<!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>[197943] trunk/Source</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/197943">197943</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2016-03-10 10:24:50 -0800 (Thu, 10 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add a baseURL parameter to _WKUserStyleSheet
https://bugs.webkit.org/show_bug.cgi?id=155219

Reviewed by Tim Horton.

Source/WebCore:

- Moves to a model for user content where instead of each page having a WebCore::UserContentController
  object, we have an abstract WebCore::UserContentProvider interface that can be implemented at the WebKit
  level. For now, legacy WebKit continues to use the old UserContentController, which implements 
  WebCore::UserContentProvider, and WebKit2 implements its own implementation so it can store additional
  state.

* WebCore.xcodeproj/project.pbxproj:
Add new files.

* dom/ExtensionStyleSheets.cpp:
(WebCore::ExtensionStyleSheets::updateInjectedStyleSheetCache):
Switch to using forEachUserStyleSheet on the UserContentProvider.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::loadResource):
Remove null check now that we always have a UserContentProvider.

* loader/EmptyClients.cpp:
(WebCore::fillWithEmptyClients):
* loader/EmptyClients.h:
Add new EmptyClients.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::loadResourceSynchronously):
Remove null check now that we always have a UserContentProvider.

* loader/PingLoader.cpp:
(WebCore::processContentExtensionRulesForLoad):
Remove null check now that we always have a UserContentProvider.

* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::willSendRequestInternal):
Remove null check now that we always have a UserContentProvider.

* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::requestResource):
Remove null check now that we always have a UserContentProvider.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::shouldHaveWebKitNamespaceForWorld):
Remove null checks now that we always have a UserContentProvider, and userMessageHandlerDescriptors
returns a reference.

(WebCore::DOMWindow::open):
Remove null check now that we always have a UserContentProvider.

* page/Frame.cpp:
(WebCore::Frame::injectUserScripts):
Simplify by lifting document check out of the main loop and using forEachUserScript.

* page/Page.cpp:
(WebCore::Page::Page):
(WebCore::Page::~Page):
(WebCore::Page::userContentProvider):
(WebCore::Page::setUserContentProvider):
(WebCore::Page::setUserContentController): Deleted.
* page/Page.h:
(WebCore::Page::userContentController): Deleted.
* page/PageConfiguration.h:
Store the UserContentProvider in a Ref, and require PageConfigurations to provide one. This
removes a bunch of null checks and simplifies the code.

* page/UserContentController.cpp:
(WebCore::UserContentController::~UserContentController):
(WebCore::UserContentController::forEachUserScript):
(WebCore::UserContentController::forEachUserStyleSheet):
(WebCore::UserContentController::addUserScript):
(WebCore::UserContentController::removeUserScript):
(WebCore::UserContentController::removeUserScripts):
(WebCore::UserContentController::addUserStyleSheet):
(WebCore::UserContentController::removeUserStyleSheet):
(WebCore::UserContentController::removeUserStyleSheets):
(WebCore::UserContentController::addUserMessageHandlerDescriptor):
(WebCore::UserContentController::removeUserMessageHandlerDescriptor):
(WebCore::UserContentController::addUserContentExtension):
(WebCore::UserContentController::removeUserContentExtension):
(WebCore::UserContentController::removeAllUserContentExtensions):
(WebCore::UserContentController::removeAllUserContent):
(WebCore::UserContentController::addPage): Deleted.
(WebCore::UserContentController::removePage): Deleted.
(WebCore::contentExtensionsEnabled): Deleted.
(WebCore::UserContentController::processContentExtensionRulesForLoad): Deleted.
(WebCore::UserContentController::actionsForResourceLoad): Deleted.
* page/UserContentController.h:
(WebCore::UserContentController::userScripts): Deleted.
(WebCore::UserContentController::userStyleSheets): Deleted.
(WebCore::UserContentController::userMessageHandlerDescriptors): Deleted.
Add inheritance from UserContentProvider and simplify things by removing unique_ptrs
that were holding the member variables. There is usually only one UserContentController
so having these in unique_ptrs doesn't make much sense.
        
* page/UserContentProvider.cpp: Added.
(WebCore::UserContentProvider::UserContentProvider):
(WebCore::UserContentProvider::~UserContentProvider):
(WebCore::UserContentProvider::addPage):
(WebCore::UserContentProvider::removePage):
(WebCore::UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages):
(WebCore::contentExtensionsEnabled):
(WebCore::UserContentProvider::processContentExtensionRulesForLoad):
(WebCore::UserContentProvider::actionsForResourceLoad):
* page/UserContentProvider.h: Added.
Add abstract class for providing user content and add some helpers on it.

* page/UserMessageHandlerDescriptor.h:
(WebCore::UserMessageHandlerDescriptor::create):
(WebCore::UserMessageHandlerDescriptor::client):
(WebCore::UserMessageHandlerDescriptor::invalidateClient):
* page/UserMessageHandlersNamespace.cpp:
(WebCore::UserMessageHandlersNamespace::handler):
Simplify now that userContentProvider() and userMessageHandlerDescriptors() are references.

Source/WebKit/mac:

* WebView/WebView.mm:
(-[WebView _commonInitializationWithFrameName:groupName:]):
(-[WebView initSimpleHTMLDocumentWithStyle:frame:preferences:groupName:]):
(-[WebView setGroupName:]):
Update to account for the name change from UserContentController -&gt; UserContentProvider.

Source/WebKit2:

- Moves to a model for user content where instead of using a WebCore::UserContentController
  object, we implement the new WebCore::UserContentProvider interface (on the existing 
  WebUserContentController object).
- Uses this to maintain maps of UserStylesSheets and UserScripts along with their identifiers,
  freeing up the URL, which had been acting as the identifier, to be used as the baseURL which
  was what it was intended for.
- Adds a baseURL property to _WKUserStyleSheet.

* WebKit2.xcodeproj/project.pbxproj:
Add new files.

* Scripts/webkit/messages.py:
(headers_for_type):
Add support for sending WebUserContentControllerDataTypes.

* Shared/WebUserContentControllerDataTypes.cpp: Added.
(WebKit::WebUserScriptData::encode):
(WebKit::WebUserScriptData::decode):
(WebKit::WebUserStyleSheetData::encode):
(WebKit::WebUserStyleSheetData::decode):
* Shared/WebUserContentControllerDataTypes.h: Added.
Add helper types for sending user content over IPC.

* UIProcess/API/APIUserScript.cpp:
(API::UserScript::generateUniqueURL):
(API::UserScript::UserScript):
* UIProcess/API/APIUserScript.h:
* UIProcess/API/APIUserStyleSheet.cpp:
(API::UserStyleSheet::generateUniqueURL):
(API::UserStyleSheet::UserStyleSheet):
* UIProcess/API/APIUserStyleSheet.h:
Add identifiers for tracking across processes.

* UIProcess/API/Cocoa/_WKUserStyleSheet.h:
* UIProcess/API/Cocoa/_WKUserStyleSheet.mm:
(-[_WKUserStyleSheet initWithSource:forMainFrameOnly:legacyWhitelist:legacyBlacklist:baseURL:userContentWorld:]):
(-[_WKUserStyleSheet baseURL]):
Add new initializer which takes a baseURL as well as an accessor for the baseURL.

* UIProcess/UserContent/WebUserContentControllerProxy.cpp:
(WebKit::WebUserContentControllerProxy::addProcess):
(WebKit::WebUserContentControllerProxy::addUserScript):
(WebKit::WebUserContentControllerProxy::removeUserScript):
(WebKit::WebUserContentControllerProxy::addUserStyleSheet):
(WebKit::WebUserContentControllerProxy::removeUserStyleSheet):
Pass identifiers as well as user content.

* WebProcess/InjectedBundle/InjectedBundle.cpp:
(WebKit::InjectedBundle::addUserScript):
(WebKit::InjectedBundle::addUserStyleSheet):
Move user content in via move semantics rather than using a unique_ptr.

(WebKit::InjectedBundle::removeUserScript):
(WebKit::InjectedBundle::removeUserStyleSheet):
(WebKit::InjectedBundle::removeUserScripts):
(WebKit::InjectedBundle::removeUserStyleSheets):
(WebKit::InjectedBundle::removeAllUserContent):
Update for new function signatures.

* WebProcess/UserContent/WebUserContentController.cpp:
(WebKit::WebUserContentController::WebUserContentController):
(WebKit::WebUserContentController::~WebUserContentController):
(WebKit::WebUserContentController::addUserContentWorlds):
(WebKit::WebUserContentController::removeUserContentWorlds):
(WebKit::WebUserContentController::addUserScripts):
(WebKit::WebUserContentController::removeUserScript):
(WebKit::WebUserContentController::removeAllUserScripts):
(WebKit::WebUserContentController::addUserStyleSheets):
(WebKit::WebUserContentController::removeUserStyleSheet):
(WebKit::WebUserContentController::removeAllUserStyleSheets):
(WebKit::WebUserContentController::addUserScriptMessageHandlers):
(WebKit::WebUserContentController::removeUserScriptMessageHandler):
(WebKit::WebUserContentController::addUserContentExtensions):
(WebKit::WebUserContentController::removeUserContentExtension):
(WebKit::WebUserContentController::removeAllUserContentExtensions):
(WebKit::WebUserContentController::addUserScriptInternal):
(WebKit::WebUserContentController::addUserScript):
(WebKit::WebUserContentController::removeUserScriptWithURL):
(WebKit::WebUserContentController::removeUserScriptInternal):
(WebKit::WebUserContentController::removeUserScripts):
(WebKit::WebUserContentController::addUserStyleSheetInternal):
(WebKit::WebUserContentController::addUserStyleSheet):
(WebKit::WebUserContentController::removeUserStyleSheetWithURL):
(WebKit::WebUserContentController::removeUserStyleSheetInternal):
(WebKit::WebUserContentController::removeUserStyleSheets):
(WebKit::WebUserContentController::removeAllUserContent):
(WebKit::WebUserContentController::forEachUserScript):
(WebKit::WebUserContentController::forEachUserStyleSheet):
* WebProcess/UserContent/WebUserContentController.h:
* WebProcess/UserContent/WebUserContentController.messages.in:
Convert to inheriting from UserContentProvider, rather than containing a UserContentController.
This means adding the storage for the user content, which has been simplified to avoid using
unique_ptrs.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::addUserScript):
(WebKit::WebPage::addUserStyleSheet):
(WebKit::WebPage::removeAllUserContent):
Update to call the WebUserContentController, rather than going to the UserContentController, which
no longer exists.

