Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
e25faa3
[webview_flutter_platform_interface] Update webview platform interfac…
BeMacized Oct 1, 2021
f19b5c3
Fix tests
BeMacized Oct 1, 2021
3a22d00
[webview_flutter] Implemented `runJavaScript` and `runJavaScriptForRe…
BeMacized Oct 1, 2021
2bcec1c
Remove accidental development team inclusion from project.pbxproj
BeMacized Oct 1, 2021
8e5a2de
[webview_flutter] Deprecate `evaluateJavascript` in favour of `runJav…
BeMacized Oct 1, 2021
5a84981
Updated changelog
BeMacized Oct 1, 2021
ff493a2
Implemented PR feedback
BeMacized Oct 1, 2021
6bf082f
Merge branch 'webview/js_eval_fix_platform' into webview/js_eval_fix_…
BeMacized Oct 1, 2021
ff125c9
Updated runJavaScriptForResult behaviour
BeMacized Oct 1, 2021
79707d7
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Oct 1, 2021
73f3407
Updated documentation
BeMacized Oct 1, 2021
9f661e8
Implemented PR feedback partially
BeMacized Oct 4, 2021
cbc88e8
Implement PR feedback
BeMacized Oct 4, 2021
9f537c7
Merge branch 'webview/js_eval_fix_platform' into webview/js_eval_fix_…
BeMacized Oct 4, 2021
26004c3
Update changelog
BeMacized Oct 4, 2021
283f8a7
Merge branch 'webview/js_eval_fix_platform' into webview/js_eval_fix_…
BeMacized Oct 4, 2021
b95d986
Implement PR feedback from interface PR
BeMacized Oct 4, 2021
3d8b9ce
Update changelog
BeMacized Oct 4, 2021
840a73e
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Oct 4, 2021
45c4a7d
Fix issues from merge.
BeMacized Oct 4, 2021
0ecf641
Revert inclusion of development team
BeMacized Oct 4, 2021
d7b57f4
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Oct 4, 2021
02e1106
Implement PR feedback
BeMacized Oct 5, 2021
d7780dd
Merge branch 'webview/js_eval_fix_platform' into webview/js_eval_fix_…
BeMacized Oct 5, 2021
d8f51ed
Implemented platform interface PR feedback
BeMacized Oct 5, 2021
3ccb8ae
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Oct 5, 2021
c884665
Implemented platform interface PR feedback
BeMacized Oct 5, 2021
285c2cc
Merge branch 'master' into webview/js_eval_fix_platform
BeMacized Oct 6, 2021
90cb648
Merge branch 'webview/js_eval_fix_platform' into webview/js_eval_fix_…
BeMacized Oct 6, 2021
156f77f
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Oct 6, 2021
bfcacdc
Update pubspec dependency
BeMacized Oct 6, 2021
bcb368c
Merge branch 'master' into webview/js_eval_fix_native
BeMacized Oct 6, 2021
485ead3
Fixed capitalisation
BeMacized Oct 6, 2021
a7d10c0
Fixed capitalisation
BeMacized Oct 6, 2021
d98bc6a
Fix warning
BeMacized Oct 7, 2021
738a9ad
Partially implement PR feedback
BeMacized Oct 8, 2021
527bd67
Partially implement PR feedback
BeMacized Oct 8, 2021
acf5ff9
Format
BeMacized Oct 8, 2021
aed3830
Update podfile
BeMacized Oct 8, 2021
6967c4f
Update podfile
BeMacized Oct 8, 2021
37ba26e
Update podfiles
BeMacized Oct 8, 2021
13076ba
Update iOS project files
BeMacized Oct 8, 2021
0c87362
Update podspec
BeMacized Oct 8, 2021
28ac939
Merge remote-tracking branch 'origin/webview/js_eval_fix_native' into…
BeMacized Oct 8, 2021
962ad02
Remove unnecessary podfile configuration
BeMacized Oct 8, 2021
9184d48
Implemented PR feedback
BeMacized Oct 8, 2021
a111502
Merge branch 'master' into webview/js_eval_fix_native
BeMacized Oct 18, 2021
80cbe9b
Format
BeMacized Oct 18, 2021
9fdab9d
Revert podfile changes
BeMacized Oct 22, 2021
6e609d7
Implemented PR feedback
BeMacized Oct 22, 2021
f6d8cb4
Fix formatting
BeMacized Oct 22, 2021
b019d3c
Fix formatting
BeMacized Oct 22, 2021
2b0f490
Fixed test.
BeMacized Oct 22, 2021
fa9526c
Re-add integration tests for deprecated evaluateJavascript method.
BeMacized Oct 26, 2021
45e799b
Merge branch 'master' into webview/js_eval_fix_native
BeMacized Oct 28, 2021
40a6b38
Merge branch 'master' into webview/js_eval_fix_native
BeMacized Oct 28, 2021
e2f4710
Fix merge conflicts
BeMacized Oct 28, 2021
29cca43
Merge branch 'webview/js_eval_fix_native' into webview/js_eval_fix_app
BeMacized Nov 1, 2021
fcf1723
Merge branch 'master' into webview/js_eval_fix_app
BeMacized Nov 1, 2021
a3656a3
Add missing test and format
BeMacized Nov 1, 2021
662e563
Fixed dependencies and updated changelog
BeMacized Nov 1, 2021
834465e
Ignore deprecated uses of evaluateJavascript in tests
BeMacized Nov 1, 2021
20b5a90
Fix analysis errors
BeMacized Nov 1, 2021
5c2885e
Fix unit tests
BeMacized Nov 1, 2021
6341867
Merge branch 'master' into webview/js_eval_fix_app
BeMacized Nov 2, 2021
37504c9
Implemented PR feedback
BeMacized Nov 4, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Partially implement PR feedback
  • Loading branch information
