Back/forward buttons, share button on iPad

This commit is contained in:
James Magahern
2020-07-31 14:08:10 -07:00
parent 6baf543da3
commit ad85c3dc23
6 changed files with 133 additions and 64 deletions

View File

@@ -6,6 +6,7 @@
//
import UIKit
import UniformTypeIdentifiers
class BrowserViewController: UIViewController, WKNavigationDelegate,
UITextFieldDelegate, ScriptPolicyViewControllerDelegate,
@@ -24,6 +25,8 @@ class BrowserViewController: UIViewController, WKNavigationDelegate,
private var titleObservation: NSKeyValueObservation?
private var loadingObservation: NSKeyValueObservation?
private var backButtonObservation: NSKeyValueObservation?
private var forwardButtonObservation: NSKeyValueObservation?
override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent }
@@ -41,18 +44,49 @@ class BrowserViewController: UIViewController, WKNavigationDelegate,
browserView.toolbarView = toolbarController.toolbarView
// Refresh button
toolbarController.urlBar.refreshButton.addAction(UIAction(handler: { [weak self] action in
guard let self = self else { return }
if self.webView.isLoading {
self.webView.stopLoading()
toolbarController.urlBar.refreshButton.addAction(UIAction(handler: { [webView] action in
if webView.isLoading {
webView.stopLoading()
} else {
self.webView.reload()
webView.reload()
}
}), for: .touchUpInside)
// Back button
toolbarController.backButton.addAction(UIAction(handler: { [webView] _ in
webView.goBack()
}), for: .touchUpInside)
// Forward button
toolbarController.forwardButton.addAction(UIAction(handler: { [webView] _ in
webView.goForward()
}), for: .touchUpInside)
// Share button
toolbarController.shareButton.addAction(UIAction(handler: { [unowned self, webView, toolbarController] _ in
if let url = webView.url {
let itemProvider = NSItemProvider(item: url as NSURL, typeIdentifier: UTType.url.identifier)
let config = UIActivityItemsConfiguration(itemProviders: [ itemProvider ])
config.metadataProvider = { metadataKey in
switch metadataKey {
case .title: return webView.title
case .messageBody: return webView.title
default: return nil
}
}
config.previewProvider = { index, intent, suggestedSize in
NSItemProvider(item: self.tab.favicon, typeIdentifier: UTType.image.identifier)
}
let activityController = UIActivityViewController(activityItemsConfiguration: config)
activityController.popoverPresentationController?.sourceView = toolbarController.shareButton
self.present(activityController, animated: true, completion: nil)
}
}), for: .touchUpInside)
// Script button
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { [weak self] action in
guard let self = self else { return }
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { [unowned self] action in
let hostOrigin = self.webView.url?.host ?? ""
let loadedScripts = self.tab.allowedScriptOrigins.union(self.tab.blockedScriptOrigins)
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager,
@@ -70,15 +104,13 @@ class BrowserViewController: UIViewController, WKNavigationDelegate,
}), for: .touchUpInside)
// Dark mode button
toolbarController.darkModeButton.addAction(UIAction(handler: { [weak self] _ in
guard let self = self else { return }
self.tab.bridge.darkModeEnabled = !self.tab.bridge.darkModeEnabled
self.toolbarController.darkModeEnabled = self.tab.bridge.darkModeEnabled
toolbarController.darkModeButton.addAction(UIAction(handler: { [tab, toolbarController] _ in
tab.bridge.darkModeEnabled = !tab.bridge.darkModeEnabled
toolbarController.darkModeEnabled = tab.bridge.darkModeEnabled
}), for: .touchUpInside)
// Tabs button
toolbarController.windowButton.addAction(UIAction(handler: { [weak self] _ in
guard let self = self else { return }
toolbarController.windowButton.addAction(UIAction(handler: { [unowned self] _ in
let tabPickerController = TabPickerViewController(tabController: self.tabController)
tabPickerController.delegate = self
tabPickerController.selectedTab = self.tab
@@ -125,14 +157,25 @@ class BrowserViewController: UIViewController, WKNavigationDelegate,
// Load progress
updateLoadProgress(forWebView: webView)
loadingObservation = webView.observe(\.estimatedProgress) { [weak self] (webView, observedChange) in
self?.updateLoadProgress(forWebView: webView)
loadingObservation = webView.observe(\.estimatedProgress) { [unowned self] (webView, observedChange) in
self.updateLoadProgress(forWebView: webView)
}
// Title observer
updateTitleAndURL(forWebView: webView)
titleObservation = webView.observe(\.title, changeHandler: { [weak self] (webView, observedChange) in
self?.updateTitleAndURL(forWebView: webView)
titleObservation = webView.observe(\.title, changeHandler: { [unowned self] (webView, observedChange) in
self.updateTitleAndURL(forWebView: webView)
})
// Back/forward observer
toolbarController.backButton.isEnabled = webView.canGoBack
backButtonObservation = webView.observe(\.canGoBack, changeHandler: { [toolbarController] (webView, observedChange) in
toolbarController.backButton.isEnabled = webView.canGoBack
})
toolbarController.forwardButton.isEnabled = webView.canGoForward
forwardButtonObservation = webView.observe(\.canGoForward, changeHandler: { [toolbarController] (webView, observedChange) in
toolbarController.forwardButton.isEnabled = webView.canGoForward
})
// Script blocker button