summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/WebContext.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:56:46 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:57:30 +0200
commitb297e0fa5c217c9467033b7c8b46891a52870120 (patch)
tree43fc14689295e9e64f2719d05aad94e3049f6cd7 /Source/WebKit2/UIProcess/WebContext.cpp
parent69d517dbfa69903d8593cc1737f0474b21e3251e (diff)
downloadqtwebkit-b297e0fa5c217c9467033b7c8b46891a52870120.tar.gz
Revert "Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)"
This reverts commit 5466563f4b5b6b86523e3f89bb7f77e5b5270c78. Caused OOM issues on some CI machines :(
Diffstat (limited to 'Source/WebKit2/UIProcess/WebContext.cpp')
-rw-r--r--Source/WebKit2/UIProcess/WebContext.cpp244
1 files changed, 128 insertions, 116 deletions
diff --git a/Source/WebKit2/UIProcess/WebContext.cpp b/Source/WebKit2/UIProcess/WebContext.cpp
index d3dab6c74..f0c3580c1 100644
--- a/Source/WebKit2/UIProcess/WebContext.cpp
+++ b/Source/WebKit2/UIProcess/WebContext.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,6 +28,7 @@
#include "DownloadProxy.h"
#include "ImmutableArray.h"
+#include "InjectedBundleMessageKinds.h"
#include "Logging.h"
#include "MutableDictionary.h"
#include "SandboxExtension.h"
@@ -120,45 +121,36 @@ WebContext::WebContext(ProcessModel processModel, const String& injectedBundlePa
, m_cacheModel(CacheModelDocumentViewer)
, m_memorySamplerEnabled(false)
, m_memorySamplerInterval(1400.0)
-#if PLATFORM(WIN)
- , m_shouldPaintNativeControls(true)
- , m_initialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicyAlways)
-#endif
- , m_processTerminationEnabled(true)
-#if ENABLE(NETWORK_PROCESS)
- , m_usesNetworkProcess(false)
-#endif
-{
- addMessageReceiver(CoreIPC::MessageClassWebContext, this);
- addMessageReceiver(CoreIPC::MessageClassDownloadProxy, this);
- addMessageReceiver(CoreIPC::MessageClassWebContextLegacy, this);
-
- // NOTE: These sub-objects must be initialized after m_messageReceiverMap..
- m_applicationCacheManagerProxy = WebApplicationCacheManagerProxy::create(this);
+ , m_applicationCacheManagerProxy(WebApplicationCacheManagerProxy::create(this))
#if ENABLE(BATTERY_STATUS)
- m_batteryManagerProxy = WebBatteryManagerProxy::create(this);
+ , m_batteryManagerProxy(WebBatteryManagerProxy::create(this))
#endif
- m_cookieManagerProxy = WebCookieManagerProxy::create(this);
+ , m_cookieManagerProxy(WebCookieManagerProxy::create(this))
#if ENABLE(SQL_DATABASE)
- m_databaseManagerProxy = WebDatabaseManagerProxy::create(this);
+ , m_databaseManagerProxy(WebDatabaseManagerProxy::create(this))
#endif
- m_geolocationManagerProxy = WebGeolocationManagerProxy::create(this);
- m_iconDatabase = WebIconDatabase::create(this);
- m_keyValueStorageManagerProxy = WebKeyValueStorageManagerProxy::create(this);
- m_mediaCacheManagerProxy = WebMediaCacheManagerProxy::create(this);
+ , m_geolocationManagerProxy(WebGeolocationManagerProxy::create(this))
+ , m_iconDatabase(WebIconDatabase::create(this))
+ , m_keyValueStorageManagerProxy(WebKeyValueStorageManagerProxy::create(this))
+ , m_mediaCacheManagerProxy(WebMediaCacheManagerProxy::create(this))
#if ENABLE(NETWORK_INFO)
- m_networkInfoManagerProxy = WebNetworkInfoManagerProxy::create(this);
+ , m_networkInfoManagerProxy(WebNetworkInfoManagerProxy::create(this))
#endif
- m_notificationManagerProxy = WebNotificationManagerProxy::create(this);
- m_pluginSiteDataManager = WebPluginSiteDataManager::create(this);
- m_resourceCacheManagerProxy = WebResourceCacheManagerProxy::create(this);
+ , m_notificationManagerProxy(WebNotificationManagerProxy::create(this))
+ , m_pluginSiteDataManager(WebPluginSiteDataManager::create(this))
+ , m_resourceCacheManagerProxy(WebResourceCacheManagerProxy::create(this))
#if USE(SOUP)
- m_soupRequestManagerProxy = WebSoupRequestManagerProxy::create(this);
+ , m_soupRequestManagerProxy(WebSoupRequestManagerProxy::create(this))
#endif
#if ENABLE(VIBRATION)
- m_vibrationProxy = WebVibrationProxy::create(this);
+ , m_vibrationProxy(WebVibrationProxy::create(this))
#endif
-
+#if PLATFORM(WIN)
+ , m_shouldPaintNativeControls(true)
+ , m_initialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicyAlways)
+#endif
+ , m_processTerminationEnabled(true)
+{
#if !LOG_DISABLED
WebKit::initializeLogChannelsIfNecessary();
#endif
@@ -183,8 +175,6 @@ WebContext::~WebContext()
removeLanguageChangeObserver(this);
- m_messageReceiverMap.invalidate();
-
m_applicationCacheManagerProxy->invalidate();
m_applicationCacheManagerProxy->clearContext();
@@ -273,8 +263,6 @@ void WebContext::setProcessModel(ProcessModel processModel)
// Guard against API misuse.
if (!m_processes.isEmpty())
CRASH();
- if (processModel != ProcessModelSharedSecondaryProcess && !m_messagesToInjectedBundlePostedToEmptyContext.isEmpty())
- CRASH();
#if !ENABLE(PLUGIN_PROCESS)
// Plugin process is required for multiple web process mode.
@@ -313,28 +301,14 @@ void WebContext::textCheckerStateChanged()
sendToAllProcesses(Messages::WebProcess::SetTextCheckerState(TextChecker::state()));
}
-void WebContext::setUsesNetworkProcess(bool usesNetworkProcess)
-{
-#if ENABLE(NETWORK_PROCESS)
- m_usesNetworkProcess = usesNetworkProcess;
-#else
- UNUSED_PARAM(usesNetworkProcess);
-#endif
-}
-
void WebContext::ensureSharedWebProcess()
{
if (m_processes.isEmpty())
- createNewWebProcess();
+ m_processes.append(createNewWebProcess());
}
PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess()
{
-#if ENABLE(NETWORK_PROCESS)
- if (m_usesNetworkProcess)
- ensureNetworkProcess();
-#endif
-
RefPtr<WebProcessProxy> process = WebProcessProxy::create(this);
WebProcessCreationParameters parameters;
@@ -392,23 +366,6 @@ PassRefPtr<WebProcessProxy> WebContext::createNewWebProcess()
injectedBundleInitializationUserData = m_injectedBundleInitializationUserData;
process->send(Messages::WebProcess::InitializeWebProcess(parameters, WebContextUserMessageEncoder(injectedBundleInitializationUserData.get())), 0);
- m_processes.append(process);
-
- if (m_processModel == ProcessModelSharedSecondaryProcess) {
- for (size_t i = 0; i != m_messagesToInjectedBundlePostedToEmptyContext.size(); ++i) {
- pair<String, RefPtr<APIObject> >& message = m_messagesToInjectedBundlePostedToEmptyContext[i];
-
- OwnPtr<CoreIPC::ArgumentEncoder> messageData = CoreIPC::ArgumentEncoder::create(0);
-
- messageData->encode(message.first);
- messageData->encode(WebContextUserMessageEncoder(message.second.get()));
- process->send(Messages::WebProcess::PostInjectedBundleMessage(CoreIPC::DataReference(messageData->buffer(), messageData->bufferSize())), 0);
- }
- m_messagesToInjectedBundlePostedToEmptyContext.clear();
- } else
- ASSERT(m_messagesToInjectedBundlePostedToEmptyContext.isEmpty());
-
-
return process.release();
}
@@ -419,20 +376,10 @@ void WebContext::warmInitialProcess()
return;
}
- createNewWebProcess();
+ m_processes.append(createNewWebProcess());
m_haveInitialEmptyProcess = true;
}
-#if ENABLE(NETWORK_PROCESS)
-void WebContext::ensureNetworkProcess()
-{
- if (m_networkProcess)
- return;
-
- m_networkProcess = NetworkProcessProxy::create();
-}
-#endif
-
void WebContext::enableProcessTermination()
{
m_processTerminationEnabled = true;
@@ -499,9 +446,6 @@ void WebContext::disconnectProcess(WebProcessProxy* process)
m_visitedLinkProvider.processDidClose(process);
- if (m_haveInitialEmptyProcess && process == m_processes.last())
- m_haveInitialEmptyProcess = false;
-
// 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) {
@@ -570,6 +514,7 @@ PassRefPtr<WebPageProxy> WebContext::createWebPage(PageClient* pageClient, WebPa
} else {
// FIXME (Multi-WebProcess): <rdar://problem/12239661> Consider limiting the number of web processes in per-tab process model.
process = createNewWebProcess();
+ m_processes.append(process);
}
}
@@ -584,10 +529,10 @@ WebProcessProxy* WebContext::relaunchProcessIfNecessary()
if (m_processModel == ProcessModelSharedSecondaryProcess) {
ensureSharedWebProcess();
return m_processes[0].get();
+ } else {
+ // FIXME (Multi-WebProcess): What should this do in this model?
+ return 0;
}
-
- ASSERT_NOT_REACHED();
- return 0;
}
DownloadProxy* WebContext::download(WebPageProxy* initiatingPage, const ResourceRequest& request)
@@ -614,20 +559,15 @@ DownloadProxy* WebContext::download(WebPageProxy* initiatingPage, const Resource
void WebContext::postMessageToInjectedBundle(const String& messageName, APIObject* messageBody)
{
- if (m_processes.isEmpty()) {
- if (m_processModel == ProcessModelSharedSecondaryProcess)
- m_messagesToInjectedBundlePostedToEmptyContext.append(std::make_pair(messageName, messageBody));
+ if (m_processes.isEmpty())
return;
- }
// FIXME: Return early if the message body contains any references to WKPageRefs/WKFrameRefs etc. since they're local to a process.
- OwnPtr<CoreIPC::ArgumentEncoder> messageData = CoreIPC::ArgumentEncoder::create(0);
- messageData->encode(messageName);
- messageData->encode(WebContextUserMessageEncoder(messageBody));
-
for (size_t i = 0; i < m_processes.size(); ++i) {
- m_processes[i]->send(Messages::WebProcess::PostInjectedBundleMessage(CoreIPC::DataReference(messageData->buffer(), messageData->bufferSize())), 0);
+ // FIXME: We should consider returning false from this function if the messageBody cannot be encoded.
+ // FIXME: Can we encode the message body outside the loop for all the processes?
+ m_processes[i]->deprecatedSend(InjectedBundleMessage::PostMessage, 0, CoreIPC::In(messageName, WebContextUserMessageEncoder(messageBody)));
}
}
@@ -769,40 +709,100 @@ HashSet<String, CaseFoldingHash> WebContext::pdfAndPostScriptMIMETypes()
return mimeTypes;
}
-void WebContext::addMessageReceiver(CoreIPC::MessageClass messageClass, CoreIPC::MessageReceiver* messageReceiver)
-{
- m_messageReceiverMap.addMessageReceiver(messageClass, messageReceiver);
-}
-
-bool WebContext::dispatchMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* argumentDecoder)
-{
- return m_messageReceiverMap.dispatchMessage(connection, messageID, argumentDecoder);
-}
-
-bool WebContext::dispatchSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* argumentDecoder, OwnPtr<CoreIPC::ArgumentEncoder>& reply)
-{
- return m_messageReceiverMap.dispatchSyncMessage(connection, messageID, argumentDecoder, reply);
-}
-
-void WebContext::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
+void WebContext::didReceiveMessage(WebProcessProxy* process, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
{
if (messageID.is<CoreIPC::MessageClassWebContext>()) {
- didReceiveWebContextMessage(connection, messageID, arguments);
+ didReceiveWebContextMessage(process->connection(), messageID, arguments);
return;
}
if (messageID.is<CoreIPC::MessageClassDownloadProxy>()) {
if (DownloadProxy* downloadProxy = m_downloads.get(arguments->destinationID()).get())
- downloadProxy->didReceiveDownloadProxyMessage(connection, messageID, arguments);
+ downloadProxy->didReceiveDownloadProxyMessage(process->connection(), messageID, arguments);
return;
}
+ if (messageID.is<CoreIPC::MessageClassWebApplicationCacheManagerProxy>()) {
+ m_applicationCacheManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+#if ENABLE(BATTERY_STATUS)
+ if (messageID.is<CoreIPC::MessageClassWebBatteryManagerProxy>()) {
+ m_batteryManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+#endif
+
+ if (messageID.is<CoreIPC::MessageClassWebCookieManagerProxy>()) {
+ m_cookieManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+#if ENABLE(SQL_DATABASE)
+ if (messageID.is<CoreIPC::MessageClassWebDatabaseManagerProxy>()) {
+ m_databaseManagerProxy->didReceiveWebDatabaseManagerProxyMessage(process->connection(), messageID, arguments);
+ return;
+ }
+#endif
+
+ if (messageID.is<CoreIPC::MessageClassWebGeolocationManagerProxy>()) {
+ m_geolocationManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+ if (messageID.is<CoreIPC::MessageClassWebIconDatabase>()) {
+ m_iconDatabase->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+ if (messageID.is<CoreIPC::MessageClassWebKeyValueStorageManagerProxy>()) {
+ m_keyValueStorageManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+ if (messageID.is<CoreIPC::MessageClassWebMediaCacheManagerProxy>()) {
+ m_mediaCacheManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+#if ENABLE(NETWORK_INFO)
+ if (messageID.is<CoreIPC::MessageClassWebNetworkInfoManagerProxy>()) {
+ m_networkInfoManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+#endif
+
+ if (messageID.is<CoreIPC::MessageClassWebNotificationManagerProxy>()) {
+ m_notificationManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+ if (messageID.is<CoreIPC::MessageClassWebResourceCacheManagerProxy>()) {
+ m_resourceCacheManagerProxy->didReceiveWebResourceCacheManagerProxyMessage(process->connection(), messageID, arguments);
+ return;
+ }
+
+#if USE(SOUP)
+ if (messageID.is<CoreIPC::MessageClassWebSoupRequestManagerProxy>()) {
+ m_soupRequestManagerProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+#endif
+
+#if ENABLE(VIBRATION)
+ if (messageID.is<CoreIPC::MessageClassWebVibrationProxy>()) {
+ m_vibrationProxy->didReceiveMessage(process->connection(), messageID, arguments);
+ return;
+ }
+#endif
+
switch (messageID.get<WebContextLegacyMessage::Kind>()) {
case WebContextLegacyMessage::PostMessage: {
String messageName;
RefPtr<APIObject> messageBody;
- WebContextUserMessageDecoder messageDecoder(messageBody, WebProcessProxy::fromConnection(connection));
+ WebContextUserMessageDecoder messageDecoder(messageBody, process);
if (!arguments->decode(CoreIPC::Out(messageName, messageDecoder)))
return;
@@ -816,26 +816,38 @@ void WebContext::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::Mes
ASSERT_NOT_REACHED();
}
-void WebContext::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, OwnPtr<CoreIPC::ArgumentEncoder>& reply)
+void WebContext::didReceiveSyncMessage(WebProcessProxy* process, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, OwnPtr<CoreIPC::ArgumentEncoder>& reply)
{
if (messageID.is<CoreIPC::MessageClassWebContext>()) {
- didReceiveSyncWebContextMessage(connection, messageID, arguments, reply);
+ didReceiveSyncWebContextMessage(process->connection(), messageID, arguments, reply);
return;
}
if (messageID.is<CoreIPC::MessageClassDownloadProxy>()) {
if (DownloadProxy* downloadProxy = m_downloads.get(arguments->destinationID()).get())
- downloadProxy->didReceiveSyncDownloadProxyMessage(connection, messageID, arguments, reply);
+ downloadProxy->didReceiveSyncDownloadProxyMessage(process->connection(), messageID, arguments, reply);
return;
}
+ if (messageID.is<CoreIPC::MessageClassWebIconDatabase>()) {
+ m_iconDatabase->didReceiveSyncMessage(process->connection(), messageID, arguments, reply);
+ return;
+ }
+
+#if ENABLE(NETWORK_INFO)
+ if (messageID.is<CoreIPC::MessageClassWebNetworkInfoManagerProxy>()) {
+ m_networkInfoManagerProxy->didReceiveSyncMessage(process->connection(), messageID, arguments, reply);
+ return;
+ }
+#endif
+
switch (messageID.get<WebContextLegacyMessage::Kind>()) {
case WebContextLegacyMessage::PostSynchronousMessage: {
// FIXME: We should probably encode something in the case that the arguments do not decode correctly.
String messageName;
RefPtr<APIObject> messageBody;
- WebContextUserMessageDecoder messageDecoder(messageBody, WebProcessProxy::fromConnection(connection));
+ WebContextUserMessageDecoder messageDecoder(messageBody, process);
if (!arguments->decode(CoreIPC::Out(messageName, messageDecoder)))
return;
@@ -958,7 +970,7 @@ static PassRefPtr<MutableDictionary> createDictionaryFromHashMap(const HashMap<S
RefPtr<MutableDictionary> result = MutableDictionary::create();
HashMap<String, uint64_t>::const_iterator end = map.end();
for (HashMap<String, uint64_t>::const_iterator it = map.begin(); it != end; ++it)
- result->set(it->key, RefPtr<WebUInt64>(WebUInt64::create(it->value)).get());
+ result->set(it->first, RefPtr<WebUInt64>(WebUInt64::create(it->second)).get());
return result;
}