WebKit Bugzilla
Attachment 373357 Details for
Bug 199418
: Protect NetworkProcess::m_networkSessions against corruption
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-199418-20190702135006.patch (text/plain), 40.65 KB, created by
Chris Dumez
on 2019-07-02 13:50:07 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2019-07-02 13:50:07 PDT
Size:
40.65 KB
patch
obsolete
>Subversion Revision: 247051 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 4f5f1673c31f087694cc030bacb23e9bc03a78cb..7378c06294ebfb60810d340357a61510eb64a427 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,68 @@ >+2019-07-02 Chris Dumez <cdumez@apple.com> >+ >+ Simplify logic that handles registering WebProcessProxy objects with their WebsiteDataStore >+ https://bugs.webkit.org/show_bug.cgi?id=199412 >+ <rdar://problem/51899751> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Simplify logic that handles registering WebProcessProxy objects with their WebsiteDataStore to make >+ it more maintainable and less error-prone (avoid bugs like <rdar://problem/51899751>). >+ >+ The following changes were made: >+ 1. The WebProcess now registers / unregisters itself directly with its WebsiteDataStore when needed, >+ instead of having the WebPageProxy/ProvisionalPageProxy be in charge of calling the right >+ WebProcessLifetimeTracker / WebProcessLifetimeObserver abstractions. >+ 2. The WebProcessLifetimeTracker / WebProcessLifetimeObserver abstractions were dropped. The >+ WebsiteDataStore was the only observer. >+ 3. The WebProcessProxy is now registered with its WebsiteDataStore as soon as it has a page (provisional >+ or not) instead of waiting until the process has finished launching. This simplifies the logic a >+ lot and waiting until the process has launched is not needed by the WebsiteDataStore. >+ >+ >+ * Sources.txt: >+ * UIProcess/ProvisionalPageProxy.cpp: >+ (WebKit::ProvisionalPageProxy::ProvisionalPageProxy): >+ (WebKit::ProvisionalPageProxy::~ProvisionalPageProxy): >+ * UIProcess/ProvisionalPageProxy.h: >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::m_resetRecentCrashCountTimer): >+ (WebKit::WebPageProxy::finishAttachingToWebProcess): >+ (WebKit::WebPageProxy::close): >+ (WebKit::WebPageProxy::processDidTerminate): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebProcessCache.cpp: >+ (WebKit::WebProcessCache::CachedProcess::CachedProcess): >+ * UIProcess/WebProcessLifetimeObserver.cpp: Removed. >+ * UIProcess/WebProcessLifetimeObserver.h: Removed. >+ * UIProcess/WebProcessLifetimeTracker.cpp: Removed. >+ * UIProcess/WebProcessLifetimeTracker.h: Removed. >+ * UIProcess/WebProcessProxy.cpp: >+ (WebKit::WebProcessProxy::setWebsiteDataStore): >+ (WebKit::WebProcessProxy::updateRegistrationWithDataStore): >+ (WebKit::WebProcessProxy::addProvisionalPageProxy): >+ (WebKit::WebProcessProxy::removeProvisionalPageProxy): >+ (WebKit::WebProcessProxy::connectionWillOpen): >+ (WebKit::WebProcessProxy::processWillShutDown): >+ (WebKit::WebProcessProxy::addExistingWebPage): >+ (WebKit::WebProcessProxy::removeWebPage): >+ * UIProcess/WebProcessProxy.h: >+ * UIProcess/WebsiteData/WebsiteDataStore.cpp: >+ (WebKit::WebsiteDataStore::registerProcess): >+ (WebKit::WebsiteDataStore::unregisterProcess): >+ >+ (WebKit::WebsiteDataStore::processPoolForCookieStorageOperations): >+ Drop change that was added in r246097 to work around the fact that WebProcessProxy objects >+ were only registering themselves with their data store after their process had finished >+ launching. >+ >+ (WebKit::WebsiteDataStore::fetchDataAndApply): >+ (WebKit::WebsiteDataStore::removeData): >+ (WebKit::WebsiteDataStore::processPools const): >+ * UIProcess/WebsiteData/WebsiteDataStore.h: >+ (WebKit::WebsiteDataStore::processes const): >+ * WebKit.xcodeproj/project.pbxproj: >+ > 2019-07-02 Chris Dumez <cdumez@apple.com> > > VisitedLinkStore does not need to subclass WebProcessLifetimeObserver >diff --git a/Source/WebKit/Sources.txt b/Source/WebKit/Sources.txt >index 7d25ed4d0bd864052fd47d253afc9aa26b35d461..1b75d7a040b183e3777d88cc54840a10dd064b61 100644 >--- a/Source/WebKit/Sources.txt >+++ b/Source/WebKit/Sources.txt >@@ -290,8 +290,6 @@ UIProcess/WebPageProxy.cpp > UIProcess/WebPasteboardProxy.cpp > UIProcess/WebPreferences.cpp > UIProcess/WebProcessCache.cpp >-UIProcess/WebProcessLifetimeObserver.cpp >-UIProcess/WebProcessLifetimeTracker.cpp > UIProcess/WebProcessPool.cpp > UIProcess/WebProcessProxy.cpp > UIProcess/WebURLSchemeHandler.cpp >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >index ad4bd5b9e31c584a74bb64f950969536de0df58f..91b2462d712760a14f18e6b52f6803b6eeb6eb2e 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >@@ -68,9 +68,6 @@ ProvisionalPageProxy::ProvisionalPageProxy(WebPageProxy& page, Ref<WebProcessPro > m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID(), *this); > m_process->addProvisionalPageProxy(*this); > >- if (m_process->state() == AuxiliaryProcessProxy::State::Running) >- m_page.webProcessLifetimeTracker().webPageEnteringWebProcess(m_process); >- > if (&m_process->websiteDataStore() != &m_page.websiteDataStore()) > m_process->processPool().pageBeginUsingWebsiteDataStore(m_page.pageID(), m_process->websiteDataStore()); > >@@ -95,9 +92,6 @@ ProvisionalPageProxy::~ProvisionalPageProxy() > if (m_wasCommitted) > return; > >- if (m_process->state() == AuxiliaryProcessProxy::State::Running) >- m_page.webProcessLifetimeTracker().webPageLeavingWebProcess(m_process); >- > if (&m_process->websiteDataStore() != &m_page.websiteDataStore()) > m_process->processPool().pageEndUsingWebsiteDataStore(m_page.pageID(), m_process->websiteDataStore()); > >@@ -110,13 +104,6 @@ ProvisionalPageProxy::~ProvisionalPageProxy() > }); > } > >-void ProvisionalPageProxy::connectionWillOpen(IPC::Connection& connection) >-{ >- ASSERT_UNUSED(connection, &connection == m_process->connection()); >- >- m_page.webProcessLifetimeTracker().webPageEnteringWebProcess(m_process); >-} >- > void ProvisionalPageProxy::processDidTerminate() > { > RELEASE_LOG_ERROR_IF_ALLOWED(ProcessSwapping, "processDidTerminate: pageID = %" PRIu64, m_page.pageID().toUInt64()); >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.h b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >index 65afb86b8102e4dc64f4894f12c931cda36397dd..333216a2cc78566716324ab06ff1b3b96080c0be 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.h >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >@@ -86,7 +86,6 @@ public: > void cancel(); > > void processDidTerminate(); >- void connectionWillOpen(IPC::Connection&); > > private: > // IPC::MessageReceiver >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index 0635a6d0be7e5793da06e03a1ef4a68a50ec7266..0ffb9b75191d7da0c9e2eabf8de55f5511d0a05d 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -445,8 +445,6 @@ WebPageProxy::WebPageProxy(PageClient& pageClient, WebProcessProxy& process, Pag > if (!m_configuration->drawsBackground()) > m_backgroundColor = Color(Color::transparent); > >- m_webProcessLifetimeTracker.addObserver(m_websiteDataStore); >- > updateActivityState(); > updateThrottleState(); > updateHiddenPageThrottlingAutoIncreases(); >@@ -810,13 +808,6 @@ void WebPageProxy::finishAttachingToWebProcess(IsProcessSwap isProcessSwap) > { > ASSERT(m_process->state() != AuxiliaryProcessProxy::State::Terminated); > >- if (m_process->state() == AuxiliaryProcessProxy::State::Running) { >- // In the process-swap case, the ProvisionalPageProxy constructor already took care of calling webPageEnteringWebProcess() >- // when the process was provisional. >- if (isProcessSwap != IsProcessSwap::Yes) >- m_webProcessLifetimeTracker.webPageEnteringWebProcess(m_process); >- } >- > updateActivityState(); > updateThrottleState(); > >@@ -1010,8 +1001,6 @@ void WebPageProxy::close() > m_fullscreenClient = std::make_unique<API::FullscreenClient>(); > #endif > >- m_webProcessLifetimeTracker.pageWasInvalidated(); >- > m_process->processPool().removeAllSuspendedPagesForPage(*this); > > m_process->send(Messages::WebPage::Close(), m_pageID); >@@ -5195,18 +5184,6 @@ void WebPageProxy::mouseDidMoveOverElement(WebHitTestResultData&& hitTestResultD > m_uiClient->mouseDidMoveOverElement(*this, hitTestResultData, modifiers, m_process->transformHandlesToObjects(userData.object()).get()); > } > >-void WebPageProxy::connectionWillOpen(IPC::Connection& connection) >-{ >- ASSERT_UNUSED(connection, &connection == m_process->connection()); >- >- m_webProcessLifetimeTracker.webPageEnteringWebProcess(m_process); >-} >- >-void WebPageProxy::webProcessWillShutDown() >-{ >- m_webProcessLifetimeTracker.webPageLeavingWebProcess(m_process); >-} >- > #if ENABLE(NETSCAPE_PLUGIN_API) > void WebPageProxy::unavailablePluginButtonClicked(uint32_t opaquePluginUnavailabilityReason, const String& mimeType, const String& pluginURLString, const String& pluginspageAttributeURLString, const String& frameURLString, const String& pageURLString) > { >@@ -6830,9 +6807,7 @@ void WebPageProxy::processDidTerminate(ProcessTerminationReason reason) > // For bringup of process swapping, NavigationSwap termination will not go out to clients. > // If it does *during* process swapping, and the client triggers a reload, that causes bizarre WebKit re-entry. > // FIXME: This might have to change >- if (reason == ProcessTerminationReason::NavigationSwap) >- m_webProcessLifetimeTracker.webPageLeavingWebProcess(m_process); >- else { >+ if (reason != ProcessTerminationReason::NavigationSwap) { > navigationState().clearAllNavigations(); > dispatchProcessDidTerminate(reason); > } >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index a19ee09649d4a737e889b2765b6c834d13b28a96..60c5c5167350f0a292b9d8c34bbefa218fd9b243 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -64,7 +64,6 @@ > #include "WebPreferences.h" > #include "WebPageProxyMessages.h" > #include "WebPopupMenuProxy.h" >-#include "WebProcessLifetimeTracker.h" > #include "WebUndoStepID.h" > #include "WebsitePoliciesData.h" > #include <WebCore/ActivityState.h> >@@ -409,8 +408,6 @@ public: > > void addPreviouslyVisitedPath(const String&); > >- WebProcessLifetimeTracker& webProcessLifetimeTracker() { return m_webProcessLifetimeTracker; } >- > #if ENABLE(DATA_DETECTION) > NSArray *dataDetectionResults() { return m_dataDetectionResults.get(); } > void detectDataInAllFrames(WebCore::DataDetectorTypes, CompletionHandler<void(const DataDetectionResult&)>&&); >@@ -1255,9 +1252,6 @@ public: > void didFinishCheckingText(uint64_t requestID, const Vector<WebCore::TextCheckingResult>&); > void didCancelCheckingText(uint64_t requestID); > >- void connectionWillOpen(IPC::Connection&); >- void webProcessWillShutDown(); >- > void didSaveToPageCache(); > > void setScrollPinningBehavior(WebCore::ScrollPinningBehavior); >@@ -2135,8 +2129,6 @@ private: > Ref<WebPageGroup> m_pageGroup; > Ref<WebPreferences> m_preferences; > >- WebProcessLifetimeTracker m_webProcessLifetimeTracker { *this }; >- > Ref<WebUserContentControllerProxy> m_userContentController; > Ref<VisitedLinkStore> m_visitedLinkStore; > Ref<WebsiteDataStore> m_websiteDataStore; >diff --git a/Source/WebKit/UIProcess/WebProcessCache.cpp b/Source/WebKit/UIProcess/WebProcessCache.cpp >index cbfb0ab7563a161c451e6f3786b129bba6afa048..8bdf8cf8388cdc7bfacff2b7e605d0a818daac64 100644 >--- a/Source/WebKit/UIProcess/WebProcessCache.cpp >+++ b/Source/WebKit/UIProcess/WebProcessCache.cpp >@@ -247,7 +247,7 @@ WebProcessCache::CachedProcess::CachedProcess(Ref<WebProcessProxy>&& process) > , m_evictionTimer(RunLoop::main(), this, &CachedProcess::evictionTimerFired) > { > RELEASE_ASSERT(!m_process->pageCount()); >- RELEASE_ASSERT_WITH_MESSAGE(!m_process->websiteDataStore().hasProcess(m_process.get()), "Only processes with pages should be registered with the data store"); >+ RELEASE_ASSERT_WITH_MESSAGE(!m_process->websiteDataStore().processes().contains(*m_process), "Only processes with pages should be registered with the data store"); > m_process->setIsInProcessCache(true); > m_evictionTimer.startOneShot(cachedProcessLifetime); > } >diff --git a/Source/WebKit/UIProcess/WebProcessLifetimeObserver.cpp b/Source/WebKit/UIProcess/WebProcessLifetimeObserver.cpp >deleted file mode 100644 >index f497151d75c5e6f1f286aaa79e8a647c6a9f36c0..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/WebProcessLifetimeObserver.cpp >+++ /dev/null >@@ -1,80 +0,0 @@ >-/* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#include "config.h" >-#include "WebProcessLifetimeObserver.h" >- >-#include "Logging.h" >-#include "WebPageProxy.h" >-#include "WebProcessProxy.h" >- >-namespace WebKit { >- >-WebProcessLifetimeObserver::WebProcessLifetimeObserver() >-{ >-} >- >-WebProcessLifetimeObserver::~WebProcessLifetimeObserver() >-{ >-} >- >-void WebProcessLifetimeObserver::addWebPage(WebPageProxy& webPageProxy, WebProcessProxy& process) >-{ >- ASSERT(process.state() == WebProcessProxy::State::Running); >- RELEASE_ASSERT(!process.isInProcessCache()); >- RELEASE_ASSERT(!process.isPrewarmed()); >- >- if (m_processes.add(&process).isNewEntry) { >- RELEASE_LOG(Loading, "%p - WebProcessLifetimeObserver::addWebPage: webPID = %i, pageID = %" PRIu64, this, process.processIdentifier(), webPageProxy.pageID().toUInt64()); >- webProcessWillOpenConnection(process, *process.connection()); >- } >- >- webPageWillOpenConnection(webPageProxy, *process.connection()); >-} >- >-void WebProcessLifetimeObserver::removeWebPage(WebPageProxy& webPageProxy, WebProcessProxy& process) >-{ >- // FIXME: This should assert that the page is either closed or that the process is no longer running, >- // but we have to make sure that removeWebPage is called after the connection has been removed in that case. >- ASSERT(m_processes.contains(&process)); >- >- webPageDidCloseConnection(webPageProxy, *process.connection()); >- >- if (m_processes.remove(&process)) { >- RELEASE_LOG(Loading, "%p - WebProcessLifetimeObserver::removeWebPage: webPID = %i, pageID = %" PRIu64, this, process.processIdentifier(), webPageProxy.pageID().toUInt64()); >- webProcessDidCloseConnection(process, *process.connection()); >- } >-} >- >-WTF::IteratorRange<HashCountedSet<WebProcessProxy*>::const_iterator::Keys> WebProcessLifetimeObserver::processes() const >-{ >- ASSERT(std::all_of(m_processes.begin().keys(), m_processes.end().keys(), [](WebProcessProxy* process) { >- return process->state() == WebProcessProxy::State::Running; >- })); >- >- return makeIteratorRange(m_processes.begin().keys(), m_processes.end().keys()); >-} >- >-} >diff --git a/Source/WebKit/UIProcess/WebProcessLifetimeObserver.h b/Source/WebKit/UIProcess/WebProcessLifetimeObserver.h >deleted file mode 100644 >index 49cbffb8494008a29ad90f2b27faff8c1e40a618..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/WebProcessLifetimeObserver.h >+++ /dev/null >@@ -1,66 +0,0 @@ >-/* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#ifndef WebProcessLifetimeObserver_h >-#define WebProcessLifetimeObserver_h >- >-#include <wtf/HashCountedSet.h> >-#include <wtf/IteratorRange.h> >- >-namespace IPC { >-class Connection; >-} >- >-namespace WebKit { >- >-class WebPageProxy; >-class WebProcessProxy; >- >-class WebProcessLifetimeObserver { >-public: >- WebProcessLifetimeObserver(); >- virtual ~WebProcessLifetimeObserver(); >- >- void addWebPage(WebPageProxy&, WebProcessProxy&); >- void removeWebPage(WebPageProxy&, WebProcessProxy&); >- >- WTF::IteratorRange<HashCountedSet<WebProcessProxy*>::const_iterator::Keys> processes() const; >- >- bool hasProcess(WebProcessProxy* process) const { return m_processes.contains(process); } >- >-private: >- friend class WebProcessLifetimeTracker; >- >- virtual void webProcessWillOpenConnection(WebProcessProxy&, IPC::Connection&) { } >- virtual void webPageWillOpenConnection(WebPageProxy&, IPC::Connection&) { } >- virtual void webPageDidCloseConnection(WebPageProxy&, IPC::Connection&) { } >- virtual void webProcessDidCloseConnection(WebProcessProxy&, IPC::Connection&) { } >- >- HashCountedSet<WebProcessProxy*> m_processes; >-}; >- >-} >- >-#endif // WebProcessLifetimeObserver_h >diff --git a/Source/WebKit/UIProcess/WebProcessLifetimeTracker.cpp b/Source/WebKit/UIProcess/WebProcessLifetimeTracker.cpp >deleted file mode 100644 >index 3a508e132321a70caac079c10975291655d831b6..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/WebProcessLifetimeTracker.cpp >+++ /dev/null >@@ -1,84 +0,0 @@ >-/* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#include "config.h" >-#include "WebProcessLifetimeTracker.h" >- >-#include "WebPageProxy.h" >-#include "WebProcessLifetimeObserver.h" >-#include "WebProcessProxy.h" >- >-namespace WebKit { >- >-WebProcessLifetimeTracker::WebProcessLifetimeTracker(WebPageProxy& webPageProxy) >- : m_webPageProxy(webPageProxy) >-{ >-} >- >-WebProcessLifetimeTracker::~WebProcessLifetimeTracker() >-{ >-} >- >-void WebProcessLifetimeTracker::addObserver(WebProcessLifetimeObserver& observer) >-{ >- ASSERT(!m_observers.contains(&observer)); >- >- m_observers.add(&observer); >- >- if (processIsRunning(m_webPageProxy.process())) >- observer.addWebPage(m_webPageProxy, m_webPageProxy.process()); >-} >- >-void WebProcessLifetimeTracker::webPageEnteringWebProcess(WebProcessProxy& process) >-{ >- ASSERT(processIsRunning(process)); >- >- for (auto& observer : m_observers) >- observer->addWebPage(m_webPageProxy, process); >-} >- >-void WebProcessLifetimeTracker::webPageLeavingWebProcess(WebProcessProxy& process) >-{ >- ASSERT(processIsRunning(process)); >- >- for (auto& observer : m_observers) >- observer->removeWebPage(m_webPageProxy, process); >-} >- >-void WebProcessLifetimeTracker::pageWasInvalidated() >-{ >- if (!processIsRunning(m_webPageProxy.process())) >- return; >- >- for (auto& observer : m_observers) >- observer->removeWebPage(m_webPageProxy, m_webPageProxy.process()); >-} >- >-bool WebProcessLifetimeTracker::processIsRunning(WebProcessProxy& process) >-{ >- return process.state() == WebProcessProxy::State::Running; >-} >- >-} >diff --git a/Source/WebKit/UIProcess/WebProcessLifetimeTracker.h b/Source/WebKit/UIProcess/WebProcessLifetimeTracker.h >deleted file mode 100644 >index 12875ae6340eda4c9b90132394f9191294916b4c..0000000000000000000000000000000000000000 >--- a/Source/WebKit/UIProcess/WebProcessLifetimeTracker.h >+++ /dev/null >@@ -1,63 +0,0 @@ >-/* >- * Copyright (C) 2015 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#ifndef WebProcessLifetimeTracker_h >-#define WebProcessLifetimeTracker_h >- >-#include <wtf/HashSet.h> >- >-namespace IPC { >-class Connection; >-} >- >-namespace WebKit { >- >-class WebPageProxy; >-class WebProcessLifetimeObserver; >-class WebProcessProxy; >- >-class WebProcessLifetimeTracker { >-public: >- explicit WebProcessLifetimeTracker(WebPageProxy&); >- ~WebProcessLifetimeTracker(); >- >- void addObserver(WebProcessLifetimeObserver&); >- >- void webPageEnteringWebProcess(WebProcessProxy&); >- void webPageLeavingWebProcess(WebProcessProxy&); >- >- void pageWasInvalidated(); >- >-private: >- static bool processIsRunning(WebProcessProxy&); >- >- WebPageProxy& m_webPageProxy; >- >- HashSet<WebProcessLifetimeObserver*> m_observers; >-}; >- >-} >- >-#endif // WebProcessLifetimeTracker_h >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp >index 73ed98c482db33c1831d3df198c57d4c420cae71..404b438975b5218b91aaa65d06d9b072a6d9ca90 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp >@@ -220,6 +220,33 @@ void WebProcessProxy::setWebsiteDataStore(WebsiteDataStore& dataStore) > { > ASSERT(!m_websiteDataStore); > m_websiteDataStore = &dataStore; >+ updateRegistrationWithDataStore(); >+} >+ >+void WebProcessProxy::updateRegistrationWithDataStore() >+{ >+ if (!m_websiteDataStore) >+ return; >+ >+ bool shouldBeRegistered = processPool().dummyProcessProxy() != this && (pageCount() || provisionalPageCount()); >+ if (shouldBeRegistered) >+ m_websiteDataStore->registerProcess(*this); >+ else >+ m_websiteDataStore->unregisterProcess(*this); >+} >+ >+void WebProcessProxy::addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) >+{ >+ ASSERT(!m_provisionalPages.contains(&provisionalPage)); >+ m_provisionalPages.add(&provisionalPage); >+ updateRegistrationWithDataStore(); >+} >+ >+void WebProcessProxy::removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) >+{ >+ ASSERT(m_provisionalPages.contains(&provisionalPage)); >+ m_provisionalPages.remove(&provisionalPage); >+ updateRegistrationWithDataStore(); > } > > void WebProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions) >@@ -277,12 +304,6 @@ void WebProcessProxy::connectionWillOpen(IPC::Connection& connection) > #if ENABLE(SEC_ITEM_SHIM) > SecItemShimProxy::singleton().initializeConnection(connection); > #endif >- >- for (auto& page : m_pageMap.values()) >- page->connectionWillOpen(connection); >- >- for (auto* provisionalPage : m_provisionalPages) >- provisionalPage->connectionWillOpen(connection); > } > > void WebProcessProxy::processWillShutDown(IPC::Connection& connection) >@@ -292,9 +313,6 @@ void WebProcessProxy::processWillShutDown(IPC::Connection& connection) > #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) > processPool().stopDisplayLinks(connection); > #endif >- >- for (auto& page : m_pageMap.values()) >- page->webProcessWillShutDown(); > } > > void WebProcessProxy::shutDown() >@@ -386,6 +404,7 @@ void WebProcessProxy::addExistingWebPage(WebPageProxy& webPage, BeginsUsingDataS > m_pageMap.set(webPage.pageID(), &webPage); > globalPageMap().set(webPage.pageID(), &webPage); > >+ updateRegistrationWithDataStore(); > updateBackgroundResponsivenessTimer(); > } > >@@ -411,6 +430,7 @@ void WebProcessProxy::removeWebPage(WebPageProxy& webPage, EndsUsingDataStore en > m_processPool->pageEndUsingWebsiteDataStore(webPage.pageID(), webPage.websiteDataStore()); > > removeVisitedLinkStoreUser(webPage.visitedLinkStore(), webPage.pageID()); >+ updateRegistrationWithDataStore(); > > updateBackgroundResponsivenessTimer(); > >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h >index 4b7ca4db62ff0d72a53b542f385fdd8c616ccf0c..6e4a68e6c5d4b0a3484086abe58240f45490bc14 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -139,8 +139,8 @@ public: > enum class EndsUsingDataStore : bool { No, Yes }; > void removeWebPage(WebPageProxy&, EndsUsingDataStore); > >- void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); } >- void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); } >+ void addProvisionalPageProxy(ProvisionalPageProxy&); >+ void removeProvisionalPageProxy(ProvisionalPageProxy&); > > typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); } > unsigned pageCount() const { return m_pageMap.size(); } >@@ -394,6 +394,8 @@ private: > void didCollectPrewarmInformation(const WebCore::RegistrableDomain&, const WebCore::PrewarmInformation&); > > void logDiagnosticMessageForResourceLimitTermination(const String& limitKey); >+ >+ void updateRegistrationWithDataStore(); > > enum class IsWeak { No, Yes }; > template<typename T> class WeakOrStrongPtr { >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >index 0e97520d01afe5b5cb1b2ce1876c80526dabb40c..f42aef53a2599d0a1829c8a4eaf385d6a70d14f9 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >+++ b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp >@@ -168,20 +168,23 @@ WebsiteDataStore* WebsiteDataStore::existingNonDefaultDataStoreForSessionID(PAL: > return sessionID.isValid() && sessionID != PAL::SessionID::defaultSessionID() ? nonDefaultDataStores().get(sessionID) : nullptr; > } > >-WebProcessPool* WebsiteDataStore::processPoolForCookieStorageOperations() >+void WebsiteDataStore::registerProcess(WebProcessProxy& process) > { >- auto pools = processPools(1, false); >- if (!pools.isEmpty()) >- return pools.begin()->get(); >+ ASSERT(process.pageCount() || process.provisionalPageCount()); >+ m_processes.add(process); >+} > >- for (auto* processPool : WebProcessPool::allProcessPools()) { >- for (auto& process : processPool->processes()) { >- if (process != processPool->dummyProcessProxy() && process->pageCount() && &process->websiteDataStore() == this) >- return processPool; >- } >- } >+void WebsiteDataStore::unregisterProcess(WebProcessProxy& process) >+{ >+ ASSERT(!process.pageCount()); >+ ASSERT(!process.provisionalPageCount()); >+ m_processes.remove(process); >+} > >- return nullptr; >+WebProcessPool* WebsiteDataStore::processPoolForCookieStorageOperations() >+{ >+ auto pools = processPools(1, false); >+ return pools.isEmpty() ? nullptr : pools.begin()->get(); > } > > void WebsiteDataStore::resolveDirectoriesIfNecessary() >@@ -430,7 +433,7 @@ void WebsiteDataStore::fetchDataAndApply(OptionSet<WebsiteDataType> dataTypes, O > for (auto& process : processes()) { > switch (webProcessAccessType) { > case ProcessAccessType::OnlyIfLaunched: >- if (!process->canSendMessage()) >+ if (!process.canSendMessage()) > continue; > break; > >@@ -444,7 +447,7 @@ void WebsiteDataStore::fetchDataAndApply(OptionSet<WebsiteDataType> dataTypes, O > } > > callbackAggregator->addPendingCallback(); >- process->fetchWebsiteData(m_sessionID, dataTypes, [callbackAggregator](WebsiteData websiteData) { >+ process.fetchWebsiteData(m_sessionID, dataTypes, [callbackAggregator](WebsiteData websiteData) { > callbackAggregator->removePendingCallback(WTFMove(websiteData)); > }); > } >@@ -742,7 +745,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, WallTime > for (auto& process : processes()) { > switch (webProcessAccessType) { > case ProcessAccessType::OnlyIfLaunched: >- if (!process->canSendMessage()) >+ if (!process.canSendMessage()) > continue; > break; > >@@ -756,7 +759,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, WallTime > } > > callbackAggregator->addPendingCallback(); >- process->deleteWebsiteData(m_sessionID, dataTypes, modifiedSince, [callbackAggregator] { >+ process.deleteWebsiteData(m_sessionID, dataTypes, modifiedSince, [callbackAggregator] { > callbackAggregator->removePendingCallback(); > }); > } >@@ -1005,7 +1008,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, const Ve > for (auto& process : processes()) { > switch (webProcessAccessType) { > case ProcessAccessType::OnlyIfLaunched: >- if (!process->canSendMessage()) >+ if (!process.canSendMessage()) > continue; > break; > >@@ -1020,7 +1023,7 @@ void WebsiteDataStore::removeData(OptionSet<WebsiteDataType> dataTypes, const Ve > > callbackAggregator->addPendingCallback(); > >- process->deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, [callbackAggregator] { >+ process.deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, [callbackAggregator] { > callbackAggregator->removePendingCallback(); > }); > } >@@ -1753,7 +1756,7 @@ HashSet<RefPtr<WebProcessPool>> WebsiteDataStore::processPools(size_t count, boo > { > HashSet<RefPtr<WebProcessPool>> processPools; > for (auto& process : processes()) { >- if (auto* processPool = process->processPoolIfExists()) >+ if (auto* processPool = process.processPoolIfExists()) > processPools.add(processPool); > } > >diff --git a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >index 0b23501650fdcca7316ac5b5fbf45435116b4185..f07cc618d6c1131e5054a148216305aff9ffe486 100644 >--- a/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >+++ b/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h >@@ -28,7 +28,6 @@ > #include "LocalStorageDatabaseTracker.h" > #include "NetworkSessionCreationParameters.h" > #include "WebDeviceOrientationAndMotionAccessController.h" >-#include "WebProcessLifetimeObserver.h" > #include "WebsiteDataStoreClient.h" > #include "WebsiteDataStoreConfiguration.h" > #include <WebCore/Cookie.h> >@@ -44,6 +43,7 @@ > #include <wtf/RefCounted.h> > #include <wtf/RefPtr.h> > #include <wtf/UniqueRef.h> >+#include <wtf/WeakHashSet.h> > #include <wtf/WeakPtr.h> > #include <wtf/WorkQueue.h> > #include <wtf/text/WTFString.h> >@@ -73,6 +73,7 @@ class DeviceIdHashSaltStorage; > class SOAuthorizationCoordinator; > class WebPageProxy; > class WebProcessPool; >+class WebProcessProxy; > class WebResourceLoadStatisticsStore; > enum class WebsiteDataFetchOption; > enum class WebsiteDataType; >@@ -90,7 +91,7 @@ enum class StorageAccessPromptStatus; > struct PluginModuleInfo; > #endif > >-class WebsiteDataStore : public RefCounted<WebsiteDataStore>, public WebProcessLifetimeObserver, public Identified<WebsiteDataStore>, public CanMakeWeakPtr<WebsiteDataStore> { >+class WebsiteDataStore : public RefCounted<WebsiteDataStore>, public Identified<WebsiteDataStore>, public CanMakeWeakPtr<WebsiteDataStore> { > public: > static Ref<WebsiteDataStore> createNonPersistent(); > static Ref<WebsiteDataStore> create(Ref<WebsiteDataStoreConfiguration>&&, PAL::SessionID); >@@ -100,6 +101,11 @@ public: > > bool isPersistent() const { return !m_sessionID.isEphemeral(); } > PAL::SessionID sessionID() const { return m_sessionID; } >+ >+ void registerProcess(WebProcessProxy&); >+ void unregisterProcess(WebProcessProxy&); >+ >+ const WeakHashSet<WebProcessProxy>& processes() const { return m_processes; } > > bool resourceLoadStatisticsEnabled() const; > void setResourceLoadStatisticsEnabled(bool); >@@ -310,6 +316,8 @@ private: > #endif > > HashSet<WebCore::Cookie> m_pendingCookies; >+ >+ WeakHashSet<WebProcessProxy> m_processes; > > String m_boundInterfaceIdentifier; > AllowsCellularAccess m_allowsCellularAccess { AllowsCellularAccess::Yes }; >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 9d82f2d4de4a6edb30a8b006aa73cfa76ef3cf61..c3611cbfcb840829e42d1116e46c5b683144fc08 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -367,8 +367,6 @@ > 1AF4592F19464B2000F9D4A2 /* WKError.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF4592D19464B2000F9D4A2 /* WKError.h */; settings = {ATTRIBUTES = (Public, ); }; }; > 1AF4CEF018BC481800BC2D34 /* VisitedLinkTableController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF4CEEE18BC481800BC2D34 /* VisitedLinkTableController.h */; }; > 1AFA3AC918E61C61003CCBAE /* WKUserContentController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFA3AC718E61C61003CCBAE /* WKUserContentController.h */; settings = {ATTRIBUTES = (Public, ); }; }; >- 1AFA4B8C1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFA4B8A1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h */; }; >- 1AFA4B901A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFA4B8E1A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h */; }; > 1AFB4C721ADF155D00B33339 /* _WKWebsiteDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFB4C701ADF155D00B33339 /* _WKWebsiteDataStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 1AFDD3151891B54000153970 /* APIPolicyClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFDD3141891B54000153970 /* APIPolicyClient.h */; }; > 1AFDD3171891C94700153970 /* WKPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFDD3161891C94700153970 /* WKPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; >@@ -2422,10 +2420,6 @@ > 1AF4CEEE18BC481800BC2D34 /* VisitedLinkTableController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisitedLinkTableController.h; sourceTree = "<group>"; }; > 1AFA3AC618E61C61003CCBAE /* WKUserContentController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKUserContentController.mm; sourceTree = "<group>"; }; > 1AFA3AC718E61C61003CCBAE /* WKUserContentController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserContentController.h; sourceTree = "<group>"; }; >- 1AFA4B891A65A1D0006C4AB4 /* WebProcessLifetimeTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebProcessLifetimeTracker.cpp; sourceTree = "<group>"; }; >- 1AFA4B8A1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebProcessLifetimeTracker.h; sourceTree = "<group>"; }; >- 1AFA4B8D1A65A9E2006C4AB4 /* WebProcessLifetimeObserver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebProcessLifetimeObserver.cpp; sourceTree = "<group>"; }; >- 1AFA4B8E1A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebProcessLifetimeObserver.h; sourceTree = "<group>"; }; > 1AFB4C6F1ADF155D00B33339 /* _WKWebsiteDataStore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKWebsiteDataStore.mm; sourceTree = "<group>"; }; > 1AFB4C701ADF155D00B33339 /* _WKWebsiteDataStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKWebsiteDataStore.h; sourceTree = "<group>"; }; > 1AFDD3141891B54000153970 /* APIPolicyClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIPolicyClient.h; sourceTree = "<group>"; }; >@@ -7781,10 +7775,6 @@ > BCD597FD112B57BE00EC8C23 /* WebPreferences.h */, > 83397C6622124BD100B62388 /* WebProcessCache.cpp */, > 83397C6722124BD100B62388 /* WebProcessCache.h */, >- 1AFA4B8D1A65A9E2006C4AB4 /* WebProcessLifetimeObserver.cpp */, >- 1AFA4B8E1A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h */, >- 1AFA4B891A65A1D0006C4AB4 /* WebProcessLifetimeTracker.cpp */, >- 1AFA4B8A1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h */, > 7CE4D2171A4914A300C7F152 /* WebProcessPool.cpp */, > 7CE4D2181A4914A300C7F152 /* WebProcessPool.h */, > 7CE4D2191A4914A300C7F152 /* WebProcessPool.messages.in */, >@@ -9871,8 +9861,6 @@ > 1A043F6A12514D8B00FFBFB5 /* WebProcessConnectionMessages.h in Headers */, > BC306824125A6B9400E71278 /* WebProcessCreationParameters.h in Headers */, > 467E43E82243FF7D00B13924 /* WebProcessDataStoreParameters.h in Headers */, >- 1AFA4B901A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h in Headers */, >- 1AFA4B8C1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h in Headers */, > BC3066BF125A442100E71278 /* WebProcessMessages.h in Headers */, > 7CE4D21B1A4914A300C7F152 /* WebProcessPool.h in Headers */, > 7CE4D2281A4916C200C7F152 /* WebProcessPoolMessages.h in Headers */,
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 199418
:
373353
|
373357