Fix crash when opening in new tab

This commit is contained in:
James Magahern
2020-09-24 16:36:31 -07:00
parent d0713b5f11
commit 6e0e2a0f20
5 changed files with 45 additions and 30 deletions

View File

@@ -383,7 +383,7 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? 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) newTab.webView.load(navigationAction.request)
self.tab = newTab self.tab = newTab

View File

@@ -18,7 +18,7 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate
public weak var delegate: TabDelegate? public weak var delegate: TabDelegate?
public let homeURL: URL? public let homeURL: URL?
public let bridge = SBRProcessBundleBridge() public let bridge: SBRProcessBundleBridge
public var webView: WKWebView { public var webView: WKWebView {
if self.loadedWebView == nil { if self.loadedWebView == nil {
self.loadedWebView = bridge.webView self.loadedWebView = bridge.webView
@@ -53,17 +53,19 @@ class Tab: NSObject, SBRProcessBundleBridgeDelegate
private var urlObservation: NSKeyValueObservation? private var urlObservation: NSKeyValueObservation?
convenience init(policyManager: ResourcePolicyManager) { convenience init(policyManager: ResourcePolicyManager) {
self.init(url: nil, policyManager: policyManager) self.init(url: nil, policyManager: policyManager, webViewConfiguration: nil)
} }
convenience init(urlString: String, policyManager: ResourcePolicyManager) { 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.homeURL = url
self.policyManager = policyManager self.policyManager = policyManager
bridge.policyDataSource = policyManager
self.bridge = SBRProcessBundleBridge(webViewConfiguration: webViewConfiguration)
self.bridge.policyDataSource = policyManager
super.init() super.init()

View File

@@ -26,7 +26,11 @@ class TabController
} }
func createNewTab(url: URL?) -> Tab { 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) tabs.append(tab)
return tab return tab

View File

@@ -34,9 +34,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) BOOL webContentProcessConnected; @property (nonatomic, readonly) BOOL webContentProcessConnected;
- (instancetype)initWithWebViewConfiguration:(nullable WKWebViewConfiguration *)webViewConfiguration NS_DESIGNATED_INITIALIZER;
- (void)policyDataSourceDidChange; - (void)policyDataSourceDidChange;
- (void)tearDown; - (void)tearDown;
- (instancetype)init NS_UNAVAILABLE;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -60,32 +60,38 @@
return interface; return interface;
} }
- (WKWebView *)webView - (instancetype)initWithWebViewConfiguration:(WKWebViewConfiguration *)webViewConfiguration
{ {
if (!_webView) { self = [super init];
// Inject bundle if (self) {
_WKProcessPoolConfiguration *poolConfiguration = [[_WKProcessPoolConfiguration alloc] init]; if (!webViewConfiguration) {
NSURL *bundleURL = [[[NSBundle mainBundle] builtInPlugInsURL] URLByAppendingPathComponent:@"SBrowserProcessBundle.bundle"]; webViewConfiguration = [[WKWebViewConfiguration alloc] init];
// Make sure it exists. Bail if otherwise. // Inject bundle
NSBundle *pluginBundle = [NSBundle bundleWithURL:bundleURL]; _WKProcessPoolConfiguration *poolConfiguration = [[_WKProcessPoolConfiguration alloc] init];
NSAssert(pluginBundle != nil, @"Attix process bundle not found at %@", bundleURL.path); NSURL *bundleURL = [[[NSBundle mainBundle] builtInPlugInsURL] URLByAppendingPathComponent:@"SBrowserProcessBundle.bundle"];
[poolConfiguration setInjectedBundleURL:bundleURL]; // 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 // Set up process pool
_processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration]; _processPool = [[WKProcessPool alloc] _initWithConfiguration:poolConfiguration];
// Initialize allowed origins now
NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects];
[_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()];
[_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()];
webViewConfiguration.processPool = _processPool;
}
// Initialize allowed origins now _webViewConfiguration = webViewConfiguration;
NSArray<NSString *> *allowedOrigins = [[_policyDataSource allowedOriginsForScriptResources] allObjects];
[_processPool _setObject:allowedOrigins forBundleParameter:SBRGetAllowedOriginsKey()];
[_processPool _setObject:@(_allowAllScripts) forBundleParameter:SBRGetAllScriptsAllowedKey()];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.processPool = _processPool;
// Instantiate web view // 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) // Configure proxy interface (interface to remote web process)
_webProcessProxy = [[webView _remoteObjectRegistry] remoteObjectProxyWithInterface:[self _webProcessProxyInterface]]; _webProcessProxy = [[webView _remoteObjectRegistry] remoteObjectProxyWithInterface:[self _webProcessProxyInterface]];
@@ -94,10 +100,9 @@
[[webView _remoteObjectRegistry] registerExportedObject:self interface:[self _webProcessDelegateInterface]]; [[webView _remoteObjectRegistry] registerExportedObject:self interface:[self _webProcessDelegateInterface]];
_webView = webView; _webView = webView;
_webViewConfiguration = configuration;
} }
return _webView; return self;
} }
#pragma mark <SBRWebProcessDelegate> #pragma mark <SBRWebProcessDelegate>