From 3806b85fcef01ad34327dda9cc2c88619b522c74 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 1 Jun 2021 16:35:43 -0700 Subject: [PATCH] feat(WebView): allow JS bound window frame navigation to be intercepted through loadStarted (#9430) --- packages/core/ui/web-view/index.ios.ts | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/web-view/index.ios.ts b/packages/core/ui/web-view/index.ios.ts index efce12e2c..e27c8a5bf 100644 --- a/packages/core/ui/web-view/index.ios.ts +++ b/packages/core/ui/web-view/index.ios.ts @@ -96,6 +96,24 @@ class WKNavigationDelegateImpl extends NSObject implements WKNavigationDelegate } } +@NativeClass +class WKUIDelegateImpl extends NSObject implements WKUIDelegate { + public static ObjCProtocols = [WKUIDelegate]; + public static initWithOwner(owner: WeakRef): WKUIDelegateImpl { + const handler = WKUIDelegateImpl.new(); + handler._owner = owner; + return handler; + } + private _owner: WeakRef; + + webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures(webView: WKWebView, configuration: WKWebViewConfiguration, navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures): WKWebView { + if (navigationAction && (!navigationAction.targetFrame || (navigationAction.targetFrame && !navigationAction.targetFrame.mainFrame))) { + webView.loadRequest(navigationAction.request); + } + return null; + } +} + @NativeClass @ObjCClass(UIScrollViewDelegate) class UIScrollViewDelegateImpl extends NSObject implements UIScrollViewDelegate { @@ -138,8 +156,9 @@ class UIScrollViewDelegateImpl extends NSObject implements UIScrollViewDelegate export class WebView extends WebViewBase { nativeViewProtected: WKWebView; - private _delegate: any; - private _scrollDelegate: any; + private _delegate: WKNavigationDelegateImpl; + private _scrollDelegate: UIScrollViewDelegateImpl; + private _uiDelegate: WKUIDelegateImpl; _maximumZoomScale; _minimumZoomScale; @@ -164,8 +183,10 @@ export class WebView extends WebViewBase { super.initNativeView(); this._delegate = WKNavigationDelegateImpl.initWithOwner(new WeakRef(this)); this._scrollDelegate = UIScrollViewDelegateImpl.initWithOwner(new WeakRef(this)); + this._uiDelegate = WKUIDelegateImpl.initWithOwner(new WeakRef(this)); this.ios.navigationDelegate = this._delegate; this.ios.scrollView.delegate = this._scrollDelegate; + this.ios.UIDelegate = this._uiDelegate; } @profile