Port web view navigation over for the mac app

This commit is contained in:
Maurice Parker
2020-07-15 12:41:49 -05:00
parent 31068f90a0
commit 160b0476f7
3 changed files with 89 additions and 3 deletions

View File

@@ -0,0 +1,65 @@
//
// Browser.swift
// Evergren
//
// Created by Brent Simmons on 2/23/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
//
import Foundation
import RSWeb
struct Browser {
/// The user-specified default browser for opening web pages.
///
/// The user-assigned default browser, or `nil` if none was assigned
/// (i.e., the system default should be used).
static var defaultBrowser: MacWebBrowser? {
if let bundleID = AppDefaults.shared.defaultBrowserID, let browser = MacWebBrowser(bundleIdentifier: bundleID) {
return browser
}
return nil
}
/// Opens a URL in the default browser.
///
/// - Parameters:
/// - urlString: The URL to open.
/// - invert: Whether to invert the "open in background in browser" preference
static func open(_ urlString: String, invertPreference invert: Bool = false) {
// Opens according to prefs.
open(urlString, inBackground: invert ? !AppDefaults.shared.openInBrowserInBackground : AppDefaults.shared.openInBrowserInBackground)
}
/// Opens a URL in the default browser.
///
/// - Parameters:
/// - urlString: The URL to open.
/// - inBackground: Whether to open the URL in the background or not.
/// - Note: Some browsers (specifically Chromium-derived ones) will ignore the request
/// to open in the background.
static func open(_ urlString: String, inBackground: Bool) {
if let url = URL(string: urlString) {
if let defaultBrowser = defaultBrowser {
defaultBrowser.openURL(url, inBackground: inBackground)
} else {
MacWebBrowser.openURL(url, inBackground: inBackground)
}
}
}
}
extension Browser {
static var titleForOpenInBrowserInverted: String {
let openInBackgroundPref = AppDefaults.shared.openInBrowserInBackground
return openInBackgroundPref ?
NSLocalizedString("Open in Browser in Foreground", comment: "Open in Browser in Foreground menu item title") :
NSLocalizedString("Open in Browser in Background", comment: "Open in Browser in Background menu item title")
}
}

View File

@@ -6,9 +6,6 @@
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import AppKit
import Articles
import AppKit
import RSCore
import Articles
@@ -207,6 +204,24 @@ extension WebViewController: WKScriptMessageHandler {
}
extension WebViewController: WKNavigationDelegate {
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
if let url = navigationAction.request.url {
let flags = navigationAction.modifierFlags
let invert = flags.contains(.shift) || flags.contains(.command)
Browser.open(url.absoluteString, invertPreference: invert)
}
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
}
// MARK: Private
private extension WebViewController {
@@ -228,6 +243,8 @@ private extension WebViewController {
self.view.topAnchor.constraint(equalTo: webView.topAnchor),
self.view.bottomAnchor.constraint(equalTo: webView.bottomAnchor)
])
webView.navigationDelegate = self
webView.configuration.userContentController.add(WrapperScriptMessageHandler(self), name: MessageName.imageWasClicked)
webView.configuration.userContentController.add(WrapperScriptMessageHandler(self), name: MessageName.imageWasShown)