Script origins control inline policy, all scripts allowed for tab

This commit is contained in:
James Magahern
2020-07-29 17:46:53 -07:00
parent f330293606
commit 32cdcf71f7
14 changed files with 301 additions and 57 deletions

View File

@@ -14,8 +14,11 @@ class BrowserViewController: UIViewController,
let bridge = SBRProcessBundleBridge()
let browserView = BrowserView()
var javaScriptEnabledForTab: Bool = false
private let policyManager = ResourcePolicyManager()
private let toolbarController = ToolbarViewController()
private var allowedScriptOrigins = Set<String>()
private var blockedScriptOrigins = Set<String>()
override var canBecomeFirstResponder: Bool { true }
@@ -52,8 +55,11 @@ class BrowserViewController: UIViewController,
// Script button
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { action in
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager, blockedScripts: self.blockedScriptOrigins)
let hostOrigin = webView.url?.host ?? ""
let loadedScripts = self.allowedScriptOrigins.union(self.blockedScriptOrigins)
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager, hostOrigin: hostOrigin, loadedScripts: loadedScripts)
scriptViewController.delegate = self
scriptViewController.allowScriptsForTab = self.javaScriptEnabledForTab
let navController = UINavigationController(rootViewController: scriptViewController)
self.present(navController, animated: true, completion: nil)
@@ -64,7 +70,11 @@ class BrowserViewController: UIViewController,
// Load progress
loadingObservation = webView.observe(\.estimatedProgress) { (webView, observedChange) in
self.toolbarController.urlBar.loadProgress = .loading(progress: webView.estimatedProgress)
if webView.estimatedProgress == 1.0 {
self.toolbarController.urlBar.loadProgress = .complete
} else {
self.toolbarController.urlBar.loadProgress = .loading(progress: webView.estimatedProgress)
}
}
// Title observer
@@ -76,7 +86,7 @@ class BrowserViewController: UIViewController,
}
override func viewDidLoad() {
beginLoadingURL(URL(string: "https://reddit.com")!)
beginLoadingURL(URL(string: "https://google.com")!)
}
override func viewWillAppear(_ animated: Bool) {
@@ -95,9 +105,14 @@ class BrowserViewController: UIViewController,
// MARK: SBRProcessBundleBridgeDelegate
func webProcess(_ bridge: SBRProcessBundleBridge, didAllowScriptResourceFromOrigin origin: String) {
print("Allowed script resource from origin: \(origin)")
allowedScriptOrigins.formUnion([ origin ])
updateScriptBlockerButton()
}
func webProcess(_ bridge: SBRProcessBundleBridge, didBlockScriptResourceFromOrigin origin: String) {
print("Blocked script resource from origin: \(origin)")
blockedScriptOrigins.formUnion([ origin ])
updateScriptBlockerButton()
}
@@ -117,6 +132,18 @@ class BrowserViewController: UIViewController,
toolbarController.urlBar.loadProgress = .complete
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void)
{
var allowJavaScript = javaScriptEnabledForTab
if !allowJavaScript, let host = navigationAction.request.url?.host {
// Check origin policy
allowJavaScript = policyManager.allowedOriginsForScriptResources().contains(host)
}
preferences.allowsContentJavaScript = allowJavaScript
decisionHandler(.allow, preferences)
}
// MARK: UITextField Delegate
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
@@ -140,4 +167,9 @@ class BrowserViewController: UIViewController,
bridge.webView.reload()
}
func setScriptsEnabledForTab(_ enabled: Bool) {
javaScriptEnabledForTab = enabled
bridge.allowAllScripts = enabled
}
}