Skip to content

Commit

Permalink
fix #1422
Browse files Browse the repository at this point in the history
  • Loading branch information
pichillilorenzo committed Dec 3, 2022
1 parent f3fe62f commit c078c48
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 8 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 5.7.2+2

- Fixed "Unexpected addWebMessageListener behaviour" [#1422](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1422)

## 5.7.2+1

- Fixed "Cannot Grant Permission at Android 21" [#1447](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1447)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,21 @@
public class WebMessageListener implements MethodChannel.MethodCallHandler {
static final String LOG_TAG = "WebMessageListener";

@NonNull
public String id;
public String jsObjectName;
public Set<String> allowedOriginRules;
public WebViewCompat.WebMessageListener listener;
public JavaScriptReplyProxy replyProxy;
public MethodChannel channel;
public InAppWebViewInterface webView;

public WebMessageListener(@NonNull InAppWebViewInterface webView, @NonNull BinaryMessenger messenger, @NonNull String jsObjectName, @NonNull Set<String> allowedOriginRules) {
public WebMessageListener(@NonNull String id, @NonNull InAppWebViewInterface webView, @NonNull BinaryMessenger messenger, @NonNull String jsObjectName, @NonNull Set<String> allowedOriginRules) {
this.id = id;
this.webView = webView;
this.jsObjectName = jsObjectName;
this.allowedOriginRules = allowedOriginRules;
this.channel = new MethodChannel(messenger, "com.pichillilorenzo/flutter_inappwebview_web_message_listener_" + this.jsObjectName);
this.channel = new MethodChannel(messenger, "com.pichillilorenzo/flutter_inappwebview_web_message_listener_" + this.id + "_" + this.jsObjectName);
this.channel.setMethodCallHandler(this);
if (this.webView instanceof InAppWebView) {
final WebMessageListener self = this;
Expand Down Expand Up @@ -95,12 +98,13 @@ public static WebMessageListener fromMap(@NonNull InAppWebViewInterface webView,
if (map == null) {
return null;
}
String id = (String) map.get("id");
String jsObjectName = (String) map.get("jsObjectName");
assert jsObjectName != null;
List<String> allowedOriginRuleList = (List<String>) map.get("allowedOriginRules");
assert allowedOriginRuleList != null;
Set<String> allowedOriginRules = new HashSet<>(allowedOriginRuleList);
return new WebMessageListener(webView, messenger, jsObjectName, allowedOriginRules);
return new WebMessageListener(id, webView, messenger, jsObjectName, allowedOriginRules);
}

@Override
Expand Down
9 changes: 6 additions & 3 deletions ios/Classes/Types/WebMessageListener.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@ import WebKit

public class WebMessageListener : FlutterMethodCallDelegate {

var id: String
var jsObjectName: String
var allowedOriginRules: Set<String>
var channel: FlutterMethodChannel?
var webView: InAppWebView?

public init(jsObjectName: String, allowedOriginRules: Set<String>) {
public init(id: String, jsObjectName: String, allowedOriginRules: Set<String>) {
self.id = id
self.jsObjectName = jsObjectName
self.allowedOriginRules = allowedOriginRules
super.init()
self.channel = FlutterMethodChannel(name: "com.pichillilorenzo/flutter_inappwebview_web_message_listener_" + self.jsObjectName,
self.channel = FlutterMethodChannel(name: "com.pichillilorenzo/flutter_inappwebview_web_message_listener_" + self.id + "_" + self.jsObjectName,
binaryMessenger: SwiftFlutterPlugin.instance!.registrar!.messenger())
self.channel?.setMethodCallHandler(self.handle)
}
Expand Down Expand Up @@ -101,7 +103,7 @@ public class WebMessageListener : FlutterMethodCallDelegate {
})();
"""
webView.configuration.userContentController.addPluginScript(PluginScript(
groupName: "WebMessageListener-" + jsObjectName,
groupName: "WebMessageListener-" + id + "-" + jsObjectName,
source: source,
injectionTime: .atDocumentStart,
forMainFrameOnly: false,
Expand All @@ -117,6 +119,7 @@ public class WebMessageListener : FlutterMethodCallDelegate {
return nil
}
return WebMessageListener(
id: map["id"] as! String,
jsObjectName: map["jsObjectName"] as! String,
allowedOriginRules: Set(map["allowedOriginRules"] as! [String])
)
Expand Down
8 changes: 7 additions & 1 deletion lib/src/web_message/web_message_listener.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import 'package:flutter/services.dart';
import '../in_app_webview/in_app_webview_controller.dart';
import '../types.dart';
import '../util.dart';

///This listener receives messages sent on the JavaScript object which was injected by [InAppWebViewController.addWebMessageListener].
class WebMessageListener {
///Message Listener ID used internally.
late final String id;

///The name for the injected JavaScript object.
final String jsObjectName;

Expand All @@ -30,12 +34,13 @@ class WebMessageListener {
{required this.jsObjectName,
Set<String>? allowedOriginRules,
this.onPostMessage}) {
this.id = IdGenerator.generate();
this.allowedOriginRules =
allowedOriginRules != null ? allowedOriginRules : Set.from(["*"]);
assert(!this.allowedOriginRules.contains(""),
"allowedOriginRules cannot contain empty strings");
this._channel = MethodChannel(
'com.pichillilorenzo/flutter_inappwebview_web_message_listener_$jsObjectName');
'com.pichillilorenzo/flutter_inappwebview_web_message_listener_${id}_$jsObjectName');
this._channel.setMethodCallHandler(handleMethod);
}

Expand All @@ -62,6 +67,7 @@ class WebMessageListener {

Map<String, dynamic> toMap() {
return {
"id": id,
"jsObjectName": jsObjectName,
"allowedOriginRules": allowedOriginRules.toList(),
};
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: flutter_inappwebview
description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window.
version: 5.7.2+1
version: 5.7.2+2
homepage: https://inappwebview.dev/
repository: https://github.com/pichillilorenzo/flutter_inappwebview
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
Expand Down

0 comments on commit c078c48

Please sign in to comment.