<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[199020] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/199020">199020</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2016-04-04 14:03:28 -0700 (Mon, 04 Apr 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add SPI to allow install script message handlers in isolated worlds
https://bugs.webkit.org/show_bug.cgi?id=156153
Reviewed by Anders Carlsson.
Source/WebCore:
Added API Test: WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld
- Changes the signature of the method in UserContentProvider to get UserMessageHandlerDescriptors
to match that of UserScripts and UserStyleSheets.
- Removes the need for UserMessageHandlerDescriptor::Client by making UserMessageHandlerDescriptor
directly subclassable.
- Changes invalidation model of UserMessageHandlersNamespace to be more direct by allowing it to
register for invalidation notifications, rather than always checking if handler has been removed
on each invocation.
* loader/EmptyClients.cpp:
Update for new signature.
* page/DOMWindow.cpp:
(WebCore::DOMWindow::shouldHaveWebKitNamespaceForWorld):
Switch to using forEachUserMessageHandler.
(WebCore::DOMWindow::webkitNamespace):
Pass the UserContentProvider to the namespace on creation, so the UserMessageHandlersNamespace
can use it to register to listen for UserMessageHandler changes.
* page/UserContentController.h:
* page/UserContentController.cpp:
(WebCore::UserContentController::forEachUserStyleSheet):
(WebCore::UserContentController::forEachUserMessageHandler):
(WebCore::UserContentController::addUserScript):
(WebCore::UserContentController::removeUserStyleSheets):
(WebCore::UserContentController::removeAllUserContent):
(WebCore::UserContentController::addUserMessageHandlerDescriptor): Deleted.
(WebCore::UserContentController::removeUserMessageHandlerDescriptor): Deleted.
(WebCore::UserContentController::addUserContentExtension): Deleted.
(WebCore::UserContentController::removeUserContentExtension): Deleted.
(WebCore::UserContentController::removeAllUserContentExtensions): Deleted.
Removed unused functions, all the UserMessageHandler and UserContentExtension ones. UserContentController
is only used for Legacy WebKit where those features are not exposed.
* page/UserContentProvider.h:
* page/UserContentProvider.cpp:
(WebCore::UserContentProvider::registerForUserMessageHandlerInvalidation):
(WebCore::UserContentProvider::unregisterForUserMessageHandlerInvalidation):
(WebCore::UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients):
(WebCore::UserContentProviderInvalidationClient::~UserContentProviderInvalidationClient):
Update signature for UserMessageHandlerDescriptor access to match UserScript and UserStyleSheet.
Adds explicit invalidation for UserMessageHandlers.
* page/UserMessageHandler.cpp:
(WebCore::UserMessageHandler::UserMessageHandler):
(WebCore::UserMessageHandler::postMessage):
(WebCore::UserMessageHandler::name): Deleted.
(WebCore::UserMessageHandler::world): Deleted.
* page/UserMessageHandler.h:
(WebCore::UserMessageHandler::descriptor):
(WebCore::UserMessageHandler::invalidateDescriptor):
* page/UserMessageHandlerDescriptor.cpp:
(WebCore::UserMessageHandlerDescriptor::UserMessageHandlerDescriptor):
(WebCore::UserMessageHandlerDescriptor::~UserMessageHandlerDescriptor):
(WebCore::UserMessageHandlerDescriptor::name):
(WebCore::UserMessageHandlerDescriptor::world):
* page/UserMessageHandlerDescriptor.h:
(WebCore::UserMessageHandlerDescriptor::Client::~Client): Deleted.
(WebCore::UserMessageHandlerDescriptor::create): Deleted.
(WebCore::UserMessageHandlerDescriptor::client): Deleted.
(WebCore::UserMessageHandlerDescriptor::invalidateClient): Deleted.
Simplify by removing the Client. Now, when the UserMessageHandlerDescriptor is no longer
active, it gets nulled out in the UserMessageHandler.
* page/UserMessageHandlersNamespace.cpp:
(WebCore::UserMessageHandlersNamespace::UserMessageHandlersNamespace):
(WebCore::UserMessageHandlersNamespace::~UserMessageHandlersNamespace):
(WebCore::UserMessageHandlersNamespace::didInvalidate):
(WebCore::UserMessageHandlersNamespace::handler):
* page/UserMessageHandlersNamespace.h:
Change the logic to listen for invalidations of the UserMessageHandlerDescriptor map. When it
is invalidated, re-build the map of cached UserMessageHandlers from the UserContentProvider,
and invalidate any remaining UserMessageHandlers that no longer exist in the UserContentProvider.
* page/WebKitNamespace.cpp:
(WebCore::WebKitNamespace::WebKitNamespace):
* page/WebKitNamespace.h:
(WebCore::WebKitNamespace::create):
Pass through the UserContentProvider.
Source/WebKit2:
* Scripts/webkit/messages.py:
(headers_for_type):
* Shared/WebUserContentControllerDataTypes.cpp:
(WebKit::WebScriptMessageHandlerData::encode):
(WebKit::WebScriptMessageHandlerData::decode):
* Shared/WebUserContentControllerDataTypes.h:
Add WebKit::WebScriptMessageHandlerData, matching WebKit::WebUserScriptData and
WebKit::WebUserStyleSheetData.
* UIProcess/API/Cocoa/WKUserContentController.mm:
(-[WKUserContentController addScriptMessageHandler:name:]):
(-[WKUserContentController removeScriptMessageHandlerForName:]):
(-[WKUserContentController _removeAllUserStyleSheetsAssociatedWithUserContentWorld:]):
(-[WKUserContentController _addScriptMessageHandler:name:userContentWorld:]):
(-[WKUserContentController _removeScriptMessageHandlerForName:userContentWorld:]):
(-[WKUserContentController _removeAllScriptMessageHandlersAssociatedWithUserContentWorld:]):
* UIProcess/API/Cocoa/WKUserContentControllerPrivate.h:
Add SPI for adding and removing ScriptMessageHandlers associated with a world.
* UIProcess/UserContent/WebScriptMessageHandler.cpp:
(WebKit::WebScriptMessageHandler::create):
(WebKit::WebScriptMessageHandler::WebScriptMessageHandler):
(WebKit::WebScriptMessageHandlerHandle::encode): Deleted.
(WebKit::WebScriptMessageHandlerHandle::decode): Deleted.
* UIProcess/UserContent/WebScriptMessageHandler.h:
(WebKit::WebScriptMessageHandler::identifier):
(WebKit::WebScriptMessageHandler::name):
(WebKit::WebScriptMessageHandler::userContentWorld):
(WebKit::WebScriptMessageHandler::client):
(WebKit::WebScriptMessageHandler::handle): Deleted.
Add the world and move the data object to WebUserContentControllerDataTypes.h
* UIProcess/UserContent/WebUserContentControllerProxy.cpp:
(WebKit::WebUserContentControllerProxy::addProcess):
(WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler):
(WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName):
(WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers):
* UIProcess/UserContent/WebUserContentControllerProxy.h:
Update for worlds, matching UserScript/UserStyleSheet model.
* WebProcess/UserContent/WebUserContentController.h:
* WebProcess/UserContent/WebUserContentController.cpp:
(WebKit::WebUserMessageHandlerDescriptorProxy::WebUserMessageHandlerDescriptorProxy):
Change to inherit directly from WebCore::UserMessageHandlerDescriptor.
(WebKit::WebUserContentController::addUserScriptMessageHandlers):
(WebKit::WebUserContentController::removeUserScriptMessageHandler):
(WebKit::WebUserContentController::removeAllUserScriptMessageHandlers):
(WebKit::WebUserContentController::addUserScriptMessageHandlerInternal):
(WebKit::WebUserContentController::removeUserScriptMessageHandlerInternal):
Add support for worlds, matching UserScript/UserStyleSheet model.
(WebKit::WebUserContentController::addUserStyleSheets):
Add missing call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
(WebKit::WebUserContentController::removeAllUserStyleSheets):
Switch to only calling invalidateInjectedStyleSheetCacheInAllFramesInAllPages() once
after the loop and only if any stylesheets were removed.
(WebKit::WebUserContentController::addUserStyleSheetInternal):
Remove call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages(), make
callers call it. This allows us to avoid calling it repeatedly in removeAllUserStyleSheets().
(WebKit::WebUserContentController::addUserStyleSheet):
Call invalidateInjectedStyleSheetCacheInAllFramesInAllPages() explicitly since it
is no longer called in addUserStyleSheetInternal().
(WebKit::WebUserContentController::forEachUserMessageHandler):
Implement by iterating the m_userMessageHandlers map.
* WebProcess/UserContent/WebUserContentController.messages.in:
Update for worlds, matching UserScript/UserStyleSheet model.
Tools:
* TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm:
Add new test, WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloaderEmptyClientscpp">trunk/Source/WebCore/loader/EmptyClients.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserContentControllercpp">trunk/Source/WebCore/page/UserContentController.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserContentControllerh">trunk/Source/WebCore/page/UserContentController.h</a></li>
<li><a href="#trunkSourceWebCorepageUserContentProvidercpp">trunk/Source/WebCore/page/UserContentProvider.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserContentProviderh">trunk/Source/WebCore/page/UserContentProvider.h</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlercpp">trunk/Source/WebCore/page/UserMessageHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlerh">trunk/Source/WebCore/page/UserMessageHandler.h</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlerDescriptorcpp">trunk/Source/WebCore/page/UserMessageHandlerDescriptor.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlerDescriptorh">trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlersNamespacecpp">trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlersNamespaceh">trunk/Source/WebCore/page/UserMessageHandlersNamespace.h</a></li>
<li><a href="#trunkSourceWebCorepageWebKitNamespacecpp">trunk/Source/WebCore/page/WebKitNamespace.cpp</a></li>
<li><a href="#trunkSourceWebCorepageWebKitNamespaceh">trunk/Source/WebCore/page/WebKitNamespace.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2Scriptswebkitmessagespy">trunk/Source/WebKit2/Scripts/webkit/messages.py</a></li>
<li><a href="#trunkSourceWebKit2SharedWebUserContentControllerDataTypescpp">trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebUserContentControllerDataTypesh">trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKUserContentControllermm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKUserContentControllerPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserContentWebScriptMessageHandlercpp">trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserContentWebScriptMessageHandlerh">trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxycpp">trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxyh">trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessUserContentWebUserContentControllercpp">trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessUserContentWebUserContentControllerh">trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessUserContentWebUserContentControllermessagesin">trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2CocoaUserContentControllermm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/ChangeLog        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -1,3 +1,92 @@
</span><ins>+2016-04-03 Sam Weinig <sam@webkit.org>
+
+ Add SPI to allow install script message handlers in isolated worlds
+ https://bugs.webkit.org/show_bug.cgi?id=156153
+
+ Reviewed by Anders Carlsson.
+
+ Added API Test: WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld
+
+ - Changes the signature of the method in UserContentProvider to get UserMessageHandlerDescriptors
+ to match that of UserScripts and UserStyleSheets.
+ - Removes the need for UserMessageHandlerDescriptor::Client by making UserMessageHandlerDescriptor
+ directly subclassable.
+ - Changes invalidation model of UserMessageHandlersNamespace to be more direct by allowing it to
+ register for invalidation notifications, rather than always checking if handler has been removed
+ on each invocation.
+
+ * loader/EmptyClients.cpp:
+ Update for new signature.
+
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::shouldHaveWebKitNamespaceForWorld):
+ Switch to using forEachUserMessageHandler.
+
+ (WebCore::DOMWindow::webkitNamespace):
+ Pass the UserContentProvider to the namespace on creation, so the UserMessageHandlersNamespace
+ can use it to register to listen for UserMessageHandler changes.
+
+ * page/UserContentController.h:
+ * page/UserContentController.cpp:
+ (WebCore::UserContentController::forEachUserStyleSheet):
+ (WebCore::UserContentController::forEachUserMessageHandler):
+ (WebCore::UserContentController::addUserScript):
+ (WebCore::UserContentController::removeUserStyleSheets):
+ (WebCore::UserContentController::removeAllUserContent):
+ (WebCore::UserContentController::addUserMessageHandlerDescriptor): Deleted.
+ (WebCore::UserContentController::removeUserMessageHandlerDescriptor): Deleted.
+ (WebCore::UserContentController::addUserContentExtension): Deleted.
+ (WebCore::UserContentController::removeUserContentExtension): Deleted.
+ (WebCore::UserContentController::removeAllUserContentExtensions): Deleted.
+ Removed unused functions, all the UserMessageHandler and UserContentExtension ones. UserContentController
+ is only used for Legacy WebKit where those features are not exposed.
+
+ * page/UserContentProvider.h:
+ * page/UserContentProvider.cpp:
+ (WebCore::UserContentProvider::registerForUserMessageHandlerInvalidation):
+ (WebCore::UserContentProvider::unregisterForUserMessageHandlerInvalidation):
+ (WebCore::UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients):
+ (WebCore::UserContentProviderInvalidationClient::~UserContentProviderInvalidationClient):
+ Update signature for UserMessageHandlerDescriptor access to match UserScript and UserStyleSheet.
+ Adds explicit invalidation for UserMessageHandlers.
+
+ * page/UserMessageHandler.cpp:
+ (WebCore::UserMessageHandler::UserMessageHandler):
+ (WebCore::UserMessageHandler::postMessage):
+ (WebCore::UserMessageHandler::name): Deleted.
+ (WebCore::UserMessageHandler::world): Deleted.
+ * page/UserMessageHandler.h:
+ (WebCore::UserMessageHandler::descriptor):
+ (WebCore::UserMessageHandler::invalidateDescriptor):
+ * page/UserMessageHandlerDescriptor.cpp:
+ (WebCore::UserMessageHandlerDescriptor::UserMessageHandlerDescriptor):
+ (WebCore::UserMessageHandlerDescriptor::~UserMessageHandlerDescriptor):
+ (WebCore::UserMessageHandlerDescriptor::name):
+ (WebCore::UserMessageHandlerDescriptor::world):
+ * page/UserMessageHandlerDescriptor.h:
+ (WebCore::UserMessageHandlerDescriptor::Client::~Client): Deleted.
+ (WebCore::UserMessageHandlerDescriptor::create): Deleted.
+ (WebCore::UserMessageHandlerDescriptor::client): Deleted.
+ (WebCore::UserMessageHandlerDescriptor::invalidateClient): Deleted.
+ Simplify by removing the Client. Now, when the UserMessageHandlerDescriptor is no longer
+ active, it gets nulled out in the UserMessageHandler.
+
+ * page/UserMessageHandlersNamespace.cpp:
+ (WebCore::UserMessageHandlersNamespace::UserMessageHandlersNamespace):
+ (WebCore::UserMessageHandlersNamespace::~UserMessageHandlersNamespace):
+ (WebCore::UserMessageHandlersNamespace::didInvalidate):
+ (WebCore::UserMessageHandlersNamespace::handler):
+ * page/UserMessageHandlersNamespace.h:
+ Change the logic to listen for invalidations of the UserMessageHandlerDescriptor map. When it
+ is invalidated, re-build the map of cached UserMessageHandlers from the UserContentProvider,
+ and invalidate any remaining UserMessageHandlers that no longer exist in the UserContentProvider.
+
+ * page/WebKitNamespace.cpp:
+ (WebCore::WebKitNamespace::WebKitNamespace):
+ * page/WebKitNamespace.h:
+ (WebCore::WebKitNamespace::create):
+ Pass through the UserContentProvider.
+
</ins><span class="cx"> 2016-04-04 Chris Dumez <cdumez@apple.com>
</span><span class="cx">
</span><span class="cx"> Regression(r196145): Crash in getOwnPropertyDescriptor on http://www.history.com/shows/vikings
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderEmptyClientscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/EmptyClients.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx"> void forEachUserScript(const std::function<void(DOMWrapperWorld&, const UserScript&)>&) const override { }
</span><span class="cx"> void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const override { }
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { static NeverDestroyed<UserMessageHandlerDescriptorMap> map; return map.get(); }
</del><ins>+ void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const override { }
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() override { static NeverDestroyed<ContentExtensions::ContentExtensionsBackend> backend; return backend.get(); };
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -761,20 +761,26 @@
</span><span class="cx"> if (!page)
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- for (auto& descriptor : page->userContentProvider().userMessageHandlerDescriptors().values()) {
- if (&descriptor->world() == &world)
- return true;
- }
</del><ins>+ bool hasUserMessageHandler = false;
+ page->userContentProvider().forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) {
+ if (&descriptor.world() == &world) {
+ hasUserMessageHandler = true;
+ return;
+ }
+ });
</ins><span class="cx">
</span><del>- return false;
</del><ins>+ return hasUserMessageHandler;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> WebKitNamespace* DOMWindow::webkitNamespace() const
</span><span class="cx"> {
</span><span class="cx"> if (!isCurrentlyDisplayedInFrame())
</span><span class="cx"> return nullptr;
</span><ins>+ auto* page = m_frame->page();
+ if (!page)
+ return nullptr;
</ins><span class="cx"> if (!m_webkitNamespace)
</span><del>- m_webkitNamespace = WebKitNamespace::create(*m_frame);
</del><ins>+ m_webkitNamespace = WebKitNamespace::create(*m_frame, page->userContentProvider());
</ins><span class="cx"> return m_webkitNamespace.get();
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserContentController.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -32,10 +32,6 @@
</span><span class="cx"> #include <runtime/JSCellInlines.h>
</span><span class="cx"> #include <runtime/StructureInlines.h>
</span><span class="cx">
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
-#include "UserMessageHandlerDescriptor.h"
-#endif
-
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> #include "CompiledContentExtension.h"
</span><span class="cx"> #endif
</span><span class="lines">@@ -72,6 +68,12 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+void UserContentController::forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const
+{
+}
+#endif
+
</ins><span class="cx"> void UserContentController::addUserScript(DOMWrapperWorld& world, std::unique_ptr<UserScript> userScript)
</span><span class="cx"> {
</span><span class="cx"> auto& scriptsInWorld = m_userScripts.ensure(&world, [&] { return std::make_unique<UserScriptVector>(); }).iterator->value;
</span><span class="lines">@@ -141,35 +143,6 @@
</span><span class="cx"> invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
-void UserContentController::addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
-{
- m_userMessageHandlerDescriptors.add(std::make_pair(descriptor.name(), &descriptor.world()), &descriptor);
-}
-
-void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
-{
- m_userMessageHandlerDescriptors.remove(std::make_pair(descriptor.name(), &descriptor.world()));
-}
-#endif
-
-#if ENABLE(CONTENT_EXTENSIONS)
-void UserContentController::addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension> contentExtension)
-{
- m_contentExtensionBackend.addContentExtension(name, contentExtension);
-}
-
-void UserContentController::removeUserContentExtension(const String& name)
-{
- m_contentExtensionBackend.removeContentExtension(name);
-}
-
-void UserContentController::removeAllUserContentExtensions()
-{
- m_contentExtensionBackend.removeAllContentExtensions();
-}
-#endif
-
</del><span class="cx"> void UserContentController::removeAllUserContent()
</span><span class="cx"> {
</span><span class="cx"> m_userScripts.clear();
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserContentController.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -45,17 +45,6 @@
</span><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void removeAllUserContent();
</span><span class="cx">
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
- WEBCORE_EXPORT void addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&);
- WEBCORE_EXPORT void removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&);
-#endif
-
-#if ENABLE(CONTENT_EXTENSIONS)
- WEBCORE_EXPORT void addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension>);
- WEBCORE_EXPORT void removeUserContentExtension(const String& name);
- WEBCORE_EXPORT void removeAllUserContentExtensions();
-#endif
-
</del><span class="cx"> private:
</span><span class="cx"> UserContentController();
</span><span class="cx">
</span><span class="lines">@@ -63,7 +52,7 @@
</span><span class="cx"> void forEachUserScript(const std::function<void(DOMWrapperWorld&, const UserScript&)>&) const override;
</span><span class="cx"> void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const override;
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptors; }
</del><ins>+ void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const override;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() override { return m_contentExtensionBackend; }
</span><span class="lines">@@ -71,9 +60,6 @@
</span><span class="cx">
</span><span class="cx"> UserScriptMap m_userScripts;
</span><span class="cx"> UserStyleSheetMap m_userStyleSheets;
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
- UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptors;
-#endif
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentProvidercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentProvider.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentProvider.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserContentProvider.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -61,6 +61,26 @@
</span><span class="cx"> m_pages.remove(&page);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void UserContentProvider::registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient)
+{
+ ASSERT(!m_userMessageHandlerInvalidationClients.contains(&invalidationClient));
+
+ m_userMessageHandlerInvalidationClients.add(&invalidationClient);
+}
+
+void UserContentProvider::unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient)
+{
+ ASSERT(m_userMessageHandlerInvalidationClients.contains(&invalidationClient));
+
+ m_userMessageHandlerInvalidationClients.remove(&invalidationClient);
+}
+
+void UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients()
+{
+ for (auto& client : m_userMessageHandlerInvalidationClients)
+ client->didInvalidate(*this);
+}
+
</ins><span class="cx"> void UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
</span><span class="cx"> {
</span><span class="cx"> for (auto& page : m_pages)
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentProviderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentProvider.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentProvider.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserContentProvider.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -58,6 +58,17 @@
</span><span class="cx"> struct Action;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+class UserContentProvider;
+
+class UserContentProviderInvalidationClient {
+public:
+ virtual ~UserContentProviderInvalidationClient()
+ {
+ }
+
+ virtual void didInvalidate(UserContentProvider&) = 0;
+};
+
</ins><span class="cx"> class UserContentProvider : public RefCounted<UserContentProvider> {
</span><span class="cx"> public:
</span><span class="cx"> WEBCORE_EXPORT UserContentProvider();
</span><span class="lines">@@ -65,19 +76,19 @@
</span><span class="cx">
</span><span class="cx"> virtual void forEachUserScript(const std::function<void(DOMWrapperWorld&, const UserScript&)>&) const = 0;
</span><span class="cx"> virtual void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const = 0;
</span><del>-
</del><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- virtual const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const = 0;
</del><ins>+ virtual void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const = 0;
</ins><span class="cx"> #endif
</span><del>-
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> virtual ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() = 0;
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+ void registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&);
+ void unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&);
+
</ins><span class="cx"> void addPage(Page&);
</span><span class="cx"> void removePage(Page&);
</span><span class="cx">
</span><del>-
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> // FIXME: These don't really belong here. They should probably bundled up in the ContentExtensionsBackend
</span><span class="cx"> // which should always exist.
</span><span class="lines">@@ -86,10 +97,12 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> protected:
</span><ins>+ WEBCORE_EXPORT void invalidateAllRegisteredUserMessageHandlerInvalidationClients();
</ins><span class="cx"> WEBCORE_EXPORT void invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> HashSet<Page*> m_pages;
</span><ins>+ HashSet<UserContentProviderInvalidationClient*> m_userMessageHandlerInvalidationClients;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandler.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandler.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandler.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx">
</span><span class="cx"> UserMessageHandler::UserMessageHandler(Frame& frame, UserMessageHandlerDescriptor& descriptor)
</span><span class="cx"> : FrameDestructionObserver(&frame)
</span><del>- , m_descriptor(descriptor)
</del><ins>+ , m_descriptor(&descriptor)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -48,24 +48,14 @@
</span><span class="cx"> {
</span><span class="cx"> // Check to see if the descriptor has been removed. This can happen if the host application has
</span><span class="cx"> // removed the named message handler at the WebKit2 API level.
</span><del>- if (!m_descriptor->client()) {
</del><ins>+ if (!m_descriptor) {
</ins><span class="cx"> ec = INVALID_ACCESS_ERR;
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- m_descriptor->client()->didPostMessage(*this, value.get());
</del><ins>+ m_descriptor->didPostMessage(*this, value.get());
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-const AtomicString& UserMessageHandler::name()
-{
- return m_descriptor->name();
-}
-
-DOMWrapperWorld& UserMessageHandler::world()
-{
- return m_descriptor->world();
-}
-
</del><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(USER_MESSAGE_HANDLERS)
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandler.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandler.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandler.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">
</span><span class="cx"> #include "FrameDestructionObserver.h"
</span><span class="cx"> #include "UserMessageHandlerDescriptor.h"
</span><del>-#include <bindings/ScriptValue.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -46,14 +45,13 @@
</span><span class="cx">
</span><span class="cx"> void postMessage(PassRefPtr<SerializedScriptValue>, ExceptionCode&);
</span><span class="cx">
</span><del>- const AtomicString& name();
- DOMWrapperWorld& world();
- const UserMessageHandlerDescriptor& descriptor() const { return m_descriptor.get(); }
</del><ins>+ UserMessageHandlerDescriptor* descriptor() { return m_descriptor.get(); }
+ void invalidateDescriptor() { m_descriptor = nullptr; }
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> UserMessageHandler(Frame&, UserMessageHandlerDescriptor&);
</span><span class="cx">
</span><del>- Ref<UserMessageHandlerDescriptor> m_descriptor;
</del><ins>+ RefPtr<UserMessageHandlerDescriptor> m_descriptor;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlerDescriptorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlerDescriptor.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlerDescriptor.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandlerDescriptor.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -32,10 +32,9 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-UserMessageHandlerDescriptor::UserMessageHandlerDescriptor(const AtomicString& name, DOMWrapperWorld& world, Client& client)
</del><ins>+UserMessageHandlerDescriptor::UserMessageHandlerDescriptor(const AtomicString& name, DOMWrapperWorld& world)
</ins><span class="cx"> : m_name(name)
</span><span class="cx"> , m_world(world)
</span><del>- , m_client(&client)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -43,7 +42,7 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-const AtomicString& UserMessageHandlerDescriptor::name()
</del><ins>+const AtomicString& UserMessageHandlerDescriptor::name() const
</ins><span class="cx"> {
</span><span class="cx"> return m_name;
</span><span class="cx"> }
</span><span class="lines">@@ -53,6 +52,11 @@
</span><span class="cx"> return m_world.get();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+const DOMWrapperWorld& UserMessageHandlerDescriptor::world() const
+{
+ return m_world.get();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(USER_MESSAGE_HANDLERS)
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlerDescriptorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -28,44 +28,30 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><span class="cx">
</span><del>-#include <wtf/PassRefPtr.h>
</del><ins>+#include <wtf/Ref.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><del>-#include <wtf/RefPtr.h>
</del><span class="cx"> #include <wtf/text/AtomicString.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-class Frame;
</del><span class="cx"> class DOMWrapperWorld;
</span><del>-class UserMessageHandler;
</del><span class="cx"> class SerializedScriptValue;
</span><ins>+class UserMessageHandler;
</ins><span class="cx">
</span><span class="cx"> class UserMessageHandlerDescriptor : public RefCounted<UserMessageHandlerDescriptor> {
</span><span class="cx"> public:
</span><del>- class Client {
- public:
- virtual ~Client() { }
- virtual void didPostMessage(UserMessageHandler&, SerializedScriptValue*) = 0;
- };
</del><ins>+ WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&, DOMWrapperWorld&);
+ WEBCORE_EXPORT virtual ~UserMessageHandlerDescriptor();
</ins><span class="cx">
</span><del>- static Ref<UserMessageHandlerDescriptor> create(const AtomicString& name, DOMWrapperWorld& world, Client& client)
- {
- return adoptRef(*new UserMessageHandlerDescriptor(name, world, client));
- }
- WEBCORE_EXPORT ~UserMessageHandlerDescriptor();
-
- WEBCORE_EXPORT const AtomicString& name();
</del><ins>+ WEBCORE_EXPORT const AtomicString& name() const;
</ins><span class="cx"> WEBCORE_EXPORT DOMWrapperWorld& world();
</span><ins>+ WEBCORE_EXPORT const DOMWrapperWorld& world() const;
</ins><span class="cx">
</span><del>- Client* client() const { return m_client; }
- void invalidateClient() { m_client = nullptr; }
</del><ins>+ virtual void didPostMessage(UserMessageHandler&, SerializedScriptValue*) = 0;
</ins><span class="cx">
</span><span class="cx"> private:
</span><del>- WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&, DOMWrapperWorld&, Client&);
-
</del><span class="cx"> AtomicString m_name;
</span><span class="cx"> Ref<DOMWrapperWorld> m_world;
</span><del>- Client* m_client;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlersNamespacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -32,49 +32,63 @@
</span><span class="cx"> #include "Frame.h"
</span><span class="cx"> #include "Page.h"
</span><span class="cx"> #include "UserContentController.h"
</span><ins>+#include "UserMessageHandler.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame& frame)
</del><ins>+UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame& frame, UserContentProvider& userContentProvider)
</ins><span class="cx"> : FrameDestructionObserver(&frame)
</span><ins>+ , m_userContentProvider(userContentProvider)
</ins><span class="cx"> {
</span><ins>+ m_userContentProvider->registerForUserMessageHandlerInvalidation(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> UserMessageHandlersNamespace::~UserMessageHandlersNamespace()
</span><span class="cx"> {
</span><ins>+ m_userContentProvider->unregisterForUserMessageHandlerInvalidation(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void UserMessageHandlersNamespace::didInvalidate(UserContentProvider& provider)
+{
+ auto oldMap = WTFMove(m_messageHandlers);
+
+ provider.forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) {
+ auto userMessageHandler = oldMap.take(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())));
+ if (userMessageHandler) {
+ m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), userMessageHandler);
+ return;
+ }
+ });
+
+ for (auto& userMessageHandler : oldMap.values())
+ userMessageHandler->invalidateDescriptor();
+}
+
</ins><span class="cx"> UserMessageHandler* UserMessageHandlersNamespace::handler(const AtomicString& name, DOMWrapperWorld& world)
</span><span class="cx"> {
</span><del>- if (!frame())
</del><ins>+ Frame* frame = this->frame();
+ if (!frame)
</ins><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- Page* page = frame()->page();
</del><ins>+ Page* page = frame->page();
</ins><span class="cx"> if (!page)
</span><span class="cx"> return nullptr;
</span><del>-
- auto& descriptors = page->userContentProvider().userMessageHandlerDescriptors();
-
- RefPtr<UserMessageHandlerDescriptor> descriptor = descriptors.get(std::make_pair(name, &world));
- if (!descriptor)
- return nullptr;
</del><span class="cx">
</span><del>- for (auto& handler : m_messageHandlers) {
- if (&handler->descriptor() == descriptor.get())
- return &handler.get();
- }
</del><ins>+ UserMessageHandler* handler = m_messageHandlers.get(std::pair<AtomicString, RefPtr<DOMWrapperWorld>>(name, &world));
+ if (handler)
+ return handler;
</ins><span class="cx">
</span><del>- auto liveHandlers = descriptors.values();
- m_messageHandlers.removeAllMatching([liveHandlers](const Ref<UserMessageHandler>& handler) {
- for (const auto& liveHandler : liveHandlers) {
- if (liveHandler.get() == &handler->descriptor())
- return true;
- }
- return false;
</del><ins>+ page->userContentProvider().forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) {
+ if (descriptor.name() != name || &descriptor.world() != &world)
+ return;
+
+ ASSERT(!handler);
+
+ auto addResult = m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), UserMessageHandler::create(*frame, const_cast<UserMessageHandlerDescriptor&>(descriptor)));
+ handler = addResult.iterator->value.get();
</ins><span class="cx"> });
</span><span class="cx">
</span><del>- m_messageHandlers.append(UserMessageHandler::create(*frame(), *descriptor));
- return &m_messageHandlers.last().get();
</del><ins>+ return handler;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlersNamespaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlersNamespace.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlersNamespace.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/UserMessageHandlersNamespace.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -29,11 +29,13 @@
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><span class="cx">
</span><span class="cx"> #include "FrameDestructionObserver.h"
</span><ins>+#include "UserContentProvider.h"
</ins><span class="cx"> #include "UserMessageHandler.h"
</span><ins>+#include <wtf/HashMap.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><del>-#include <wtf/Vector.h>
</del><span class="cx"> #include <wtf/text/AtomicString.h>
</span><ins>+#include <wtf/text/AtomicStringHash.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -41,11 +43,11 @@
</span><span class="cx"> class UserMessageHandler;
</span><span class="cx"> class DOMWrapperWorld;
</span><span class="cx">
</span><del>-class UserMessageHandlersNamespace : public RefCounted<UserMessageHandlersNamespace>, public FrameDestructionObserver {
</del><ins>+class UserMessageHandlersNamespace : public RefCounted<UserMessageHandlersNamespace>, public FrameDestructionObserver, public UserContentProviderInvalidationClient {
</ins><span class="cx"> public:
</span><del>- static Ref<UserMessageHandlersNamespace> create(Frame& frame)
</del><ins>+ static Ref<UserMessageHandlersNamespace> create(Frame& frame, UserContentProvider& userContentProvider)
</ins><span class="cx"> {
</span><del>- return adoptRef(*new UserMessageHandlersNamespace(frame));
</del><ins>+ return adoptRef(*new UserMessageHandlersNamespace(frame, userContentProvider));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> virtual ~UserMessageHandlersNamespace();
</span><span class="lines">@@ -53,9 +55,13 @@
</span><span class="cx"> UserMessageHandler* handler(const AtomicString&, DOMWrapperWorld&);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- explicit UserMessageHandlersNamespace(Frame&);
</del><ins>+ explicit UserMessageHandlersNamespace(Frame&, UserContentProvider&);
</ins><span class="cx">
</span><del>- Vector<Ref<UserMessageHandler>> m_messageHandlers;
</del><ins>+ // UserContentProviderInvalidationClient
+ void didInvalidate(UserContentProvider&) override;
+
+ Ref<UserContentProvider> m_userContentProvider;
+ HashMap<std::pair<AtomicString, RefPtr<DOMWrapperWorld>>, RefPtr<UserMessageHandler>> m_messageHandlers;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageWebKitNamespacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WebKitNamespace.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WebKitNamespace.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/WebKitNamespace.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -33,9 +33,9 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-WebKitNamespace::WebKitNamespace(Frame& frame)
</del><ins>+WebKitNamespace::WebKitNamespace(Frame& frame, UserContentProvider& userContentProvider)
</ins><span class="cx"> : DOMWindowProperty(&frame)
</span><del>- , m_messageHandlerNamespace(UserMessageHandlersNamespace::create(frame))
</del><ins>+ , m_messageHandlerNamespace(UserMessageHandlersNamespace::create(frame, userContentProvider))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorepageWebKitNamespaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WebKitNamespace.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WebKitNamespace.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebCore/page/WebKitNamespace.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -35,13 +35,14 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class Frame;
</span><ins>+class UserContentProvider;
</ins><span class="cx"> class UserMessageHandlersNamespace;
</span><span class="cx">
</span><span class="cx"> class WebKitNamespace : public DOMWindowProperty, public RefCounted<WebKitNamespace> {
</span><span class="cx"> public:
</span><del>- static Ref<WebKitNamespace> create(Frame& frame)
</del><ins>+ static Ref<WebKitNamespace> create(Frame& frame, UserContentProvider& userContentProvider)
</ins><span class="cx"> {
</span><del>- return adoptRef(*new WebKitNamespace(frame));
</del><ins>+ return adoptRef(*new WebKitNamespace(frame, userContentProvider));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> virtual ~WebKitNamespace();
</span><span class="lines">@@ -49,7 +50,7 @@
</span><span class="cx"> UserMessageHandlersNamespace* messageHandlers();
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- explicit WebKitNamespace(Frame&);
</del><ins>+ explicit WebKitNamespace(Frame&, UserContentProvider&);
</ins><span class="cx">
</span><span class="cx"> Ref<UserMessageHandlersNamespace> m_messageHandlerNamespace;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/ChangeLog        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -1,3 +1,83 @@
</span><ins>+2016-04-03 Sam Weinig <sam@webkit.org>
+
+ Add SPI to allow install script message handlers in isolated worlds
+ https://bugs.webkit.org/show_bug.cgi?id=156153
+
+ Reviewed by Anders Carlsson.
+
+ * Scripts/webkit/messages.py:
+ (headers_for_type):
+ * Shared/WebUserContentControllerDataTypes.cpp:
+ (WebKit::WebScriptMessageHandlerData::encode):
+ (WebKit::WebScriptMessageHandlerData::decode):
+ * Shared/WebUserContentControllerDataTypes.h:
+ Add WebKit::WebScriptMessageHandlerData, matching WebKit::WebUserScriptData and
+ WebKit::WebUserStyleSheetData.
+
+ * UIProcess/API/Cocoa/WKUserContentController.mm:
+ (-[WKUserContentController addScriptMessageHandler:name:]):
+ (-[WKUserContentController removeScriptMessageHandlerForName:]):
+ (-[WKUserContentController _removeAllUserStyleSheetsAssociatedWithUserContentWorld:]):
+ (-[WKUserContentController _addScriptMessageHandler:name:userContentWorld:]):
+ (-[WKUserContentController _removeScriptMessageHandlerForName:userContentWorld:]):
+ (-[WKUserContentController _removeAllScriptMessageHandlersAssociatedWithUserContentWorld:]):
+ * UIProcess/API/Cocoa/WKUserContentControllerPrivate.h:
+ Add SPI for adding and removing ScriptMessageHandlers associated with a world.
+
+ * UIProcess/UserContent/WebScriptMessageHandler.cpp:
+ (WebKit::WebScriptMessageHandler::create):
+ (WebKit::WebScriptMessageHandler::WebScriptMessageHandler):
+ (WebKit::WebScriptMessageHandlerHandle::encode): Deleted.
+ (WebKit::WebScriptMessageHandlerHandle::decode): Deleted.
+ * UIProcess/UserContent/WebScriptMessageHandler.h:
+ (WebKit::WebScriptMessageHandler::identifier):
+ (WebKit::WebScriptMessageHandler::name):
+ (WebKit::WebScriptMessageHandler::userContentWorld):
+ (WebKit::WebScriptMessageHandler::client):
+ (WebKit::WebScriptMessageHandler::handle): Deleted.
+ Add the world and move the data object to WebUserContentControllerDataTypes.h
+
+ * UIProcess/UserContent/WebUserContentControllerProxy.cpp:
+ (WebKit::WebUserContentControllerProxy::addProcess):
+ (WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler):
+ (WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName):
+ (WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers):
+ * UIProcess/UserContent/WebUserContentControllerProxy.h:
+ Update for worlds, matching UserScript/UserStyleSheet model.
+
+ * WebProcess/UserContent/WebUserContentController.h:
+ * WebProcess/UserContent/WebUserContentController.cpp:
+ (WebKit::WebUserMessageHandlerDescriptorProxy::WebUserMessageHandlerDescriptorProxy):
+ Change to inherit directly from WebCore::UserMessageHandlerDescriptor.
+
+ (WebKit::WebUserContentController::addUserScriptMessageHandlers):
+ (WebKit::WebUserContentController::removeUserScriptMessageHandler):
+ (WebKit::WebUserContentController::removeAllUserScriptMessageHandlers):
+ (WebKit::WebUserContentController::addUserScriptMessageHandlerInternal):
+ (WebKit::WebUserContentController::removeUserScriptMessageHandlerInternal):
+ Add support for worlds, matching UserScript/UserStyleSheet model.
+
+ (WebKit::WebUserContentController::addUserStyleSheets):
+ Add missing call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
+
+ (WebKit::WebUserContentController::removeAllUserStyleSheets):
+ Switch to only calling invalidateInjectedStyleSheetCacheInAllFramesInAllPages() once
+ after the loop and only if any stylesheets were removed.
+
+ (WebKit::WebUserContentController::addUserStyleSheetInternal):
+ Remove call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages(), make
+ callers call it. This allows us to avoid calling it repeatedly in removeAllUserStyleSheets().
+
+ (WebKit::WebUserContentController::addUserStyleSheet):
+ Call invalidateInjectedStyleSheetCacheInAllFramesInAllPages() explicitly since it
+ is no longer called in addUserStyleSheetInternal().
+
+ (WebKit::WebUserContentController::forEachUserMessageHandler):
+ Implement by iterating the m_userMessageHandlers map.
+
+ * WebProcess/UserContent/WebUserContentController.messages.in:
+ Update for worlds, matching UserScript/UserStyleSheet model.
+
</ins><span class="cx"> 2016-04-04 Joonghun Park <jh718.park@samsung.com>
</span><span class="cx">
</span><span class="cx"> [EFL] Fix build break since r198800
</span></span></pre></div>
<a id="trunkSourceWebKit2Scriptswebkitmessagespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Scripts/webkit/messages.py (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Scripts/webkit/messages.py        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/Scripts/webkit/messages.py        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -377,9 +377,9 @@
</span><span class="cx"> 'WebKit::WebMouseEvent': ['"WebEvent.h"'],
</span><span class="cx"> 'WebKit::WebTouchEvent': ['"WebEvent.h"'],
</span><span class="cx"> 'WebKit::WebWheelEvent': ['"WebEvent.h"'],
</span><del>- 'WebKit::WebScriptMessageHandlerHandle': ['"WebScriptMessageHandler.h"'],
</del><span class="cx"> 'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'],
</span><span class="cx"> 'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'],
</span><ins>+ 'struct WebKit::WebScriptMessageHandlerData': ['"WebUserContentControllerDataTypes.h"'],
</ins><span class="cx"> 'std::chrono::system_clock::time_point': ['<chrono>'],
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebUserContentControllerDataTypescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -66,4 +66,24 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+
+void WebScriptMessageHandlerData::encode(IPC::ArgumentEncoder& encoder) const
+{
+ encoder << identifier;
+ encoder << worldIdentifier;
+ encoder << name;
+}
+
+bool WebScriptMessageHandlerData::decode(IPC::ArgumentDecoder& decoder, WebScriptMessageHandlerData& data)
+{
+ if (!decoder.decode(data.identifier))
+ return false;
+ if (!decoder.decode(data.worldIdentifier))
+ return false;
+ if (!decoder.decode(data.name))
+ return false;
+
+ return true;
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebUserContentControllerDataTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -54,6 +54,15 @@
</span><span class="cx"> WebCore::UserStyleSheet userStyleSheet;
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+struct WebScriptMessageHandlerData {
+ void encode(IPC::ArgumentEncoder&) const;
+ static bool decode(IPC::ArgumentDecoder&, WebScriptMessageHandlerData&);
+
+ uint64_t identifier;
+ uint64_t worldIdentifier;
+ String name;
+};
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx">
</span><span class="cx"> #endif // WebUserContentControllerDataTypes_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKUserContentControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if WK_API_ENABLED
</span><span class="cx">
</span><span class="cx"> #import "APISerializedScriptValue.h"
</span><ins>+#import "APIUserContentWorld.h"
</ins><span class="cx"> #import "WKFrameInfoInternal.h"
</span><span class="cx"> #import "WKNSArray.h"
</span><span class="cx"> #import "WKScriptMessageHandler.h"
</span><span class="lines">@@ -118,14 +119,14 @@
</span><span class="cx">
</span><span class="cx"> - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name
</span><span class="cx"> {
</span><del>- RefPtr<WebKit::WebScriptMessageHandler> handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name);
</del><ins>+ auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, API::UserContentWorld::normalWorld());
</ins><span class="cx"> if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get()))
</span><span class="cx"> [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name];
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)removeScriptMessageHandlerForName:(NSString *)name
</span><span class="cx"> {
</span><del>- _userContentControllerProxy->removeUserMessageHandlerForName(name);
</del><ins>+ _userContentControllerProxy->removeUserMessageHandlerForName(name, API::UserContentWorld::normalWorld());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #pragma mark WKObject protocol implementation
</span><span class="lines">@@ -195,6 +196,23 @@
</span><span class="cx"> _userContentControllerProxy->removeAllUserStyleSheets(*userContentWorld->_userContentWorld);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)_addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+ auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, *userContentWorld->_userContentWorld);
+ if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get()))
+ [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name];
+}
+
+- (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+ _userContentControllerProxy->removeUserMessageHandlerForName(name, *userContentWorld->_userContentWorld);
+}
+
+- (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+ _userContentControllerProxy->removeAllUserMessageHandlers(*userContentWorld->_userContentWorld);
+}
+
</ins><span class="cx"> @end
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKUserContentControllerPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -47,6 +47,10 @@
</span><span class="cx"> - (void)_removeAllUserStyleSheets WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
</span><span class="cx"> - (void)_removeAllUserStyleSheetsAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
</span><span class="cx">
</span><ins>+- (void)_addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld;
+- (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld;
+- (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld;
+
</ins><span class="cx"> @end
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserContentWebScriptMessageHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -26,27 +26,10 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "WebScriptMessageHandler.h"
</span><span class="cx">
</span><del>-#include "ArgumentCoders.h"
</del><ins>+#include "APIUserContentWorld.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><del>-void WebScriptMessageHandlerHandle::encode(IPC::ArgumentEncoder& encoder) const
-{
- encoder << identifier;
- encoder << name;
-}
-
-bool WebScriptMessageHandlerHandle::decode(IPC::ArgumentDecoder& decoder, WebScriptMessageHandlerHandle& handle)
-{
- if (!decoder.decode(handle.identifier))
- return false;
-
- if (!decoder.decode(handle.name))
- return false;
-
- return true;
-}
-
</del><span class="cx"> static uint64_t generateIdentifier()
</span><span class="cx"> {
</span><span class="cx"> static uint64_t identifier;
</span><span class="lines">@@ -54,15 +37,16 @@
</span><span class="cx"> return ++identifier;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-PassRefPtr<WebScriptMessageHandler> WebScriptMessageHandler::create(std::unique_ptr<Client> client, const String& name)
</del><ins>+Ref<WebScriptMessageHandler> WebScriptMessageHandler::create(std::unique_ptr<Client> client, const String& name, API::UserContentWorld& world)
</ins><span class="cx"> {
</span><del>- return adoptRef(new WebScriptMessageHandler(WTFMove(client), name));
</del><ins>+ return adoptRef(*new WebScriptMessageHandler(WTFMove(client), name, world));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-WebScriptMessageHandler::WebScriptMessageHandler(std::unique_ptr<Client> client, const String& name)
</del><ins>+WebScriptMessageHandler::WebScriptMessageHandler(std::unique_ptr<Client> client, const String& name, API::UserContentWorld& world)
</ins><span class="cx"> : m_identifier(generateIdentifier())
</span><span class="cx"> , m_client(WTFMove(client))
</span><span class="cx"> , m_name(name)
</span><ins>+ , m_world(world)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserContentWebScriptMessageHandlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -26,33 +26,25 @@
</span><span class="cx"> #ifndef WebScriptMessageHandler_h
</span><span class="cx"> #define WebScriptMessageHandler_h
</span><span class="cx">
</span><del>-#include <wtf/PassRefPtr.h>
</del><ins>+#include "WebUserContentControllerDataTypes.h"
+#include <wtf/Ref.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><del>-namespace IPC {
-class ArgumentDecoder;
-class ArgumentEncoder;
-}
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx"> struct SecurityOriginData;
</span><span class="cx"> class SerializedScriptValue;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+namespace API {
+class UserContentWorld;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> class WebPageProxy;
</span><span class="cx"> class WebFrameProxy;
</span><span class="cx">
</span><del>-struct WebScriptMessageHandlerHandle {
- void encode(IPC::ArgumentEncoder&) const;
- static bool decode(IPC::ArgumentDecoder&, WebScriptMessageHandlerHandle&);
-
- uint64_t identifier;
- String name;
-};
-
</del><span class="cx"> class WebScriptMessageHandler : public RefCounted<WebScriptMessageHandler> {
</span><span class="cx"> public:
</span><span class="cx"> class Client {
</span><span class="lines">@@ -61,23 +53,25 @@
</span><span class="cx"> virtual void didPostMessage(WebPageProxy&, WebFrameProxy&, const WebCore::SecurityOriginData&, WebCore::SerializedScriptValue&) = 0;
</span><span class="cx"> };
</span><span class="cx">
</span><del>- static PassRefPtr<WebScriptMessageHandler> create(std::unique_ptr<Client>, const String& name);
</del><ins>+ static Ref<WebScriptMessageHandler> create(std::unique_ptr<Client>, const String& name, API::UserContentWorld&);
</ins><span class="cx"> virtual ~WebScriptMessageHandler();
</span><span class="cx">
</span><del>- WebScriptMessageHandlerHandle handle() { return { m_identifier, m_name }; }
-
</del><span class="cx"> uint64_t identifier() const { return m_identifier; }
</span><span class="cx"> String name() const { return m_name; }
</span><span class="cx">
</span><ins>+ const API::UserContentWorld& userContentWorld() const { return m_world; }
+ API::UserContentWorld& userContentWorld() { return m_world; }
+
</ins><span class="cx"> Client& client() const { return *m_client; }
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- WebScriptMessageHandler(std::unique_ptr<Client>, const String&);
</del><ins>+ WebScriptMessageHandler(std::unique_ptr<Client>, const String&, API::UserContentWorld&);
</ins><span class="cx">
</span><span class="cx"> uint64_t m_identifier;
</span><span class="cx">
</span><span class="cx"> std::unique_ptr<Client> m_client;
</span><span class="cx"> String m_name;
</span><ins>+ Ref<API::UserContentWorld> m_world;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace API
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -91,10 +91,10 @@
</span><span class="cx"> userStyleSheets.append({ userStyleSheet->identifier(), userStyleSheet->userContentWorld().identifier(), userStyleSheet->userStyleSheet() });
</span><span class="cx"> webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier);
</span><span class="cx">
</span><del>- Vector<WebScriptMessageHandlerHandle> messageHandlerHandles;
</del><ins>+ Vector<WebScriptMessageHandlerData> messageHandlers;
</ins><span class="cx"> for (auto& handler : m_scriptMessageHandlers.values())
</span><del>- messageHandlerHandles.append(handler->handle());
- webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlerHandles), m_identifier);
</del><ins>+ messageHandlers.append({ handler->identifier(), handler->userContentWorld().identifier(), handler->name() });
+ webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlers), m_identifier);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> Vector<std::pair<String, WebCompiledContentExtensionData>> userContentExtensions;
</span><span class="lines">@@ -270,33 +270,57 @@
</span><span class="cx"> removeUserContentWorldUses(worlds);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessageHandler* handler)
</del><ins>+bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessageHandler& handler)
</ins><span class="cx"> {
</span><ins>+ Ref<API::UserContentWorld> world = handler.userContentWorld();
+
</ins><span class="cx"> for (auto& existingHandler : m_scriptMessageHandlers.values()) {
</span><del>- if (existingHandler->name() == handler->name())
</del><ins>+ if (existingHandler->name() == handler.name() && &existingHandler->userContentWorld() == world.ptr())
</ins><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- m_scriptMessageHandlers.add(handler->identifier(), handler);
</del><ins>+ addUserContentWorldUse(world.get());
</ins><span class="cx">
</span><ins>+ m_scriptMessageHandlers.add(handler.identifier(), &handler);
+
</ins><span class="cx"> for (WebProcessProxy* process : m_processes)
</span><del>- process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ handler->handle() }), m_identifier);
</del><ins>+ process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), m_identifier);
</ins><span class="cx">
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String& name)
</del><ins>+void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String& name, API::UserContentWorld& world)
</ins><span class="cx"> {
</span><span class="cx"> for (auto it = m_scriptMessageHandlers.begin(), end = m_scriptMessageHandlers.end(); it != end; ++it) {
</span><del>- if (it->value->name() == name) {
</del><ins>+ if (it->value->name() == name && &it->value->userContentWorld() == &world) {
</ins><span class="cx"> for (WebProcessProxy* process : m_processes)
</span><del>- process->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(it->value->identifier()), m_identifier);
</del><ins>+ process->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), m_identifier);
+
</ins><span class="cx"> m_scriptMessageHandlers.remove(it);
</span><ins>+
+ removeUserContentWorldUses(world, 1);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebUserContentControllerProxy::removeAllUserMessageHandlers(API::UserContentWorld& world)
+{
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), m_identifier);
+
+ unsigned numberRemoved = 0;
+ m_scriptMessageHandlers.removeIf([&](HashMap<uint64_t, RefPtr<WebScriptMessageHandler>>::KeyValuePairType& entry) {
+ if (&entry.value->userContentWorld() == &world) {
+ ++numberRemoved;
+ return true;
+ }
+ return false;
+ });
+
+ removeUserContentWorldUses(world, numberRemoved);
+}
+
</ins><span class="cx"> void WebUserContentControllerProxy::didPostMessage(IPC::Connection& connection, uint64_t pageID, uint64_t frameID, const WebCore::SecurityOriginData& securityOrigin, uint64_t messageHandlerID, const IPC::DataReference& dataReference)
</span><span class="cx"> {
</span><span class="cx"> WebPageProxy* page = WebProcessProxy::webPage(pageID);
</span><span class="lines">@@ -315,8 +339,7 @@
</span><span class="cx"> if (!handler)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- handler->client().didPostMessage(*page, *frame, securityOrigin,
- WebCore::SerializedScriptValue::adopt(dataReference.vector()));
</del><ins>+ handler->client().didPostMessage(*page, *frame, securityOrigin, WebCore::SerializedScriptValue::adopt(dataReference.vector()));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -88,8 +88,9 @@
</span><span class="cx"> void removeAllUserContent(API::UserContentWorld&);
</span><span class="cx">
</span><span class="cx"> // Returns false if there was a name conflict.
</span><del>- bool addUserScriptMessageHandler(WebScriptMessageHandler*);
- void removeUserMessageHandlerForName(const String&);
</del><ins>+ bool addUserScriptMessageHandler(WebScriptMessageHandler&);
+ void removeUserMessageHandlerForName(const String&, API::UserContentWorld&);
+ void removeAllUserMessageHandlers(API::UserContentWorld&);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> void addUserContentExtension(API::UserContentExtension&);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessUserContentWebUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -171,6 +171,8 @@
</span><span class="cx"> UserStyleSheet sheet = userStyleSheetData.userStyleSheet;
</span><span class="cx"> addUserStyleSheetInternal(*it->value.first, userStyleSheetData.identifier, WTFMove(sheet));
</span><span class="cx"> }
</span><ins>+
+ invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebUserContentController::removeUserStyleSheet(uint64_t worldIdentifier, uint64_t userStyleSheetIdentifier)
</span><span class="lines">@@ -186,6 +188,7 @@
</span><span class="cx">
</span><span class="cx"> void WebUserContentController::removeAllUserStyleSheets(const Vector<uint64_t>& worldIdentifiers)
</span><span class="cx"> {
</span><ins>+ bool sheetsChanged = false;
</ins><span class="cx"> for (auto& worldIdentifier : worldIdentifiers) {
</span><span class="cx"> auto it = worldMap().find(worldIdentifier);
</span><span class="cx"> if (it == worldMap().end()) {
</span><span class="lines">@@ -193,26 +196,39 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- removeUserStyleSheets(*it->value.first);
</del><ins>+ if (m_userStyleSheets.remove(it->value.first.get()))
+ sheetsChanged = true;
</ins><span class="cx"> }
</span><ins>+
+ if (sheetsChanged)
+ invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-class WebUserMessageHandlerDescriptorProxy : public RefCounted<WebUserMessageHandlerDescriptorProxy>, public WebCore::UserMessageHandlerDescriptor::Client {
</del><ins>+class WebUserMessageHandlerDescriptorProxy : public WebCore::UserMessageHandlerDescriptor {
</ins><span class="cx"> public:
</span><del>- static PassRefPtr<WebUserMessageHandlerDescriptorProxy> create(WebUserContentController* controller, const String& name, uint64_t identifier)
</del><ins>+ static PassRefPtr<WebUserMessageHandlerDescriptorProxy> create(WebUserContentController* controller, const String& name, InjectedBundleScriptWorld& world, uint64_t identifier)
</ins><span class="cx"> {
</span><del>- return adoptRef(new WebUserMessageHandlerDescriptorProxy(controller, name, identifier));
</del><ins>+ return adoptRef(new WebUserMessageHandlerDescriptorProxy(controller, name, world, identifier));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> virtual ~WebUserMessageHandlerDescriptorProxy()
</span><span class="cx"> {
</span><del>- m_descriptor->invalidateClient();
</del><span class="cx"> }
</span><span class="cx">
</span><del>- // WebCore::UserMessageHandlerDescriptor::Client
- virtual void didPostMessage(WebCore::UserMessageHandler& handler, WebCore::SerializedScriptValue* value)
</del><ins>+ uint64_t identifier() { return m_identifier; }
+
+private:
+ WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String& name, InjectedBundleScriptWorld& world, uint64_t identifier)
+ : WebCore::UserMessageHandlerDescriptor(name, world.coreWorld())
+ , m_controller(controller)
+ , m_identifier(identifier)
</ins><span class="cx"> {
</span><ins>+ }
+
+ // WebCore::UserMessageHandlerDescriptor
+ void didPostMessage(WebCore::UserMessageHandler& handler, WebCore::SerializedScriptValue* value) override
+ {
</ins><span class="cx"> WebCore::Frame* frame = handler.frame();
</span><span class="cx"> if (!frame)
</span><span class="cx"> return;
</span><span class="lines">@@ -228,54 +244,99 @@
</span><span class="cx"> WebProcess::singleton().parentProcessConnection()->send(Messages::WebUserContentControllerProxy::DidPostMessage(webPage->pageID(), webFrame->frameID(), SecurityOriginData::fromFrame(frame), m_identifier, IPC::DataReference(value->data())), m_controller->identifier());
</span><span class="cx"> }
</span><span class="cx">
</span><del>- WebCore::UserMessageHandlerDescriptor& descriptor() { return *m_descriptor; }
- uint64_t identifier() { return m_identifier; }
-
-private:
- WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String& name, uint64_t identifier)
- : m_controller(controller)
- , m_descriptor(UserMessageHandlerDescriptor::create(name, mainThreadNormalWorld(), *this))
- , m_identifier(identifier)
- {
- }
-
</del><span class="cx"> RefPtr<WebUserContentController> m_controller;
</span><del>- RefPtr<WebCore::UserMessageHandlerDescriptor> m_descriptor;
</del><span class="cx"> uint64_t m_identifier;
</span><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-void WebUserContentController::addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerHandle>& scriptMessageHandlers)
</del><ins>+void WebUserContentController::addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>& scriptMessageHandlers)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- for (auto& handle : scriptMessageHandlers) {
- RefPtr<WebUserMessageHandlerDescriptorProxy> descriptor = WebUserMessageHandlerDescriptorProxy::create(this, handle.name, handle.identifier);
</del><ins>+ for (auto& handler : scriptMessageHandlers) {
+ auto it = worldMap().find(handler.worldIdentifier);
+ if (it == worldMap().end()) {
+ WTFLogAlways("Trying to add a UserScriptMessageHandler to a UserContentWorld (id=%" PRIu64 ") that does not exist.", handler.worldIdentifier);
+ continue;
+ }
</ins><span class="cx">
</span><del>- m_userMessageHandlerDescriptors.add(descriptor->identifier(), descriptor);
-
- auto& coreDescriptor = descriptor->descriptor();
- m_userMessageHandlerDescriptorsMap.add(std::make_pair(coreDescriptor.name(), &coreDescriptor.world()), &coreDescriptor);
</del><ins>+ addUserScriptMessageHandlerInternal(*it->value.first, handler.identifier, handler.name);
</ins><span class="cx"> }
</span><span class="cx"> #else
</span><span class="cx"> UNUSED_PARAM(scriptMessageHandlers);
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebUserContentController::removeUserScriptMessageHandler(uint64_t identifier)
</del><ins>+void WebUserContentController::removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptMessageHandlerIdentifier)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- auto it = m_userMessageHandlerDescriptors.find(identifier);
- ASSERT(it != m_userMessageHandlerDescriptors.end());
</del><ins>+ auto it = worldMap().find(worldIdentifier);
+ if (it == worldMap().end()) {
+ WTFLogAlways("Trying to remove a UserScriptMessageHandler from a UserContentWorld (id=%" PRIu64 ") that does not exist.", worldIdentifier);
+ return;
+ }
</ins><span class="cx">
</span><del>- auto& coreDescriptor = it->value->descriptor();
- m_userMessageHandlerDescriptorsMap.remove(std::make_pair(coreDescriptor.name(), &coreDescriptor.world()));
</del><ins>+ removeUserScriptMessageHandlerInternal(*it->value.first, userScriptMessageHandlerIdentifier);
+#else
+ UNUSED_PARAM(worldIdentifier);
+ UNUSED_PARAM(userScriptMessageHandlerIdentifier);
+#endif
+}
</ins><span class="cx">
</span><del>- m_userMessageHandlerDescriptors.remove(it);
</del><ins>+void WebUserContentController::removeAllUserScriptMessageHandlers(const Vector<uint64_t>& worldIdentifiers)
+{
+#if ENABLE(USER_MESSAGE_HANDLERS)
+ bool userMessageHandlersChanged = false;
+ for (auto& worldIdentifier : worldIdentifiers) {
+ auto it = worldMap().find(worldIdentifier);
+ if (it == worldMap().end()) {
+ WTFLogAlways("Trying to remove all UserScriptMessageHandler from a UserContentWorld (id=%" PRIu64 ") that does not exist.", worldIdentifier);
+ return;
+ }
+
+ if (m_userMessageHandlers.remove(it->value.first.get()))
+ userMessageHandlersChanged = true;
+ }
+
+ if (userMessageHandlersChanged)
+ invalidateAllRegisteredUserMessageHandlerInvalidationClients();
</ins><span class="cx"> #else
</span><del>- UNUSED_PARAM(identifier);
</del><ins>+ UNUSED_PARAM(worldIdentifiers);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+void WebUserContentController::addUserScriptMessageHandlerInternal(InjectedBundleScriptWorld& world, uint64_t userScriptMessageHandlerIdentifier, const String& name)
+{
+ auto& messageHandlersInWorld = m_userMessageHandlers.ensure(&world, [] { return Vector<RefPtr<WebUserMessageHandlerDescriptorProxy>>(); }).iterator->value;
+ messageHandlersInWorld.append(WebUserMessageHandlerDescriptorProxy::create(this, name, world, userScriptMessageHandlerIdentifier));
+}
+
+void WebUserContentController::removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld& world, uint64_t userScriptMessageHandlerIdentifier)
+{
+ auto it = m_userMessageHandlers.find(&world);
+ if (it == m_userMessageHandlers.end())
+ return;
+
+ auto& userMessageHandlers = it->value;
+
+ bool userMessageHandlersChanged = false;
+ for (int i = userMessageHandlers.size() - 1; i >= 0; --i) {
+ if (userMessageHandlers[i]->identifier() == userScriptMessageHandlerIdentifier) {
+ userMessageHandlers.remove(i);
+ userMessageHandlersChanged = true;
+ }
+ }
+
+ if (!userMessageHandlersChanged)
+ return;
+
+ if (userMessageHandlers.isEmpty())
+ m_userMessageHandlers.remove(it);
+
+ invalidateAllRegisteredUserMessageHandlerInvalidationClients();
+}
+#endif
+
</ins><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> void WebUserContentController::addUserContentExtensions(const Vector<std::pair<String, WebCompiledContentExtensionData>>& userContentExtensions)
</span><span class="cx"> {
</span><span class="lines">@@ -298,8 +359,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-
-
</del><span class="cx"> void WebUserContentController::addUserScriptInternal(InjectedBundleScriptWorld& world, uint64_t userScriptIdentifier, UserScript&& userScript)
</span><span class="cx"> {
</span><span class="cx"> auto& scriptsInWorld = m_userScripts.ensure(&world, [] { return Vector<std::pair<uint64_t, WebCore::UserScript>>(); }).iterator->value;
</span><span class="lines">@@ -352,13 +411,12 @@
</span><span class="cx"> {
</span><span class="cx"> auto& styleSheetsInWorld = m_userStyleSheets.ensure(&world, [] { return Vector<std::pair<uint64_t, WebCore::UserStyleSheet>>(); }).iterator->value;
</span><span class="cx"> styleSheetsInWorld.append(std::make_pair(userStyleSheetIdentifier, WTFMove(userStyleSheet)));
</span><del>-
- invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebUserContentController::addUserStyleSheet(InjectedBundleScriptWorld& world, UserStyleSheet&& userStyleSheet)
</span><span class="cx"> {
</span><span class="cx"> addUserStyleSheetInternal(world, 0, WTFMove(userStyleSheet));
</span><ins>+ invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebUserContentController::removeUserStyleSheetWithURL(InjectedBundleScriptWorld& world, const URL& url)
</span><span class="lines">@@ -446,4 +504,14 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+void WebUserContentController::forEachUserMessageHandler(const std::function<void(const WebCore::UserMessageHandlerDescriptor&)>& functor) const
+{
+ for (const auto& userMessageHandlerVector : m_userMessageHandlers.values()) {
+ for (const auto& userMessageHandler : userMessageHandlerVector)
+ functor(*userMessageHandler.get());
+ }
+}
+#endif
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessUserContentWebUserContentControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -46,10 +46,7 @@
</span><span class="cx">
</span><span class="cx"> class InjectedBundleScriptWorld;
</span><span class="cx"> class WebCompiledContentExtensionData;
</span><del>-
-#if ENABLE(USER_MESSAGE_HANDLERS)
</del><span class="cx"> class WebUserMessageHandlerDescriptorProxy;
</span><del>-#endif
</del><span class="cx">
</span><span class="cx"> class WebUserContentController final : public WebCore::UserContentProvider, private IPC::MessageReceiver {
</span><span class="cx"> public:
</span><span class="lines">@@ -73,7 +70,7 @@
</span><span class="cx"> void forEachUserScript(const std::function<void(WebCore::DOMWrapperWorld&, const WebCore::UserScript&)>&) const override;
</span><span class="cx"> void forEachUserStyleSheet(const std::function<void(const WebCore::UserStyleSheet&)>&) const override;
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- const WebCore::UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptorsMap; }
</del><ins>+ void forEachUserMessageHandler(const std::function<void(const WebCore::UserMessageHandlerDescriptor&)>&) const override;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> WebCore::ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() override { return m_contentExtensionBackend; }
</span><span class="lines">@@ -93,8 +90,9 @@
</span><span class="cx"> void removeUserStyleSheet(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
</span><span class="cx"> void removeAllUserStyleSheets(const Vector<uint64_t>&);
</span><span class="cx">
</span><del>- void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerHandle>&);
- void removeUserScriptMessageHandler(uint64_t);
</del><ins>+ void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>&);
+ void removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
+ void removeAllUserScriptMessageHandlers(const Vector<uint64_t>&);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> void addUserContentExtensions(const Vector<std::pair<String, WebCompiledContentExtensionData>>&);
</span><span class="lines">@@ -102,13 +100,15 @@
</span><span class="cx"> void removeAllUserContentExtensions();
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-
</del><span class="cx"> void addUserScriptInternal(InjectedBundleScriptWorld&, uint64_t userScriptIdentifier, WebCore::UserScript&&);
</span><span class="cx"> void removeUserScriptInternal(InjectedBundleScriptWorld&, uint64_t userScriptIdentifier);
</span><span class="cx"> void addUserStyleSheetInternal(InjectedBundleScriptWorld&, uint64_t userStyleSheetIdentifier, WebCore::UserStyleSheet&&);
</span><span class="cx"> void removeUserStyleSheetInternal(InjectedBundleScriptWorld&, uint64_t userStyleSheetIdentifier);
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+ void addUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&, uint64_t userScriptMessageHandlerIdentifier, const String& name);
+ void removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&, uint64_t userScriptMessageHandlerIdentifier);
+#endif
</ins><span class="cx">
</span><del>-
</del><span class="cx"> uint64_t m_identifier;
</span><span class="cx">
</span><span class="cx"> typedef HashMap<RefPtr<InjectedBundleScriptWorld>, Vector<std::pair<uint64_t, WebCore::UserScript>>> WorldToUserScriptMap;
</span><span class="lines">@@ -118,8 +118,8 @@
</span><span class="cx"> WorldToUserStyleSheetMap m_userStyleSheets;
</span><span class="cx">
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>- HashMap<uint64_t, RefPtr<WebUserMessageHandlerDescriptorProxy>> m_userMessageHandlerDescriptors;
- WebCore::UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptorsMap;
</del><ins>+ typedef HashMap<RefPtr<InjectedBundleScriptWorld>, Vector<RefPtr<WebUserMessageHandlerDescriptorProxy>>> WorldToUserMessageHandlerVectorMap;
+ WorldToUserMessageHandlerVectorMap m_userMessageHandlers;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> WebCore::ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessUserContentWebUserContentControllermessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -35,8 +35,9 @@
</span><span class="cx"> RemoveUserStyleSheet(uint64_t worldIdentifier, uint64_t identifier);
</span><span class="cx"> RemoveAllUserStyleSheets(Vector<uint64_t> worldIdentifiers);
</span><span class="cx">
</span><del>- AddUserScriptMessageHandlers(Vector<WebKit::WebScriptMessageHandlerHandle> scriptMessageHandlers);
- RemoveUserScriptMessageHandler(uint64_t identifier);
</del><ins>+ AddUserScriptMessageHandlers(Vector<struct WebKit::WebScriptMessageHandlerData> scriptMessageHandlers);
+ RemoveUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t identifier);
+ RemoveAllUserScriptMessageHandlers(Vector<uint64_t> worldIdentifiers);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> AddUserContentExtensions(Vector<std::pair<String, WebKit::WebCompiledContentExtensionData>> userContentFilters);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Tools/ChangeLog        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-04-03 Sam Weinig <sam@webkit.org>
+
+ Add SPI to allow install script message handlers in isolated worlds
+ https://bugs.webkit.org/show_bug.cgi?id=156153
+
+ Reviewed by Anders Carlsson.
+
+ * TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm:
+ Add new test, WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld
+
</ins><span class="cx"> 2016-04-04 Jiewen Tan <jiewen_tan@apple.com>
</span><span class="cx">
</span><span class="cx"> Build fix for r198956.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2CocoaUserContentControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm (199019 => 199020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm        2016-04-04 20:45:01 UTC (rev 199019)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm        2016-04-04 21:03:28 UTC (rev 199020)
</span><span class="lines">@@ -95,6 +95,55 @@
</span><span class="cx"> EXPECT_WK_STREQ(@"Hello", (NSString *)[lastScriptMessage body]);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+TEST(WKUserContentController, ScriptMessageHandlerBasicPostIsolatedWorld)
+{
+ RetainPtr<_WKUserContentWorld> world = adoptNS([_WKUserContentWorld worldWithName:@"TestWorld"]);
+
+ RetainPtr<ScriptMessageHandler> handler = adoptNS([[ScriptMessageHandler alloc] init]);
+ RetainPtr<WKUserScript> userScript = adoptNS([[WKUserScript alloc] _initWithSource:@"window.webkit.messageHandlers.testHandler.postMessage('Hello')" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO legacyWhitelist:@[] legacyBlacklist:@[] userContentWorld:world.get()]);
+
+ RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [[configuration userContentController] _addScriptMessageHandler:handler.get() name:@"testHandler" userContentWorld:world.get()];
+ [[configuration userContentController] addUserScript:userScript.get()];
+
+ RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+ RetainPtr<SimpleNavigationDelegate> delegate = adoptNS([[SimpleNavigationDelegate alloc] init]);
+ [webView setNavigationDelegate:delegate.get()];
+
+ NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+
+ isDoneWithNavigation = false;
+ [webView loadRequest:request];
+
+ TestWebKitAPI::Util::run(&receivedScriptMessage);
+ receivedScriptMessage = false;
+
+ EXPECT_WK_STREQ(@"Hello", (NSString *)[lastScriptMessage body]);
+
+ if (!isDoneWithNavigation)
+ TestWebKitAPI::Util::run(&isDoneWithNavigation);
+
+ __block bool isDoneEvaluatingScript = false;
+ __block NSString *resultValue = @"";
+ [webView evaluateJavaScript:
+ @"var result;"
+ "if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.testHandler) {"
+ " result = { 'result': 'FAIL' };"
+ "} else {"
+ " result = { 'result': 'PASS' };"
+ "} "
+ "result;"
+ completionHandler:^(id value, NSError *error) {
+ resultValue = [((NSDictionary *)value)[@"result"] copy];
+ isDoneEvaluatingScript = true;
+ }];
+
+ TestWebKitAPI::Util::run(&isDoneEvaluatingScript);
+
+ EXPECT_WK_STREQ(@"PASS", resultValue);
+}
+
</ins><span class="cx"> TEST(WKUserContentController, ScriptMessageHandlerBasicRemove)
</span><span class="cx"> {
</span><span class="cx"> RetainPtr<ScriptMessageHandler> handler = adoptNS([[ScriptMessageHandler alloc] init]);
</span></span></pre>
</div>
</div>
</body>
</html>