diff --git a/App/Browser View/BrowserViewController+WebKitDelegate.swift b/App/Browser View/BrowserViewController+WebKitDelegate.swift index 6da0849..5fcb0da 100644 --- a/App/Browser View/BrowserViewController+WebKitDelegate.swift +++ b/App/Browser View/BrowserViewController+WebKitDelegate.swift @@ -10,7 +10,11 @@ import WebKit extension BrowserViewController: WKNavigationDelegate, WKUIDelegate { func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { - currentTab.loadError = nil + if let tab = tabController.tab(forWebView: webView) { + // We're alive! + tab.contentProcessTerminated = false + tab.loadError = nil + } // Check to make sure we have connected to the web content process if !currentTab.bridge.webContentProcessConnected { @@ -120,6 +124,10 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate } } + func webViewWebContentProcessDidTerminate(_ webView: WKWebView) { + tabController.tab(forWebView: webView)?.contentProcessTerminated = true + } + // MARK: WKUIDelegate func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? diff --git a/App/Browser View/BrowserViewController.swift b/App/Browser View/BrowserViewController.swift index c2272fc..c5d6fb5 100644 --- a/App/Browser View/BrowserViewController.swift +++ b/App/Browser View/BrowserViewController.swift @@ -520,6 +520,8 @@ class BrowserViewController: UIViewController } internal func updateTitleAndURL(forWebView webView: WKWebView) { + guard let tab = tabController.tab(forWebView: webView) else { return } + if webView == browserView.webView { browserView.titlebarView.setTitle(webView.title ?? "") @@ -531,8 +533,7 @@ class BrowserViewController: UIViewController } // Figure out which tab this corresponds to - let tab = tabController.tabs.first { $0.webView == webView } - if let tab = tab, let tabIndex = tabController.tabs.firstIndex(of: tab) { + if let tabIndex = tabController.tabs.firstIndex(of: tab) { tabBarViewController.tabBarView.reloadTab(atIndex: tabIndex) } } diff --git a/App/Tabs/Tab.swift b/App/Tabs/Tab.swift index 0a5f92e..63aade9 100644 --- a/App/Tabs/Tab.swift +++ b/App/Tabs/Tab.swift @@ -19,12 +19,8 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate public var tabInfo: TabInfo { get { - TabInfo( - title: loadedWebView?.title, - urlString: loadedWebView?.url?.absoluteString ?? self.homeURL?.absoluteString, - faviconData: self.favicon?.pngData(), - identifier: self.identifier - ) + updateMetadata() + return _tabInfo } } @@ -43,6 +39,8 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate } public var policyManager: ResourcePolicyManager + private var _tabInfo: TabInfo = TabInfo() + private var loadedWebView: WKWebView? = nil public var title: String? { get { tabInfo.title } } public var url: URL? { @@ -82,6 +80,7 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate @Published public var favicon: UIImage? public var loadError: Error? + public var contentProcessTerminated: Bool = false private var faviconHost: String? private var faviconRequest: AnyCancellable? @@ -151,4 +150,15 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate .assign(to: \.favicon, on: self) } } + + private func updateMetadata() { + guard contentProcessTerminated == false else { return } + + _tabInfo = TabInfo( + title: loadedWebView?.title, + urlString: loadedWebView?.url?.absoluteString ?? self.homeURL?.absoluteString, + faviconData: self.favicon?.pngData(), + identifier: self.identifier + ) + } } diff --git a/App/Tabs/TabController.swift b/App/Tabs/TabController.swift index 3d96b79..4259646 100644 --- a/App/Tabs/TabController.swift +++ b/App/Tabs/TabController.swift @@ -33,6 +33,10 @@ class TabController tabs.first { $0.identifier == identifier } } + func tab(forWebView webView: WKWebView) -> Tab? { + tabs.first { $0.webView == webView } + } + func createNewTab(url: URL?) -> Tab { return self.createNewTab(url: url, webViewConfiguration: nil) }