Skip to content

Commit 26dcec3

Browse files
[webview_flutter_wkwebview] Change callback methods with a non-null return type to non-null (#8564)
Callback methods that can't return nullable value are made non-null. If the error seen by issues listed below, this should make the failure happen in Dart. Related: flutter/flutter#162437 flutter/flutter#162368 Fixes flutter/flutter#125901
1 parent fd53793 commit 26dcec3

28 files changed

+2674
-3225
lines changed

packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 3.18.1
2+
3+
* Fixes bug that would allow the API wrapper to return `null` when a non-null value was required in
4+
a callback method.
5+
* Changes default method to enable JavaScript for web content to
6+
`WKWebpagePreferences.allowsContentJavaScript`.
7+
18
## 3.18.0
29

310
* Updates internal API wrapper to use ProxyApis.

packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/PreferencesProxyAPITests.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ import XCTest
88
@testable import webview_flutter_wkwebview
99

1010
class PreferencesProxyAPITests: XCTestCase {
11-
@MainActor func testSetJavaScriptEnabled() {
12-
let registrar = TestProxyApiRegistrar()
13-
let api = registrar.apiDelegate.pigeonApiWKPreferences(registrar)
11+
@MainActor func testSetJavaScriptEnabled() throws {
12+
if #available(iOS 14.0, macOS 11.0, *) {
13+
throw XCTSkip("Required API is not available for this test.")
1414

15-
let instance = WKPreferences()
16-
let enabled = true
17-
try? api.pigeonDelegate.setJavaScriptEnabled(
18-
pigeonApi: api, pigeonInstance: instance, enabled: enabled)
15+
} else {
16+
let registrar = TestProxyApiRegistrar()
17+
let api = registrar.apiDelegate.pigeonApiWKPreferences(registrar)
1918

20-
XCTAssertEqual(instance.javaScriptEnabled, enabled)
19+
let instance = WKPreferences()
20+
let enabled = true
21+
try? api.pigeonDelegate.setJavaScriptEnabled(
22+
pigeonApi: api, pigeonInstance: instance, enabled: enabled)
23+
24+
XCTAssertEqual(instance.javaScriptEnabled, enabled)
25+
}
2126
}
2227
}

packages/webview_flutter/webview_flutter_wkwebview/darwin/Tests/WebViewConfigurationProxyAPITests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,16 @@ class WebViewConfigurationProxyAPITests: XCTestCase {
123123

124124
XCTAssertEqual(instance.mediaTypesRequiringUserActionForPlayback, [])
125125
}
126+
127+
@available(iOS 13.0, macOS 10.15, *)
128+
@MainActor func testGetDefaultWebpagePreferences() {
129+
let registrar = TestProxyApiRegistrar()
130+
let api = registrar.apiDelegate.pigeonApiWKWebViewConfiguration(registrar)
131+
132+
let instance = WKWebViewConfiguration()
133+
let value = try? api.pigeonDelegate.getDefaultWebpagePreferences(
134+
pigeonApi: api, pigeonInstance: instance)
135+
136+
XCTAssertEqual(value, instance.defaultWebpagePreferences)
137+
}
126138
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import WebKit
6+
import XCTest
7+
8+
@testable import webview_flutter_wkwebview
9+
10+
class WebpagePreferencesProxyAPITests: XCTestCase {
11+
@available(iOS 14.0, macOS 11.0, *)
12+
@MainActor func testSetAllowsContentJavaScript() {
13+
let registrar = TestProxyApiRegistrar()
14+
let api = registrar.apiDelegate.pigeonApiWKWebpagePreferences(registrar)
15+
16+
let instance = WKWebpagePreferences()
17+
let allow = true
18+
try? api.pigeonDelegate.setAllowsContentJavaScript(
19+
pigeonApi: api, pigeonInstance: instance, allow: allow)
20+
21+
XCTAssertEqual(instance.allowsContentJavaScript, allow)
22+
}
23+
}

packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/PreferencesProxyAPIDelegate.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ class PreferencesProxyAPIDelegate: PigeonApiDelegateWKPreferences {
1212
func setJavaScriptEnabled(
1313
pigeonApi: PigeonApiWKPreferences, pigeonInstance: WKPreferences, enabled: Bool
1414
) throws {
15-
pigeonInstance.javaScriptEnabled = enabled
15+
if #available(iOS 14.0, macOS 11.0, *) {
16+
// On iOS 14 and macOS 11, WKWebpagePreferences.allowsContentJavaScript should be
17+
// used instead.
18+
throw (pigeonApi.pigeonRegistrar as! ProxyAPIRegistrar)
19+
.createUnsupportedVersionError(
20+
method: "WKPreferences.javaScriptEnabled",
21+
versionRequirements: "< iOS 14.0, macOS 11.0")
22+
} else {
23+
pigeonInstance.javaScriptEnabled = enabled
24+
}
1625
}
1726
}

packages/webview_flutter/webview_flutter_wkwebview/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ProxyAPIRegistrar.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,4 +273,11 @@ class ProxyAPIDelegate: WebKitLibraryPigeonProxyApiDelegate {
273273
func pigeonApiURL(_ registrar: WebKitLibraryPigeonProxyApiRegistrar) -> PigeonApiURL {
274274
return PigeonApiURL(pigeonRegistrar: registrar, delegate: URLProxyAPIDelegate())
275275
}
276+
277+
func pigeonApiWKWebpagePreferences(_ registrar: WebKitLibraryPigeonProxyApiRegistrar)
278+
-> PigeonApiWKWebpagePreferences
279+
{
280+
return PigeonApiWKWebpagePreferences(
281+
pigeonRegistrar: registrar, delegate: WebpagePreferencesProxyAPIDelegate())
282+
}
276283
}

0 commit comments

Comments
 (0)