Diff
Modified: trunk/Source/WebKit2/ChangeLog (132385 => 132386)
--- trunk/Source/WebKit2/ChangeLog 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/ChangeLog 2012-10-24 19:31:16 UTC (rev 132386)
@@ -1,3 +1,36 @@
+2012-10-24 Anders Carlsson <[email protected]>
+
+ Add per destination ID message receivers
+ https://bugs.webkit.org/show_bug.cgi?id=100276
+
+ Reviewed by Andreas Kling.
+
+ Extend MessageReceiverMap to handle adding message receivers for a given destinationID/receiver name pair.
+ Use this to make every WebPage object a message receiver.
+
+ * Platform/CoreIPC/MessageReceiverMap.cpp:
+ (CoreIPC::MessageReceiverMap::addMessageReceiver):
+ (CoreIPC):
+ (CoreIPC::MessageReceiverMap::removeMessageReceiver):
+ (CoreIPC::MessageReceiverMap::invalidate):
+ (CoreIPC::MessageReceiverMap::dispatchMessage):
+ (CoreIPC::MessageReceiverMap::dispatchSyncMessage):
+ * Platform/CoreIPC/MessageReceiverMap.h:
+ (MessageReceiverMap):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::WebPage):
+ (WebKit::WebPage::~WebPage):
+ * WebProcess/WebPage/WebPage.h:
+ (WebPage):
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::addMessageReceiver):
+ (WebKit):
+ (WebKit::WebProcess::removeMessageReceiver):
+ (WebKit::WebProcess::didReceiveSyncMessage):
+ (WebKit::WebProcess::didReceiveMessage):
+ * WebProcess/WebProcess.h:
+ (WebProcess):
+
2012-10-24 Timothy Hatcher <[email protected]>
Make the Inspector WKView/WebView become the first responder when bringToFront is called.
Modified: trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.cpp (132385 => 132386)
--- trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.cpp 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.cpp 2012-10-24 19:31:16 UTC (rev 132386)
@@ -45,28 +45,65 @@
m_globalMessageReceivers.set(messageReceiverName, messageReceiver);
}
+void MessageReceiverMap::addMessageReceiver(StringReference messageReceiverName, uint64_t destinationID, MessageReceiver* messageReceiver)
+{
+ ASSERT(!m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID)));
+ ASSERT(!m_globalMessageReceivers.contains(messageReceiverName));
+
+ m_messageReceivers.set(std::make_pair(messageReceiverName, destinationID), messageReceiver);
+}
+
+void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverName)
+{
+ ASSERT(m_globalMessageReceivers.contains(messageReceiverName));
+
+ m_globalMessageReceivers.remove(messageReceiverName);
+}
+
+void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverName, uint64_t destinationID)
+{
+ ASSERT(m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID)));
+
+ m_messageReceivers.remove(std::make_pair(messageReceiverName, destinationID));
+}
+
void MessageReceiverMap::invalidate()
{
m_globalMessageReceivers.clear();
+ m_messageReceivers.clear();
}
bool MessageReceiverMap::dispatchMessage(Connection* connection, MessageID messageID, MessageDecoder& decoder)
{
if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) {
+ ASSERT(!decoder.destinationID());
+
messageReceiver->didReceiveMessage(connection, messageID, decoder);
return true;
}
+ if (MessageReceiver* messageReceiver = m_messageReceivers.get(std::make_pair(decoder.messageReceiverName(), decoder.destinationID()))) {
+ messageReceiver->didReceiveMessage(connection, messageID, decoder);
+ return true;
+ }
+
return false;
}
bool MessageReceiverMap::dispatchSyncMessage(Connection* connection, MessageID messageID, MessageDecoder& decoder, OwnPtr<MessageEncoder>& replyEncoder)
{
if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) {
+ ASSERT(!decoder.destinationID());
+
messageReceiver->didReceiveSyncMessage(connection, messageID, decoder, replyEncoder);
return true;
}
+ if (MessageReceiver* messageReceiver = m_messageReceivers.get(std::make_pair(decoder.messageReceiverName(), decoder.destinationID()))) {
+ messageReceiver->didReceiveSyncMessage(connection, messageID, decoder, replyEncoder);
+ return true;
+ }
+
return false;
}
Modified: trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.h (132385 => 132386)
--- trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.h 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/Platform/CoreIPC/MessageReceiverMap.h 2012-10-24 19:31:16 UTC (rev 132386)
@@ -44,7 +44,11 @@
~MessageReceiverMap();
void addMessageReceiver(StringReference messageReceiverName, MessageReceiver*);
+ void addMessageReceiver(StringReference messageReceiverName, uint64_t destinationID, MessageReceiver*);
+ void removeMessageReceiver(StringReference messageReceiverName);
+ void removeMessageReceiver(StringReference messageReceiverName, uint64_t destinationID);
+
void invalidate();
bool dispatchMessage(Connection*, MessageID, MessageDecoder&);
@@ -53,6 +57,8 @@
private:
// Message receivers that don't require a destination ID.
HashMap<StringReference, MessageReceiver*> m_globalMessageReceivers;
+
+ HashMap<std::pair<StringReference, uint64_t>, MessageReceiver*> m_messageReceivers;
};
};
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (132385 => 132386)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2012-10-24 19:31:16 UTC (rev 132386)
@@ -31,6 +31,7 @@
#include "DataReference.h"
#include "DecoderAdapter.h"
#include "DrawingArea.h"
+#include "DrawingAreaMessages.h"
#include "InjectedBundle.h"
#include "InjectedBundleBackForwardList.h"
#include "InjectedBundleUserMessageCoders.h"
@@ -60,15 +61,18 @@
#include "WebEventConversion.h"
#include "WebFrame.h"
#include "WebFullScreenManager.h"
+#include "WebFullScreenManagerMessages.h"
#include "WebGeolocationClient.h"
#include "WebGeometry.h"
#include "WebImage.h"
#include "WebInspector.h"
#include "WebInspectorClient.h"
+#include "WebInspectorMessages.h"
#include "WebNotificationClient.h"
#include "WebOpenPanelResultListener.h"
#include "WebPageCreationParameters.h"
#include "WebPageGroupProxy.h"
+#include "WebPageMessages.h"
#include "WebPageProxyMessages.h"
#include "WebPopupMenu.h"
#include "WebPreferencesStore.h"
@@ -176,6 +180,10 @@
#include <wtf/RefCountedLeakCounter.h>
#endif
+#if USE(COORDINATED_GRAPHICS)
+#include "LayerTreeCoordinatorMessages.h"
+#endif
+
using namespace JSC;
using namespace WebCore;
using namespace std;
@@ -355,6 +363,20 @@
setMediaVolume(parameters.mediaVolume);
+ WebProcess::shared().addMessageReceiver(Messages::WebPage::messageReceiverName(), m_pageID, this);
+
+ // FIXME: This should be done in the object constructors, and the objects themselves should be message receivers.
+ WebProcess::shared().addMessageReceiver(Messages::DrawingArea::messageReceiverName(), m_pageID, this);
+#if USE(COORDINATED_GRAPHICS)
+ WebProcess::shared().addMessageReceiver(Messages::LayerTreeCoordinator::messageReceiverName(), m_pageID, this);
+#endif
+#if ENABLE(INSPECTOR)
+ WebProcess::shared().addMessageReceiver(Messages::WebInspector::messageReceiverName(), m_pageID, this);
+#endif
+#if ENABLE(FULLSCREEN_API)
+ WebProcess::shared().addMessageReceiver(Messages::WebFullScreenManager::messageReceiverName(), m_pageID, this);
+#endif
+
#ifndef NDEBUG
webPageCounter.increment();
#endif
@@ -372,6 +394,20 @@
for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
(*it)->webPageDestroyed();
+ WebProcess::shared().removeMessageReceiver(Messages::WebPage::messageReceiverName(), m_pageID);
+
+ // FIXME: This should be done in the object destructors, and the objects themselves should be message receivers.
+ WebProcess::shared().removeMessageReceiver(Messages::DrawingArea::messageReceiverName(), m_pageID);
+#if USE(COORDINATED_GRAPHICS)
+ WebProcess::shared().removeMessageReceiver(Messages::LayerTreeCoordinator::messageReceiverName(), m_pageID);
+#endif
+#if ENABLE(INSPECTOR)
+ WebProcess::shared().removeMessageReceiver(Messages::WebInspector::messageReceiverName(), m_pageID);
+#endif
+#if ENABLE(FULLSCREEN_API)
+ WebProcess::shared().removeMessageReceiver(Messages::WebFullScreenManager::messageReceiverName(), m_pageID);
+#endif
+
#ifndef NDEBUG
webPageCounter.decrement();
#endif
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (132385 => 132386)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2012-10-24 19:31:16 UTC (rev 132386)
@@ -43,6 +43,7 @@
#include "InjectedBundlePagePolicyClient.h"
#include "InjectedBundlePageResourceLoadClient.h"
#include "InjectedBundlePageUIClient.h"
+#include "MessageReceiver.h"
#include "MessageSender.h"
#include "TapHighlightController.h"
#include "Plugin.h"
@@ -162,7 +163,7 @@
class WebTouchEvent;
#endif
-class WebPage : public APIObject, public CoreIPC::MessageSender<WebPage> {
+class WebPage : public APIObject, public CoreIPC::MessageReceiver, public CoreIPC::MessageSender<WebPage> {
public:
static const Type APIType = TypeBundlePage;
@@ -238,9 +239,8 @@
WebOpenPanelResultListener* activeOpenPanelResultListener() const { return m_activeOpenPanelResultListener.get(); }
void setActiveOpenPanelResultListener(PassRefPtr<WebOpenPanelResultListener>);
- // -- Called from WebProcess.
- void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);
- void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&);
+ void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&) OVERRIDE;
+ void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&) OVERRIDE;
// -- InjectedBundle methods
#if ENABLE(CONTEXT_MENUS)
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (132385 => 132386)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2012-10-24 19:31:16 UTC (rev 132386)
@@ -199,6 +199,16 @@
m_messageReceiverMap.addMessageReceiver(messageReceiverName, messageReceiver);
}
+void WebProcess::addMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID, CoreIPC::MessageReceiver* messageReceiver)
+{
+ m_messageReceiverMap.addMessageReceiver(messageReceiverName, destinationID, messageReceiver);
+}
+
+void WebProcess::removeMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID)
+{
+ m_messageReceiverMap.removeMessageReceiver(messageReceiverName, destinationID);
+}
+
void WebProcess::initializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::MessageDecoder& decoder)
{
ASSERT(m_pageMap.isEmpty());
@@ -651,18 +661,8 @@
void WebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)
{
- if (m_messageReceiverMap.dispatchSyncMessage(connection, messageID, decoder, replyEncoder))
+ m_messageReceiverMap.dispatchSyncMessage(connection, messageID, decoder, replyEncoder);
return;
-
- uint64_t pageID = decoder.destinationID();
- if (!pageID)
- return;
-
- WebPage* page = webPage(pageID);
- if (!page)
- return;
-
- page->didReceiveSyncMessage(connection, messageID, decoder, replyEncoder);
}
void WebProcess::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder)
@@ -718,16 +718,6 @@
pageGroupProxy->didReceiveMessage(connection, messageID, decoder);
}
-
- uint64_t pageID = decoder.destinationID();
- if (!pageID)
- return;
-
- WebPage* page = webPage(pageID);
- if (!page)
- return;
-
- page->didReceiveMessage(connection, messageID, decoder);
}
void WebProcess::didClose(CoreIPC::Connection*)
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (132385 => 132386)
--- trunk/Source/WebKit2/WebProcess/WebProcess.h 2012-10-24 19:31:09 UTC (rev 132385)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h 2012-10-24 19:31:16 UTC (rev 132386)
@@ -115,7 +115,10 @@
WebCore::RunLoop* runLoop() const { return m_runLoop; }
void addMessageReceiver(CoreIPC::StringReference messageReceiverName, CoreIPC::MessageReceiver*);
+ void addMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID, CoreIPC::MessageReceiver*);
+ void removeMessageReceiver(CoreIPC::StringReference messageReceiverName, uint64_t destinationID);
+
WebConnectionToUIProcess* webConnectionToUIProcess() const { return m_connection.get(); }
WebPage* webPage(uint64_t pageID) const;