diff --git a/App/Browser View/BrowserViewController.swift b/App/Browser View/BrowserViewController.swift index 3dc7969..4917f7a 100644 --- a/App/Browser View/BrowserViewController.swift +++ b/App/Browser View/BrowserViewController.swift @@ -38,6 +38,8 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat private var loadError: Error? + private var commandKeyHeld: Bool = false + override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } init() { @@ -324,6 +326,32 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat toolbarController.traitCollectionDidChange(previousTraitCollection) } + private func updateCommandKeyState(forPresses presses: Set) { + guard let press = presses.first else { return } + + if let key = press.key { + if key.modifierFlags == [.command] { + let isDown = press.phase == .began || press.phase == .changed || press.phase == .stationary + self.commandKeyHeld = isDown + } + } + } + + override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { + super.pressesBegan(presses, with: event) + updateCommandKeyState(forPresses: presses) + } + + override func pressesCancelled(_ presses: Set, with event: UIPressesEvent?) { + super.pressesCancelled(presses, with: event) + updateCommandKeyState(forPresses: presses) + } + + override func pressesEnded(_ presses: Set, with event: UIPressesEvent?) { + super.pressesEnded(presses, with: event) + updateCommandKeyState(forPresses: presses) + } + private func updateScriptBlockerButton() { var numBlockedScripts: Int = tab.blockedScriptOrigins.count if tab.url != nil, tab.javaScriptEnabled == false { @@ -411,6 +439,21 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { + // Handle command+click + if commandKeyHeld { + // Cancel navigation in this tab + decisionHandler(.cancel, preferences) + + // Start navigation in a new tab + let tab = tabController.createNewTab(url: navigationAction.request.url) + self.tab = tab + + // Reset this flag. + commandKeyHeld = false + + return + } + var allowJavaScript = tab.javaScriptEnabled if !allowJavaScript, let host = navigationAction.request.url?.host { // Check origin policy