summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/WebContext.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-09-10 19:10:20 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-09-10 19:10:20 +0200
commit284837daa07b29d6a63a748544a90b1f5842ac5c (patch)
treeecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/WebKit2/UIProcess/WebContext.cpp
parent2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff)
downloadqtwebkit-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.cpp83
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();
}
}