From a25997bf65196d3dad857cb07ab8ae89f7a34407 Mon Sep 17 00:00:00 2001 From: Stanislav Shakirov Date: Wed, 13 Mar 2019 18:21:25 +0300 Subject: [PATCH] fix(onShouldStartLoadWithRequest): android event was missing fields (#385) `onShouldStartLoadWithRequest` event had only `url` in payload on android. I've fixed it according to js event definition. https://github.com/react-native-community/react-native-webview/blob/master/js/WebViewTypes.js#L34 --- .../webview/RNCWebViewManager.java | 10 +++-- .../TopShouldStartLoadWithRequestEvent.java | 40 ------------------- .../TopShouldStartLoadWithRequestEvent.kt | 27 +++++++++++++ 3 files changed, 34 insertions(+), 43 deletions(-) delete mode 100644 android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.java create mode 100644 android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.kt diff --git a/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java b/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java index b5e2bcc..38b42b8 100644 --- a/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +++ b/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java @@ -159,7 +159,11 @@ public class RNCWebViewManager extends SimpleViewManager { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - dispatchEvent(view, new TopShouldStartLoadWithRequestEvent(view.getId(), url)); + dispatchEvent( + view, + new TopShouldStartLoadWithRequestEvent( + view.getId(), + createWebViewEvent(view, url))); return true; } @@ -167,8 +171,8 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - dispatchEvent(view, new TopShouldStartLoadWithRequestEvent(view.getId(), request.getUrl().toString())); - return true; + final String url = request.getUrl().toString(); + return this.shouldOverrideUrlLoading(view, url); } @Override diff --git a/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.java b/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.java deleted file mode 100644 index c706aca..0000000 --- a/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.reactnativecommunity.webview.events; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.uimanager.events.Event; -import com.facebook.react.uimanager.events.RCTEventEmitter; - -public class TopShouldStartLoadWithRequestEvent extends Event { - public static final String EVENT_NAME = "topShouldStartLoadWithRequest"; - private final String mUrl; - - public TopShouldStartLoadWithRequestEvent(int viewId, String url) { - super(viewId); - mUrl = url; - } - - @Override - public String getEventName() { - return EVENT_NAME; - } - - @Override - public boolean canCoalesce() { - return false; - } - - @Override - public short getCoalescingKey() { - // All events for a given view can be coalesced. - return 0; - } - - @Override - public void dispatch(RCTEventEmitter rctEventEmitter) { - WritableMap data = Arguments.createMap(); - data.putString("url", mUrl); - data.putString("navigationType", "other"); - rctEventEmitter.receiveEvent(getViewTag(), EVENT_NAME, data); - } -} diff --git a/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.kt b/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.kt new file mode 100644 index 0000000..c576773 --- /dev/null +++ b/android/src/main/java/com/reactnativecommunity/webview/events/TopShouldStartLoadWithRequestEvent.kt @@ -0,0 +1,27 @@ +package com.reactnativecommunity.webview.events + +import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.events.Event +import com.facebook.react.uimanager.events.RCTEventEmitter + +/** + * Event emitted when shouldOverrideUrlLoading is called + */ +class TopShouldStartLoadWithRequestEvent(viewId: Int, private val mData: WritableMap) : Event(viewId) { + companion object { + const val EVENT_NAME = "topShouldStartLoadWithRequest" + } + + init { + mData.putString("navigationType", "other") + } + + override fun getEventName(): String = EVENT_NAME + + override fun canCoalesce(): Boolean = false + + override fun getCoalescingKey(): Short = 0 + + override fun dispatch(rctEventEmitter: RCTEventEmitter) = + rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, mData) +}