Skip to content

Commit c569011

Browse files
authored
Merge pull request #401 from rencsikmarian/fix-double-webview-init-retain-cycles-400
fix: resolve double WebView initialization and script handler retain cycles (#400)
2 parents e870886 + afbabec commit c569011

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

ios/Sources/InAppBrowserPlugin/WKWebViewController.swift

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
8686
self.setPreventDeeplink(preventDeeplink: preventDeeplink)
8787
self.initWebview(isInspectable: isInspectable)
8888
}
89-
89+
9090
public init(url: URL, headers: [String: String], isInspectable: Bool, credentials: WKWebViewCredentials? = nil, preventDeeplink: Bool, blankNavigationTab: Bool, enabledSafeBottomMargin: Bool, blockedHosts: [String]) {
9191
super.init(nibName: nil, bundle: nil)
9292
self.blankNavigationTab = blankNavigationTab
@@ -153,6 +153,8 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
153153

154154
internal var preShowSemaphore: DispatchSemaphore?
155155
internal var preShowError: String?
156+
private var isWebViewInitialized = false
157+
156158

157159
func setHeaders(headers: [String: String]) {
158160
self.headers = headers
@@ -169,7 +171,7 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
169171
func setPreventDeeplink(preventDeeplink: Bool) {
170172
self.preventDeeplink = preventDeeplink
171173
}
172-
174+
173175
func setBlockedHosts(blockedHosts: [String]) {
174176
self.blockedHosts = blockedHosts
175177
}
@@ -393,6 +395,10 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
393395

394396
override open func viewDidDisappear(_ animated: Bool) {
395397
super.viewDidDisappear(animated)
398+
399+
if self.isBeingDismissed || self.isMovingFromParent {
400+
self.cleanupWebView()
401+
}
396402

397403
if let capacitorStatusBar = capacitorStatusBar {
398404
self.capBrowserPlugin?.bridge?.webView?.superview?.addSubview(capacitorStatusBar)
@@ -582,18 +588,24 @@ open class WKWebViewController: UIViewController, WKScriptMessageHandler {
582588
}
583589

584590
open func initWebview(isInspectable: Bool = true) {
591+
if self.isWebViewInitialized {
592+
return
593+
}
594+
self.isWebViewInitialized = true
585595
self.view.backgroundColor = UIColor.white
586596

587597
self.extendedLayoutIncludesOpaqueBars = true
588598
self.edgesForExtendedLayout = [.bottom]
589599

590600
let webConfiguration = WKWebViewConfiguration()
591601
let userContentController = WKUserContentController()
592-
userContentController.add(self, name: "messageHandler")
593-
userContentController.add(self, name: "preShowScriptError")
594-
userContentController.add(self, name: "preShowScriptSuccess")
595-
userContentController.add(self, name: "close")
596-
userContentController.add(self, name: "magicPrint")
602+
603+
let weakHandler = WeakScriptMessageHandler(self)
604+
userContentController.add(weakHandler, name: "messageHandler")
605+
userContentController.add(weakHandler, name: "preShowScriptError")
606+
userContentController.add(weakHandler, name: "preShowScriptSuccess")
607+
userContentController.add(weakHandler, name: "close")
608+
userContentController.add(weakHandler, name: "magicPrint")
597609

598610
// Inject JavaScript to override window.print
599611
let script = WKUserScript(
@@ -1980,3 +1992,16 @@ class PassThroughView: UIView {
19801992
extension WKNavigationActionPolicy {
19811993
static let preventDeeplinkActionPolicy = WKNavigationActionPolicy(rawValue: WKNavigationActionPolicy.allow.rawValue + 2)!
19821994
}
1995+
1996+
class WeakScriptMessageHandler: NSObject, WKScriptMessageHandler {
1997+
weak var delegate: WKScriptMessageHandler?
1998+
1999+
init(_ delegate: WKScriptMessageHandler) {
2000+
self.delegate = delegate
2001+
super.init()
2002+
}
2003+
2004+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
2005+
self.delegate?.userContentController(userContentController, didReceive: message)
2006+
}
2007+
}

0 commit comments

Comments
 (0)