Title: [212786] trunk/Source/WebKit2
Revision
212786
Author
[email protected]
Date
2017-02-21 17:35:13 -0800 (Tue, 21 Feb 2017)

Log Message

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:

Modified Paths

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*);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to