Script blocking UI works now

This commit is contained in:
James Magahern
2020-07-24 19:26:35 -07:00
parent 125c7f8991
commit 37eeeacc85
16 changed files with 619 additions and 34 deletions

View File

@@ -7,59 +7,114 @@
import UIKit
class BrowserViewController: UIViewController, SBRProcessBundleBridgeDelegate
class BrowserViewController: UIViewController,
SBRProcessBundleBridgeDelegate, WKNavigationDelegate,
UITextFieldDelegate, ScriptPolicyViewControllerDelegate
{
let bridge = SBRProcessBundleBridge()
let browserView = BrowserView()
private let policyManager = ResourcePolicyManager()
private let toolbarController = ToolbarViewController()
private var blockedScriptOrigins = Set<String>()
private var scriptBlockerButtonItem: UIBarButtonItem
override var canBecomeFirstResponder: Bool { true }
init()
{
scriptBlockerButtonItem = UIBarButtonItem(title: "0", image: nil, primaryAction: UIAction(handler: { action in
// present
}), menu: nil)
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
override func loadView()
{
override func loadView() {
bridge.delegate = self
bridge.policyDataSource = policyManager
let webView = bridge.webView
webView.allowsBackForwardNavigationGestures = true
webView.navigationDelegate = self
browserView.webView = webView
browserView.toolbarView = toolbarController.toolbarView
// Refresh button
toolbarController.urlBar.refreshButton.addAction(UIAction(handler: { action in
webView.reload()
}), for: .touchUpInside)
// Script button
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { action in
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager, blockedScripts: self.blockedScriptOrigins)
scriptViewController.delegate = self
let navController = UINavigationController(rootViewController: scriptViewController)
self.present(navController, animated: true, completion: nil)
}), for: .touchUpInside)
// TextField delegate
toolbarController.urlBar.textField.delegate = self
self.view = browserView
}
override func viewDidLoad()
{
let request = URLRequest(url: URL(string: "https://yahoo.com")!)
browserView.webView?.load(request)
setToolbarItems([ scriptBlockerButtonItem ], animated: false)
override func viewDidLoad() {
beginLoadingURL(URL(string: "https://reddit.com")!)
}
private func updateScriptBlockerButton()
{
scriptBlockerButtonItem.title = "\(blockedScriptOrigins.count)"
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
becomeFirstResponder()
}
private func updateScriptBlockerButton() {
toolbarController.scriptControllerIconView.setBlockedScriptsNumber(blockedScriptOrigins.count)
}
func beginLoadingURL(_ url: URL) {
let request = URLRequest(url: url)
bridge.webView.load(request)
}
// MARK: SBRProcessBundleBridgeDelegate
func webProcess(_ bridge: SBRProcessBundleBridge, didBlockScriptResourceFromOrigin origin: String)
{
func webProcess(_ bridge: SBRProcessBundleBridge, didBlockScriptResourceFromOrigin origin: String) {
print("Blocked script resource from origin: \(origin)")
blockedScriptOrigins.formUnion([ origin ])
updateScriptBlockerButton()
}
// MARK: Navigation Delegate
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
// Reset tracking this
blockedScriptOrigins.removeAll()
if let urlString = webView.url?.absoluteString {
toolbarController.urlBar.textField.text = urlString
}
}
// MARK: UITextField Delegate
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if let text = textField.text, let url = URL(string: text) {
if url.scheme == nil {
let urlString = "https://\(text)"
if let url = URL(string: urlString) {
beginLoadingURL(url)
}
}
}
textField.resignFirstResponder()
return false
}
// MARK: Script Policy View Controller Delegate
func didChangeScriptPolicy() {
bridge.policyDataSourceDidChange()
bridge.webView.reload()
}
}