Diff
Modified: trunk/Source/WebKit2/ChangeLog (212785 => 212786)
--- trunk/Source/WebKit2/ChangeLog 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/ChangeLog 2017-02-22 01:35:13 UTC (rev 212786)
@@ -1,3 +1,32 @@
+2017-02-21 Brady Eidson <[email protected]>
+
+ Refactor WebViewImpl creation in preparation for supporting multiple WebsiteDataStores.
+ https://bugs.webkit.org/show_bug.cgi?id=168676
+
+ Reviewed by Alex Christensen.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _initializeWithConfiguration:]): Allow for WebViewImpl creation to fail.
+
+ * UIProcess/API/mac/WKView.mm:
+ (-[WKView initWithFrame:processPool:configuration:]): Ditto.
+
+ * UIProcess/Cocoa/WebViewImpl.h:
+ * UIProcess/Cocoa/WebViewImpl.mm:
+ (WebKit::WebViewImpl::maybeCreate):
+ (WebKit::WebViewImpl::WebViewImpl):
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::reattachToWebProcess): New WebProcess creation might fail. Handle it.
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::createNewWebProcess):
+ (WebKit::WebProcessPool::warmInitialProcess):
+ (WebKit::WebProcessPool::maybeCreateNewWebProcessRespectingProcessCountLimit): This can now fail
+ if the process will have a non-default WebsiteDataStore but we've already reached the process cap.
+ (WebKit::WebProcessPool::createWebPage):
+ (WebKit::WebProcessPool::createNewWebProcessRespectingProcessCountLimit): Deleted.
+ * UIProcess/WebProcessPool.h:
+
2017-02-21 Youenn Fablet <[email protected]>
[WebRTC] WebKit2 should assert that libwebrtc transmitted IP addresses family is IP4 or IP6
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2017-02-22 01:35:13 UTC (rev 212786)
@@ -549,7 +549,12 @@
#endif
#if PLATFORM(MAC)
- _impl = std::make_unique<WebKit::WebViewImpl>(self, self, processPool, WTFMove(pageConfiguration));
+ _impl = WebKit::WebViewImpl::maybeCreate(self, self, processPool, WTFMove(pageConfiguration));
+ if (!_impl) {
+ [NSException raise:NSInternalInconsistencyException format:@"WKWebView initialization failed. Unable to create a new WebProcess."];
+ return;
+ }
+
_page = &_impl->page();
_impl->setAutomaticallyAdjustsContentInsets(true);
Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm 2017-02-22 01:35:13 UTC (rev 212786)
@@ -904,8 +904,13 @@
InitializeWebKit2();
_data = [[WKViewData alloc] init];
- _data->_impl = std::make_unique<WebViewImpl>(self, nullptr, processPool, WTFMove(configuration));
+ _data->_impl = WebViewImpl::maybeCreate(self, nullptr, processPool, WTFMove(configuration));
+ if (!_data->_impl) {
+ [NSException raise:NSInternalInconsistencyException format:@"[WKView initWithFrame:processPool:configuration:] failed to create a new WebProcess"];
+ return nil;
+ }
+
[self maybeInstallIconLoadingClient];
return self;
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.h (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.h 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.h 2017-02-22 01:35:13 UTC (rev 212786)
@@ -120,7 +120,7 @@
WTF_MAKE_FAST_ALLOCATED;
WTF_MAKE_NONCOPYABLE(WebViewImpl);
public:
- WebViewImpl(NSView <WebViewImplDelegate> *, WKWebView *outerWebView, WebProcessPool&, Ref<API::PageConfiguration>&&);
+ static std::unique_ptr<WebViewImpl> maybeCreate(NSView <WebViewImplDelegate> *, WKWebView *outerWebView, WebProcessPool&, Ref<API::PageConfiguration>&&);
~WebViewImpl();
@@ -523,6 +523,8 @@
#endif // HAVE(TOUCH_BAR)
private:
+ WebViewImpl(NSView <WebViewImplDelegate> *, std::unique_ptr<PageClientImpl>&&, Ref<WebPageProxy>&&, WebProcessPool&);
+
#if HAVE(TOUCH_BAR)
void setUpTextTouchBar(NSTouchBar *);
void updateTextTouchBar();
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm 2017-02-22 01:35:13 UTC (rev 212786)
@@ -1229,10 +1229,20 @@
return options;
}
-WebViewImpl::WebViewImpl(NSView <WebViewImplDelegate> *view, WKWebView *outerWebView, WebProcessPool& processPool, Ref<API::PageConfiguration>&& configuration)
+std::unique_ptr<WebViewImpl> WebViewImpl::maybeCreate(NSView <WebViewImplDelegate> *view, WKWebView *outerWebView, WebProcessPool& processPool, Ref<API::PageConfiguration>&& configuration)
+{
+ auto pageClient = std::make_unique<PageClientImpl>(view, outerWebView);
+ auto webPage = processPool.createWebPage(*pageClient, WTFMove(configuration));
+ if (!webPage)
+ return nullptr;
+
+ return std::unique_ptr<WebViewImpl>(new WebViewImpl(view, WTFMove(pageClient), *webPage, processPool));
+}
+
+WebViewImpl::WebViewImpl(NSView <WebViewImplDelegate> *view, std::unique_ptr<PageClientImpl>&& pageClient, Ref<WebPageProxy>&& page, WebProcessPool& processPool)
: m_view(view)
- , m_pageClient(std::make_unique<PageClientImpl>(view, outerWebView))
- , m_page(processPool.createWebPage(*m_pageClient, WTFMove(configuration)))
+ , m_pageClient(WTFMove(pageClient))
+ , m_page(WTFMove(page))
, m_weakPtrFactory(this)
, m_needsViewFrameInWindowCoordinates(m_page->preferences().pluginsEnabled())
, m_intrinsicContentSize(CGSizeMake(NSViewNoInstrinsicMetric, NSViewNoInstrinsicMetric))
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2017-02-22 01:35:13 UTC (rev 212786)
@@ -716,8 +716,13 @@
m_process->removeWebPage(m_pageID);
m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID);
- m_process = m_process->processPool().createNewWebProcessRespectingProcessCountLimit();
+ auto* newProcess = m_process->processPool().maybeCreateNewWebProcessRespectingProcessCountLimit(m_websiteDataStore.ptr());
+ if (!newProcess) {
+ WTFLogAlways("Couldn't reattach to a new web process");
+ return;
+ }
+ m_process = *newProcess;
ASSERT(m_process->state() != ChildProcessProxy::State::Terminated);
if (m_process->state() == ChildProcessProxy::State::Running)
processDidFinishLaunching();
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2017-02-22 01:35:13 UTC (rev 212786)
@@ -557,7 +557,7 @@
platformResolvePathsForSandboxExtensions();
}
-WebProcessProxy& WebProcessPool::createNewWebProcess()
+WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore* websiteDataStore)
{
ensureNetworkProcess();
@@ -693,7 +693,7 @@
if (m_processes.size() >= maximumNumberOfProcesses())
return;
- createNewWebProcess();
+ createNewWebProcess(nullptr);
m_haveInitialEmptyProcess = true;
}
@@ -769,20 +769,25 @@
#endif
}
-WebProcessProxy& WebProcessPool::createNewWebProcessRespectingProcessCountLimit()
+WebProcessProxy* WebProcessPool::maybeCreateNewWebProcessRespectingProcessCountLimit(WebsiteDataStore* websiteDataStore)
{
if (m_processes.size() < maximumNumberOfProcesses())
- return createNewWebProcess();
+ return &createNewWebProcess(websiteDataStore);
+ // If a non-default WebsiteDataStore was passed in and we couldn't make a new web process for it,
+ // we should not return an existing process.
+ if (websiteDataStore && websiteDataStore != &API::WebsiteDataStore::defaultDataStore()->websiteDataStore())
+ return nullptr;
+
// Choose the process with fewest pages.
auto& process = *std::min_element(m_processes.begin(), m_processes.end(), [](const RefPtr<WebProcessProxy>& a, const RefPtr<WebProcessProxy>& b) {
return a->pageCount() < b->pageCount();
});
- return *process;
+ return process.get();
}
-Ref<WebPageProxy> WebProcessPool::createWebPage(PageClient& pageClient, Ref<API::PageConfiguration>&& pageConfiguration)
+RefPtr<WebPageProxy> WebProcessPool::createWebPage(PageClient& pageClient, Ref<API::PageConfiguration>&& pageConfiguration)
{
if (!pageConfiguration->pageGroup())
pageConfiguration->setPageGroup(m_defaultPageGroup.ptr());
@@ -792,7 +797,9 @@
pageConfiguration->setUserContentController(&pageConfiguration->pageGroup()->userContentController());
if (!pageConfiguration->visitedLinkStore())
pageConfiguration->setVisitedLinkStore(m_visitedLinkStore.ptr());
- if (!pageConfiguration->websiteDataStore()) {
+
+ bool pageHasWebsiteDataStore = pageConfiguration->websiteDataStore();
+ if (!pageHasWebsiteDataStore) {
ASSERT(!pageConfiguration->sessionID().isValid());
pageConfiguration->setWebsiteDataStore(m_websiteDataStore.get());
pageConfiguration->setSessionID(pageConfiguration->preferences()->privateBrowsingEnabled() ? SessionID::legacyPrivateSessionID() : SessionID::defaultSessionID());
@@ -799,7 +806,7 @@
}
RefPtr<WebProcessProxy> process;
- if (m_haveInitialEmptyProcess) {
+ if (m_haveInitialEmptyProcess && !pageHasWebsiteDataStore) {
process = m_processes.last();
m_haveInitialEmptyProcess = false;
} else if (pageConfiguration->relatedPage()) {
@@ -806,7 +813,7 @@
// Sharing processes, e.g. when creating the page via window.open().
process = &pageConfiguration->relatedPage()->process();
} else
- process = &createNewWebProcessRespectingProcessCountLimit();
+ process = maybeCreateNewWebProcessRespectingProcessCountLimit(&pageConfiguration->websiteDataStore()->websiteDataStore());
return process->createWebPage(pageClient, WTFMove(pageConfiguration));
}
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (212785 => 212786)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2017-02-22 01:20:15 UTC (rev 212785)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2017-02-22 01:35:13 UTC (rev 212786)
@@ -170,7 +170,7 @@
API::WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); }
- Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&);
+ RefPtr<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&);
const String& injectedBundlePath() const { return m_configuration->injectedBundlePath(); }
@@ -258,7 +258,7 @@
void allowSpecificHTTPSCertificateForHost(const WebCertificateInfo*, const String& host);
- WebProcessProxy& createNewWebProcessRespectingProcessCountLimit(); // Will return an existing one if limit is met.
+ WebProcessProxy* maybeCreateNewWebProcessRespectingProcessCountLimit(WebsiteDataStore*); // Will return an existing one if limit is met.
void warmInitialProcess();
bool shouldTerminate(WebProcessProxy*);
@@ -397,7 +397,7 @@
void platformInitializeWebProcess(WebProcessCreationParameters&);
void platformInvalidateContext();
- WebProcessProxy& createNewWebProcess();
+ WebProcessProxy& createNewWebProcess(WebsiteDataStore*);
void requestWebContentStatistics(StatisticsRequest*);
void requestNetworkingStatistics(StatisticsRequest*);