diff --git a/App/Browser View/BrowserViewController.swift b/App/Browser View/BrowserViewController.swift index ce2031e..b66e192 100644 --- a/App/Browser View/BrowserViewController.swift +++ b/App/Browser View/BrowserViewController.swift @@ -383,7 +383,7 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { - let newTab = tabController.createNewTab(url: nil) + let newTab = tabController.createNewTab(url: nil, webViewConfiguration: configuration) newTab.webView.load(navigationAction.request) self.tab = newTab diff --git a/App/Tabs/Tab.swift b/App/Tabs/Tab.swift index 4081c2f..f6f0187 100644 --- a/App/Tabs/Tab.swift +++ b/App/Tabs/Tab.swift @@ -18,7 +18,7 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate public weak var delegate: TabDelegate? public let homeURL: URL? - public let bridge = SBRProcessBundleBridge() + public let bridge: SBRProcessBundleBridge public var webView: WKWebView { if self.loadedWebView == nil { self.loadedWebView = bridge.webView @@ -53,17 +53,19 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate private var urlObservation: NSKeyValueObservation? convenience init(policyManager: ResourcePolicyManager) { - self.init(url: nil, policyManager: policyManager) + self.init(url: nil, policyManager: policyManager, webViewConfiguration: nil) } convenience init(urlString: String, policyManager: ResourcePolicyManager) { - self.init(url: URL(string: urlString), policyManager: policyManager) + self.init(url: URL(string: urlString), policyManager: policyManager, webViewConfiguration: nil) } - init(url: URL?, policyManager: ResourcePolicyManager) { + init(url: URL?, policyManager: ResourcePolicyManager, webViewConfiguration: WKWebViewConfiguration?) { self.homeURL = url self.policyManager = policyManager - bridge.policyDataSource = policyManager + + self.bridge = SBRProcessBundleBridge(webViewConfiguration: webViewConfiguration) + self.bridge.policyDataSource = policyManager super.init() diff --git a/App/Tabs/TabController.swift b/App/Tabs/TabController.swift index 60ad090..52dd225 100644 --- a/App/Tabs/TabController.swift +++ b/App/Tabs/TabController.swift @@ -26,7 +26,11 @@ class TabController } func createNewTab(url: URL?) -> Tab { - let tab = Tab(url: url, policyManager: policyManager) + return self.createNewTab(url: url, webViewConfiguration: nil) + } + + func createNewTab(url: URL?, webViewConfiguration: WKWebViewConfiguration?) -> Tab { + let tab = Tab(url: url, policyManager: policyManager, webViewConfiguration: webViewConfiguration) tabs.append(tab) return tab diff --git a/App/Web Process Bundle Bridge/SBRProcessBundleBridge.h b/App/Web Process Bundle Bridge/SBRProcessBundleBridge.h index 11146cf..32bc70c 100644 --- a/App/Web Process Bundle Bridge/SBRProcessBundleBridge.h +++ b/App/Web Process Bundle Bridge/SBRProcessBundleBridge.h @@ -34,9 +34,13 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) BOOL webContentProcessConnected; +- (instancetype)initWithWebViewConfiguration:(nullable WKWebViewConfiguration *)webViewConfiguration NS_DESIGNATED_INITIALIZER; + - (void)policyDataSourceDidChange; - (void)tearDown; +- (instancetype)init NS_UNAVAILABLE; + @end NS_ASSUME_NONNULL_END diff --git a/App/Web Process Bundle Bridge/SBRProcessBundleBridge.m b/App/Web Process Bundle Bridge/SBRProcessBundleBridge.m index 745dc0d..7f71335 100644 --- a/App/Web Process Bundle Bridge/SBRProcessBundleBridge.m +++ b/App/Web Process Bundle Bridge/SBRProcessBundleBridge.m @@ -60,32 +60,38 @@ return interface; } -- (WKWebView *)webView +- (instancetype)initWithWebViewConfiguration:(WKWebViewConfiguration *)webViewConfiguration { - if (!_webView) { - // Inject bundle - _WKProcessPoolConfiguration *poolConfiguration = [[_WKProcessPoolConfiguration alloc] init]; - NSURL *bundleURL = [[[NSBundle mainBundle] builtInPlugInsURL] URLByAppendingPathComponent:@"SBrowserProcessBundle.bundle"]; - - // Make sure it exists. Bail if otherwise. - NSBundle *pluginBundle = [NSBundle bundleWithURL:bundleURL]; - NSAssert(pluginBundle != nil, @"Attix process bundle not found at %@", bundleURL.path); - - [poolConfiguration setInjectedBundleURL:bundleURL]; + self = [super init]; + if (self) { + if (!webViewConfiguration) { + webViewConfiguration = [[WKWebViewConfiguration alloc] init]; + + // Inject bundle + _WKProcessPoolConfiguration *poolConfiguration = [[_WKProcessPoolConfiguration alloc] init]; + NSURL *bundleURL = [[[NSBundle mainBundle] builtInPlugInsURL] URLByAppendingPathComponent:@"SBrowserProcessBundle.bundle"]; + + // Make sure it exists. Bail if otherwise. + NSBundle *pluginBundle = [NSBundle bundleWithURL:bundleURL]; + NSAssert(pluginBundle != nil, @"Attix process bundle not found at %@", bundleURL.path); + + [poolConfiguration setInjectedBundleURL:bundleURL]; - // Set up process pool - _processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; + // Set up process pool + _processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; + + // Initialize allowed origins now + NSArray *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; + [_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; + [_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; + + webViewConfiguration.processPool = _processPool; + } - // Initialize allowed origins now - NSArray *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects]; - [_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()]; - [_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()]; - - WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; - configuration.processPool = _processPool; + _webViewConfiguration = webViewConfiguration; // Instantiate web view - WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfiguration]; // Configure proxy interface (interface to remote web process) _webProcessProxy = [[webView _remoteObjectRegistry] remoteObjectProxyWithInterface:[self _webProcessProxyInterface]]; @@ -94,10 +100,9 @@ [[webView _remoteObjectRegistry] registerExportedObject:self interface:[self _webProcessDelegateInterface]]; _webView = webView; - _webViewConfiguration = configuration; } - return _webView; + return self; } #pragma mark