From 634beb86035a8301b1f25dacde79f00ba306de23 Mon Sep 17 00:00:00 2001 From: Jakub Adamczyk Date: Wed, 30 Apr 2025 23:11:15 +0200 Subject: [PATCH 1/2] implement passing isMainFrame with on message callbacks --- .../com/reactnativecommunity/webview/RNCWebView.java | 12 +++++++++++- apple/RNCWebViewImpl.m | 2 ++ src/RNCWebViewNativeComponent.ts | 1 + src/WebViewTypes.ts | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java b/android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java index 9b15838a0..9c822ccc5 100644 --- a/android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java +++ b/android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java @@ -257,7 +257,7 @@ protected void createRNCWebViewBridge(RNCWebView webView) { this.bridgeListener = new WebViewCompat.WebMessageListener() { @Override public void onPostMessage(@NonNull WebView view, @NonNull WebMessageCompat message, @NonNull Uri sourceOrigin, boolean isMainFrame, @NonNull JavaScriptReplyProxy replyProxy) { - RNCWebView.this.onMessage(message.getData(), sourceOrigin.toString()); + RNCWebView.this.onMessage(message.getData(), sourceOrigin.toString(), isMainFrame); } }; WebViewCompat.addWebMessageListener( @@ -339,6 +339,10 @@ public void setInjectedJavaScriptObject(String obj) { } public void onMessage(String message, String sourceUrl) { + onMessage(message, sourceUrl, null); + } + + public void onMessage(String message, String sourceUrl, @Nullable Boolean isMainFrame) { ThemedReactContext reactContext = getThemedReactContext(); RNCWebView mWebView = this; @@ -352,6 +356,9 @@ public void run() { } WritableMap data = mRNCWebViewClient.createWebViewEvent(webView, sourceUrl); data.putString("data", message); + if (isMainFrame != null) { + data.putBoolean("isMainFrame", isMainFrame); + } if (mMessagingJSModule != null) { dispatchDirectMessage(data); @@ -363,6 +370,9 @@ public void run() { } else { WritableMap eventData = Arguments.createMap(); eventData.putString("data", message); + if (isMainFrame != null) { + eventData.putBoolean("isMainFrame", isMainFrame); + } if (mMessagingJSModule != null) { dispatchDirectMessage(eventData); diff --git a/apple/RNCWebViewImpl.m b/apple/RNCWebViewImpl.m index 6f415a819..af8c1d347 100644 --- a/apple/RNCWebViewImpl.m +++ b/apple/RNCWebViewImpl.m @@ -773,10 +773,12 @@ - (void)userContentController:(WKUserContentController *)userContentController _onLoadingFinish(event); } } else if ([message.name isEqualToString:MessageHandlerName]) { + BOOL isMainFrame = message.frameInfo.isMainFrame; if (_onMessage) { NSMutableDictionary *event = [self baseEvent]; [event addEntriesFromDictionary: @{@"data": message.body}]; [event addEntriesFromDictionary: @{@"url": message.frameInfo.request.URL.absoluteString}]; + [event addEntriesFromDictionary: @{@"isMainFrame": @(isMainFrame)}]; _onMessage(event); } } diff --git a/src/RNCWebViewNativeComponent.ts b/src/RNCWebViewNativeComponent.ts index be8ba0869..55801daf0 100644 --- a/src/RNCWebViewNativeComponent.ts +++ b/src/RNCWebViewNativeComponent.ts @@ -29,6 +29,7 @@ export type WebViewMessageEvent = Readonly<{ canGoForward: boolean; lockIdentifier: Double; data: string; + isMainFrame?: boolean; }>; export type WebViewOpenWindowEvent = Readonly<{ targetUrl: string; diff --git a/src/WebViewTypes.ts b/src/WebViewTypes.ts index c8e017e62..26dd7de95 100644 --- a/src/WebViewTypes.ts +++ b/src/WebViewTypes.ts @@ -110,6 +110,7 @@ export type DecelerationRateConstant = 'normal' | 'fast'; export interface WebViewMessage extends WebViewNativeEvent { data: string; + isMainFrame?: boolean; } export interface WebViewError extends WebViewNativeEvent { From 17a37dceddf9013acb420e71c5b793b4813226ee Mon Sep 17 00:00:00 2001 From: Jakub Adamczyk Date: Wed, 30 Apr 2025 23:16:42 +0200 Subject: [PATCH 2/2] isMainFrame in onMEssage --- .changeset/spotty-feet-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spotty-feet-shave.md diff --git a/.changeset/spotty-feet-shave.md b/.changeset/spotty-feet-shave.md new file mode 100644 index 000000000..e58e39cc9 --- /dev/null +++ b/.changeset/spotty-feet-shave.md @@ -0,0 +1,5 @@ +--- +'@phantom/react-native-webview': patch +--- + +added isMainFrame to onMessage callbacks