BeMacized committed Oct 8, 2021
commit 738a9ade3ffee077fd548eaad564dac61f513fc6
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public void onProgressChanged(WebView view, int progress) {
if (params.containsKey(JS_CHANNEL_NAMES_FIELD)) {
List<String> names = (List<String>) params.get(JS_CHANNEL_NAMES_FIELD);
if (names != null) {
registerJavascriptChannelNames(names);
registerJavaScriptChannelNames(names);
}
}

Expand Down Expand Up @@ -245,16 +245,16 @@ public void onMethodCall(MethodCall methodCall, Result result) {
break;
case "evaluateJavascript":
case "runJavascriptReturningResult":
evaluateJavascript(methodCall, result, true);
evaluateJavaScript(methodCall, result, true);
break;
case "runJavascript":
evaluateJavascript(methodCall, result, false);
evaluateJavaScript(methodCall, result, false);
break;
case "addJavascriptChannels":
addJavascriptChannels(methodCall, result);
addJavaScriptChannels(methodCall, result);
break;
case "removeJavascriptChannels":
removeJavascriptChannels(methodCall, result);
removeJavaScriptChannels(methodCall, result);
break;
case "clearCache":
clearCache(result);
Expand Down Expand Up @@ -329,7 +329,7 @@ private void updateSettings(MethodCall methodCall, Result result) {
}

@TargetApi(Build.VERSION_CODES.KITKAT)
private void evaluateJavascript(
private void evaluateJavaScript(
MethodCall methodCall, final Result result, final boolean returnValue) {
String jsString = (String) methodCall.arguments;
if (jsString == null) {
Expand All @@ -350,14 +350,14 @@ public void onReceiveValue(String value) {
}

@SuppressWarnings("unchecked")
private void addJavascriptChannels(MethodCall methodCall, Result result) {
private void addJavaScriptChannels(MethodCall methodCall, Result result) {
List<String> channelNames = (List<String>) methodCall.arguments;
registerJavascriptChannelNames(channelNames);
registerJavaScriptChannelNames(channelNames);
result.success(null);
}

@SuppressWarnings("unchecked")
private void removeJavascriptChannels(MethodCall methodCall, Result result) {
private void removeJavaScriptChannels(MethodCall methodCall, Result result) {
List<String> channelNames = (List<String>) methodCall.arguments;
for (String channelName : channelNames) {
webView.removeJavascriptInterface(channelName);
Expand Down Expand Up @@ -465,10 +465,10 @@ private void updateAutoMediaPlaybackPolicy(int mode) {
}
}

private void registerJavascriptChannelNames(List<String> channelNames) {
private void registerJavaScriptChannelNames(List<String> channelNames) {
for (String channelName : channelNames) {
webView.addJavascriptInterface(
new JavascriptChannel(methodChannel, channelName, platformThreadHandler), channelName);
new JavaScriptChannel(methodChannel, channelName, platformThreadHandler), channelName);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,21 @@
* <p>Exposes a single method named `postMessage` to JavaScript, which sends a message over a method
* channel to the Dart code.
*/
class JavascriptChannel {
class JavaScriptChannel {
private final MethodChannel methodChannel;
private final String javascriptChannelName;
private final String javaScriptChannelName;
private final Handler platformThreadHandler;

/**
* @param methodChannel the Flutter WebView method channel to which JS messages are sent
* @param javascriptChannelName the name of the JavaScript channel, this is sent over the method
* @param javaScriptChannelName the name of the JavaScript channel, this is sent over the method
* channel with each message to let the Dart code know which JavaScript channel the message
* was sent through
*/
JavascriptChannel(
MethodChannel methodChannel, String javascriptChannelName, Handler platformThreadHandler) {
JavaScriptChannel(
MethodChannel methodChannel, String javaScriptChannelName, Handler platformThreadHandler) {
this.methodChannel = methodChannel;
this.javascriptChannelName = javascriptChannelName;
this.javaScriptChannelName = javaScriptChannelName;
this.platformThreadHandler = platformThreadHandler;
}

Expand All @@ -44,7 +44,7 @@ public void postMessage(final String message) {
@Override
public void run() {
HashMap<String, String> arguments = new HashMap<>();
arguments.put("channel", javascriptChannelName);
arguments.put("channel", javaScriptChannelName);
arguments.put("message", message);
methodChannel.invokeMethod("javascriptChannelMessage", arguments);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public void createWebView_shouldCreateWebViewWithDefaultConfiguration() {
}

@Test(expected = UnsupportedOperationException.class)
public void evaluateJavascript_shouldThrowForNullString() {
public void evaluateJavaScript_shouldThrowForNullString() {
try (MockedStatic<FlutterWebView> mockedFlutterWebView = mockStatic(FlutterWebView.class)) {
// Setup
mockedFlutterWebView
Expand All @@ -97,7 +97,7 @@ public void apply() throws Throwable {
}

@Test
public void evaluateJavascript_shouldReturnValueOnSuccessForReturnValue() {
public void evaluateJavaScript_shouldReturnValueOnSuccessForReturnValue() {
try (MockedStatic<FlutterWebView> mockedFlutterWebView = mockStatic(FlutterWebView.class)) {
// Setup
mockedFlutterWebView
Expand Down Expand Up @@ -130,7 +130,7 @@ public void evaluateJavascript_shouldReturnValueOnSuccessForReturnValue() {
}

@Test
public void evaluateJavascript_shouldReturnNilOnSuccessForNoReturnValue() {
public void evaluateJavaScript_shouldReturnNilOnSuccessForNoReturnValue() {
try (MockedStatic<FlutterWebView> mockedFlutterWebView = mockStatic(FlutterWebView.class)) {
// Setup
mockedFlutterWebView
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -975,15 +975,15 @@ void main() {

final WebViewController controller = await controllerCompleter.future;
await pageLoaded.future;
final String viewportRectJSON = await _runJavascriptReturningResult(
final String viewportRectJSON = await _runJavaScriptReturningResult(
controller, 'JSON.stringify(viewport.getBoundingClientRect())');
final Map<String, dynamic> viewportRectRelativeToViewport =
jsonDecode(viewportRectJSON);

// Check that the input is originally outside of the viewport.

final String initialInputClientRectJSON =
await _runJavascriptReturningResult(
await _runJavaScriptReturningResult(
controller, 'JSON.stringify(inputEl.getBoundingClientRect())');
final Map<String, dynamic> initialInputClientRectRelativeToViewport =
jsonDecode(initialInputClientRectJSON);
Expand All @@ -998,7 +998,7 @@ void main() {
// Check that focusing the input brought it into view.

final String lastInputClientRectJSON =
await _runJavascriptReturningResult(
await _runJavaScriptReturningResult(
controller, 'JSON.stringify(inputEl.getBoundingClientRect())');
final Map<String, dynamic> lastInputClientRectRelativeToViewport =
jsonDecode(lastInputClientRectJSON);
Expand Down Expand Up @@ -1408,10 +1408,10 @@ String _webviewBool(bool value) {

/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.
Future<String> _getUserAgent(WebViewController controller) async {
return _runJavascriptReturningResult(controller, 'navigator.userAgent;');
return _runJavaScriptReturningResult(controller, 'navigator.userAgent;');
}

Future<String> _runJavascriptReturningResult(
Future<String> _runJavaScriptReturningResult(
WebViewController controller, String js) async {
return jsonDecode(await controller.runJavascriptReturningResult(js));
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#import "FlutterWebView.h"
#import "FLTWKNavigationDelegate.h"
#import "FLTWKProgressionDelegate.h"
#import "JavascriptChannelHandler.h"
#import "JavaScriptChannelHandler.h"

@implementation FLTWebViewFactory {
NSObject<FlutterBinaryMessenger>* _messenger;
Expand Down Expand Up @@ -63,7 +63,7 @@ @implementation FLTWebViewController {
FlutterMethodChannel* _channel;
NSString* _currentUrl;
// The set of registered JavaScript channel names.
NSMutableSet* _javascriptChannelNames;
NSMutableSet* _javaScriptChannelNames;
FLTWKNavigationDelegate* _navigationDelegate;
FLTWKProgressionDelegate* _progressionDelegate;
}
Expand All @@ -77,13 +77,13 @@ - (instancetype)initWithFrame:(CGRect)frame

NSString* channelName = [NSString stringWithFormat:@"plugins.flutter.io/webview_%lld", viewId];
_channel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:messenger];
_javascriptChannelNames = [[NSMutableSet alloc] init];
_javaScriptChannelNames = [[NSMutableSet alloc] init];

WKUserContentController* userContentController = [[WKUserContentController alloc] init];
if ([args[@"javascriptChannelNames"] isKindOfClass:[NSArray class]]) {
NSArray* javaScriptChannelNames = args[@"javascriptChannelNames"];
[_javascriptChannelNames addObjectsFromArray:javaScriptChannelNames];
[self registerJavascriptChannels:_javascriptChannelNames controller:userContentController];
[_javaScriptChannelNames addObjectsFromArray:javaScriptChannelNames];
[self registerJavaScriptChannels:_javaScriptChannelNames controller:userContentController];
}

NSDictionary<NSString*, id>* settings = args[@"settings"];
Expand Down Expand Up @@ -156,9 +156,9 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
} else if ([[call method] isEqualToString:@"runJavascriptReturningResult"]) {
[self onRunJavascriptReturningResult:call result:result];
} else if ([[call method] isEqualToString:@"addJavascriptChannels"]) {
[self onAddJavascriptChannels:call result:result];
[self onAddJavaScriptChannels:call result:result];
} else if ([[call method] isEqualToString:@"removeJavascriptChannels"]) {
[self onRemoveJavascriptChannels:call result:result];
[self onRemoveJavaScriptChannels:call result:result];
} else if ([[call method] isEqualToString:@"clearCache"]) {
[self clearCache:result];
} else if ([[call method] isEqualToString:@"getTitle"]) {
Expand Down Expand Up @@ -229,7 +229,7 @@ - (void)onCurrentUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
- (void)onEvaluateJavascript:(FlutterMethodCall*)call result:(FlutterResult)result {
NSString* jsString = [call arguments];
if (!jsString) {
result([FlutterError errorWithCode:@"evaluateJavascript_failed"
result([FlutterError errorWithCode:@"evaluateJavaScript_failed"
message:@"JavaScript String cannot be null"
details:nil]);
return;
Expand All @@ -238,7 +238,7 @@ - (void)onEvaluateJavascript:(FlutterMethodCall*)call result:(FlutterResult)resu
completionHandler:^(_Nullable id evaluateResult, NSError* _Nullable error) {
if (error) {
result([FlutterError
errorWithCode:@"evaluateJavascript_failed"
errorWithCode:@"evaluateJavaScript_failed"
message:@"Failed evaluating JavaScript"
details:[NSString stringWithFormat:@"JavaScript string was: '%@'\n%@",
jsString, error]]);
Expand All @@ -248,7 +248,9 @@ - (void)onEvaluateJavascript:(FlutterMethodCall*)call result:(FlutterResult)resu
}];
}

- (void)onRunJavascript:(FlutterMethodCall*)call result:(FlutterResult)result {
- (void)onRunJavascript:(FlutterMethodCall*)call
result:(FlutterResult)result
sendReturnValue:(BOOL)sendReturnValue {
NSString* jsString = [call arguments];
if (!jsString) {
result([FlutterError errorWithCode:@"runJavascript_failed"
Expand All @@ -258,17 +260,20 @@ - (void)onRunJavascript:(FlutterMethodCall*)call result:(FlutterResult)result {
}
[_webView evaluateJavaScript:jsString
completionHandler:^(_Nullable id evaluateResult, NSError* _Nullable error) {
BOOL unsupportedTypeError = false;
if (@available(iOS 9, *)) {
unsupportedTypeError =
error && error.code == WKErrorJavaScriptResultTypeIsUnsupported;
if (error) {
if (sendReturnValue || (!sendReturnValue && error.code != WKErrorJavaScriptResultTypeIsUnsupported)) {
result([FlutterError
errorWithCode:(sendReturnValue ? @"runJavascriptReturningResult_failed"
: @"runJavascript_failed")
message:@"Failed running JavaScript"
details:[NSString stringWithFormat:@"JavaScript string was: '%@'\n%@",
jsString, error]]);
} else {
result(nil);
}
}
if (error && !unsupportedTypeError) {
result([FlutterError
errorWithCode:@"runJavascript_failed"
message:@"Failed running JavaScript"
details:[NSString stringWithFormat:@"JavaScript string was: '%@'\n%@",
jsString, error]]);
if (sendReturnValue) {
result([NSString stringWithFormat:@"%@", evaluateResult]);
} else {
result(nil);
}
Expand All @@ -284,42 +289,34 @@ - (void)onRunJavascriptReturningResult:(FlutterMethodCall*)call result:(FlutterR
return;
}
[_webView evaluateJavaScript:jsString
completionHandler:^(_Nullable id evaluateResult, NSError* _Nullable error) {
if (error) {
result([FlutterError
errorWithCode:@"runJavascriptReturningResult_failed"
message:@"Failed running JavaScript"
details:[NSString stringWithFormat:@"JavaScript string was: '%@'\n%@",
jsString, error]]);
} else {
result([NSString stringWithFormat:@"%@", evaluateResult]);
}
completionHandler:^(_Nullable id evaluateResult, NSError* _Nullable error){

}];
}

- (void)onAddJavascriptChannels:(FlutterMethodCall*)call result:(FlutterResult)result {
- (void)onAddJavaScriptChannels:(FlutterMethodCall*)call result:(FlutterResult)result {
NSArray* channelNames = [call arguments];
NSSet* channelNamesSet = [[NSSet alloc] initWithArray:channelNames];
[_javascriptChannelNames addObjectsFromArray:channelNames];
[self registerJavascriptChannels:channelNamesSet
[_javaScriptChannelNames addObjectsFromArray:channelNames];
[self registerJavaScriptChannels:channelNamesSet
controller:_webView.configuration.userContentController];
result(nil);
}

- (void)onRemoveJavascriptChannels:(FlutterMethodCall*)call result:(FlutterResult)result {
- (void)onRemoveJavaScriptChannels:(FlutterMethodCall*)call result:(FlutterResult)result {
// WkWebView does not support removing a single user script, so instead we remove all
// user scripts, all message handlers. And re-register channels that shouldn't be removed.
[_webView.configuration.userContentController removeAllUserScripts];
for (NSString* channelName in _javascriptChannelNames) {
for (NSString* channelName in _javaScriptChannelNames) {
[_webView.configuration.userContentController removeScriptMessageHandlerForName:channelName];
}

NSArray* channelNamesToRemove = [call arguments];
for (NSString* channelName in channelNamesToRemove) {
[_javascriptChannelNames removeObject:channelName];
[_javaScriptChannelNames removeObject:channelName];
}

[self registerJavascriptChannels:_javascriptChannelNames
[self registerJavaScriptChannels:_javaScriptChannelNames
controller:_webView.configuration.userContentController];
result(nil);
}
Expand Down Expand Up @@ -503,11 +500,11 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
return true;
}

- (void)registerJavascriptChannels:(NSSet*)channelNames
- (void)registerJavaScriptChannels:(NSSet*)channelNames
controller:(WKUserContentController*)userContentController {
for (NSString* channelName in channelNames) {
FLTJavascriptChannel* channel =
[[FLTJavascriptChannel alloc] initWithMethodChannel:_channel
FLTJavaScriptChannel* channel =
[[FLTJavaScriptChannel alloc] initWithMethodChannel:_channel
javascriptChannelName:channelName];
[userContentController addScriptMessageHandler:channel name:channelName];
NSString* wrapperSource = [NSString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

NS_ASSUME_NONNULL_BEGIN

@interface FLTJavascriptChannel : NSObject <WKScriptMessageHandler>
@interface FLTJavaScriptChannelFLTJavaScriptChannel : NSObject <WKScriptMessageHandler>

- (instancetype)initWithMethodChannel:(FlutterMethodChannel*)methodChannel
javascriptChannelName:(NSString*)javascriptChannelName;
javaScriptChannelName:(NSString*)javaScriptChannelName;

@end

Expand Down
Loading