* WebProcess/WebPage/WebPageGroupProxy.cpp:
(WebKit::WebPageGroupProxy::userContentController):
* WebProcess/WebPage/WebPageGroupProxy.h:
Return the WebUserContentController rather than old UserContentController.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoredomExtensionStyleSheetscpp">trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderEmptyClientscpp">trunk/Source/WebCore/loader/EmptyClients.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderEmptyClientsh">trunk/Source/WebCore/loader/EmptyClients.h</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoadercpp">trunk/Source/WebCore/loader/FrameLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderPingLoadercpp">trunk/Source/WebCore/loader/PingLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderResourceLoadercpp">trunk/Source/WebCore/loader/ResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceLoadercpp">trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFramecpp">trunk/Source/WebCore/page/Frame.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFrameh">trunk/Source/WebCore/page/Frame.h</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCorepagePageConfigurationh">trunk/Source/WebCore/page/PageConfiguration.h</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="#trunkSourceWebCorepageUserMessageHandlerDescriptorh">trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h</a></li>
<li><a href="#trunkSourceWebCorepageUserMessageHandlersNamespacecpp">trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebViewmm">trunk/Source/WebKit/mac/WebView/WebView.mm</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="#trunkSourceWebKit2UIProcessAPIAPIUserScriptcpp">trunk/Source/WebKit2/UIProcess/API/APIUserScript.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUserScripth">trunk/Source/WebKit2/UIProcess/API/APIUserScript.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUserStyleSheetcpp">trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUserStyleSheeth">trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKUserStyleSheeth">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKUserStyleSheetmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxycpp">trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleInjectedBundlecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp</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="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageGroupProxycpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageGroupProxyh">trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<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="#trunkSourceWebKit2SharedWebUserContentControllerDataTypescpp">trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebUserContentControllerDataTypesh">trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/ChangeLog        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1,3 +1,121 @@
</span><ins>+2016-03-08  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Add a baseURL parameter to _WKUserStyleSheet
+        https://bugs.webkit.org/show_bug.cgi?id=155219
+
+        Reviewed by Tim Horton.
+
+        - Moves to a model for user content where instead of each page having a WebCore::UserContentController
+          object, we have an abstract WebCore::UserContentProvider interface that can be implemented at the WebKit
+          level. For now, legacy WebKit continues to use the old UserContentController, which implements 
+          WebCore::UserContentProvider, and WebKit2 implements its own implementation so it can store additional
+          state.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Add new files.
+
+        * dom/ExtensionStyleSheets.cpp:
+        (WebCore::ExtensionStyleSheets::updateInjectedStyleSheetCache):
+        Switch to using forEachUserStyleSheet on the UserContentProvider.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::loadResource):
+        Remove null check now that we always have a UserContentProvider.
+
+        * loader/EmptyClients.cpp:
+        (WebCore::fillWithEmptyClients):
+        * loader/EmptyClients.h:
+        Add new EmptyClients.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::loadResourceSynchronously):
+        Remove null check now that we always have a UserContentProvider.
+
+        * loader/PingLoader.cpp:
+        (WebCore::processContentExtensionRulesForLoad):
+        Remove null check now that we always have a UserContentProvider.
+
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::willSendRequestInternal):
+        Remove null check now that we always have a UserContentProvider.
+
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::requestResource):
+        Remove null check now that we always have a UserContentProvider.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::shouldHaveWebKitNamespaceForWorld):
+        Remove null checks now that we always have a UserContentProvider, and userMessageHandlerDescriptors
+        returns a reference.
+
+        (WebCore::DOMWindow::open):
+        Remove null check now that we always have a UserContentProvider.
+
+        * page/Frame.cpp:
+        (WebCore::Frame::injectUserScripts):
+        Simplify by lifting document check out of the main loop and using forEachUserScript.
+
+        * page/Page.cpp:
+        (WebCore::Page::Page):
+        (WebCore::Page::~Page):
+        (WebCore::Page::userContentProvider):
+        (WebCore::Page::setUserContentProvider):
+        (WebCore::Page::setUserContentController): Deleted.
+        * page/Page.h:
+        (WebCore::Page::userContentController): Deleted.
+        * page/PageConfiguration.h:
+        Store the UserContentProvider in a Ref, and require PageConfigurations to provide one. This
+        removes a bunch of null checks and simplifies the code.
+
+        * page/UserContentController.cpp:
+        (WebCore::UserContentController::~UserContentController):
+        (WebCore::UserContentController::forEachUserScript):
+        (WebCore::UserContentController::forEachUserStyleSheet):
+        (WebCore::UserContentController::addUserScript):
+        (WebCore::UserContentController::removeUserScript):
+        (WebCore::UserContentController::removeUserScripts):
+        (WebCore::UserContentController::addUserStyleSheet):
+        (WebCore::UserContentController::removeUserStyleSheet):
+        (WebCore::UserContentController::removeUserStyleSheets):
+        (WebCore::UserContentController::addUserMessageHandlerDescriptor):
+        (WebCore::UserContentController::removeUserMessageHandlerDescriptor):
+        (WebCore::UserContentController::addUserContentExtension):
+        (WebCore::UserContentController::removeUserContentExtension):
+        (WebCore::UserContentController::removeAllUserContentExtensions):
+        (WebCore::UserContentController::removeAllUserContent):
+        (WebCore::UserContentController::addPage): Deleted.
+        (WebCore::UserContentController::removePage): Deleted.
+        (WebCore::contentExtensionsEnabled): Deleted.
+        (WebCore::UserContentController::processContentExtensionRulesForLoad): Deleted.
+        (WebCore::UserContentController::actionsForResourceLoad): Deleted.
+        * page/UserContentController.h:
+        (WebCore::UserContentController::userScripts): Deleted.
+        (WebCore::UserContentController::userStyleSheets): Deleted.
+        (WebCore::UserContentController::userMessageHandlerDescriptors): Deleted.
+        Add inheritance from UserContentProvider and simplify things by removing unique_ptrs
+        that were holding the member variables. There is usually only one UserContentController
+        so having these in unique_ptrs doesn't make much sense.
+        
+        * page/UserContentProvider.cpp: Added.
+        (WebCore::UserContentProvider::UserContentProvider):
+        (WebCore::UserContentProvider::~UserContentProvider):
+        (WebCore::UserContentProvider::addPage):
+        (WebCore::UserContentProvider::removePage):
+        (WebCore::UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages):
+        (WebCore::contentExtensionsEnabled):
+        (WebCore::UserContentProvider::processContentExtensionRulesForLoad):
+        (WebCore::UserContentProvider::actionsForResourceLoad):
+        * page/UserContentProvider.h: Added.
+        Add abstract class for providing user content and add some helpers on it.
+
+        * page/UserMessageHandlerDescriptor.h:
+        (WebCore::UserMessageHandlerDescriptor::create):
+        (WebCore::UserMessageHandlerDescriptor::client):
+        (WebCore::UserMessageHandlerDescriptor::invalidateClient):
+        * page/UserMessageHandlersNamespace.cpp:
+        (WebCore::UserMessageHandlersNamespace::handler):
+        Simplify now that userContentProvider() and userMessageHandlerDescriptors() are references.
+
</ins><span class="cx"> 2016-03-10  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r197923.
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -2740,6 +2740,8 @@
</span><span class="cx">                 7C3B79721908757B00B47A2D /* UserMessageHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3B79701908757B00B47A2D /* UserMessageHandler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C3E510A18DF8F3500C112F7 /* HTMLConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3E510818DF8F3500C112F7 /* HTMLConverter.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C3E510B18DF8F3500C112F7 /* HTMLConverter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7C3E510918DF8F3500C112F7 /* HTMLConverter.mm */; };
</span><ins>+                7C3F01C11C8E5ABA00ADD962 /* UserContentProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3F01C01C8E5AB100ADD962 /* UserContentProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                7C3F01C21C8E5AC200ADD962 /* UserContentProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C3F01BF1C8E5AB100ADD962 /* UserContentProvider.cpp */; };
</ins><span class="cx">                 7C48A6D0191C9D6500026674 /* WebKitNamespace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C48A6CE191C9D6500026674 /* WebKitNamespace.cpp */; };
</span><span class="cx">                 7C48A6D1191C9D6500026674 /* WebKitNamespace.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C48A6CF191C9D6500026674 /* WebKitNamespace.h */; };
</span><span class="cx">                 7C4902A218B825F8007D9298 /* DOMWheelEventInternal.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 85989DCA0ACC8BBD00A0BC51 /* DOMWheelEventInternal.h */; };
</span><span class="lines">@@ -10382,6 +10384,8 @@
</span><span class="cx">                 7C3B79701908757B00B47A2D /* UserMessageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMessageHandler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C3E510818DF8F3500C112F7 /* HTMLConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLConverter.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C3E510918DF8F3500C112F7 /* HTMLConverter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HTMLConverter.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                7C3F01BF1C8E5AB100ADD962 /* UserContentProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserContentProvider.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C3F01C01C8E5AB100ADD962 /* UserContentProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserContentProvider.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 7C4189AB1B07C170000FA757 /* GlobalEventHandlers.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = GlobalEventHandlers.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C4189AC1B07CBF2000FA757 /* WindowEventHandlers.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = WindowEventHandlers.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C48A6CE191C9D6500026674 /* WebKitNamespace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitNamespace.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -18119,6 +18123,8 @@
</span><span class="cx">                                 2D4F96F21A1ECC240098BF88 /* TextIndicator.h */,
</span><span class="cx">                                 1AE79D40188DB61F002239C2 /* UserContentController.cpp */,
</span><span class="cx">                                 1AE79D41188DB61F002239C2 /* UserContentController.h */,
</span><ins>+                                7C3F01BF1C8E5AB100ADD962 /* UserContentProvider.cpp */,
+                                7C3F01C01C8E5AB100ADD962 /* UserContentProvider.h */,
</ins><span class="cx">                                 003F1FE911E6AB43008258D9 /* UserContentTypes.h */,
</span><span class="cx">                                 BCACF3BA1072921A00C0C8A3 /* UserContentURLPattern.cpp */,
</span><span class="cx">                                 BCACF3BB1072921A00C0C8A3 /* UserContentURLPattern.h */,
</span><span class="lines">@@ -28258,6 +28264,7 @@
</span><span class="cx">                                 088C2F7A12390081003D65CE /* SVGTextLayoutAttributes.h in Headers */,
</span><span class="cx">                                 081093DC1255F0E700ED9D29 /* SVGTextLayoutAttributesBuilder.h in Headers */,
</span><span class="cx">                                 081668DA125603D5006F25DE /* SVGTextLayoutEngine.h in Headers */,
</span><ins>+                                7C3F01C11C8E5ABA00ADD962 /* UserContentProvider.h in Headers */,
</ins><span class="cx">                                 080E49261255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.h in Headers */,
</span><span class="cx">                                 080E49281255F3BD00EFCA27 /* SVGTextLayoutEngineSpacing.h in Headers */,
</span><span class="cx">                                 08F0BFC61255C53C00075185 /* SVGTextMetrics.h in Headers */,
</span><span class="lines">@@ -30434,6 +30441,7 @@
</span><span class="cx">                                 511EF2D117F0FDF100E4FA16 /* JSIDBObjectStoreCustom.cpp in Sources */,
</span><span class="cx">                                 511EF2C817F0FD3500E4FA16 /* JSIDBOpenDBRequest.cpp in Sources */,
</span><span class="cx">                                 511EF2C917F0FD3500E4FA16 /* JSIDBRequest.cpp in Sources */,
</span><ins>+                                7C3F01C21C8E5AC200ADD962 /* UserContentProvider.cpp in Sources */,
</ins><span class="cx">                                 511EF2CA17F0FD3500E4FA16 /* JSIDBTransaction.cpp in Sources */,
</span><span class="cx">                                 511EF2CB17F0FD3500E4FA16 /* JSIDBVersionChangeEvent.cpp in Sources */,
</span><span class="cx">                                 BC6C49F30D7DBA0500FFA558 /* JSImageConstructor.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoredomExtensionStyleSheetscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -117,6 +117,24 @@
</span><span class="cx">     if (!owningPage)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    owningPage-&gt;userContentProvider().forEachUserStyleSheet([&amp;](const UserStyleSheet&amp; userStyleSheet) {
+        if (userStyleSheet.injectedFrames() == InjectInTopFrameOnly &amp;&amp; m_document.ownerElement())
+            return;
+
+        if (!UserContentURLPattern::matchesPatterns(m_document.url(), userStyleSheet.whitelist(), userStyleSheet.blacklist()))
+            return;
+
+        RefPtr&lt;CSSStyleSheet&gt; sheet = CSSStyleSheet::createInline(const_cast&lt;Document&amp;&gt;(m_document), userStyleSheet.url());
+        bool isUserStyleSheet = userStyleSheet.level() == UserStyleUserLevel;
+        if (isUserStyleSheet)
+            m_injectedUserStyleSheets.append(sheet);
+        else
+            m_injectedAuthorStyleSheets.append(sheet);
+
+        sheet-&gt;contents().setIsUserStyleSheet(isUserStyleSheet);
+        sheet-&gt;contents().parseString(userStyleSheet.source());
+    });
+    
</ins><span class="cx">     if (!owningPage-&gt;captionUserPreferencesStyleSheet().isEmpty()) {
</span><span class="cx">         // Identify our override style sheet with a unique URL - a new scheme and a UUID.
</span><span class="cx">         static NeverDestroyed&lt;URL&gt; captionsStyleSheetURL(ParsedURLString, &quot;user-captions-override:01F6AF12-C3B0-4F70-AF5E-A3E00234DC23&quot;);
</span><span class="lines">@@ -127,34 +145,6 @@
</span><span class="cx">         sheet-&gt;contents().setIsUserStyleSheet(false);
</span><span class="cx">         sheet-&gt;contents().parseString(owningPage-&gt;captionUserPreferencesStyleSheet());
</span><span class="cx">     }
</span><del>-
-    const auto* userContentController = owningPage-&gt;userContentController();
-    if (!userContentController)
-        return;
-
-    const UserStyleSheetMap* userStyleSheets = userContentController-&gt;userStyleSheets();
-    if (!userStyleSheets)
-        return;
-
-    for (auto&amp; styleSheets : userStyleSheets-&gt;values()) {
-        for (const auto&amp; sheet : *styleSheets) {
-            if (sheet-&gt;injectedFrames() == InjectInTopFrameOnly &amp;&amp; m_document.ownerElement())
-                continue;
-
-            if (!UserContentURLPattern::matchesPatterns(m_document.url(), sheet-&gt;whitelist(), sheet-&gt;blacklist()))
-                continue;
-
-            RefPtr&lt;CSSStyleSheet&gt; groupSheet = CSSStyleSheet::createInline(const_cast&lt;Document&amp;&gt;(m_document), sheet-&gt;url());
-            bool isUserStyleSheet = sheet-&gt;level() == UserStyleUserLevel;
-            if (isUserStyleSheet)
-                m_injectedUserStyleSheets.append(groupSheet);
-            else
-                m_injectedAuthorStyleSheets.append(groupSheet);
-
-            groupSheet-&gt;contents().setIsUserStyleSheet(isUserStyleSheet);
-            groupSheet-&gt;contents().parseString(sheet-&gt;source());
-        }
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ExtensionStyleSheets::invalidateInjectedStyleSheetCache()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1256,7 +1256,7 @@
</span><span class="cx">     ResourceRequest request(url);
</span><span class="cx">     DocumentLoader* documentLoader = frame-&gt;loader().documentLoader();
</span><span class="cx"> 
</span><del>-    if (page-&gt;userContentController() &amp;&amp; documentLoader &amp;&amp; page-&gt;userContentController()-&gt;processContentExtensionRulesForLoad(request, ResourceType::Media, *documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
</del><ins>+    if (documentLoader &amp;&amp; page-&gt;userContentProvider().processContentExtensionRulesForLoad(request, ResourceType::Media, *documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
</ins><span class="cx">         request = { };
</span><span class="cx">         mediaLoadingFailed(MediaPlayer::FormatError);
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderEmptyClientscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/EmptyClients.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;StorageArea.h&quot;
</span><span class="cx"> #include &quot;StorageNamespace.h&quot;
</span><span class="cx"> #include &quot;StorageNamespaceProvider.h&quot;
</span><ins>+#include &quot;UserContentProvider.h&quot;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if USE(APPLE_INTERNAL_SDK)
</span><span class="lines">@@ -95,7 +96,18 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class EmptyVisitedLinkStore : public VisitedLinkStore {
</del><ins>+class EmptyUserContentProvider final : public UserContentProvider {
+    void forEachUserScript(const std::function&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const override { }
+    void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const override { }
+#if ENABLE(USER_MESSAGE_HANDLERS)
+    const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { static NeverDestroyed&lt;UserMessageHandlerDescriptorMap&gt; map; return map.get(); }
+#endif
+#if ENABLE(CONTENT_EXTENSIONS)
+    ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() override { static NeverDestroyed&lt;ContentExtensions::ContentExtensionsBackend&gt; backend; return backend.get(); };
+#endif
+};
+
+class EmptyVisitedLinkStore final : public VisitedLinkStore {
</ins><span class="cx">     bool isLinkVisited(Page&amp;, LinkHash, const URL&amp;, const AtomicString&amp;) override { return false; }
</span><span class="cx">     void addVisitedLink(Page&amp;, LinkHash) override { }
</span><span class="cx"> };
</span><span class="lines">@@ -132,6 +144,7 @@
</span><span class="cx"> 
</span><span class="cx">     pageConfiguration.databaseProvider = adoptRef(new EmptyDatabaseProvider);
</span><span class="cx">     pageConfiguration.storageNamespaceProvider = adoptRef(new EmptyStorageNamespaceProvider);
</span><ins>+    pageConfiguration.userContentProvider = adoptRef(new EmptyUserContentProvider);
</ins><span class="cx">     pageConfiguration.visitedLinkStore = adoptRef(new EmptyVisitedLinkStore);
</span><span class="cx"> 
</span><span class="cx"> #if USE(APPLE_INTERNAL_SDK)
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderEmptyClientsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/EmptyClients.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/EmptyClients.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/EmptyClients.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -36,7 +36,6 @@
</span><span class="cx"> #include &quot;DiagnosticLoggingClient.h&quot;
</span><span class="cx"> #include &quot;DragClient.h&quot;
</span><span class="cx"> #include &quot;EditorClient.h&quot;
</span><del>-#include &quot;TextCheckerClient.h&quot;
</del><span class="cx"> #include &quot;FloatRect.h&quot;
</span><span class="cx"> #include &quot;FocusDirection.h&quot;
</span><span class="cx"> #include &quot;FrameLoaderClient.h&quot;
</span><span class="lines">@@ -44,9 +43,18 @@
</span><span class="cx"> #include &quot;Page.h&quot;
</span><span class="cx"> #include &quot;ProgressTrackerClient.h&quot;
</span><span class="cx"> #include &quot;ResourceError.h&quot;
</span><ins>+#include &quot;TextCheckerClient.h&quot;
</ins><span class="cx"> #include &quot;VisitedLinkStore.h&quot;
</span><span class="cx"> #include &lt;wtf/text/StringView.h&gt;
</span><span class="cx"> 
</span><ins>+#if ENABLE(USER_MESSAGE_HANDLERS)
+#include &quot;UserMessageHandlerDescriptor.h&quot;
+#endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+#include &quot;CompiledContentExtension.h&quot;
+#endif
+
</ins><span class="cx"> /*
</span><span class="cx">  This file holds empty Client stubs for use by WebCore.
</span><span class="cx">  Viewless element needs to create a dummy Page-&gt;Frame-&gt;FrameView tree for use in parsing or executing JavaScript.
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoader.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -2730,13 +2730,11 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     if (error.isNull()) {
</span><span class="cx">         if (auto* page = m_frame.page()) {
</span><del>-            if (auto* controller = page-&gt;userContentController()) {
-                if (m_documentLoader &amp;&amp; controller-&gt;processContentExtensionRulesForLoad(newRequest, ResourceType::Raw, *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
-                    newRequest = { };
-                    error = ResourceError(errorDomainWebKitInternal, 0, initialRequest.url(), emptyString());
-                    response = { };
-                    data = nullptr;
-                }
</del><ins>+            if (m_documentLoader &amp;&amp; page-&gt;userContentProvider().processContentExtensionRulesForLoad(newRequest, ResourceType::Raw, *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
+                newRequest = { };
+                error = ResourceError(errorDomainWebKitInternal, 0, initialRequest.url(), emptyString());
+                response = { };
+                data = nullptr;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderPingLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/PingLoader.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/PingLoader.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/PingLoader.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -59,10 +59,8 @@
</span><span class="cx"> static ContentExtensions::BlockedStatus processContentExtensionRulesForLoad(const Frame&amp; frame, ResourceRequest&amp; request, ResourceType resourceType)
</span><span class="cx"> {
</span><span class="cx">     if (DocumentLoader* documentLoader = frame.loader().documentLoader()) {
</span><del>-        if (Page* page = frame.page()) {
-            if (UserContentController* controller = page-&gt;userContentController())
-                return controller-&gt;processContentExtensionRulesForLoad(request, resourceType, *documentLoader);
-        }
</del><ins>+        if (Page* page = frame.page())
+            return page-&gt;userContentProvider().processContentExtensionRulesForLoad(request, resourceType, *documentLoader);
</ins><span class="cx">     }
</span><span class="cx">     return ContentExtensions::BlockedStatus::NotBlocked;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ResourceLoader.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/ResourceLoader.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/ResourceLoader.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -346,8 +346,7 @@
</span><span class="cx">     if (frameLoader()) {
</span><span class="cx">         Page* page = frameLoader()-&gt;frame().page();
</span><span class="cx">         if (page &amp;&amp; m_documentLoader) {
</span><del>-            auto* userContentController = page-&gt;userContentController();
-            if (userContentController &amp;&amp; userContentController-&gt;processContentExtensionRulesForLoad(request, m_resourceType, *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked)
</del><ins>+            if (page-&gt;userContentProvider().processContentExtensionRulesForLoad(request, m_resourceType, *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked)
</ins><span class="cx">                 request = { };
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -542,8 +542,8 @@
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><del>-    if (frame() &amp;&amp; frame()-&gt;mainFrame().page() &amp;&amp; frame()-&gt;mainFrame().page()-&gt;userContentController() &amp;&amp; m_documentLoader) {
-        if (frame()-&gt;mainFrame().page()-&gt;userContentController()-&gt;processContentExtensionRulesForLoad(request.mutableResourceRequest(), toResourceType(type), *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
</del><ins>+    if (frame() &amp;&amp; frame()-&gt;mainFrame().page() &amp;&amp; m_documentLoader) {
+        if (frame()-&gt;mainFrame().page()-&gt;userContentProvider().processContentExtensionRulesForLoad(request.mutableResourceRequest(), toResourceType(type), *m_documentLoader) == ContentExtensions::BlockedStatus::Blocked) {
</ins><span class="cx">             if (type == CachedResource::Type::MainResource) {
</span><span class="cx">                 auto resource = createResource(type, request.mutableResourceRequest(), request.charset(), sessionID());
</span><span class="cx">                 ASSERT(resource);
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -761,15 +761,7 @@
</span><span class="cx">     if (!page)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    auto* userContentController = page-&gt;userContentController();
-    if (!userContentController)
-        return false;
-
-    auto* descriptorMap = userContentController-&gt;userMessageHandlerDescriptors();
-    if (!descriptorMap)
-        return false;
-
-    for (auto&amp; descriptor : descriptorMap-&gt;values()) {
</del><ins>+    for (auto&amp; descriptor : page-&gt;userContentProvider().userMessageHandlerDescriptors().values()) {
</ins><span class="cx">         if (&amp;descriptor-&gt;world() == &amp;world)
</span><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="lines">@@ -2168,11 +2160,10 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     if (firstFrame-&gt;document()
</span><span class="cx">         &amp;&amp; firstFrame-&gt;mainFrame().page()
</span><del>-        &amp;&amp; firstFrame-&gt;mainFrame().page()-&gt;userContentController()
</del><span class="cx">         &amp;&amp; firstFrame-&gt;mainFrame().document()
</span><span class="cx">         &amp;&amp; firstFrame-&gt;mainFrame().document()-&gt;loader()) {
</span><del>-        ResourceLoadInfo resourceLoadInfo = {firstFrame-&gt;document()-&gt;completeURL(urlString), firstFrame-&gt;mainFrame().document()-&gt;url(), ResourceType::Popup};
-        Vector&lt;ContentExtensions::Action&gt; actions = firstFrame-&gt;mainFrame().page()-&gt;userContentController()-&gt;actionsForResourceLoad(resourceLoadInfo, *firstFrame-&gt;mainFrame().document()-&gt;loader());
</del><ins>+        ResourceLoadInfo resourceLoadInfo = { firstFrame-&gt;document()-&gt;completeURL(urlString), firstFrame-&gt;mainFrame().document()-&gt;url(), ResourceType::Popup };
+        Vector&lt;ContentExtensions::Action&gt; actions = firstFrame-&gt;mainFrame().page()-&gt;userContentProvider().actionsForResourceLoad(resourceLoadInfo, *firstFrame-&gt;mainFrame().document()-&gt;loader());
</ins><span class="cx">         for (const ContentExtensions::Action&amp; action : actions) {
</span><span class="cx">             if (action.type() == ContentExtensions::ActionType::BlockLoad)
</span><span class="cx">                 return nullptr;
</span></span></pre></div>
<a id="trunkSourceWebCorepageFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Frame.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Frame.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/Frame.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -689,37 +689,19 @@
</span><span class="cx">     if (loader().stateMachine().creatingInitialEmptyDocument() &amp;&amp; !settings().shouldInjectUserScriptsInInitialEmptyDocument())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    const auto* userContentController = m_page-&gt;userContentController();
-    if (!userContentController)
</del><ins>+    Document* document = this-&gt;document();
+    if (!document)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    // Walk the hashtable. Inject by world.
-    const UserScriptMap* userScripts = userContentController-&gt;userScripts();
-    if (!userScripts)
-        return;
</del><ins>+    m_page-&gt;userContentProvider().forEachUserScript([&amp;](DOMWrapperWorld&amp; world, const UserScript&amp; script) {
+        if (script.injectedFrames() == InjectInTopFrameOnly &amp;&amp; ownerElement())
+            return;
</ins><span class="cx"> 
</span><del>-    for (const auto&amp; worldAndUserScript : *userScripts)
-        injectUserScriptsForWorld(*worldAndUserScript.key, *worldAndUserScript.value, injectionTime);
</del><ins>+        if (script.injectionTime() == injectionTime &amp;&amp; UserContentURLPattern::matchesPatterns(document-&gt;url(), script.whitelist(), script.blacklist()))
+            m_script-&gt;evaluateInWorld(ScriptSourceCode(script.source(), script.url()), world);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Frame::injectUserScriptsForWorld(DOMWrapperWorld&amp; world, const UserScriptVector&amp; userScripts, UserScriptInjectionTime injectionTime)
-{
-    if (userScripts.isEmpty())
-        return;
-
-    Document* doc = document();
-    if (!doc)
-        return;
-
-    for (auto&amp; script : userScripts) {
-        if (script-&gt;injectedFrames() == InjectInTopFrameOnly &amp;&amp; ownerElement())
-            continue;
-
-        if (script-&gt;injectionTime() == injectionTime &amp;&amp; UserContentURLPattern::matchesPatterns(doc-&gt;url(), script-&gt;whitelist(), script-&gt;blacklist()))
-            m_script-&gt;evaluateInWorld(ScriptSourceCode(script-&gt;source(), script-&gt;url()), world);
-    }
-}
-
</del><span class="cx"> RenderView* Frame::contentRenderer() const
</span><span class="cx"> {
</span><span class="cx">     return document() ? document()-&gt;renderView() : nullptr;
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Frame.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Frame.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/Frame.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -280,8 +280,6 @@
</span><span class="cx">         Frame(Page&amp;, HTMLFrameOwnerElement*, FrameLoaderClient&amp;);
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        void injectUserScriptsForWorld(DOMWrapperWorld&amp;, const UserScriptVector&amp;, UserScriptInjectionTime);
-
</del><span class="cx">         HashSet&lt;FrameDestructionObserver*&gt; m_destructionObservers;
</span><span class="cx"> 
</span><span class="cx">         MainFrame&amp; m_mainFrame;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/Page.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><span class="cx"> #include &quot;SubframeLoader.h&quot;
</span><span class="cx"> #include &quot;TextResourceDecoder.h&quot;
</span><del>-#include &quot;UserContentController.h&quot;
</del><ins>+#include &quot;UserContentProvider.h&quot;
</ins><span class="cx"> #include &quot;UserInputBridge.h&quot;
</span><span class="cx"> #include &quot;ViewStateChangeObserver.h&quot;
</span><span class="cx"> #include &quot;VisitedLinkState.h&quot;
</span><span class="lines">@@ -231,7 +231,7 @@
</span><span class="cx">     , m_applicationCacheStorage(pageConfiguration.applicationCacheStorage ? *WTFMove(pageConfiguration.applicationCacheStorage) : ApplicationCacheStorage::singleton())
</span><span class="cx">     , m_databaseProvider(*WTFMove(pageConfiguration.databaseProvider))
</span><span class="cx">     , m_storageNamespaceProvider(*WTFMove(pageConfiguration.storageNamespaceProvider))
</span><del>-    , m_userContentController(WTFMove(pageConfiguration.userContentController))
</del><ins>+    , m_userContentProvider(*WTFMove(pageConfiguration.userContentProvider))
</ins><span class="cx">     , m_visitedLinkStore(*WTFMove(pageConfiguration.visitedLinkStore))
</span><span class="cx">     , m_sessionID(SessionID::defaultSessionID())
</span><span class="cx">     , m_isClosing(false)
</span><span class="lines">@@ -240,9 +240,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_storageNamespaceProvider-&gt;addPage(*this);
</span><span class="cx"> 
</span><del>-    if (m_userContentController)
-        m_userContentController-&gt;addPage(*this);
-
</del><ins>+    m_userContentProvider-&gt;addPage(*this);
</ins><span class="cx">     m_visitedLinkStore-&gt;addPage(*this);
</span><span class="cx"> 
</span><span class="cx">     if (!allPages) {
</span><span class="lines">@@ -298,9 +296,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     m_storageNamespaceProvider-&gt;removePage(*this);
</span><del>-
-    if (m_userContentController)
-        m_userContentController-&gt;removePage(*this);
</del><ins>+    m_userContentProvider-&gt;removePage(*this);
</ins><span class="cx">     m_visitedLinkStore-&gt;removePage(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1819,16 +1815,17 @@
</span><span class="cx">     return !m_forbidPromptsDepth;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Page::setUserContentController(UserContentController* userContentController)
</del><ins>+UserContentProvider&amp; Page::userContentProvider()
</ins><span class="cx"> {
</span><del>-    if (m_userContentController)
-        m_userContentController-&gt;removePage(*this);
</del><ins>+    return m_userContentProvider;
+}
</ins><span class="cx"> 
</span><del>-    m_userContentController = userContentController;
</del><ins>+void Page::setUserContentProvider(Ref&lt;UserContentProvider&gt;&amp;&amp; userContentProvider)
+{
+    m_userContentProvider-&gt;removePage(*this);
+    m_userContentProvider = WTFMove(userContentProvider);
+    m_userContentProvider-&gt;addPage(*this);
</ins><span class="cx"> 
</span><del>-    if (m_userContentController)
-        m_userContentController-&gt;addPage(*this);
-
</del><span class="cx">     invalidateInjectedStyleSheetCacheInAllFrames();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/Page.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx"> class Settings;
</span><span class="cx"> class StorageNamespace;
</span><span class="cx"> class StorageNamespaceProvider;
</span><del>-class UserContentController;
</del><ins>+class UserContentProvider;
</ins><span class="cx"> class ValidationMessageClient;
</span><span class="cx"> class ViewStateChangeObserver;
</span><span class="cx"> class VisitedLinkStore;
</span><span class="lines">@@ -450,8 +450,8 @@
</span><span class="cx">     StorageNamespaceProvider&amp; storageNamespaceProvider() { return m_storageNamespaceProvider.get(); }
</span><span class="cx">     void setStorageNamespaceProvider(Ref&lt;StorageNamespaceProvider&gt;&amp;&amp;);
</span><span class="cx"> 
</span><del>-    UserContentController* userContentController() { return m_userContentController.get(); }
-    WEBCORE_EXPORT void setUserContentController(UserContentController*);
</del><ins>+    UserContentProvider&amp; userContentProvider();
+    WEBCORE_EXPORT void setUserContentProvider(Ref&lt;UserContentProvider&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     VisitedLinkStore&amp; visitedLinkStore();
</span><span class="cx">     WEBCORE_EXPORT void setVisitedLinkStore(Ref&lt;VisitedLinkStore&gt;&amp;&amp;);
</span><span class="lines">@@ -676,7 +676,7 @@
</span><span class="cx">     Ref&lt;ApplicationCacheStorage&gt; m_applicationCacheStorage;
</span><span class="cx">     Ref&lt;DatabaseProvider&gt; m_databaseProvider;
</span><span class="cx">     Ref&lt;StorageNamespaceProvider&gt; m_storageNamespaceProvider;
</span><del>-    RefPtr&lt;UserContentController&gt; m_userContentController;
</del><ins>+    Ref&lt;UserContentProvider&gt; m_userContentProvider;
</ins><span class="cx">     Ref&lt;VisitedLinkStore&gt; m_visitedLinkStore;
</span><span class="cx">     RefPtr&lt;WheelEventTestTrigger&gt; m_testTrigger;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageConfigurationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageConfiguration.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageConfiguration.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/PageConfiguration.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> class PlugInClient;
</span><span class="cx"> class ProgressTrackerClient;
</span><span class="cx"> class StorageNamespaceProvider;
</span><del>-class UserContentController;
</del><ins>+class UserContentProvider;
</ins><span class="cx"> class ValidationMessageClient;
</span><span class="cx"> class VisitedLinkStore;
</span><span class="cx"> 
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     RefPtr&lt;ApplicationCacheStorage&gt; applicationCacheStorage;
</span><span class="cx">     RefPtr&lt;DatabaseProvider&gt; databaseProvider;
</span><span class="cx">     RefPtr&lt;StorageNamespaceProvider&gt; storageNamespaceProvider;
</span><del>-    RefPtr&lt;UserContentController&gt; userContentController;
</del><ins>+    RefPtr&lt;UserContentProvider&gt; userContentProvider;
</ins><span class="cx">     RefPtr&lt;VisitedLinkStore&gt; visitedLinkStore;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/UserContentController.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -27,24 +27,15 @@
</span><span class="cx"> #include &quot;UserContentController.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWrapperWorld.h&quot;
</span><del>-#include &quot;Document.h&quot;
-#include &quot;DocumentLoader.h&quot;
-#include &quot;ExtensionStyleSheets.h&quot;
-#include &quot;MainFrame.h&quot;
-#include &quot;Page.h&quot;
-#include &quot;ResourceLoadInfo.h&quot;
</del><span class="cx"> #include &quot;UserScript.h&quot;
</span><span class="cx"> #include &quot;UserStyleSheet.h&quot;
</span><del>-#include &lt;runtime/JSCellInlines.h&gt;
-#include &lt;runtime/StructureInlines.h&gt;
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><span class="cx"> #include &quot;UserMessageHandlerDescriptor.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><del>-#include &quot;ContentExtensionCompiler.h&quot;
-#include &quot;ContentExtensionsBackend.h&quot;
</del><ins>+#include &quot;CompiledContentExtension.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -62,38 +53,35 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserContentController::addPage(Page&amp; page)
</del><ins>+void UserContentController::forEachUserScript(const std::function&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp; functor) const
</ins><span class="cx"> {
</span><del>-    ASSERT(!m_pages.contains(&amp;page));
-    m_pages.add(&amp;page);
</del><ins>+    for (const auto&amp; worldAndUserScriptVector : m_userScripts) {
+        auto&amp; world = *worldAndUserScriptVector.key.get();
+        for (const auto&amp; userScript : *worldAndUserScriptVector.value)
+            functor(world, *userScript);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserContentController::removePage(Page&amp; page)
</del><ins>+void UserContentController::forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp; functor) const
</ins><span class="cx"> {
</span><del>-    ASSERT(m_pages.contains(&amp;page));
-    m_pages.remove(&amp;page);
</del><ins>+    for (auto&amp; styleSheetVector : m_userStyleSheets.values()) {
+        for (const auto&amp; styleSheet : *styleSheetVector)
+            functor(*styleSheet);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::addUserScript(DOMWrapperWorld&amp; world, std::unique_ptr&lt;UserScript&gt; userScript)
</span><span class="cx"> {
</span><del>-    if (!m_userScripts)
-        m_userScripts = std::make_unique&lt;UserScriptMap&gt;();
-
-    auto&amp; scriptsInWorld = m_userScripts-&gt;add(&amp;world, nullptr).iterator-&gt;value;
-    if (!scriptsInWorld)
-        scriptsInWorld = std::make_unique&lt;UserScriptVector&gt;();
</del><ins>+    auto&amp; scriptsInWorld = m_userScripts.ensure(&amp;world, [&amp;] { return std::make_unique&lt;UserScriptVector&gt;(); }).iterator-&gt;value;
</ins><span class="cx">     scriptsInWorld-&gt;append(WTFMove(userScript));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserScript(DOMWrapperWorld&amp; world, const URL&amp; url)
</span><span class="cx"> {
</span><del>-    if (!m_userScripts)
</del><ins>+    auto it = m_userScripts.find(&amp;world);
+    if (it == m_userScripts.end())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    auto it = m_userScripts-&gt;find(&amp;world);
-    if (it == m_userScripts-&gt;end())
-        return;
-
</del><span class="cx">     auto scripts = it-&gt;value.get();
</span><span class="cx">     for (int i = scripts-&gt;size() - 1; i &gt;= 0; --i) {
</span><span class="cx">         if (scripts-&gt;at(i)-&gt;url() == url)
</span><span class="lines">@@ -101,25 +89,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (scripts-&gt;isEmpty())
</span><del>-        m_userScripts-&gt;remove(it);
</del><ins>+        m_userScripts.remove(it);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserScripts(DOMWrapperWorld&amp; world)
</span><span class="cx"> {
</span><del>-    if (!m_userScripts)
-        return;
-
-    m_userScripts-&gt;remove(&amp;world);
</del><ins>+    m_userScripts.remove(&amp;world);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::addUserStyleSheet(DOMWrapperWorld&amp; world, std::unique_ptr&lt;UserStyleSheet&gt; userStyleSheet, UserStyleInjectionTime injectionTime)
</span><span class="cx"> {
</span><del>-    if (!m_userStyleSheets)
-        m_userStyleSheets = std::make_unique&lt;UserStyleSheetMap&gt;();
-
-    auto&amp; styleSheetsInWorld = m_userStyleSheets-&gt;add(&amp;world, nullptr).iterator-&gt;value;
-    if (!styleSheetsInWorld)
-        styleSheetsInWorld = std::make_unique&lt;UserStyleSheetVector&gt;();
</del><ins>+    auto&amp; styleSheetsInWorld = m_userStyleSheets.ensure(&amp;world, [&amp;] { return std::make_unique&lt;UserStyleSheetVector&gt;(); }).iterator-&gt;value;
</ins><span class="cx">     styleSheetsInWorld-&gt;append(WTFMove(userStyleSheet));
</span><span class="cx"> 
</span><span class="cx">     if (injectionTime == InjectInExistingDocuments)
</span><span class="lines">@@ -128,13 +108,10 @@
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserStyleSheet(DOMWrapperWorld&amp; world, const URL&amp; url)
</span><span class="cx"> {
</span><del>-    if (!m_userStyleSheets)
</del><ins>+    auto it = m_userStyleSheets.find(&amp;world);
+    if (it == m_userStyleSheets.end())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    auto it = m_userStyleSheets-&gt;find(&amp;world);
-    if (it == m_userStyleSheets-&gt;end())
-        return;
-
</del><span class="cx">     auto&amp; stylesheets = *it-&gt;value;
</span><span class="cx"> 
</span><span class="cx">     bool sheetsChanged = false;
</span><span class="lines">@@ -149,114 +126,56 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (stylesheets.isEmpty())
</span><del>-        m_userStyleSheets-&gt;remove(it);
</del><ins>+        m_userStyleSheets.remove(it);
</ins><span class="cx"> 
</span><span class="cx">     invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserStyleSheets(DOMWrapperWorld&amp; world)
</span><span class="cx"> {
</span><del>-    if (!m_userStyleSheets)
</del><ins>+    if (!m_userStyleSheets.remove(&amp;world))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (!m_userStyleSheets-&gt;remove(&amp;world))
-        return;
-
</del><span class="cx">     invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><span class="cx"> void UserContentController::addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp; descriptor)
</span><span class="cx"> {
</span><del>-    if (!m_userMessageHandlerDescriptors)
-        m_userMessageHandlerDescriptors = std::make_unique&lt;UserMessageHandlerDescriptorMap&gt;();
-
-    m_userMessageHandlerDescriptors-&gt;add(std::make_pair(descriptor.name(), &amp;descriptor.world()), &amp;descriptor);
</del><ins>+    m_userMessageHandlerDescriptors.add(std::make_pair(descriptor.name(), &amp;descriptor.world()), &amp;descriptor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp; descriptor)
</span><span class="cx"> {
</span><del>-    if (!m_userMessageHandlerDescriptors)
-        return;
-
-    m_userMessageHandlerDescriptors-&gt;remove(std::make_pair(descriptor.name(), &amp;descriptor.world()));
</del><ins>+    m_userMessageHandlerDescriptors.remove(std::make_pair(descriptor.name(), &amp;descriptor.world()));
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx"> void UserContentController::addUserContentExtension(const String&amp; name, RefPtr&lt;ContentExtensions::CompiledContentExtension&gt; contentExtension)
</span><span class="cx"> {
</span><del>-    if (!m_contentExtensionBackend)
-        m_contentExtensionBackend = std::make_unique&lt;ContentExtensions::ContentExtensionsBackend&gt;();
-    
-    m_contentExtensionBackend-&gt;addContentExtension(name, contentExtension);
</del><ins>+    m_contentExtensionBackend.addContentExtension(name, contentExtension);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeUserContentExtension(const String&amp; name)
</span><span class="cx"> {
</span><del>-    if (!m_contentExtensionBackend)
-        return;
-
-    m_contentExtensionBackend-&gt;removeContentExtension(name);
</del><ins>+    m_contentExtensionBackend.removeContentExtension(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeAllUserContentExtensions()
</span><span class="cx"> {
</span><del>-    if (!m_contentExtensionBackend)
-        return;
-
-    m_contentExtensionBackend-&gt;removeAllContentExtensions();
</del><ins>+    m_contentExtensionBackend.removeAllContentExtensions();
</ins><span class="cx"> }
</span><del>-
-static bool contentExtensionsEnabled(const DocumentLoader&amp; documentLoader)
-{
-    if (auto frame = documentLoader.frame()) {
-        if (frame-&gt;isMainFrame())
-            return documentLoader.userContentExtensionsEnabled();
-        if (auto mainDocumentLoader = frame-&gt;mainFrame().loader().documentLoader())
-            return mainDocumentLoader-&gt;userContentExtensionsEnabled();
-    }
-
-    return true;
-}
-    
-ContentExtensions::BlockedStatus UserContentController::processContentExtensionRulesForLoad(ResourceRequest&amp; request, ResourceType resourceType, DocumentLoader&amp; initiatingDocumentLoader)
-{
-    if (!m_contentExtensionBackend)
-        return ContentExtensions::BlockedStatus::NotBlocked;
-
-    if (!contentExtensionsEnabled(initiatingDocumentLoader))
-        return ContentExtensions::BlockedStatus::NotBlocked;
-
-    return m_contentExtensionBackend-&gt;processContentExtensionRulesForLoad(request, resourceType, initiatingDocumentLoader);
-}
-
-Vector&lt;ContentExtensions::Action&gt; UserContentController::actionsForResourceLoad(const ResourceLoadInfo&amp; resourceLoadInfo, DocumentLoader&amp; initiatingDocumentLoader)
-{
-    if (!m_contentExtensionBackend)
-        return Vector&lt;ContentExtensions::Action&gt;();
-    
-    if (!contentExtensionsEnabled(initiatingDocumentLoader))
-        return Vector&lt;ContentExtensions::Action&gt;();
-
-    return m_contentExtensionBackend-&gt;actionsForResourceLoad(resourceLoadInfo);
-}
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void UserContentController::removeAllUserContent()
</span><span class="cx"> {
</span><del>-    m_userScripts = nullptr;
</del><ins>+    m_userScripts.clear();
</ins><span class="cx"> 
</span><del>-    if (m_userStyleSheets) {
-        m_userStyleSheets = nullptr;
</del><ins>+    if (!m_userStyleSheets.isEmpty()) {
+        m_userStyleSheets.clear();
</ins><span class="cx">         invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserContentController::invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
-{
-    for (auto&amp; page : m_pages)
-        page-&gt;invalidateInjectedStyleSheetCacheInAllFrames();
-}
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserContentController.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentController.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/UserContentController.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -26,58 +26,19 @@
</span><span class="cx"> #ifndef UserContentController_h
</span><span class="cx"> #define UserContentController_h
</span><span class="cx"> 
</span><del>-#include &quot;UserScriptTypes.h&quot;
-#include &quot;UserStyleSheetTypes.h&quot;
-#include &lt;wtf/HashSet.h&gt;
-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/RefPtr.h&gt;
</del><ins>+#include &quot;UserContentProvider.h&quot;
</ins><span class="cx"> 
</span><del>-#if ENABLE(USER_MESSAGE_HANDLERS)
-#include &quot;UserMessageHandlerDescriptorTypes.h&quot;
-#endif
-
-#if ENABLE(CONTENT_EXTENSIONS)
-#include &quot;ContentExtensionActions.h&quot;
-#endif
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class DOMWrapperWorld;
-class DocumentLoader;
-class Page;
-class ResourceRequest;
-class StyleSheetContents;
-class URL;
-class UserScript;
-class UserStyleSheet;
-class UserMessageHandlerDescriptor;
-
-enum class ResourceType : uint16_t;
-
-struct ResourceLoadInfo;
-
-namespace ContentExtensions {
-class CompiledContentExtension;
-class ContentExtensionsBackend;
-struct Action;
-}
-
-class UserContentController : public RefCounted&lt;UserContentController&gt; {
</del><ins>+class UserContentController final : public UserContentProvider {
</ins><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT static Ref&lt;UserContentController&gt; create();
</span><span class="cx">     WEBCORE_EXPORT ~UserContentController();
</span><span class="cx"> 
</span><del>-    void addPage(Page&amp;);
-    void removePage(Page&amp;);
-
-    const UserScriptMap* userScripts() const { return m_userScripts.get(); }
-
</del><span class="cx">     WEBCORE_EXPORT void addUserScript(DOMWrapperWorld&amp;, std::unique_ptr&lt;UserScript&gt;);
</span><span class="cx">     WEBCORE_EXPORT void removeUserScript(DOMWrapperWorld&amp;, const URL&amp;);
</span><span class="cx">     WEBCORE_EXPORT void removeUserScripts(DOMWrapperWorld&amp;);
</span><span class="cx"> 
</span><del>-    const UserStyleSheetMap* userStyleSheets() const { return m_userStyleSheets.get(); }
-
</del><span class="cx">     WEBCORE_EXPORT void addUserStyleSheet(DOMWrapperWorld&amp;, std::unique_ptr&lt;UserStyleSheet&gt;, UserStyleInjectionTime);
</span><span class="cx">     WEBCORE_EXPORT void removeUserStyleSheet(DOMWrapperWorld&amp;, const URL&amp;);
</span><span class="cx">     WEBCORE_EXPORT void removeUserStyleSheets(DOMWrapperWorld&amp;);
</span><span class="lines">@@ -85,8 +46,6 @@
</span><span class="cx">     WEBCORE_EXPORT void removeAllUserContent();
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    const UserMessageHandlerDescriptorMap* userMessageHandlerDescriptors() const { return m_userMessageHandlerDescriptors.get(); }
-
</del><span class="cx">     WEBCORE_EXPORT void addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp;);
</span><span class="cx">     WEBCORE_EXPORT void removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&amp;);
</span><span class="cx"> #endif
</span><span class="lines">@@ -95,25 +54,28 @@
</span><span class="cx">     WEBCORE_EXPORT void addUserContentExtension(const String&amp; name, RefPtr&lt;ContentExtensions::CompiledContentExtension&gt;);
</span><span class="cx">     WEBCORE_EXPORT void removeUserContentExtension(const String&amp; name);
</span><span class="cx">     WEBCORE_EXPORT void removeAllUserContentExtensions();
</span><del>-
-    ContentExtensions::BlockedStatus processContentExtensionRulesForLoad(ResourceRequest&amp;, ResourceType, DocumentLoader&amp; initiatingDocumentLoader);
-    Vector&lt;ContentExtensions::Action&gt; actionsForResourceLoad(const ResourceLoadInfo&amp;, DocumentLoader&amp; initiatingDocumentLoader);
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     UserContentController();
</span><span class="cx"> 
</span><del>-    void invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
</del><ins>+    // UserContentProvider
+    void forEachUserScript(const std::function&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const override;
+    void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const override;
+#if ENABLE(USER_MESSAGE_HANDLERS)
+    const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptors; }
+#endif
+#if ENABLE(CONTENT_EXTENSIONS)
+    ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() override { return m_contentExtensionBackend; }
+#endif
</ins><span class="cx"> 
</span><del>-    HashSet&lt;Page*&gt; m_pages;
-
-    std::unique_ptr&lt;UserScriptMap&gt; m_userScripts;
-    std::unique_ptr&lt;UserStyleSheetMap&gt; m_userStyleSheets;
</del><ins>+    UserScriptMap m_userScripts;
+    UserStyleSheetMap m_userStyleSheets;
</ins><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><del>-    std::unique_ptr&lt;UserMessageHandlerDescriptorMap&gt; m_userMessageHandlerDescriptors;
</del><ins>+    UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptors;
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><del>-    std::unique_ptr&lt;ContentExtensions::ContentExtensionsBackend&gt; m_contentExtensionBackend;
</del><ins>+    ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserContentProvidercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/page/UserContentProvider.cpp (0 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentProvider.cpp                                (rev 0)
+++ trunk/Source/WebCore/page/UserContentProvider.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;UserContentProvider.h&quot;
+
+#include &quot;Document.h&quot;
+#include &quot;DocumentLoader.h&quot;
+#include &quot;MainFrame.h&quot;
+#include &quot;Page.h&quot;
+
+#if ENABLE(CONTENT_EXTENSIONS)
+#include &quot;ContentExtensionCompiler.h&quot;
+#include &quot;ContentExtensionsBackend.h&quot;
+#endif
+
+namespace WebCore {
+
+UserContentProvider::UserContentProvider()
+{
+}
+
+UserContentProvider::~UserContentProvider()
+{
+    ASSERT(m_pages.isEmpty());
+}
+
+void UserContentProvider::addPage(Page&amp; page)
+{
+    ASSERT(!m_pages.contains(&amp;page));
+
+    m_pages.add(&amp;page);
+}
+
+void UserContentProvider::removePage(Page&amp; page)
+{
+    ASSERT(m_pages.contains(&amp;page));
+
+    m_pages.remove(&amp;page);
+}
+
+void UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages()
+{
+    for (auto&amp; page : m_pages)
+        page-&gt;invalidateInjectedStyleSheetCacheInAllFrames();
+}
+
+#if ENABLE(CONTENT_EXTENSIONS)
+static bool contentExtensionsEnabled(const DocumentLoader&amp; documentLoader)
+{
+    if (auto frame = documentLoader.frame()) {
+        if (frame-&gt;isMainFrame())
+            return documentLoader.userContentExtensionsEnabled();
+        if (auto mainDocumentLoader = frame-&gt;mainFrame().loader().documentLoader())
+            return mainDocumentLoader-&gt;userContentExtensionsEnabled();
+    }
+
+    return true;
+}
+    
+ContentExtensions::BlockedStatus UserContentProvider::processContentExtensionRulesForLoad(ResourceRequest&amp; request, ResourceType resourceType, DocumentLoader&amp; initiatingDocumentLoader)
+{
+    if (!contentExtensionsEnabled(initiatingDocumentLoader))
+        return ContentExtensions::BlockedStatus::NotBlocked;
+
+    return userContentExtensionBackend().processContentExtensionRulesForLoad(request, resourceType, initiatingDocumentLoader);
+}
+
+Vector&lt;ContentExtensions::Action&gt; UserContentProvider::actionsForResourceLoad(const ResourceLoadInfo&amp; resourceLoadInfo, DocumentLoader&amp; initiatingDocumentLoader)
+{
+    if (!contentExtensionsEnabled(initiatingDocumentLoader))
+        return { };
+
+    return userContentExtensionBackend().actionsForResourceLoad(resourceLoadInfo);
+}
+#endif
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCorepageUserContentProviderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/page/UserContentProvider.h (0 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserContentProvider.h                                (rev 0)
+++ trunk/Source/WebCore/page/UserContentProvider.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -0,0 +1,97 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef UserContentProvider_h
+#define UserContentProvider_h
+
+#include &quot;UserScriptTypes.h&quot;
+#include &quot;UserStyleSheetTypes.h&quot;
+#include &lt;functional&gt;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/HashSet.h&gt;
+#include &lt;wtf/RefCounted.h&gt;
+
+#if ENABLE(USER_MESSAGE_HANDLERS)
+#include &quot;UserMessageHandlerDescriptorTypes.h&quot;
+#endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+#include &quot;ContentExtensionActions.h&quot;
+#include &quot;ContentExtensionsBackend.h&quot;
+#endif
+
+namespace WebCore {
+
+class DocumentLoader;
+class Page;
+class ResourceRequest;
+class URL;
+
+enum class ResourceType : uint16_t;
+
+struct ResourceLoadInfo;
+
+namespace ContentExtensions {
+class ContentExtensionsBackend;
+struct Action;
+}
+
+class UserContentProvider : public RefCounted&lt;UserContentProvider&gt; {
+public:
+    WEBCORE_EXPORT UserContentProvider();
+    WEBCORE_EXPORT virtual ~UserContentProvider();
+
+    virtual void forEachUserScript(const std::function&lt;void(DOMWrapperWorld&amp;, const UserScript&amp;)&gt;&amp;) const = 0;
+    virtual void forEachUserStyleSheet(const std::function&lt;void(const UserStyleSheet&amp;)&gt;&amp;) const = 0;
+
+#if ENABLE(USER_MESSAGE_HANDLERS)
+    virtual const UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const = 0;
+#endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    virtual ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() = 0;
+#endif
+
+    void addPage(Page&amp;);
+    void removePage(Page&amp;);
+
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    // FIXME: These don't really belong here. They should probably bundled up in the ContentExtensionsBackend
+    // which should always exist.
+    ContentExtensions::BlockedStatus processContentExtensionRulesForLoad(ResourceRequest&amp;, ResourceType, DocumentLoader&amp; initiatingDocumentLoader);
+    Vector&lt;ContentExtensions::Action&gt; actionsForResourceLoad(const ResourceLoadInfo&amp;, DocumentLoader&amp; initiatingDocumentLoader);
+#endif
+
+protected:
+    WEBCORE_EXPORT void invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+
+private:
+    HashSet&lt;Page*&gt; m_pages;
+};
+
+} // namespace WebCore
+
+#endif // UserContentProvider_h
</ins></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlerDescriptorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -54,8 +54,8 @@
</span><span class="cx">     }
</span><span class="cx">     WEBCORE_EXPORT ~UserMessageHandlerDescriptor();
</span><span class="cx"> 
</span><del>-    const AtomicString&amp; name();
-    DOMWrapperWorld&amp; world();
</del><ins>+    WEBCORE_EXPORT const AtomicString&amp; name();
+    WEBCORE_EXPORT DOMWrapperWorld&amp; world();
</ins><span class="cx"> 
</span><span class="cx">     Client* client() const { return m_client; }
</span><span class="cx">     void invalidateClient() { m_client = nullptr; }
</span></span></pre></div>
<a id="trunkSourceWebCorepageUserMessageHandlersNamespacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -53,15 +53,9 @@
</span><span class="cx">     if (!page)
</span><span class="cx">         return nullptr;
</span><span class="cx">     
</span><del>-    const auto* userContentController = page-&gt;userContentController();
-    if (!userContentController)
-        return nullptr;
-
-    const auto* userMessageHandlerDescriptors = userContentController-&gt;userMessageHandlerDescriptors();
-    if (!userMessageHandlerDescriptors)
-        return nullptr;
-
-    RefPtr&lt;UserMessageHandlerDescriptor&gt; descriptor = userMessageHandlerDescriptors-&gt;get(std::make_pair(name, &amp;world));
</del><ins>+    auto&amp; descriptors = page-&gt;userContentProvider().userMessageHandlerDescriptors();
+    
+    RefPtr&lt;UserMessageHandlerDescriptor&gt; descriptor = descriptors.get(std::make_pair(name, &amp;world));
</ins><span class="cx">     if (!descriptor)
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="lines">@@ -70,7 +64,7 @@
</span><span class="cx">             return &amp;handler.get();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto liveHandlers = userMessageHandlerDescriptors-&gt;values();
</del><ins>+    auto liveHandlers = descriptors.values();
</ins><span class="cx">     m_messageHandlers.removeAllMatching([liveHandlers](const Ref&lt;UserMessageHandler&gt;&amp; handler) {
</span><span class="cx">         for (const auto&amp; liveHandler : liveHandlers) {
</span><span class="cx">             if (liveHandler.get() == &amp;handler-&gt;descriptor())
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-03-08  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Add a baseURL parameter to _WKUserStyleSheet
+        https://bugs.webkit.org/show_bug.cgi?id=155219
+
+        Reviewed by Tim Horton.
+
+        * WebView/WebView.mm:
+        (-[WebView _commonInitializationWithFrameName:groupName:]):
+        (-[WebView initSimpleHTMLDocumentWithStyle:frame:preferences:groupName:]):
+        (-[WebView setGroupName:]):
+        Update to account for the name change from UserContentController -&gt; UserContentProvider.
+
</ins><span class="cx"> 2016-02-22  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Enable AVFoundationNSURLSessionEnabled by default
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebView.mm        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1004,7 +1004,7 @@
</span><span class="cx">     pageConfiguration.progressTrackerClient = new WebProgressTrackerClient(self);
</span><span class="cx">     pageConfiguration.databaseProvider = &amp;WebDatabaseProvider::singleton();
</span><span class="cx">     pageConfiguration.storageNamespaceProvider = &amp;_private-&gt;group-&gt;storageNamespaceProvider();
</span><del>-    pageConfiguration.userContentController = &amp;_private-&gt;group-&gt;userContentController();
</del><ins>+    pageConfiguration.userContentProvider = &amp;_private-&gt;group-&gt;userContentController();
</ins><span class="cx">     pageConfiguration.visitedLinkStore = &amp;_private-&gt;group-&gt;visitedLinkStore();
</span><span class="cx">     _private-&gt;page = new Page(pageConfiguration);
</span><span class="cx"> 
</span><span class="lines">@@ -1249,7 +1249,7 @@
</span><span class="cx">     pageConfiguration.progressTrackerClient = new WebProgressTrackerClient(self);
</span><span class="cx">     pageConfiguration.databaseProvider = &amp;WebDatabaseProvider::singleton();
</span><span class="cx">     pageConfiguration.storageNamespaceProvider = &amp;_private-&gt;group-&gt;storageNamespaceProvider();
</span><del>-    pageConfiguration.userContentController = &amp;_private-&gt;group-&gt;userContentController();
</del><ins>+    pageConfiguration.userContentProvider = &amp;_private-&gt;group-&gt;userContentController();
</ins><span class="cx">     pageConfiguration.visitedLinkStore = &amp;_private-&gt;group-&gt;visitedLinkStore();
</span><span class="cx"> 
</span><span class="cx">     _private-&gt;page = new Page(pageConfiguration);
</span><span class="lines">@@ -6203,7 +6203,7 @@
</span><span class="cx">     if (!_private-&gt;page)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    _private-&gt;page-&gt;setUserContentController(&amp;_private-&gt;group-&gt;userContentController());
</del><ins>+    _private-&gt;page-&gt;setUserContentProvider(_private-&gt;group-&gt;userContentController());
</ins><span class="cx">     _private-&gt;page-&gt;setVisitedLinkStore(_private-&gt;group-&gt;visitedLinkStore());
</span><span class="cx">     _private-&gt;page-&gt;setGroupName(groupName);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/ChangeLog        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1,3 +1,116 @@
</span><ins>+2016-03-08  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Add a baseURL parameter to _WKUserStyleSheet
+        https://bugs.webkit.org/show_bug.cgi?id=155219
+
+        Reviewed by Tim Horton.
+
+        - Moves to a model for user content where instead of using a WebCore::UserContentController
+          object, we implement the new WebCore::UserContentProvider interface (on the existing 
+          WebUserContentController object).
+        - Uses this to maintain maps of UserStylesSheets and UserScripts along with their identifiers,
+          freeing up the URL, which had been acting as the identifier, to be used as the baseURL which
+          was what it was intended for.
+        - Adds a baseURL property to _WKUserStyleSheet.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+        Add new files.
+
+        * Scripts/webkit/messages.py:
+        (headers_for_type):
+        Add support for sending WebUserContentControllerDataTypes.
+
+        * Shared/WebUserContentControllerDataTypes.cpp: Added.
+        (WebKit::WebUserScriptData::encode):
+        (WebKit::WebUserScriptData::decode):
+        (WebKit::WebUserStyleSheetData::encode):
+        (WebKit::WebUserStyleSheetData::decode):
+        * Shared/WebUserContentControllerDataTypes.h: Added.
+        Add helper types for sending user content over IPC.
+
+        * UIProcess/API/APIUserScript.cpp:
+        (API::UserScript::generateUniqueURL):
+        (API::UserScript::UserScript):
+        * UIProcess/API/APIUserScript.h:
+        * UIProcess/API/APIUserStyleSheet.cpp:
+        (API::UserStyleSheet::generateUniqueURL):
+        (API::UserStyleSheet::UserStyleSheet):
+        * UIProcess/API/APIUserStyleSheet.h:
+        Add identifiers for tracking across processes.
+
+        * UIProcess/API/Cocoa/_WKUserStyleSheet.h:
+        * UIProcess/API/Cocoa/_WKUserStyleSheet.mm:
+        (-[_WKUserStyleSheet initWithSource:forMainFrameOnly:legacyWhitelist:legacyBlacklist:baseURL:userContentWorld:]):
+        (-[_WKUserStyleSheet baseURL]):
+        Add new initializer which takes a baseURL as well as an accessor for the baseURL.
+
+        * UIProcess/UserContent/WebUserContentControllerProxy.cpp:
+        (WebKit::WebUserContentControllerProxy::addProcess):
+        (WebKit::WebUserContentControllerProxy::addUserScript):
+        (WebKit::WebUserContentControllerProxy::removeUserScript):
+        (WebKit::WebUserContentControllerProxy::addUserStyleSheet):
+        (WebKit::WebUserContentControllerProxy::removeUserStyleSheet):
+        Pass identifiers as well as user content.
+
+        * WebProcess/InjectedBundle/InjectedBundle.cpp:
+        (WebKit::InjectedBundle::addUserScript):
+        (WebKit::InjectedBundle::addUserStyleSheet):
+        Move user content in via move semantics rather than using a unique_ptr.
+
+        (WebKit::InjectedBundle::removeUserScript):
+        (WebKit::InjectedBundle::removeUserStyleSheet):
+        (WebKit::InjectedBundle::removeUserScripts):
+        (WebKit::InjectedBundle::removeUserStyleSheets):
+        (WebKit::InjectedBundle::removeAllUserContent):
+        Update for new function signatures.
+
+        * WebProcess/UserContent/WebUserContentController.cpp:
+        (WebKit::WebUserContentController::WebUserContentController):
+        (WebKit::WebUserContentController::~WebUserContentController):
+        (WebKit::WebUserContentController::addUserContentWorlds):
+        (WebKit::WebUserContentController::removeUserContentWorlds):
+        (WebKit::WebUserContentController::addUserScripts):
+        (WebKit::WebUserContentController::removeUserScript):
+        (WebKit::WebUserContentController::removeAllUserScripts):
+        (WebKit::WebUserContentController::addUserStyleSheets):
+        (WebKit::WebUserContentController::removeUserStyleSheet):
+        (WebKit::WebUserContentController::removeAllUserStyleSheets):
+        (WebKit::WebUserContentController::addUserScriptMessageHandlers):
+        (WebKit::WebUserContentController::removeUserScriptMessageHandler):
+        (WebKit::WebUserContentController::addUserContentExtensions):
+        (WebKit::WebUserContentController::removeUserContentExtension):
+        (WebKit::WebUserContentController::removeAllUserContentExtensions):
+        (WebKit::WebUserContentController::addUserScriptInternal):
+        (WebKit::WebUserContentController::addUserScript):
+        (WebKit::WebUserContentController::removeUserScriptWithURL):
+        (WebKit::WebUserContentController::removeUserScriptInternal):
+        (WebKit::WebUserContentController::removeUserScripts):
+        (WebKit::WebUserContentController::addUserStyleSheetInternal):
+        (WebKit::WebUserContentController::addUserStyleSheet):
+        (WebKit::WebUserContentController::removeUserStyleSheetWithURL):
+        (WebKit::WebUserContentController::removeUserStyleSheetInternal):
+        (WebKit::WebUserContentController::removeUserStyleSheets):
+        (WebKit::WebUserContentController::removeAllUserContent):
+        (WebKit::WebUserContentController::forEachUserScript):
+        (WebKit::WebUserContentController::forEachUserStyleSheet):
+        * WebProcess/UserContent/WebUserContentController.h:
+        * WebProcess/UserContent/WebUserContentController.messages.in:
+        Convert to inheriting from UserContentProvider, rather than containing a UserContentController.
+        This means adding the storage for the user content, which has been simplified to avoid using
+        unique_ptrs.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::addUserScript):
+        (WebKit::WebPage::addUserStyleSheet):
+        (WebKit::WebPage::removeAllUserContent):
+        Update to call the WebUserContentController, rather than going to the UserContentController, which
+        no longer exists.
+
+        * WebProcess/WebPage/WebPageGroupProxy.cpp:
+        (WebKit::WebPageGroupProxy::userContentController):
+        * WebProcess/WebPage/WebPageGroupProxy.h:
+        Return the WebUserContentController rather than old UserContentController.
+
</ins><span class="cx"> 2016-03-10  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r197923.
</span></span></pre></div>
<a id="trunkSourceWebKit2Scriptswebkitmessagespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Scripts/webkit/messages.py (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Scripts/webkit/messages.py        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/Scripts/webkit/messages.py        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -378,6 +378,8 @@
</span><span class="cx">         'WebKit::WebTouchEvent': ['&quot;WebEvent.h&quot;'],
</span><span class="cx">         'WebKit::WebWheelEvent': ['&quot;WebEvent.h&quot;'],
</span><span class="cx">         'WebKit::WebScriptMessageHandlerHandle': ['&quot;WebScriptMessageHandler.h&quot;'],
</span><ins>+        'struct WebKit::WebUserScriptData': ['&quot;WebUserContentControllerDataTypes.h&quot;'],
+        'struct WebKit::WebUserStyleSheetData': ['&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="addfile"><h4>Added: trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp (0 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp                                (rev 0)
+++ trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebUserContentControllerDataTypes.h&quot;
+
+#include &quot;WebCoreArgumentCoders.h&quot;
+
+namespace WebKit {
+
+void WebUserScriptData::encode(IPC::ArgumentEncoder&amp; encoder) const
+{
+    encoder &lt;&lt; identifier;
+    encoder &lt;&lt; worldIdentifier;
+    encoder &lt;&lt; userScript;
+}
+
+bool WebUserScriptData::decode(IPC::ArgumentDecoder&amp; decoder, WebUserScriptData&amp; data)
+{
+    if (!decoder.decode(data.identifier))
+        return false;
+    if (!decoder.decode(data.worldIdentifier))
+        return false;
+    if (!decoder.decode(data.userScript))
+        return false;
+    return true;
+}
+
+void WebUserStyleSheetData::encode(IPC::ArgumentEncoder&amp; encoder) const
+{
+    encoder &lt;&lt; identifier;
+    encoder &lt;&lt; worldIdentifier;
+    encoder &lt;&lt; userStyleSheet;
+}
+
+bool WebUserStyleSheetData::decode(IPC::ArgumentDecoder&amp; decoder, WebUserStyleSheetData&amp; data)
+{
+    if (!decoder.decode(data.identifier))
+        return false;
+    if (!decoder.decode(data.worldIdentifier))
+        return false;
+    if (!decoder.decode(data.userStyleSheet))
+        return false;
+    return true;
+}
+
+} // namespace WebKit
</ins></span></pre></div>
<a id="trunkSourceWebKit2SharedWebUserContentControllerDataTypesh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h (0 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h                                (rev 0)
+++ trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebUserContentControllerDataTypes_h
+#define WebUserContentControllerDataTypes_h
+
+#include &lt;WebCore/UserScript.h&gt;
+#include &lt;WebCore/UserStyleSheet.h&gt;
+
+namespace IPC {
+class ArgumentDecoder;
+class ArgumentEncoder;
+}
+
+namespace WebKit {
+
+struct WebUserScriptData {
+    void encode(IPC::ArgumentEncoder&amp;) const;
+    static bool decode(IPC::ArgumentDecoder&amp;, WebUserScriptData&amp;);
+
+    uint64_t identifier;
+    uint64_t worldIdentifier;
+    WebCore::UserScript userScript;
+};
+
+struct WebUserStyleSheetData {
+    void encode(IPC::ArgumentEncoder&amp;) const;
+    static bool decode(IPC::ArgumentDecoder&amp;, WebUserStyleSheetData&amp;);
+
+    uint64_t identifier;
+    uint64_t worldIdentifier;
+    WebCore::UserStyleSheet userStyleSheet;
+};
+
+} // namespace WebKit
+
+#endif // WebUserContentControllerDataTypes_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserScriptcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserScript.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserScript.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserScript.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -39,11 +39,20 @@
</span><span class="cx"> 
</span><span class="cx"> WebCore::URL UserScript::generateUniqueURL()
</span><span class="cx"> {
</span><ins>+    static uint64_t identifier;
+
</ins><span class="cx">     StringBuilder urlStringBuilder;
</span><span class="cx">     urlStringBuilder.appendLiteral(&quot;user-script:&quot;);
</span><del>-    urlStringBuilder.appendNumber(generateIdentifier());
</del><ins>+    urlStringBuilder.appendNumber(++identifier);
</ins><span class="cx">     return { { }, urlStringBuilder.toString() };
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+UserScript::UserScript(WebCore::UserScript userScript, API::UserContentWorld&amp; world)
+    : m_identifier(generateIdentifier())
+    , m_userScript(userScript)
+    , m_world(world)
+{
+}
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> } // namespace API
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserScripth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserScript.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserScript.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserScript.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -41,18 +41,17 @@
</span><span class="cx">         return adoptRef(*new UserScript(WTFMove(userScript), world));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    UserScript(WebCore::UserScript userScript, API::UserContentWorld&amp; world)
-        : m_userScript(userScript)
-        , m_world(world)
-    {
-    }
</del><ins>+    UserScript(WebCore::UserScript, API::UserContentWorld&amp;);
</ins><span class="cx"> 
</span><ins>+    uint64_t identifier() const { return m_identifier; }
+
</ins><span class="cx">     const WebCore::UserScript&amp; userScript() const { return m_userScript; }
</span><span class="cx">     
</span><span class="cx">     UserContentWorld&amp; userContentWorld() { return m_world; }
</span><span class="cx">     const UserContentWorld&amp; userContentWorld() const { return m_world; }
</span><span class="cx">     
</span><span class="cx"> private:
</span><ins>+    uint64_t m_identifier;
</ins><span class="cx">     WebCore::UserScript m_userScript;
</span><span class="cx">     Ref&lt;UserContentWorld&gt; m_world;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserStyleSheetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -39,11 +39,19 @@
</span><span class="cx"> 
</span><span class="cx"> WebCore::URL UserStyleSheet::generateUniqueURL()
</span><span class="cx"> {
</span><ins>+    static uint64_t identifier;
+
</ins><span class="cx">     StringBuilder urlStringBuilder;
</span><span class="cx">     urlStringBuilder.appendLiteral(&quot;user-style-sheet:&quot;);
</span><del>-    urlStringBuilder.appendNumber(generateIdentifier());
</del><ins>+    urlStringBuilder.appendNumber(++identifier);
</ins><span class="cx">     return { { }, urlStringBuilder.toString() };
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+UserStyleSheet::UserStyleSheet(WebCore::UserStyleSheet userStyleSheet, API::UserContentWorld&amp; world)
+    : m_identifier(generateIdentifier())
+    , m_userStyleSheet(userStyleSheet)
+    , m_world(world)
+{
+}
</ins><span class="cx"> 
</span><span class="cx"> } // namespace API
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUserStyleSheeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/APIUserStyleSheet.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -41,18 +41,17 @@
</span><span class="cx">         return adoptRef(*new UserStyleSheet(WTFMove(userStyleSheet), world));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    UserStyleSheet(WebCore::UserStyleSheet userStyleSheet, API::UserContentWorld&amp; world)
-        : m_userStyleSheet(userStyleSheet)
-        , m_world(world)
-    {
-    }
</del><ins>+    UserStyleSheet(WebCore::UserStyleSheet, API::UserContentWorld&amp;);
</ins><span class="cx"> 
</span><ins>+    uint64_t identifier() const { return m_identifier; }
+
</ins><span class="cx">     const WebCore::UserStyleSheet&amp; userStyleSheet() const { return m_userStyleSheet; }
</span><span class="cx"> 
</span><span class="cx">     UserContentWorld&amp; userContentWorld() { return m_world; }
</span><span class="cx">     const UserContentWorld&amp; userContentWorld() const { return m_world; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    uint64_t m_identifier;
</ins><span class="cx">     WebCore::UserStyleSheet m_userStyleSheet;
</span><span class="cx">     Ref&lt;UserContentWorld&gt; m_world;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKUserStyleSheeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -38,11 +38,13 @@
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic, readonly, copy) NSString *source;
</span><span class="cx"> 
</span><ins>+@property (nonatomic, readonly, copy) NSURL *baseURL;
+
</ins><span class="cx"> @property (nonatomic, readonly, getter=isForMainFrameOnly) BOOL forMainFrameOnly;
</span><span class="cx"> 
</span><span class="cx"> - (instancetype)initWithSource:(NSString *)source forMainFrameOnly:(BOOL)forMainFrameOnly;
</span><del>-
</del><span class="cx"> - (instancetype)initWithSource:(NSString *)source forMainFrameOnly:(BOOL)forMainFrameOnly legacyWhitelist:(WK_ARRAY(NSString *) *)legacyWhitelist legacyBlacklist:(WK_ARRAY(NSString *) *)legacyBlacklist userContentWorld:(_WKUserContentWorld *)userContentWorld;
</span><ins>+- (instancetype)initWithSource:(NSString *)source forMainFrameOnly:(BOOL)forMainFrameOnly legacyWhitelist:(WK_ARRAY(NSString *) *)legacyWhitelist legacyBlacklist:(WK_ARRAY(NSString *) *)legacyBlacklist baseURL:(NSURL *)baseURL userContentWorld:(_WKUserContentWorld *)userContentWorld;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKUserStyleSheetmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.mm (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.mm        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKUserStyleSheet.mm        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;APIArray.h&quot;
</span><span class="cx"> #import &quot;WKNSArray.h&quot;
</span><ins>+#import &quot;WKNSURLExtras.h&quot;
</ins><span class="cx"> #import &quot;WebKit2Initialize.h&quot;
</span><span class="cx"> #import &quot;_WKUserContentWorldInternal.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -61,11 +62,29 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (instancetype)initWithSource:(NSString *)source forMainFrameOnly:(BOOL)forMainFrameOnly legacyWhitelist:(WK_ARRAY(NSString *) *)legacyWhitelist legacyBlacklist:(WK_ARRAY(NSString *) *)legacyBlacklist baseURL:(NSURL *)baseURL userContentWorld:(_WKUserContentWorld *)userContentWorld
+{
+    if (!(self = [super init]))
+        return nil;
+
+    // FIXME: In the API test, we can use generateUniqueURL below before the API::Object constructor has done this... where should this really be?
+    WebKit::InitializeWebKit2();
+
+    API::Object::constructInWrapper&lt;API::UserStyleSheet&gt;(self, WebCore::UserStyleSheet { WTF::String(source), { { }, WTF::String([baseURL _web_originalDataAsWTFString]) }, API::toStringVector(legacyWhitelist), API::toStringVector(legacyBlacklist), forMainFrameOnly ? WebCore::InjectInTopFrameOnly : WebCore::InjectInAllFrames, WebCore::UserStyleUserLevel }, *userContentWorld-&gt;_userContentWorld);
+
+    return self;
+}
+
</ins><span class="cx"> - (NSString *)source
</span><span class="cx"> {
</span><span class="cx">     return _userStyleSheet-&gt;userStyleSheet().source();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (NSURL *)baseURL
+{
+    return _userStyleSheet-&gt;userStyleSheet().url();
+}
+
</ins><span class="cx"> - (BOOL)isForMainFrameOnly
</span><span class="cx"> {
</span><span class="cx">     return _userStyleSheet-&gt;userStyleSheet().injectedFrames() == WebCore::InjectInTopFrameOnly;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserContentWebUserContentControllerProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;DataReference.h&quot;
</span><span class="cx"> #include &quot;WebProcessProxy.h&quot;
</span><span class="cx"> #include &quot;WebScriptMessageHandler.h&quot;
</span><ins>+#include &quot;WebUserContentControllerDataTypes.h&quot;
</ins><span class="cx"> #include &quot;WebUserContentControllerMessages.h&quot;
</span><span class="cx"> #include &quot;WebUserContentControllerProxyMessages.h&quot;
</span><span class="cx"> #include &lt;WebCore/SerializedScriptValue.h&gt;
</span><span class="lines">@@ -80,14 +81,14 @@
</span><span class="cx">         userContentWorlds.append(std::make_pair(world.key-&gt;identifier(), world.key-&gt;name()));
</span><span class="cx">     webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserContentWorlds(userContentWorlds), m_identifier);
</span><span class="cx"> 
</span><del>-    Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt; userScripts;
</del><ins>+    Vector&lt;WebUserScriptData&gt; userScripts;
</ins><span class="cx">     for (const auto&amp; userScript : m_userScripts-&gt;elementsOfType&lt;API::UserScript&gt;())
</span><del>-        userScripts.append(std::make_pair(userScript-&gt;userContentWorld().identifier(), userScript-&gt;userScript()));
</del><ins>+        userScripts.append({ userScript-&gt;identifier(), userScript-&gt;userContentWorld().identifier(), userScript-&gt;userScript() });
</ins><span class="cx">     webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserScripts(userScripts), m_identifier);
</span><span class="cx"> 
</span><del>-    Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt; userStyleSheets;
</del><ins>+    Vector&lt;WebUserStyleSheetData&gt; userStyleSheets;
</ins><span class="cx">     for (const auto&amp; userStyleSheet : m_userStyleSheets-&gt;elementsOfType&lt;API::UserStyleSheet&gt;())
</span><del>-        userStyleSheets.append(std::make_pair(userStyleSheet-&gt;userContentWorld().identifier(), userStyleSheet-&gt;userStyleSheet()));
</del><ins>+        userStyleSheets.append({ userStyleSheet-&gt;identifier(), userStyleSheet-&gt;userContentWorld().identifier(), userStyleSheet-&gt;userStyleSheet() });
</ins><span class="cx">     webProcessProxy.connection()-&gt;send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier);
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;WebScriptMessageHandlerHandle&gt; messageHandlerHandles;
</span><span class="lines">@@ -168,7 +169,7 @@
</span><span class="cx">     m_userScripts-&gt;elements().append(&amp;userScript);
</span><span class="cx"> 
</span><span class="cx">     for (WebProcessProxy* process : m_processes)
</span><del>-        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserScripts({ std::make_pair(world-&gt;identifier(), userScript.userScript()) }), m_identifier);
</del><ins>+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world-&gt;identifier(), userScript.userScript() } }), m_identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentControllerProxy::removeUserScript(API::UserScript&amp; userScript)
</span><span class="lines">@@ -176,7 +177,7 @@
</span><span class="cx">     Ref&lt;API::UserContentWorld&gt; world = userScript.userContentWorld();
</span><span class="cx"> 
</span><span class="cx">     for (WebProcessProxy* process : m_processes)
</span><del>-        process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserScript(world-&gt;identifier(), userScript.userScript().url().string()), m_identifier);
</del><ins>+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserScript(world-&gt;identifier(), userScript.identifier()), m_identifier);
</ins><span class="cx"> 
</span><span class="cx">     m_userScripts-&gt;elements().removeAll(&amp;userScript);
</span><span class="cx"> 
</span><span class="lines">@@ -223,7 +224,7 @@
</span><span class="cx">     m_userStyleSheets-&gt;elements().append(&amp;userStyleSheet);
</span><span class="cx"> 
</span><span class="cx">     for (WebProcessProxy* process : m_processes)
</span><del>-        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserStyleSheets({ std::make_pair(world-&gt;identifier(), userStyleSheet.userStyleSheet()) }), m_identifier);
</del><ins>+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world-&gt;identifier(), userStyleSheet.userStyleSheet() } }), m_identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentControllerProxy::removeUserStyleSheet(API::UserStyleSheet&amp; userStyleSheet)
</span><span class="lines">@@ -231,7 +232,7 @@
</span><span class="cx">     Ref&lt;API::UserContentWorld&gt; world = userStyleSheet.userContentWorld();
</span><span class="cx"> 
</span><span class="cx">     for (WebProcessProxy* process : m_processes)
</span><del>-        process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserStyleSheet(world-&gt;identifier(), userStyleSheet.userStyleSheet().url().string()), m_identifier);
</del><ins>+        process-&gt;connection()-&gt;send(Messages::WebUserContentController::RemoveUserStyleSheet(world-&gt;identifier(), userStyleSheet.identifier()), m_identifier);
</ins><span class="cx"> 
</span><span class="cx">     m_userStyleSheets-&gt;elements().removeAll(&amp;userStyleSheet);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -1044,6 +1044,8 @@
</span><span class="cx">                 7A791EFA1C7CFCF100C4C52B /* WebResourceLoadStatisticsStoreMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A791EF91C7CFB3700C4C52B /* WebResourceLoadStatisticsStoreMessageReceiver.cpp */; };
</span><span class="cx">                 7A791EFB1C7CFD0100C4C52B /* WebResourceLoadStatisticsStoreMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A791EF81C7CFB1000C4C52B /* WebResourceLoadStatisticsStoreMessages.h */; };
</span><span class="cx">                 7A791EFC1C7D08C500C4C52B /* WebResourceLoadStatisticsStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A9CD8C01C77984900D9F6C7 /* WebResourceLoadStatisticsStore.cpp */; };
</span><ins>+                7C065F2B1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C065F291C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp */; };
+                7C065F2C1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C065F2A1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h */; };
</ins><span class="cx">                 7C135AA8173B0BCA00586AE2 /* WKPluginInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C135AA6173B0BCA00586AE2 /* WKPluginInformation.cpp */; };
</span><span class="cx">                 7C135AA9173B0BCA00586AE2 /* WKPluginInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C135AA7173B0BCA00586AE2 /* WKPluginInformation.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C135AAC173B0CFF00586AE2 /* PluginInformationMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7C135AAA173B0CFF00586AE2 /* PluginInformationMac.mm */; };
</span><span class="lines">@@ -3051,6 +3053,8 @@
</span><span class="cx">                 7A9CD8C01C77984900D9F6C7 /* WebResourceLoadStatisticsStore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebResourceLoadStatisticsStore.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7A9CD8C11C77984900D9F6C7 /* WebResourceLoadStatisticsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebResourceLoadStatisticsStore.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7A9CD8C21C779AD600D9F6C7 /* WebResourceLoadStatisticsStore.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebResourceLoadStatisticsStore.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                7C065F291C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebUserContentControllerDataTypes.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C065F2A1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebUserContentControllerDataTypes.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 7C0BB9A818DCDE890006C086 /* WebContent-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = &quot;WebContent-iOS.entitlements&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C0BB9A918DCDF5A0006C086 /* Network-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = &quot;Network-iOS.entitlements&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C135AA6173B0BCA00586AE2 /* WKPluginInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKPluginInformation.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4498,6 +4502,8 @@
</span><span class="cx">                                 8360349D1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp */,
</span><span class="cx">                                 8360349E1ACB34D600626549 /* WebSQLiteDatabaseTracker.h */,
</span><span class="cx">                                 C0337DD7127A51B6008FF4F4 /* WebTouchEvent.cpp */,
</span><ins>+                                7C065F291C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp */,
+                                7C065F2A1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h */,
</ins><span class="cx">                                 C0337DD0127A2980008FF4F4 /* WebWheelEvent.cpp */,
</span><span class="cx">                         );
</span><span class="cx">                         path = Shared;
</span><span class="lines">@@ -7988,6 +7994,7 @@
</span><span class="cx">                                 2D28A4971AF965A100F190C9 /* WKViewLayoutStrategy.h in Headers */,
</span><span class="cx">                                 5C1427021C23F84C00D41183 /* Download.h in Headers */,
</span><span class="cx">                                 BFA6179F12F0B99D0033E0CA /* WKViewPrivate.h in Headers */,
</span><ins>+                                7C065F2C1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h in Headers */,
</ins><span class="cx">                                 C5E1AFE916B20B75006CC1F2 /* WKWebArchive.h in Headers */,
</span><span class="cx">                                 C5E1AFEB16B20B7E006CC1F2 /* WKWebArchiveResource.h in Headers */,
</span><span class="cx">                                 1AA2E56718D77508003814BD /* WKWebProcessBundleParameters.h in Headers */,
</span><span class="lines">@@ -9144,6 +9151,7 @@
</span><span class="cx">                                 5C1427011C23F84C00D41183 /* Download.cpp in Sources */,
</span><span class="cx">                                 C0337DDD127A521C008FF4F4 /* WebPlatformTouchPoint.cpp in Sources */,
</span><span class="cx">                                 2DA944A21884E4F000ED86DB /* WebPlatformTouchPointIOS.cpp in Sources */,
</span><ins>+                                7C065F2B1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp in Sources */,
</ins><span class="cx">                                 31D5929E166E060000E6BF02 /* WebPlugInClient.cpp in Sources */,
</span><span class="cx">                                 BC5744EF12638FB3006F0F12 /* WebPopupItem.cpp in Sources */,
</span><span class="cx">                                 D3B9484611FF4B6500032B39 /* WebPopupMenu.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleInjectedBundlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> #include &quot;WebProcess.h&quot;
</span><span class="cx"> #include &quot;WebProcessCreationParameters.h&quot;
</span><span class="cx"> #include &quot;WebProcessPoolMessages.h&quot;
</span><ins>+#include &quot;WebUserContentController.h&quot;
</ins><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/Exception.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSLock.h&gt;
</span><span class="lines">@@ -70,7 +71,6 @@
</span><span class="cx"> #include &lt;WebCore/SecurityPolicy.h&gt;
</span><span class="cx"> #include &lt;WebCore/SessionID.h&gt;
</span><span class="cx"> #include &lt;WebCore/Settings.h&gt;
</span><del>-#include &lt;WebCore/UserContentController.h&gt;
</del><span class="cx"> #include &lt;WebCore/UserGestureIndicator.h&gt;
</span><span class="cx"> #include &lt;WebCore/UserScript.h&gt;
</span><span class="cx"> #include &lt;WebCore/UserStyleSheet.h&gt;
</span><span class="lines">@@ -407,39 +407,39 @@
</span><span class="cx"> void InjectedBundle::addUserScript(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld, const String&amp; source, const String&amp; url, API::Array* whitelist, API::Array* blacklist, WebCore::UserScriptInjectionTime injectionTime, WebCore::UserContentInjectedFrames injectedFrames)
</span><span class="cx"> {
</span><span class="cx">     // url is not from URL::string(), i.e. it has not already been parsed by URL, so we have to use the relative URL constructor for URL instead of the ParsedURLStringTag version.
</span><del>-    auto userScript = std::make_unique&lt;UserScript&gt;(source, URL(URL(), url), whitelist ? whitelist-&gt;toStringVector() : Vector&lt;String&gt;(), blacklist ? blacklist-&gt;toStringVector() : Vector&lt;String&gt;(), injectionTime, injectedFrames);
</del><ins>+    UserScript userScript{ source, URL(URL(), url), whitelist ? whitelist-&gt;toStringVector() : Vector&lt;String&gt;(), blacklist ? blacklist-&gt;toStringVector() : Vector&lt;String&gt;(), injectionTime, injectedFrames };
</ins><span class="cx"> 
</span><del>-    pageGroup-&gt;userContentController().addUserScript(scriptWorld-&gt;coreWorld(), WTFMove(userScript));
</del><ins>+    pageGroup-&gt;userContentController().addUserScript(*scriptWorld, WTFMove(userScript));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::addUserStyleSheet(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld, const String&amp; source, const String&amp; url, API::Array* whitelist, API::Array* blacklist, WebCore::UserContentInjectedFrames injectedFrames)
</span><span class="cx"> {
</span><span class="cx">     // url is not from URL::string(), i.e. it has not already been parsed by URL, so we have to use the relative URL constructor for URL instead of the ParsedURLStringTag version.
</span><del>-    auto userStyleSheet = std::make_unique&lt;UserStyleSheet&gt;(source, URL(URL(), url), whitelist ? whitelist-&gt;toStringVector() : Vector&lt;String&gt;(), blacklist ? blacklist-&gt;toStringVector() : Vector&lt;String&gt;(), injectedFrames, UserStyleUserLevel);
</del><ins>+    UserStyleSheet userStyleSheet{ source, URL(URL(), url), whitelist ? whitelist-&gt;toStringVector() : Vector&lt;String&gt;(), blacklist ? blacklist-&gt;toStringVector() : Vector&lt;String&gt;(), injectedFrames, UserStyleUserLevel };
</ins><span class="cx"> 
</span><del>-    pageGroup-&gt;userContentController().addUserStyleSheet(scriptWorld-&gt;coreWorld(), WTFMove(userStyleSheet), InjectInExistingDocuments);
</del><ins>+    pageGroup-&gt;userContentController().addUserStyleSheet(*scriptWorld, WTFMove(userStyleSheet));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::removeUserScript(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld, const String&amp; url)
</span><span class="cx"> {
</span><span class="cx">     // url is not from URL::string(), i.e. it has not already been parsed by URL, so we have to use the relative URL constructor for URL instead of the ParsedURLStringTag version.
</span><del>-    pageGroup-&gt;userContentController().removeUserScript(scriptWorld-&gt;coreWorld(), URL(URL(), url));
</del><ins>+    pageGroup-&gt;userContentController().removeUserScriptWithURL(*scriptWorld, URL(URL(), url));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::removeUserStyleSheet(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld, const String&amp; url)
</span><span class="cx"> {
</span><span class="cx">     // url is not from URL::string(), i.e. it has not already been parsed by URL, so we have to use the relative URL constructor for URL instead of the ParsedURLStringTag version.
</span><del>-    pageGroup-&gt;userContentController().removeUserStyleSheet(scriptWorld-&gt;coreWorld(), URL(URL(), url));
</del><ins>+    pageGroup-&gt;userContentController().removeUserStyleSheetWithURL(*scriptWorld, URL(URL(), url));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::removeUserScripts(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld)
</span><span class="cx"> {
</span><del>-    pageGroup-&gt;userContentController().removeUserScripts(scriptWorld-&gt;coreWorld());
</del><ins>+    pageGroup-&gt;userContentController().removeUserScripts(*scriptWorld);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::removeUserStyleSheets(WebPageGroupProxy* pageGroup, InjectedBundleScriptWorld* scriptWorld)
</span><span class="cx"> {
</span><del>-    pageGroup-&gt;userContentController().removeUserStyleSheets(scriptWorld-&gt;coreWorld());
</del><ins>+    pageGroup-&gt;userContentController().removeUserStyleSheets(*scriptWorld);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedBundle::removeAllUserContent(WebPageGroupProxy* pageGroup)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessUserContentWebUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -35,7 +35,6 @@
</span><span class="cx"> #include &quot;WebUserContentControllerMessages.h&quot;
</span><span class="cx"> #include &quot;WebUserContentControllerProxyMessages.h&quot;
</span><span class="cx"> #include &lt;WebCore/DOMWrapperWorld.h&gt;
</span><del>-#include &lt;WebCore/ScriptController.h&gt;
</del><span class="cx"> #include &lt;WebCore/SecurityOriginData.h&gt;
</span><span class="cx"> #include &lt;WebCore/SerializedScriptValue.h&gt;
</span><span class="cx"> #include &lt;WebCore/UserStyleSheet.h&gt;
</span><span class="lines">@@ -80,7 +79,6 @@
</span><span class="cx"> 
</span><span class="cx"> WebUserContentController::WebUserContentController(uint64_t identifier)
</span><span class="cx">     : m_identifier(identifier)
</span><del>-    , m_userContentController(UserContentController::create())
</del><span class="cx"> {
</span><span class="cx">     WebProcess::singleton().addMessageReceiver(Messages::WebUserContentController::messageReceiverName(), m_identifier, *this);
</span><span class="cx"> }
</span><span class="lines">@@ -94,7 +92,6 @@
</span><span class="cx">     userContentControllers().remove(m_identifier);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> void WebUserContentController::addUserContentWorlds(const Vector&lt;std::pair&lt;uint64_t, String&gt;&gt;&amp; worlds)
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; world : worlds) {
</span><span class="lines">@@ -124,20 +121,21 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebUserContentController::addUserScripts(const Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;&amp; userScripts)
</del><ins>+void WebUserContentController::addUserScripts(const Vector&lt;WebUserScriptData&gt;&amp; userScripts)
</ins><span class="cx"> {
</span><del>-    for (const auto&amp; userScriptWorldPair : userScripts) {
-        auto it = worldMap().find(userScriptWorldPair.first);
</del><ins>+    for (const auto&amp; userScriptData : userScripts) {
+        auto it = worldMap().find(userScriptData.worldIdentifier);
</ins><span class="cx">         if (it == worldMap().end()) {
</span><del>-            WTFLogAlways(&quot;Trying to add a UserScript to a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, userScriptWorldPair.first);
</del><ins>+            WTFLogAlways(&quot;Trying to add a UserScript to a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, userScriptData.worldIdentifier);
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        m_userContentController-&gt;addUserScript(it-&gt;value.first-&gt;coreWorld(), std::make_unique&lt;WebCore::UserScript&gt;(userScriptWorldPair.second));
</del><ins>+        UserScript script = userScriptData.userScript;
+        addUserScriptInternal(*it-&gt;value.first, userScriptData.identifier, WTFMove(script));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebUserContentController::removeUserScript(uint64_t worldIdentifier, const String&amp; urlString)
</del><ins>+void WebUserContentController::removeUserScript(uint64_t worldIdentifier, uint64_t userScriptIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     auto it = worldMap().find(worldIdentifier);
</span><span class="cx">     if (it == worldMap().end()) {
</span><span class="lines">@@ -145,7 +143,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_userContentController-&gt;removeUserScript(it-&gt;value.first-&gt;coreWorld(), URL(URL(), urlString));
</del><ins>+    removeUserScriptInternal(*it-&gt;value.first, userScriptIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentController::removeAllUserScripts(const Vector&lt;uint64_t&gt;&amp; worldIdentifiers)
</span><span class="lines">@@ -157,24 +155,25 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        m_userContentController-&gt;removeUserScripts(it-&gt;value.first-&gt;coreWorld());
</del><ins>+        removeUserScripts(*it-&gt;value.first);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebUserContentController::addUserStyleSheets(const Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt;&amp; userStyleSheets)
</del><ins>+void WebUserContentController::addUserStyleSheets(const Vector&lt;WebUserStyleSheetData&gt;&amp; userStyleSheets)
</ins><span class="cx"> {
</span><del>-    for (const auto&amp; userStyleSheetWorldPair : userStyleSheets) {
-        auto it = worldMap().find(userStyleSheetWorldPair.first);
</del><ins>+    for (const auto&amp; userStyleSheetData : userStyleSheets) {
+        auto it = worldMap().find(userStyleSheetData.worldIdentifier);
</ins><span class="cx">         if (it == worldMap().end()) {
</span><del>-            WTFLogAlways(&quot;Trying to add a UserStyleSheet to a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, userStyleSheetWorldPair.first);
</del><ins>+            WTFLogAlways(&quot;Trying to add a UserStyleSheet to a UserContentWorld (id=%&quot; PRIu64 &quot;) that does not exist.&quot;, userStyleSheetData.worldIdentifier);
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-
-        m_userContentController-&gt;addUserStyleSheet(it-&gt;value.first-&gt;coreWorld(), std::make_unique&lt;WebCore::UserStyleSheet&gt;(userStyleSheetWorldPair.second), InjectInExistingDocuments);
</del><ins>+        
+        UserStyleSheet sheet = userStyleSheetData.userStyleSheet;
+        addUserStyleSheetInternal(*it-&gt;value.first, userStyleSheetData.identifier, WTFMove(sheet));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebUserContentController::removeUserStyleSheet(uint64_t worldIdentifier, const String&amp; urlString)
</del><ins>+void WebUserContentController::removeUserStyleSheet(uint64_t worldIdentifier, uint64_t userStyleSheetIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     auto it = worldMap().find(worldIdentifier);
</span><span class="cx">     if (it == worldMap().end()) {
</span><span class="lines">@@ -182,7 +181,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_userContentController-&gt;removeUserStyleSheet(it-&gt;value.first-&gt;coreWorld(), URL(URL(), urlString));
</del><ins>+    removeUserStyleSheetInternal(*it-&gt;value.first, userStyleSheetIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentController::removeAllUserStyleSheets(const Vector&lt;uint64_t&gt;&amp; worldIdentifiers)
</span><span class="lines">@@ -194,7 +193,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        m_userContentController-&gt;removeUserStyleSheets(it-&gt;value.first-&gt;coreWorld());
</del><ins>+        removeUserStyleSheets(*it-&gt;value.first);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -253,7 +252,9 @@
</span><span class="cx">         RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt; descriptor = WebUserMessageHandlerDescriptorProxy::create(this, handle.name, handle.identifier);
</span><span class="cx"> 
</span><span class="cx">         m_userMessageHandlerDescriptors.add(descriptor-&gt;identifier(), descriptor);
</span><del>-        m_userContentController-&gt;addUserMessageHandlerDescriptor(descriptor-&gt;descriptor());
</del><ins>+
+        auto&amp; coreDescriptor = descriptor-&gt;descriptor();
+        m_userMessageHandlerDescriptorsMap.add(std::make_pair(coreDescriptor.name(), &amp;coreDescriptor.world()), &amp;coreDescriptor);
</ins><span class="cx">     }
</span><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(scriptMessageHandlers);
</span><span class="lines">@@ -265,8 +266,10 @@
</span><span class="cx"> #if ENABLE(USER_MESSAGE_HANDLERS)
</span><span class="cx">     auto it = m_userMessageHandlerDescriptors.find(identifier);
</span><span class="cx">     ASSERT(it != m_userMessageHandlerDescriptors.end());
</span><del>-    
-    m_userContentController-&gt;removeUserMessageHandlerDescriptor(it-&gt;value-&gt;descriptor());
</del><ins>+
+    auto&amp; coreDescriptor = it-&gt;value-&gt;descriptor();
+    m_userMessageHandlerDescriptorsMap.remove(std::make_pair(coreDescriptor.name(), &amp;coreDescriptor.world()));
+
</ins><span class="cx">     m_userMessageHandlerDescriptors.remove(it);
</span><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(identifier);
</span><span class="lines">@@ -279,19 +282,168 @@
</span><span class="cx">     for (const auto&amp; userContentExtension : userContentExtensions) {
</span><span class="cx">         WebCompiledContentExtensionData contentExtensionData = userContentExtension.second;
</span><span class="cx">         RefPtr&lt;WebCompiledContentExtension&gt; compiledContentExtension = WebCompiledContentExtension::create(WTFMove(contentExtensionData));
</span><del>-        m_userContentController-&gt;addUserContentExtension(userContentExtension.first, compiledContentExtension);
</del><ins>+
+        m_contentExtensionBackend.addContentExtension(userContentExtension.first, WTFMove(compiledContentExtension));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentController::removeUserContentExtension(const String&amp; name)
</span><span class="cx"> {
</span><del>-    m_userContentController-&gt;removeUserContentExtension(name);
</del><ins>+    m_contentExtensionBackend.removeContentExtension(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebUserContentController::removeAllUserContentExtensions()
</span><span class="cx"> {
</span><del>-    m_userContentController-&gt;removeAllUserContentExtensions();
</del><ins>+    m_contentExtensionBackend.removeAllContentExtensions();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+
+
+void WebUserContentController::addUserScriptInternal(InjectedBundleScriptWorld&amp; world, uint64_t userScriptIdentifier, UserScript&amp;&amp; userScript)
+{
+    auto&amp; scriptsInWorld = m_userScripts.ensure(&amp;world, [] { return Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;(); }).iterator-&gt;value;
+    scriptsInWorld.append(std::make_pair(userScriptIdentifier, WTFMove(userScript)));
+}
+
+void WebUserContentController::addUserScript(InjectedBundleScriptWorld&amp; world, UserScript&amp;&amp; userScript)
+{
+    addUserScriptInternal(world, 0, WTFMove(userScript));
+}
+
+void WebUserContentController::removeUserScriptWithURL(InjectedBundleScriptWorld&amp; world, const URL&amp; url)
+{
+    auto it = m_userScripts.find(&amp;world);
+    if (it == m_userScripts.end())
+        return;
+
+    auto&amp; scripts = it-&gt;value;
+    for (int i = scripts.size() - 1; i &gt;= 0; --i) {
+        if (scripts[i].second.url() == url)
+            scripts.remove(i);
+    }
+
+    if (scripts.isEmpty())
+        m_userScripts.remove(it);
+}
+
+void WebUserContentController::removeUserScriptInternal(InjectedBundleScriptWorld&amp; world, uint64_t userScriptIdentifier)
+{
+    auto it = m_userScripts.find(&amp;world);
+    if (it == m_userScripts.end())
+        return;
+
+    auto&amp; scripts = it-&gt;value;
+    for (int i = scripts.size() - 1; i &gt;= 0; --i) {
+        if (scripts[i].first == userScriptIdentifier)
+            scripts.remove(i);
+    }
+
+    if (scripts.isEmpty())
+        m_userScripts.remove(it);
+}
+
+void WebUserContentController::removeUserScripts(InjectedBundleScriptWorld&amp; world)
+{
+    m_userScripts.remove(&amp;world);
+}
+
+void WebUserContentController::addUserStyleSheetInternal(InjectedBundleScriptWorld&amp; world, uint64_t userStyleSheetIdentifier, UserStyleSheet&amp;&amp; userStyleSheet)
+{
+    auto&amp; styleSheetsInWorld = m_userStyleSheets.ensure(&amp;world, [] { return Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt;(); }).iterator-&gt;value;
+    styleSheetsInWorld.append(std::make_pair(userStyleSheetIdentifier, WTFMove(userStyleSheet)));
+
+    invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+}
+
+void WebUserContentController::addUserStyleSheet(InjectedBundleScriptWorld&amp; world, UserStyleSheet&amp;&amp; userStyleSheet)
+{
+    addUserStyleSheetInternal(world, 0, WTFMove(userStyleSheet));
+}
+
+void WebUserContentController::removeUserStyleSheetWithURL(InjectedBundleScriptWorld&amp; world, const URL&amp; url)
+{
+    auto it = m_userStyleSheets.find(&amp;world);
+    if (it == m_userStyleSheets.end())
+        return;
+
+    auto&amp; stylesheets = it-&gt;value;
+
+    bool sheetsChanged = false;
+    for (int i = stylesheets.size() - 1; i &gt;= 0; --i) {
+        if (stylesheets[i].second.url() == url) {
+            stylesheets.remove(i);
+            sheetsChanged = true;
+        }
+    }
+
+    if (!sheetsChanged)
+        return;
+
+    if (stylesheets.isEmpty())
+        m_userStyleSheets.remove(it);
+
+    invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+}
+
+void WebUserContentController::removeUserStyleSheetInternal(InjectedBundleScriptWorld&amp; world, uint64_t userStyleSheetIdentifier)
+{
+    auto it = m_userStyleSheets.find(&amp;world);
+    if (it == m_userStyleSheets.end())
+        return;
+
+    auto&amp; stylesheets = it-&gt;value;
+
+    bool sheetsChanged = false;
+    for (int i = stylesheets.size() - 1; i &gt;= 0; --i) {
+        if (stylesheets[i].first == userStyleSheetIdentifier) {
+            stylesheets.remove(i);
+            sheetsChanged = true;
+        }
+    }
+
+    if (!sheetsChanged)
+        return;
+
+    if (stylesheets.isEmpty())
+        m_userStyleSheets.remove(it);
+
+    invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+}
+
+void WebUserContentController::removeUserStyleSheets(InjectedBundleScriptWorld&amp; world)
+{
+    if (!m_userStyleSheets.remove(&amp;world))
+        return;
+
+    invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+}
+
+void WebUserContentController::removeAllUserContent()
+{
+    m_userScripts.clear();
+
+    if (!m_userStyleSheets.isEmpty()) {
+        m_userStyleSheets.clear();
+        invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
+    }
+}
+
+void WebUserContentController::forEachUserScript(const std::function&lt;void(WebCore::DOMWrapperWorld&amp;, const WebCore::UserScript&amp;)&gt;&amp; functor) const
+{
+    for (const auto&amp; worldAndUserScriptVector : m_userScripts) {
+        auto&amp; world = worldAndUserScriptVector.key-&gt;coreWorld();
+        for (const auto&amp; identifierUserScriptPair : worldAndUserScriptVector.value)
+            functor(world, identifierUserScriptPair.second);
+    }
+}
+
+void WebUserContentController::forEachUserStyleSheet(const std::function&lt;void(const WebCore::UserStyleSheet&amp;)&gt;&amp; functor) const
+{
+    for (auto&amp; styleSheetVector : m_userStyleSheets.values()) {
+        for (const auto&amp; identifierUserStyleSheetPair : styleSheetVector)
+            functor(identifierUserStyleSheetPair.second);
+    }
+}
+
</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 (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -28,40 +28,64 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;MessageReceiver.h&quot;
</span><span class="cx"> #include &quot;WebScriptMessageHandler.h&quot;
</span><del>-#include &lt;WebCore/UserContentController.h&gt;
</del><ins>+#include &quot;WebUserContentControllerDataTypes.h&quot;
+#include &lt;WebCore/UserContentProvider.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><del>-#include &lt;wtf/RefCounted.h&gt;
</del><span class="cx"> 
</span><ins>+#if ENABLE(CONTENT_EXTENSIONS)
+#include &lt;WebCore/ContentExtensionsBackend.h&gt;
+#endif
+
+namespace WebCore {
+namespace ContentExtensions {
+class CompiledContentExtension;
+}
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class InjectedBundleScriptWorld;
</span><span class="cx"> class WebCompiledContentExtensionData;
</span><span class="cx"> class WebUserMessageHandlerDescriptorProxy;
</span><span class="cx"> 
</span><del>-class WebUserContentController final : public RefCounted&lt;WebUserContentController&gt;, private IPC::MessageReceiver  {
</del><ins>+class WebUserContentController final : public WebCore::UserContentProvider, private IPC::MessageReceiver {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;WebUserContentController&gt; getOrCreate(uint64_t identifier);
</span><span class="cx">     virtual ~WebUserContentController();
</span><span class="cx"> 
</span><del>-    WebCore::UserContentController&amp; userContentController() { return m_userContentController; }
-
</del><span class="cx">     uint64_t identifier() { return m_identifier; } 
</span><span class="cx"> 
</span><ins>+    void addUserScript(InjectedBundleScriptWorld&amp;, WebCore::UserScript&amp;&amp;);
+    void removeUserScriptWithURL(InjectedBundleScriptWorld&amp;, const WebCore::URL&amp;);
+    void removeUserScripts(InjectedBundleScriptWorld&amp;);
+    void addUserStyleSheet(InjectedBundleScriptWorld&amp;, WebCore::UserStyleSheet&amp;&amp;);
+    void removeUserStyleSheetWithURL(InjectedBundleScriptWorld&amp;, const WebCore::URL&amp;);
+    void removeUserStyleSheets(InjectedBundleScriptWorld&amp;);
+    void removeAllUserContent();
+
</ins><span class="cx"> private:
</span><span class="cx">     explicit WebUserContentController(uint64_t identifier);
</span><span class="cx"> 
</span><ins>+    // WebCore::UserContentProvider
+    void forEachUserScript(const std::function&lt;void(WebCore::DOMWrapperWorld&amp;, const WebCore::UserScript&amp;)&gt;&amp;) const override;
+    void forEachUserStyleSheet(const std::function&lt;void(const WebCore::UserStyleSheet&amp;)&gt;&amp;) const override;
+    const WebCore::UserMessageHandlerDescriptorMap&amp; userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptorsMap; }
+#if ENABLE(CONTENT_EXTENSIONS)
+    WebCore::ContentExtensions::ContentExtensionsBackend&amp; userContentExtensionBackend() override { return m_contentExtensionBackend; }
+#endif
+
</ins><span class="cx">     // IPC::MessageReceiver.
</span><span class="cx">     void didReceiveMessage(IPC::Connection&amp;, IPC::MessageDecoder&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     void addUserContentWorlds(const Vector&lt;std::pair&lt;uint64_t, String&gt;&gt;&amp;);
</span><span class="cx">     void removeUserContentWorlds(const Vector&lt;uint64_t&gt;&amp;);
</span><span class="cx"> 
</span><del>-    void addUserScripts(const Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;&amp;);
-    void removeUserScript(uint64_t worldIdentifier, const String&amp; urlString);
</del><ins>+    void addUserScripts(const Vector&lt;WebUserScriptData&gt;&amp;);
+    void removeUserScript(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
</ins><span class="cx">     void removeAllUserScripts(const Vector&lt;uint64_t&gt;&amp;);
</span><span class="cx"> 
</span><del>-    void addUserStyleSheets(const Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt;&amp;);
-    void removeUserStyleSheet(uint64_t worldIdentifier, const String&amp; urlString);
</del><ins>+    void addUserStyleSheets(const Vector&lt;WebUserStyleSheetData&gt;&amp;);
+    void removeUserStyleSheet(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
</ins><span class="cx">     void removeAllUserStyleSheets(const Vector&lt;uint64_t&gt;&amp;);
</span><span class="cx"> 
</span><span class="cx">     void addUserScriptMessageHandlers(const Vector&lt;WebScriptMessageHandlerHandle&gt;&amp;);
</span><span class="lines">@@ -73,11 +97,27 @@
</span><span class="cx">     void removeAllUserContentExtensions();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+
+    void addUserScriptInternal(InjectedBundleScriptWorld&amp;, uint64_t userScriptIdentifier, WebCore::UserScript&amp;&amp;);
+    void removeUserScriptInternal(InjectedBundleScriptWorld&amp;, uint64_t userScriptIdentifier);
+    void addUserStyleSheetInternal(InjectedBundleScriptWorld&amp;, uint64_t userStyleSheetIdentifier, WebCore::UserStyleSheet&amp;&amp;);
+    void removeUserStyleSheetInternal(InjectedBundleScriptWorld&amp;, uint64_t userStyleSheetIdentifier);
+
+
</ins><span class="cx">     uint64_t m_identifier;
</span><del>-    Ref&lt;WebCore::UserContentController&gt; m_userContentController;
-#if ENABLE(USER_MESSAGE_HANDLERS)
</del><span class="cx">     HashMap&lt;uint64_t, RefPtr&lt;WebUserMessageHandlerDescriptorProxy&gt;&gt; m_userMessageHandlerDescriptors;
</span><ins>+
+    typedef HashMap&lt;RefPtr&lt;InjectedBundleScriptWorld&gt;, Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt;&gt; WorldToUserScriptMap;
+    WorldToUserScriptMap m_userScripts;
+
+    typedef HashMap&lt;RefPtr&lt;InjectedBundleScriptWorld&gt;, Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt;&gt; WorldToUserStyleSheetMap;
+    WorldToUserStyleSheetMap m_userStyleSheets;
+
+    WebCore::UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptorsMap;
+#if ENABLE(CONTENT_EXTENSIONS)
+    WebCore::ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend;
</ins><span class="cx"> #endif
</span><ins>+
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessUserContentWebUserContentControllermessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -27,12 +27,12 @@
</span><span class="cx">     AddUserContentWorlds(Vector&lt;std::pair&lt;uint64_t, String&gt;&gt; worlds);
</span><span class="cx">     RemoveUserContentWorlds(Vector&lt;uint64_t&gt; worldIdentifiers);
</span><span class="cx"> 
</span><del>-    AddUserScripts(Vector&lt;std::pair&lt;uint64_t, WebCore::UserScript&gt;&gt; userScripts);
-    RemoveUserScript(uint64_t worldIdentifier, String url);
</del><ins>+    AddUserScripts(Vector&lt;struct WebKit::WebUserScriptData&gt; userScripts);
+    RemoveUserScript(uint64_t worldIdentifier, uint64_t identifier);
</ins><span class="cx">     RemoveAllUserScripts(Vector&lt;uint64_t&gt; worldIdentifiers);
</span><span class="cx"> 
</span><del>-    AddUserStyleSheets(Vector&lt;std::pair&lt;uint64_t, WebCore::UserStyleSheet&gt;&gt; userStyleSheets);
-    RemoveUserStyleSheet(uint64_t worldIdentifier, String url);
</del><ins>+    AddUserStyleSheets(Vector&lt;struct WebKit::WebUserStyleSheetData&gt; userStyleSheets);
+    RemoveUserStyleSheet(uint64_t worldIdentifier, uint64_t identifier);
</ins><span class="cx">     RemoveAllUserStyleSheets(Vector&lt;uint64_t&gt; worldIdentifiers);
</span><span class="cx"> 
</span><span class="cx">     AddUserScriptMessageHandlers(Vector&lt;WebKit::WebScriptMessageHandlerHandle&gt; scriptMessageHandlers);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #include &quot;EventDispatcher.h&quot;
</span><span class="cx"> #include &quot;InjectedBundle.h&quot;
</span><span class="cx"> #include &quot;InjectedBundleBackForwardList.h&quot;
</span><ins>+#include &quot;InjectedBundleScriptWorld.h&quot;
</ins><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;NetscapePlugin.h&quot;
</span><span class="cx"> #include &quot;NotificationPermissionRequestManager.h&quot;
</span><span class="lines">@@ -396,7 +397,7 @@
</span><span class="cx"> 
</span><span class="cx">     pageConfiguration.databaseProvider = WebDatabaseProvider::getOrCreate(m_pageGroup-&gt;pageGroupID());
</span><span class="cx">     pageConfiguration.storageNamespaceProvider = WebStorageNamespaceProvider::getOrCreate(m_pageGroup-&gt;pageGroupID());
</span><del>-    pageConfiguration.userContentController = &amp;m_userContentController-&gt;userContentController();
</del><ins>+    pageConfiguration.userContentProvider = m_userContentController.ptr();
</ins><span class="cx">     pageConfiguration.visitedLinkStore = VisitedLinkTableController::getOrCreate(parameters.visitedLinkTableID);
</span><span class="cx"> 
</span><span class="cx"> #if USE(APPLE_INTERNAL_SDK)
</span><span class="lines">@@ -5216,21 +5217,21 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::addUserScript(const String&amp; source, WebCore::UserContentInjectedFrames injectedFrames, WebCore::UserScriptInjectionTime injectionTime)
</span><span class="cx"> {
</span><del>-    WebCore::UserScript userScript(source, WebCore::blankURL(), Vector&lt;String&gt;(), Vector&lt;String&gt;(), injectionTime, injectedFrames);
</del><ins>+    WebCore::UserScript userScript{ source, WebCore::blankURL(), Vector&lt;String&gt;(), Vector&lt;String&gt;(), injectionTime, injectedFrames };
</ins><span class="cx"> 
</span><del>-    m_userContentController-&gt;userContentController().addUserScript(mainThreadNormalWorld(), std::make_unique&lt;WebCore::UserScript&gt;(userScript));
</del><ins>+    m_userContentController-&gt;addUserScript(*InjectedBundleScriptWorld::normalWorld(), WTFMove(userScript));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::addUserStyleSheet(const String&amp; source, WebCore::UserContentInjectedFrames injectedFrames)
</span><span class="cx"> {
</span><del>-    WebCore::UserStyleSheet userStyleSheet(source, WebCore::blankURL(), Vector&lt;String&gt;(), Vector&lt;String&gt;(), injectedFrames, UserStyleUserLevel);
</del><ins>+    WebCore::UserStyleSheet userStyleSheet{ source, WebCore::blankURL(), Vector&lt;String&gt;(), Vector&lt;String&gt;(), injectedFrames, UserStyleUserLevel };
</ins><span class="cx"> 
</span><del>-    m_userContentController-&gt;userContentController().addUserStyleSheet(mainThreadNormalWorld(), std::make_unique&lt;WebCore::UserStyleSheet&gt;(userStyleSheet), InjectInExistingDocuments);
</del><ins>+    m_userContentController-&gt;addUserStyleSheet(*InjectedBundleScriptWorld::normalWorld(), WTFMove(userStyleSheet));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::removeAllUserContent()
</span><span class="cx"> {
</span><del>-    m_userContentController-&gt;userContentController().removeAllUserContent();
</del><ins>+    m_userContentController-&gt;removeAllUserContent();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::dispatchDidLayout(WebCore::LayoutMilestones milestones)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageGroupProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.cpp (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.cpp        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.cpp        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -56,9 +56,9 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebCore::UserContentController&amp; WebPageGroupProxy::userContentController()
</del><ins>+WebUserContentController&amp; WebPageGroupProxy::userContentController()
</ins><span class="cx"> {
</span><del>-    return m_userContentController-&gt;userContentController();
</del><ins>+    return m_userContentController;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageGroupProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.h (197942 => 197943)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.h        2016-03-10 18:23:52 UTC (rev 197942)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPageGroupProxy.h        2016-03-10 18:24:50 UTC (rev 197943)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class PageGroup;
</span><del>-class UserContentController;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -50,7 +49,7 @@
</span><span class="cx">     bool isVisibleToHistoryClient() const { return m_data.visibleToHistoryClient; }
</span><span class="cx">     WebCore::PageGroup* corePageGroup() const { return m_pageGroup; }
</span><span class="cx"> 
</span><del>-    WebCore::UserContentController&amp; userContentController();
</del><ins>+    WebUserContentController&amp; userContentController();
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebPageGroupProxy(const WebPageGroupData&amp;);
</span></span></pre>
</div>
</div>

</body>
</html>