Script origins control inline policy, all scripts allowed for tab
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user