<!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  &lt;sam@webkit.org&gt;
+
+        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  &lt;cdumez@apple.com&gt;
</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&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const override { }
</span><span class="cx">     void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const override { }
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { static NeverDestroyed&lt;UserMessageHandlerDescriptorMap&gt; map; return map.get(); }
</del><ins>+    void forEachUserMessageHandler(const std::function&lt;void(const UserMessageHandlerDescriptor&amp;)&gt;&amp;) const override { }
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() override { static NeverDestroyed&lt;ContentExtensions::ContentExtensionsBackend&gt; 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&amp; descriptor : page-&gt;userContentProvider().userMessageHandlerDescriptors().values()) {
-        if (&amp;descriptor-&gt;world() == &amp;world)
-            return true;
-    }
</del><ins>+    bool hasUserMessageHandler = false;
+    page-&gt;userContentProvider().forEachUserMessageHandler([&amp;](const UserMessageHandlerDescriptor&amp; descriptor) {
+        if (&amp;descriptor.world() == &amp;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-&gt;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-&gt;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 &lt;runtime/JSCellInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> 
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
-#include &quot;UserMessageHandlerDescriptor.h&quot;
-#endif
-
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> #include &quot;CompiledContentExtension.h&quot;
</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&lt;void(const UserMessageHandlerDescriptor&amp;)&gt;&amp;) const
+{
+}
+#endif
+
</ins><span class="cx"> void UserContentController::addUserScript(DOMWrapperWorld&amp; world, std::unique_ptr&lt;UserScript&gt; userScript)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; scriptsInWorld = m_userScripts.ensure(&amp;world, [&amp;] { return std::make_unique&lt;UserScriptVector&gt;(); }).iterator-&gt;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&amp; descriptor)
-{
-    m_userMessageHandlerDescriptors.add(std::make_pair(descriptor.name(), &amp;descriptor.world()), &amp;descriptor);
-}
-
-void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp; descriptor)
-{
-    m_userMessageHandlerDescriptors.remove(std::make_pair(descriptor.name(), &amp;descriptor.world()));
-}
-#endif
-
-#if ENABLE(CONTENT_EXTENSIONS)
-void UserContentController::addUserContentExtension(const String&amp; name, RefPtr&lt;ContentExtensions::CompiledContentExtension&gt; contentExtension)
-{
-    m_contentExtensionBackend.addContentExtension(name, contentExtension);
-}
-
-void UserContentController::removeUserContentExtension(const String&amp; 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&amp;);
-    WEBCORE_EXPORT void removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp;);
-#endif
-
-#if ENABLE(CONTENT_EXTENSIONS)
-    WEBCORE_EXPORT void addUserContentExtension(const String&amp; name, RefPtr&lt;ContentExtensions::CompiledContentExtension&gt;);
-    WEBCORE_EXPORT void removeUserContentExtension(const String&amp; 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&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const override;
</span><span class="cx">     void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const override;
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptors; }
</del><ins>+    void forEachUserMessageHandler(const std::function&lt;void(const UserMessageHandlerDescriptor&amp;)&gt;&amp;) const override;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     ContentExtensions::ContentExtensionsBackend&amp; 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(&amp;page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UserContentProvider::registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&amp; invalidationClient)
+{
+    ASSERT(!m_userMessageHandlerInvalidationClients.contains(&amp;invalidationClient));
+
+    m_userMessageHandlerInvalidationClients.add(&amp;invalidationClient);
+}
+
+void UserContentProvider::unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&amp; invalidationClient)
+{
+    ASSERT(m_userMessageHandlerInvalidationClients.contains(&amp;invalidationClient));
+
+    m_userMessageHandlerInvalidationClients.remove(&amp;invalidationClient);
+}
+
+void UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients()
+{
+    for (auto&amp; client : m_userMessageHandlerInvalidationClients)
+        client-&gt;didInvalidate(*this);
+}
+
</ins><span class="cx"> void UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; 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&amp;) = 0;
+};
+
</ins><span class="cx"> class UserContentProvider : public RefCounted&lt;UserContentProvider&gt; {
</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&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const = 0;
</span><span class="cx">     virtual void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const = 0;
</span><del>-
</del><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    virtual const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const = 0;
</del><ins>+    virtual void forEachUserMessageHandler(const std::function&lt;void(const UserMessageHandlerDescriptor&amp;)&gt;&amp;) const = 0;
</ins><span class="cx"> #endif
</span><del>-
</del><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     virtual ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() = 0;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&amp;);
+    void unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&amp;);
+
</ins><span class="cx">     void addPage(Page&amp;);
</span><span class="cx">     void removePage(Page&amp;);
</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&lt;Page*&gt; m_pages;
</span><ins>+    HashSet&lt;UserContentProviderInvalidationClient*&gt; 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&amp; frame, UserMessageHandlerDescriptor&amp; descriptor)
</span><span class="cx">     : FrameDestructionObserver(&amp;frame)
</span><del>-    , m_descriptor(descriptor)
</del><ins>+    , m_descriptor(&amp;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-&gt;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-&gt;client()-&gt;didPostMessage(*this, value.get());
</del><ins>+    m_descriptor-&gt;didPostMessage(*this, value.get());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString&amp; UserMessageHandler::name()
-{
-    return m_descriptor-&gt;name();
-}
-
-DOMWrapperWorld&amp; UserMessageHandler::world()
-{
-    return m_descriptor-&gt;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 &quot;FrameDestructionObserver.h&quot;
</span><span class="cx"> #include &quot;UserMessageHandlerDescriptor.h&quot;
</span><del>-#include &lt;bindings/ScriptValue.h&gt;
</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&lt;SerializedScriptValue&gt;, ExceptionCode&amp;);
</span><span class="cx"> 
</span><del>-    const AtomicString&amp; name();
-    DOMWrapperWorld&amp; world();
-    const UserMessageHandlerDescriptor&amp; 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&amp;, UserMessageHandlerDescriptor&amp;);
</span><span class="cx">     
</span><del>-    Ref&lt;UserMessageHandlerDescriptor&gt; m_descriptor;
</del><ins>+    RefPtr&lt;UserMessageHandlerDescriptor&gt; 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&amp; name, DOMWrapperWorld&amp; world, Client&amp; client)
</del><ins>+UserMessageHandlerDescriptor::UserMessageHandlerDescriptor(const AtomicString&amp; name, DOMWrapperWorld&amp; world)
</ins><span class="cx">     : m_name(name)
</span><span class="cx">     , m_world(world)
</span><del>-    , m_client(&amp;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&amp; UserMessageHandlerDescriptor::name()
</del><ins>+const AtomicString&amp; 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&amp; 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 &lt;wtf/PassRefPtr.h&gt;
</del><ins>+#include &lt;wtf/Ref.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><del>-#include &lt;wtf/RefPtr.h&gt;
</del><span class="cx"> #include &lt;wtf/text/AtomicString.h&gt;
</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&lt;UserMessageHandlerDescriptor&gt; {
</span><span class="cx"> public:
</span><del>-    class Client {
-    public:
-        virtual ~Client() { }
-        virtual void didPostMessage(UserMessageHandler&amp;, SerializedScriptValue*) = 0;
-    };
</del><ins>+    WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&amp;, DOMWrapperWorld&amp;);
+    WEBCORE_EXPORT virtual ~UserMessageHandlerDescriptor();
</ins><span class="cx"> 
</span><del>-    static Ref&lt;UserMessageHandlerDescriptor&gt; create(const AtomicString&amp; name, DOMWrapperWorld&amp; world, Client&amp; client)
-    {
-        return adoptRef(*new UserMessageHandlerDescriptor(name, world, client));
-    }
-    WEBCORE_EXPORT ~UserMessageHandlerDescriptor();
-
-    WEBCORE_EXPORT const AtomicString&amp; name();
</del><ins>+    WEBCORE_EXPORT const AtomicString&amp; name() const;
</ins><span class="cx">     WEBCORE_EXPORT DOMWrapperWorld&amp; world();
</span><ins>+    WEBCORE_EXPORT const DOMWrapperWorld&amp; 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&amp;, SerializedScriptValue*) = 0;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&amp;, DOMWrapperWorld&amp;, Client&amp;);
-
</del><span class="cx">     AtomicString m_name;
</span><span class="cx">     Ref&lt;DOMWrapperWorld&gt; 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 &quot;Frame.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><span class="cx"> #include &quot;UserContentController.h&quot;
</span><ins>+#include &quot;UserMessageHandler.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame&amp; frame)
</del><ins>+UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame&amp; frame, UserContentProvider&amp; userContentProvider)
</ins><span class="cx">     : FrameDestructionObserver(&amp;frame)
</span><ins>+    , m_userContentProvider(userContentProvider)
</ins><span class="cx"> {
</span><ins>+    m_userContentProvider-&gt;registerForUserMessageHandlerInvalidation(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> UserMessageHandlersNamespace::~UserMessageHandlersNamespace()
</span><span class="cx"> {
</span><ins>+    m_userContentProvider-&gt;unregisterForUserMessageHandlerInvalidation(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UserMessageHandlersNamespace::didInvalidate(UserContentProvider&amp; provider)
+{
+    auto oldMap = WTFMove(m_messageHandlers);
+
+    provider.forEachUserMessageHandler([&amp;](const UserMessageHandlerDescriptor&amp; descriptor) {
+        auto userMessageHandler = oldMap.take(std::make_pair(descriptor.name(), const_cast&lt;DOMWrapperWorld*&gt;(&amp;descriptor.world())));
+        if (userMessageHandler) {
+            m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast&lt;DOMWrapperWorld*&gt;(&amp;descriptor.world())), userMessageHandler);
+            return;
+        }
+    });
+
+    for (auto&amp; userMessageHandler : oldMap.values())
+        userMessageHandler-&gt;invalidateDescriptor();
+}
+
</ins><span class="cx"> UserMessageHandler* UserMessageHandlersNamespace::handler(const AtomicString&amp; name, DOMWrapperWorld&amp; world)
</span><span class="cx"> {
</span><del>-    if (!frame())
</del><ins>+    Frame* frame = this-&gt;frame();
+    if (!frame)
</ins><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    Page* page = frame()-&gt;page();
</del><ins>+    Page* page = frame-&gt;page();
</ins><span class="cx">     if (!page)
</span><span class="cx">         return nullptr;
</span><del>-    
-    auto&amp; descriptors = page-&gt;userContentProvider().userMessageHandlerDescriptors();
-    
-    RefPtr&lt;UserMessageHandlerDescriptor&gt; descriptor = descriptors.get(std::make_pair(name, &amp;world));
-    if (!descriptor)
-        return nullptr;
</del><span class="cx"> 
</span><del>-    for (auto&amp; handler : m_messageHandlers) {
-        if (&amp;handler-&gt;descriptor() == descriptor.get())
-            return &amp;handler.get();
-    }
</del><ins>+    UserMessageHandler* handler = m_messageHandlers.get(std::pair&lt;AtomicString, RefPtr&lt;DOMWrapperWorld&gt;&gt;(name, &amp;world));
+    if (handler)
+        return handler;
</ins><span class="cx"> 
</span><del>-    auto liveHandlers = descriptors.values();
-    m_messageHandlers.removeAllMatching([liveHandlers](const Ref&lt;UserMessageHandler&gt;&amp; handler) {
-        for (const auto&amp; liveHandler : liveHandlers) {
-            if (liveHandler.get() == &amp;handler-&gt;descriptor())
-                return true;
-        }
-        return false;
</del><ins>+    page-&gt;userContentProvider().forEachUserMessageHandler([&amp;](const UserMessageHandlerDescriptor&amp; descriptor) {
+        if (descriptor.name() != name || &amp;descriptor.world() != &amp;world)
+            return;
+        
+        ASSERT(!handler);
+
+        auto addResult = m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast&lt;DOMWrapperWorld*&gt;(&amp;descriptor.world())), UserMessageHandler::create(*frame, const_cast&lt;UserMessageHandlerDescriptor&amp;&gt;(descriptor)));
+        handler = addResult.iterator-&gt;value.get();
</ins><span class="cx">     });
</span><span class="cx"> 
</span><del>-    m_messageHandlers.append(UserMessageHandler::create(*frame(), *descriptor));
-    return &amp;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 &quot;FrameDestructionObserver.h&quot;
</span><ins>+#include &quot;UserContentProvider.h&quot;
</ins><span class="cx"> #include &quot;UserMessageHandler.h&quot;
</span><ins>+#include &lt;wtf/HashMap.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><del>-#include &lt;wtf/Vector.h&gt;
</del><span class="cx"> #include &lt;wtf/text/AtomicString.h&gt;
</span><ins>+#include &lt;wtf/text/AtomicStringHash.h&gt;
</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&lt;UserMessageHandlersNamespace&gt;, public FrameDestructionObserver {
</del><ins>+class UserMessageHandlersNamespace : public RefCounted&lt;UserMessageHandlersNamespace&gt;, public FrameDestructionObserver, public UserContentProviderInvalidationClient {
</ins><span class="cx"> public:
</span><del>-    static Ref&lt;UserMessageHandlersNamespace&gt; create(Frame&amp; frame)
</del><ins>+    static Ref&lt;UserMessageHandlersNamespace&gt; create(Frame&amp; frame, UserContentProvider&amp; 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&amp;, DOMWrapperWorld&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    explicit UserMessageHandlersNamespace(Frame&amp;);
</del><ins>+    explicit UserMessageHandlersNamespace(Frame&amp;, UserContentProvider&amp;);
</ins><span class="cx"> 
</span><del>-    Vector&lt;Ref&lt;UserMessageHandler&gt;&gt; m_messageHandlers;
</del><ins>+    // UserContentProviderInvalidationClient
+    void didInvalidate(UserContentProvider&amp;) override;
+
+    Ref&lt;UserContentProvider&gt; m_userContentProvider;
+    HashMap&lt;std::pair&lt;AtomicString, RefPtr&lt;DOMWrapperWorld&gt;&gt;, RefPtr&lt;UserMessageHandler&gt;&gt; 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&amp; frame)
</del><ins>+WebKitNamespace::WebKitNamespace(Frame&amp; frame, UserContentProvider&amp; userContentProvider)
</ins><span class="cx">     : DOMWindowProperty(&amp;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&lt;WebKitNamespace&gt; {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;WebKitNamespace&gt; create(Frame&amp; frame)
</del><ins>+    static Ref&lt;WebKitNamespace&gt; create(Frame&amp; frame, UserContentProvider&amp; 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&amp;);
</del><ins>+    explicit WebKitNamespace(Frame&amp;, UserContentProvider&amp;);
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;UserMessageHandlersNamespace&gt; 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  &lt;sam@webkit.org&gt;
+
+        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  &lt;jh718.park@samsung.com&gt;
</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': ['&quot;WebEvent.h&quot;'],
</span><span class="cx">         'WebKit::WebTouchEvent': ['&quot;WebEvent.h&quot;'],
</span><span class="cx">         'WebKit::WebWheelEvent': ['&quot;WebEvent.h&quot;'],
</span><del>-        'WebKit::WebScriptMessageHandlerHandle': ['&quot;WebScriptMessageHandler.h&quot;'],
</del><span class="cx">         'struct WebKit::WebUserScriptData': ['&quot;WebUserContentControllerDataTypes.h&quot;'],
</span><span class="cx">         'struct WebKit::WebUserStyleSheetData': ['&quot;WebUserContentControllerDataTypes.h&quot;'],
</span><ins>+        'struct WebKit::WebScriptMessageHandlerData': ['&quot;WebUserContentControllerDataTypes.h&quot;'],
</ins><span class="cx">         'std::chrono::system_clock::time_point': ['&lt;chrono&gt;'],
</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&amp; encoder) const
+{
+    encoder &lt;&lt; identifier;
+    encoder &lt;&lt; worldIdentifier;
+    encoder &lt;&lt; name;
+}
+
+bool WebScriptMessageHandlerData::decode(IPC::ArgumentDecoder&amp; decoder, WebScriptMessageHandlerData&amp; 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&amp;) const;
+    static bool decode(IPC::ArgumentDecoder&amp;, WebScriptMessageHandlerData&amp;);
+
+    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 &quot;APISerializedScriptValue.h&quot;
</span><ins>+#import &quot;APIUserContentWorld.h&quot;
</ins><span class="cx"> #import &quot;WKFrameInfoInternal.h&quot;
</span><span class="cx"> #import &quot;WKNSArray.h&quot;
</span><span class="cx"> #import &quot;WKScriptMessageHandler.h&quot;
</span><span class="lines">@@ -118,14 +119,14 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)addScriptMessageHandler:(id &lt;WKScriptMessageHandler&gt;)scriptMessageHandler name:(NSString *)name
</span><span class="cx"> {
</span><del>-    RefPtr&lt;WebKit::WebScriptMessageHandler&gt; handler = WebKit::WebScriptMessageHandler::create(std::make_unique&lt;ScriptMessageHandlerDelegate&gt;(self, scriptMessageHandler, name), name);
</del><ins>+    auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique&lt;ScriptMessageHandlerDelegate&gt;(self, scriptMessageHandler, name), name, API::UserContentWorld::normalWorld());
</ins><span class="cx">     if (!_userContentControllerProxy-&gt;addUserScriptMessageHandler(handler.get()))
</span><span class="cx">         [NSException raise:NSInvalidArgumentException format:@&quot;Attempt to add script message handler with name '%@' when one already exists.&quot;, name];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)removeScriptMessageHandlerForName:(NSString *)name
</span><span class="cx"> {
</span><del>-    _userContentControllerProxy-&gt;removeUserMessageHandlerForName(name);
</del><ins>+    _userContentControllerProxy-&gt;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-&gt;removeAllUserStyleSheets(*userContentWorld-&gt;_userContentWorld);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_addScriptMessageHandler:(id &lt;WKScriptMessageHandler&gt;)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+    auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique&lt;ScriptMessageHandlerDelegate&gt;(self, scriptMessageHandler, name), name, *userContentWorld-&gt;_userContentWorld);
+    if (!_userContentControllerProxy-&gt;addUserScriptMessageHandler(handler.get()))
+        [NSException raise:NSInvalidArgumentException format:@&quot;Attempt to add script message handler with name '%@' when one already exists.&quot;, name];
+}
+
+- (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+    _userContentControllerProxy-&gt;removeUserMessageHandlerForName(name, *userContentWorld-&gt;_userContentWorld);
+}
+
+- (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+    _userContentControllerProxy-&gt;removeAllUserMessageHandlers(*userContentWorld-&gt;_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 &lt;WKScriptMessageHandler&gt;)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 &quot;config.h&quot;
</span><span class="cx"> #include &quot;WebScriptMessageHandler.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;ArgumentCoders.h&quot;
</del><ins>+#include &quot;APIUserContentWorld.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-void WebScriptMessageHandlerHandle::encode(IPC::ArgumentEncoder&amp; encoder) const
-{
-    encoder &lt;&lt; identifier;
-    encoder &lt;&lt; name;
-}
-
-bool WebScriptMessageHandlerHandle::decode(IPC::ArgumentDecoder&amp; decoder, WebScriptMessageHandlerHandle&amp; 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&lt;WebScriptMessageHandler&gt; WebScriptMessageHandler::create(std::unique_ptr&lt;Client&gt; client, const String&amp; name)
</del><ins>+Ref&lt;WebScriptMessageHandler&gt; WebScriptMessageHandler::create(std::unique_ptr&lt;Client&gt; client, const String&amp; name, API::UserContentWorld&amp; 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&lt;Client&gt; client, const String&amp; name)
</del><ins>+WebScriptMessageHandler::WebScriptMessageHandler(std::unique_ptr&lt;Client&gt; client, const String&amp; name, API::UserContentWorld&amp; 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 &lt;wtf/PassRefPtr.h&gt;
</del><ins>+#include &quot;WebUserContentControllerDataTypes.h&quot;
+#include &lt;wtf/Ref.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</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&amp;) const;
-    static bool decode(IPC::ArgumentDecoder&amp;, WebScriptMessageHandlerHandle&amp;);
-
-    uint64_t identifier;
-    String name;
-};
-
</del><span class="cx"> class WebScriptMessageHandler : public RefCounted&lt;WebScriptMessageHandler&gt; {
</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&amp;, WebFrameProxy&amp;, const WebCore::SecurityOriginData&amp;, WebCore::SerializedScriptValue&amp;) = 0;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;WebScriptMessageHandler&gt; create(std::unique_ptr&lt;Client&gt;, const String&amp; name);    
</del><ins>+    static Ref&lt;WebScriptMessageHandler&gt; create(std::unique_ptr&lt;Client&gt;, const String&amp; name, API::UserContentWorld&amp;);
</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&amp; userContentWorld() const { return m_world; }
+    API::UserContentWorld&amp; userContentWorld() { return m_world; }
+
</ins><span class="cx">     Client&amp; client() const { return *m_client; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebScriptMessageHandler(std::unique_ptr&lt;Client&gt;, const String&amp;);
</del><ins>+    WebScriptMessageHandler(std::unique_ptr&lt;Client&gt;, const String&amp;, API::UserContentWorld&amp;);
</ins><span class="cx">     
</span><span class="cx">     uint64_t m_identifier;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;Client&gt; m_client;
</span><span class="cx">     String m_name;
</span><ins>+    Ref&lt;API::UserContentWorld&gt; 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-&gt;identifier(), userStyleSheet-&gt;userContentWorld().identifier(), userStyleSheet-&gt;userStyleSheet() });
</span><span class="cx">     webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier);
</span><span class="cx"> 
</span><del>-    Vector&lt;WebScriptMessageHandlerHandle&gt; messageHandlerHandles;
</del><ins>+    Vector&lt;WebScriptMessageHandlerData&gt; messageHandlers;
</ins><span class="cx">     for (auto&amp; handler : m_scriptMessageHandlers.values())
</span><del>-        messageHandlerHandles.append(handler-&gt;handle());
-    webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlerHandles), m_identifier);
</del><ins>+        messageHandlers.append({ handler-&gt;identifier(), handler-&gt;userContentWorld().identifier(), handler-&gt;name() });
+    webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlers), m_identifier);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     Vector&lt;std::pair&lt;String, WebCompiledContentExtensionData&gt;&gt; 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&amp; handler)
</ins><span class="cx"> {
</span><ins>+    Ref&lt;API::UserContentWorld&gt; world = handler.userContentWorld();
+
</ins><span class="cx">     for (auto&amp; existingHandler : m_scriptMessageHandlers.values()) {
</span><del>-        if (existingHandler-&gt;name() == handler-&gt;name())
</del><ins>+        if (existingHandler-&gt;name() == handler.name() &amp;&amp; &amp;existingHandler-&gt;userContentWorld() == world.ptr())
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_scriptMessageHandlers.add(handler-&gt;identifier(), handler);
</del><ins>+    addUserContentWorldUse(world.get());
</ins><span class="cx"> 
</span><ins>+    m_scriptMessageHandlers.add(handler.identifier(), &amp;handler);
+
</ins><span class="cx">     for (WebProcessProxy* process : m_processes)
</span><del>-        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ handler-&gt;handle() }), m_identifier);
</del><ins>+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world-&gt;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&amp; name)
</del><ins>+void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String&amp; name, API::UserContentWorld&amp; 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-&gt;value-&gt;name() == name) {
</del><ins>+        if (it-&gt;value-&gt;name() == name &amp;&amp; &amp;it-&gt;value-&gt;userContentWorld() == &amp;world) {
</ins><span class="cx">             for (WebProcessProxy* process : m_processes)
</span><del>-                process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(it-&gt;value-&gt;identifier()), m_identifier);
</del><ins>+                process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it-&gt;value-&gt;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&amp; world)
+{
+    for (WebProcessProxy* process : m_processes)
+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), m_identifier);
+
+    unsigned numberRemoved = 0;
+    m_scriptMessageHandlers.removeIf([&amp;](HashMap&lt;uint64_t, RefPtr&lt;WebScriptMessageHandler&gt;&gt;::KeyValuePairType&amp; entry) {
+        if (&amp;entry.value-&gt;userContentWorld() == &amp;world) {
+            ++numberRemoved;
+            return true;
+        }
+        return false;
+    });
+
+    removeUserContentWorldUses(world, numberRemoved);
+}
+
</ins><span class="cx"> void WebUserContentControllerProxy::didPostMessage(IPC::Connection&amp; connection, uint64_t pageID, uint64_t frameID, const WebCore::SecurityOriginData&amp; securityOrigin, uint64_t messageHandlerID, const IPC::DataReference&amp; 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-&gt;client().didPostMessage(*page, *frame, securityOrigin,
-        WebCore::SerializedScriptValue::adopt(dataReference.vector()));
</del><ins>+    handler-&gt;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&amp;);
</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&amp;);
</del><ins>+    bool addUserScriptMessageHandler(WebScriptMessageHandler&amp;);
+    void removeUserMessageHandlerForName(const String&amp;, API::UserContentWorld&amp;);
+    void removeAllUserMessageHandlers(API::UserContentWorld&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     void addUserContentExtension(API::UserContentExtension&amp;);
</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-&gt;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&lt;uint64_t&gt;&amp; worldIdentifiers)
</span><span class="cx"> {
</span><ins>+    bool sheetsChanged = false;
</ins><span class="cx">     for (auto&amp; 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-&gt;value.first);
</del><ins>+        if (m_userStyleSheets.remove(it-&gt;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&lt;WebUserMessageHandlerDescriptorProxy&gt;, public WebCore::UserMessageHandlerDescriptor::Client {
</del><ins>+class WebUserMessageHandlerDescriptorProxy : public WebCore::UserMessageHandlerDescriptor {
</ins><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt; create(WebUserContentController* controller, const String&amp; name, uint64_t identifier)
</del><ins>+    static PassRefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt; create(WebUserContentController* controller, const String&amp; name, InjectedBundleScriptWorld&amp; 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-&gt;invalidateClient();
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // WebCore::UserMessageHandlerDescriptor::Client
-    virtual void didPostMessage(WebCore::UserMessageHandler&amp; handler, WebCore::SerializedScriptValue* value)
</del><ins>+    uint64_t identifier() { return m_identifier; }
+
+private:
+    WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String&amp; name, InjectedBundleScriptWorld&amp; 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&amp; 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()-&gt;send(Messages::WebUserContentControllerProxy::DidPostMessage(webPage-&gt;pageID(), webFrame-&gt;frameID(), SecurityOriginData::fromFrame(frame), m_identifier, IPC::DataReference(value-&gt;data())), m_controller-&gt;identifier());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    WebCore::UserMessageHandlerDescriptor&amp; descriptor() { return *m_descriptor; }
-    uint64_t identifier() { return m_identifier; }
-
-private:
-    WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String&amp; name, uint64_t identifier)
-        : m_controller(controller)
-        , m_descriptor(UserMessageHandlerDescriptor::create(name, mainThreadNormalWorld(), *this))
-        , m_identifier(identifier)
-    {
-    }
-
</del><span class="cx">     RefPtr&lt;WebUserContentController&gt; m_controller;
</span><del>-    RefPtr&lt;WebCore::UserMessageHandlerDescriptor&gt; 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&lt;WebScriptMessageHandlerHandle&gt;&amp; scriptMessageHandlers)
</del><ins>+void WebUserContentController::addUserScriptMessageHandlers(const Vector&lt;WebScriptMessageHandlerData&gt;&amp; scriptMessageHandlers)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    for (auto&amp; handle : scriptMessageHandlers) {
-        RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt; descriptor = WebUserMessageHandlerDescriptorProxy::create(this, handle.name, handle.identifier);
</del><ins>+    for (auto&amp; handler : scriptMessageHandlers) {
+        auto it = worldMap().find(handler.worldIdentifier);
+        if (it == worldMap().end()) {
+            WTFLogAlways(&quot;Trying to add a UserScriptMessageHandler to a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, handler.worldIdentifier);
+            continue;
+        }
</ins><span class="cx"> 
</span><del>-        m_userMessageHandlerDescriptors.add(descriptor-&gt;identifier(), descriptor);
-
-        auto&amp; coreDescriptor = descriptor-&gt;descriptor();
-        m_userMessageHandlerDescriptorsMap.add(std::make_pair(coreDescriptor.name(), &amp;coreDescriptor.world()), &amp;coreDescriptor);
</del><ins>+        addUserScriptMessageHandlerInternal(*it-&gt;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(&quot;Trying to remove a UserScriptMessageHandler from a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, worldIdentifier);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    auto&amp; coreDescriptor = it-&gt;value-&gt;descriptor();
-    m_userMessageHandlerDescriptorsMap.remove(std::make_pair(coreDescriptor.name(), &amp;coreDescriptor.world()));
</del><ins>+    removeUserScriptMessageHandlerInternal(*it-&gt;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&lt;uint64_t&gt;&amp; worldIdentifiers)
+{
+#if ENABLE(USER_MESSAGE_HANDLERS)
+    bool userMessageHandlersChanged = false;
+    for (auto&amp; worldIdentifier : worldIdentifiers) {
+        auto it = worldMap().find(worldIdentifier);
+        if (it == worldMap().end()) {
+            WTFLogAlways(&quot;Trying to remove all UserScriptMessageHandler from a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, worldIdentifier);
+            return;
+        }
+
+        if (m_userMessageHandlers.remove(it-&gt;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&amp; world, uint64_t userScriptMessageHandlerIdentifier, const String&amp; name)
+{
+    auto&amp; messageHandlersInWorld = m_userMessageHandlers.ensure(&amp;world, [] { return Vector&lt;RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt;&gt;(); }).iterator-&gt;value;
+    messageHandlersInWorld.append(WebUserMessageHandlerDescriptorProxy::create(this, name, world, userScriptMessageHandlerIdentifier));
+}
+
+void WebUserContentController::removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&amp; world, uint64_t userScriptMessageHandlerIdentifier)
+{
+    auto it = m_userMessageHandlers.find(&amp;world);
+    if (it == m_userMessageHandlers.end())
+        return;
+
+    auto&amp; userMessageHandlers = it-&gt;value;
+
+    bool userMessageHandlersChanged = false;
+    for (int i = userMessageHandlers.size() - 1; i &gt;= 0; --i) {
+        if (userMessageHandlers[i]-&gt;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&lt;std::pair&lt;String, WebCompiledContentExtensionData&gt;&gt;&amp; 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&amp; world, uint64_t userScriptIdentifier, UserScript&amp;&amp; userScript)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; scriptsInWorld = m_userScripts.ensure(&amp;world, [] { return Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;(); }).iterator-&gt;value;
</span><span class="lines">@@ -352,13 +411,12 @@
</span><span class="cx"> {
</span><span class="cx">     auto&amp; styleSheetsInWorld = m_userStyleSheets.ensure(&amp;world, [] { return Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt;(); }).iterator-&gt;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&amp; world, UserStyleSheet&amp;&amp; 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&amp; world, const URL&amp; 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&lt;void(const WebCore::UserMessageHandlerDescriptor&amp;)&gt;&amp; functor) const
+{
+    for (const auto&amp; userMessageHandlerVector : m_userMessageHandlers.values()) {
+        for (const auto&amp; 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&lt;void(WebCore::DOMWrapperWorld&amp;, const WebCore::UserScript&amp;)&gt;&amp;) const override;
</span><span class="cx">     void forEachUserStyleSheet(const std::function&lt;void(const WebCore::UserStyleSheet&amp;)&gt;&amp;) const override;
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    const WebCore::UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptorsMap; }
</del><ins>+    void forEachUserMessageHandler(const std::function&lt;void(const WebCore::UserMessageHandlerDescriptor&amp;)&gt;&amp;) const override;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     WebCore::ContentExtensions::ContentExtensionsBackend&amp; 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&lt;uint64_t&gt;&amp;);
</span><span class="cx"> 
</span><del>-    void addUserScriptMessageHandlers(const Vector&lt;WebScriptMessageHandlerHandle&gt;&amp;);
-    void removeUserScriptMessageHandler(uint64_t);
</del><ins>+    void addUserScriptMessageHandlers(const Vector&lt;WebScriptMessageHandlerData&gt;&amp;);
+    void removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
+    void removeAllUserScriptMessageHandlers(const Vector&lt;uint64_t&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     void addUserContentExtensions(const Vector&lt;std::pair&lt;String, WebCompiledContentExtensionData&gt;&gt;&amp;);
</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&amp;, uint64_t userScriptIdentifier, WebCore::UserScript&amp;&amp;);
</span><span class="cx">     void removeUserScriptInternal(InjectedBundleScriptWorld&amp;, uint64_t userScriptIdentifier);
</span><span class="cx">     void addUserStyleSheetInternal(InjectedBundleScriptWorld&amp;, uint64_t userStyleSheetIdentifier, WebCore::UserStyleSheet&amp;&amp;);
</span><span class="cx">     void removeUserStyleSheetInternal(InjectedBundleScriptWorld&amp;, uint64_t userStyleSheetIdentifier);
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+    void addUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&amp;, uint64_t userScriptMessageHandlerIdentifier, const String&amp; name);
+    void removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&amp;, 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&lt;RefPtr&lt;InjectedBundleScriptWorld&gt;, Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;&gt; 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&lt;uint64_t, RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt;&gt; m_userMessageHandlerDescriptors;
-    WebCore::UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptorsMap;
</del><ins>+    typedef HashMap&lt;RefPtr&lt;InjectedBundleScriptWorld&gt;, Vector&lt;RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt;&gt;&gt; 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&lt;uint64_t&gt; worldIdentifiers);
</span><span class="cx"> 
</span><del>-    AddUserScriptMessageHandlers(Vector&lt;WebKit::WebScriptMessageHandlerHandle&gt; scriptMessageHandlers);
-    RemoveUserScriptMessageHandler(uint64_t identifier);
</del><ins>+    AddUserScriptMessageHandlers(Vector&lt;struct WebKit::WebScriptMessageHandlerData&gt; scriptMessageHandlers);
+    RemoveUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t identifier);
+    RemoveAllUserScriptMessageHandlers(Vector&lt;uint64_t&gt; worldIdentifiers);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     AddUserContentExtensions(Vector&lt;std::pair&lt;String, WebKit::WebCompiledContentExtensionData&gt;&gt; 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  &lt;sam@webkit.org&gt;
+
+        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  &lt;jiewen_tan@apple.com&gt;
</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(@&quot;Hello&quot;, (NSString *)[lastScriptMessage body]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(WKUserContentController, ScriptMessageHandlerBasicPostIsolatedWorld)
+{
+    RetainPtr&lt;_WKUserContentWorld&gt; world = adoptNS([_WKUserContentWorld worldWithName:@&quot;TestWorld&quot;]);
+
+    RetainPtr&lt;ScriptMessageHandler&gt; handler = adoptNS([[ScriptMessageHandler alloc] init]);
+    RetainPtr&lt;WKUserScript&gt; userScript = adoptNS([[WKUserScript alloc] _initWithSource:@&quot;window.webkit.messageHandlers.testHandler.postMessage('Hello')&quot; injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO legacyWhitelist:@[] legacyBlacklist:@[] userContentWorld:world.get()]);
+
+    RetainPtr&lt;WKWebViewConfiguration&gt; configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [[configuration userContentController] _addScriptMessageHandler:handler.get() name:@&quot;testHandler&quot; userContentWorld:world.get()];
+    [[configuration userContentController] addUserScript:userScript.get()];
+
+    RetainPtr&lt;WKWebView&gt; webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    RetainPtr&lt;SimpleNavigationDelegate&gt; delegate = adoptNS([[SimpleNavigationDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
+
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@&quot;simple&quot; withExtension:@&quot;html&quot; subdirectory:@&quot;TestWebKitAPI.resources&quot;]];
+
+    isDoneWithNavigation = false;
+    [webView loadRequest:request];
+
+    TestWebKitAPI::Util::run(&amp;receivedScriptMessage);
+    receivedScriptMessage = false;
+
+    EXPECT_WK_STREQ(@&quot;Hello&quot;, (NSString *)[lastScriptMessage body]);
+
+    if (!isDoneWithNavigation)
+        TestWebKitAPI::Util::run(&amp;isDoneWithNavigation);
+
+    __block bool isDoneEvaluatingScript = false;
+    __block NSString *resultValue = @&quot;&quot;;
+    [webView evaluateJavaScript:
+        @&quot;var result;&quot;
+         &quot;if (window.webkit &amp;&amp; window.webkit.messageHandlers &amp;&amp; window.webkit.messageHandlers.testHandler) {&quot;
+         &quot;    result = { 'result': 'FAIL' };&quot;
+         &quot;} else {&quot;
+         &quot;    result = { 'result': 'PASS' };&quot;
+         &quot;} &quot; 
+         &quot;result;&quot;
+         completionHandler:^(id value, NSError *error) {
+            resultValue = [((NSDictionary *)value)[@&quot;result&quot;] copy];
+            isDoneEvaluatingScript = true;
+        }];
+
+    TestWebKitAPI::Util::run(&amp;isDoneEvaluatingScript);
+
+    EXPECT_WK_STREQ(@&quot;PASS&quot;, resultValue);
+}
+
</ins><span class="cx"> TEST(WKUserContentController, ScriptMessageHandlerBasicRemove)
</span><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;ScriptMessageHandler&gt; handler = adoptNS([[ScriptMessageHandler alloc] init]);
</span></span></pre>
</div>
</div>

</body>
</html>