diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
commit | 284837daa07b29d6a63a748544a90b1f5842ac5c (patch) | |
tree | ecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/WebKit2/UIProcess/WebContext.cpp | |
parent | 2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff) | |
download | qtwebkit-284837daa07b29d6a63a748544a90b1f5842ac5c.tar.gz |
Imported WebKit commit 68645295d2e3e09af2c942f092556f06aa5f8b0d (http://svn.webkit.org/repository/webkit/trunk@128073)
New snapshot
Diffstat (limited to 'Source/WebKit2/UIProcess/WebContext.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/WebContext.cpp | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/Source/WebKit2/UIProcess/WebContext.cpp b/Source/WebKit2/UIProcess/WebContext.cpp index b5bbea4cd..0003387d0 100644 --- a/Source/WebKit2/UIProcess/WebContext.cpp +++ b/Source/WebKit2/UIProcess/WebContext.cpp @@ -86,6 +86,8 @@ using namespace WebCore; namespace WebKit { +static const double sharedSecondaryProcessShutdownTimeout = 60; + DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, webContextCounter, ("WebContext")); PassRefPtr<WebContext> WebContext::create(const String& injectedBundlePath) @@ -110,6 +112,7 @@ const Vector<WebContext*>& WebContext::allContexts() WebContext::WebContext(ProcessModel processModel, const String& injectedBundlePath) : m_processModel(processModel) + , m_haveInitialEmptyProcess(false) , m_defaultPageGroup(WebPageGroup::create()) , m_injectedBundlePath(injectedBundlePath) , m_visitedLinkProvider(this) @@ -255,6 +258,21 @@ void WebContext::initializeDownloadClient(const WKContextDownloadClient* client) m_downloadClient.initialize(client); } +void WebContext::setProcessModel(ProcessModel processModel) +{ + // Guard against API misuse. + if (!m_processes.isEmpty()) + CRASH(); + +#if !ENABLE(PLUGIN_PROCESS) + // Plugin process is required for multiple web process mode. + if (processModel != ProcessModelSharedSecondaryProcess) + CRASH(); +#endif + + m_processModel = processModel; +} + WebProcessProxy* WebContext::deprecatedSharedProcess() { ASSERT(m_processModel == ProcessModelSharedSecondaryProcess); @@ -295,21 +313,25 @@ PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess() WebProcessCreationParameters parameters; - if (!injectedBundlePath().isEmpty()) { - parameters.injectedBundlePath = injectedBundlePath(); + parameters.injectedBundlePath = injectedBundlePath(); + if (!parameters.injectedBundlePath.isEmpty()) SandboxExtension::createHandle(parameters.injectedBundlePath, SandboxExtension::ReadOnly, parameters.injectedBundlePathExtensionHandle); - } - parameters.shouldTrackVisitedLinks = m_historyClient.shouldTrackVisitedLinks(); - parameters.cacheModel = m_cacheModel; - parameters.languages = userPreferredLanguages(); parameters.applicationCacheDirectory = applicationCacheDirectory(); + if (!parameters.applicationCacheDirectory.isEmpty()) + SandboxExtension::createHandle(parameters.applicationCacheDirectory, SandboxExtension::ReadWrite, parameters.applicationCacheDirectoryExtensionHandle); + parameters.databaseDirectory = databaseDirectory(); + if (!parameters.databaseDirectory.isEmpty()) + SandboxExtension::createHandle(parameters.databaseDirectory, SandboxExtension::ReadWrite, parameters.databaseDirectoryExtensionHandle); + parameters.localStorageDirectory = localStorageDirectory(); + if (!parameters.localStorageDirectory.isEmpty()) + SandboxExtension::createHandle(parameters.localStorageDirectory, SandboxExtension::ReadWrite, parameters.localStorageDirectoryExtensionHandle); -#if PLATFORM(MAC) - parameters.presenterApplicationPid = getpid(); -#endif + parameters.shouldTrackVisitedLinks = m_historyClient.shouldTrackVisitedLinks(); + parameters.cacheModel = m_cacheModel; + parameters.languages = userPreferredLanguages(); copyToVector(m_schemesToRegisterAsEmptyDocument, parameters.urlSchemesRegistererdAsEmptyDocument); copyToVector(m_schemesToRegisterAsSecure, parameters.urlSchemesRegisteredAsSecure); @@ -320,6 +342,8 @@ PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess() parameters.iconDatabaseEnabled = !iconDatabasePath().isEmpty(); + parameters.terminationTimeout = (m_processModel == ProcessModelSharedSecondaryProcess) ? sharedSecondaryProcessShutdownTimeout : 0; + parameters.textCheckerState = TextChecker::state(); parameters.fullKeyboardAccessEnabled = WebProcessProxy::fullKeyboardAccessEnabled(); @@ -342,7 +366,7 @@ PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess() pair<String, RefPtr<APIObject> >& message = m_pendingMessagesToPostToInjectedBundle[i]; process->deprecatedSend(InjectedBundleMessage::PostMessage, 0, CoreIPC::In(message.first, WebContextUserMessageEncoder(message.second.get()))); } - // FIXME (Multi-WebProcess): What does this mean in the brave new world? + // FIXME (Multi-WebProcess) (94368): What does this mean in the brave new world? m_pendingMessagesToPostToInjectedBundle.clear(); return process.release(); @@ -350,8 +374,13 @@ PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess() void WebContext::warmInitialProcess() { - ASSERT(m_processes.isEmpty()); + if (m_haveInitialEmptyProcess) { + ASSERT(!m_processes.isEmpty()); + return; + } + m_processes.append(createNewWebProcess()); + m_haveInitialEmptyProcess = true; } void WebContext::enableProcessTermination() @@ -398,7 +427,7 @@ void WebContext::processDidFinishLaunching(WebProcessProxy* process) { ASSERT(m_processes.contains(process)); - m_visitedLinkProvider.processDidFinishLaunching(); + m_visitedLinkProvider.processDidFinishLaunching(process); // Sometimes the memorySampler gets initialized after process initialization has happened but before the process has finished launching // so check if it needs to be started here @@ -418,7 +447,15 @@ void WebContext::disconnectProcess(WebProcessProxy* process) { ASSERT(m_processes.contains(process)); - m_visitedLinkProvider.processDidClose(); + m_visitedLinkProvider.processDidClose(process); + + // FIXME (Multi-WebProcess): <rdar://problem/12239765> All the invalidation calls below are still necessary in multi-process mode, but they should only affect data structures pertaining to the process being disconnected. + // Clearing everything causes assertion failures, so it's less trouble to skip that for now. + if (m_processModel != ProcessModelSharedSecondaryProcess) { + RefPtr<WebProcessProxy> protect(process); + m_processes.remove(m_processes.find(process)); + return; + } // Invalidate all outstanding downloads. for (HashMap<uint64_t, RefPtr<DownloadProxy> >::iterator::Values it = m_downloads.begin().values(), end = m_downloads.end().values(); it != end; ++it) { @@ -457,7 +494,10 @@ void WebContext::disconnectProcess(WebProcessProxy* process) m_pluginSiteDataManager->invalidate(); #endif - // This can cause the web context to be destroyed. + // The vector may have the last reference to process proxy, which in turn may have the last reference to the context. + // Since vector elements are destroyed in place, we would recurse into WebProcessProxy destructor + // if it were invoked from Vector::remove(). RefPtr delays destruction until it's safe. + RefPtr<WebProcessProxy> protect(process); m_processes.remove(m_processes.find(process)); } @@ -469,8 +509,15 @@ PassRefPtr<WebPageProxy> WebContext::createWebPage(PageClient* pageClient, WebPa process = m_processes[0]; } else { // FIXME (Multi-WebProcess): Add logic for sharing a process. - process = createNewWebProcess(); - m_processes.append(process); + // <rdar://problem/12218164> window.open() should create pages in the same process. + // <rdar://problem/12239661> Consider limiting the number of web processes in per-tab process model + if (m_haveInitialEmptyProcess) { + process = m_processes.last(); + m_haveInitialEmptyProcess = false; + } else { + process = createNewWebProcess(); + m_processes.append(process); + } } if (!pageGroup) @@ -507,7 +554,7 @@ DownloadProxy* WebContext::download(WebPageProxy* initiatingPage, const Resource return download; } else { - // FIXME: (Multi-WebProcess): Implement. + // FIXME (Multi-WebProcess): <rdar://problem/12239483> Make downloading work. return 0; } } @@ -893,7 +940,7 @@ void WebContext::getWebCoreStatistics(PassRefPtr<DictionaryCallback> callback) m_processes[0]->send(Messages::WebProcess::GetWebCoreStatistics(callbackID), 0); } else { - // FIXME (Multi-WebProcess): Implement. + // FIXME (Multi-WebProcess): <rdar://problem/12239483> Make downloading work. callback->invalidate(); } } |