Title: [230210] trunk/Source/WebKit
Revision
230210
Author
you...@apple.com
Date
2018-04-03 10:58:48 -0700 (Tue, 03 Apr 2018)

Log Message

Make NetworkProcess get ContentBlocker information from UIProcess
https://bugs.webkit.org/show_bug.cgi?id=184205

Reviewed by Alex Christensen.

Make NetworkProcess get content blockers from UIProcess directly.
Before that patch, WebProcess sent content blockers to NetworkProcess for each PingLoad.
Instead, WebProcess sends the content blocker identifier for each PingLoad and NetworkProcess fetches the content blocker once.

This is both more efficient than passing them for each PingLoad and safer in the sense
that a compromised WebProcess will not be able to bypass any of these.
In the future, NetworkProcess should get the content blocker identifier directly from the WebPageID attached to the request.

Covered by existing beacon+content blocker tests.

Did some refactoring to add a typed content blocker identifier.
Once NetworkProcess fetches a given content blocker, the content blocker will send any modification to NetworkProcess.
Introduced NetworkContentRuleListManager to handle the content blockers in NetworkProcess.

* CMakeLists.txt:
* DerivedSources.make:
* NetworkProcess/NetworkLoadChecker.cpp:
(WebKit::NetworkLoadChecker::checkRequest):
(WebKit::NetworkLoadChecker::continueCheckingRequest):
(WebKit::NetworkLoadChecker::processContentExtensionRulesForLoad):
* NetworkProcess/NetworkLoadChecker.h:
(WebKit::NetworkLoadChecker::setContentExtensionController):
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::didReceiveMessage):
* NetworkProcess/NetworkProcess.h:
(WebKit::NetworkProcess::networkUserContentController):
* NetworkProcess/NetworkResourceLoadParameters.cpp:
(WebKit::NetworkResourceLoadParameters::encode const):
(WebKit::NetworkResourceLoadParameters::decode):
* NetworkProcess/NetworkResourceLoadParameters.h:
* NetworkProcess/NetworkContentRuleListManager.cpp: Added.
(WebKit::NetworkContentRuleListManager::contentExtensionsBackend):
(WebKit::NetworkContentRuleListManager::addContentRuleLists):
(WebKit::NetworkContentRuleListManager::removeContentRuleList):
(WebKit::NetworkContentRuleListManager::removeAllContentRuleLists):
(WebKit::NetworkContentRuleListManager::remove):
* NetworkProcess/NetworkContentRuleListManager.h: Added.
* NetworkProcess/NetworkContentRuleListManager.messages.in: Added.
* NetworkProcess/PingLoad.cpp:
* Scripts/webkit/messages.py:
* Shared/UserContentControllerIdentifier.h: Added.
* Shared/WebPageCreationParameters.cpp:
(WebKit::WebPageCreationParameters::decode):
* Shared/WebPageCreationParameters.h:
* Shared/WebPageGroupData.cpp:
(WebKit::WebPageGroupData::decode):
* Shared/WebPageGroupData.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::~NetworkProcessProxy):
(WebKit::NetworkProcessProxy::contentExtensionRules):
(WebKit::NetworkProcessProxy::didDestroyWebUserContentControllerProxy):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/Network/NetworkProcessProxy.messages.in:
* UIProcess/UserContent/WebUserContentControllerProxy.cpp:
(WebKit::WebUserContentControllerProxy::get):
(WebKit::WebUserContentControllerProxy::WebUserContentControllerProxy):
(WebKit::WebUserContentControllerProxy::~WebUserContentControllerProxy):
(WebKit::WebUserContentControllerProxy::addProcess):
(WebKit::WebUserContentControllerProxy::removeProcess):
(WebKit::WebUserContentControllerProxy::addUserContentWorldUse):
(WebKit::WebUserContentControllerProxy::removeUserContentWorldUses):
(WebKit::WebUserContentControllerProxy::addUserScript):
(WebKit::WebUserContentControllerProxy::removeUserScript):
(WebKit::WebUserContentControllerProxy::removeAllUserScripts):
(WebKit::WebUserContentControllerProxy::addUserStyleSheet):
(WebKit::WebUserContentControllerProxy::removeUserStyleSheet):
(WebKit::WebUserContentControllerProxy::removeAllUserStyleSheets):
(WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler):
(WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName):
(WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers):
(WebKit::WebUserContentControllerProxy::addContentRuleList):
(WebKit::WebUserContentControllerProxy::removeContentRuleList):
(WebKit::WebUserContentControllerProxy::removeAllContentRuleLists):
* UIProcess/UserContent/WebUserContentControllerProxy.h:
(WebKit::WebUserContentControllerProxy::create):
(WebKit::WebUserContentControllerProxy::addNetworkProcess):
(WebKit::WebUserContentControllerProxy::removeNetworkProcess):
(WebKit::WebUserContentControllerProxy::contentExtensionRules):
(WebKit::WebUserContentControllerProxy::identifier const):
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::startPingLoad):
* WebProcess/UserContent/WebUserContentController.cpp:
(WebKit::WebUserContentController::getOrCreate):
(WebKit::WebUserContentController::WebUserContentController):
(WebKit::WebUserContentController::~WebUserContentController):
* WebProcess/UserContent/WebUserContentController.h:
* WebProcess/WebPage/WebPage.h:
(WebKit::WebPage::userContentControllerIdentifier const):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/CMakeLists.txt (230209 => 230210)


--- trunk/Source/WebKit/CMakeLists.txt	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/CMakeLists.txt	2018-04-03 17:58:48 UTC (rev 230210)
@@ -107,6 +107,7 @@
 
     NetworkProcess/NetworkCORSPreflightChecker.cpp
     NetworkProcess/NetworkConnectionToWebProcess.cpp
+    NetworkProcess/NetworkContentRuleListManager.cpp
     NetworkProcess/NetworkDataTask.cpp
     NetworkProcess/NetworkDataTaskBlob.cpp
     NetworkProcess/NetworkLoad.cpp
@@ -619,6 +620,7 @@
     NetworkProcess/Cookies/WebCookieManager.messages.in
 
     NetworkProcess/NetworkConnectionToWebProcess.messages.in
+    NetworkProcess/NetworkContentRuleListManager.messages.in
     NetworkProcess/NetworkProcess.messages.in
     NetworkProcess/NetworkResourceLoader.messages.in
     NetworkProcess/NetworkSocketStream.messages.in

Modified: trunk/Source/WebKit/ChangeLog (230209 => 230210)


--- trunk/Source/WebKit/ChangeLog	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/ChangeLog	2018-04-03 17:58:48 UTC (rev 230210)
@@ -1,3 +1,100 @@
+2018-04-03  Youenn Fablet  <you...@apple.com>
+
+        Make NetworkProcess get ContentBlocker information from UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=184205
+
+        Reviewed by Alex Christensen.
+
+        Make NetworkProcess get content blockers from UIProcess directly.
+        Before that patch, WebProcess sent content blockers to NetworkProcess for each PingLoad.
+        Instead, WebProcess sends the content blocker identifier for each PingLoad and NetworkProcess fetches the content blocker once.
+
+        This is both more efficient than passing them for each PingLoad and safer in the sense
+        that a compromised WebProcess will not be able to bypass any of these.
+        In the future, NetworkProcess should get the content blocker identifier directly from the WebPageID attached to the request.
+
+        Covered by existing beacon+content blocker tests.
+
+        Did some refactoring to add a typed content blocker identifier.
+        Once NetworkProcess fetches a given content blocker, the content blocker will send any modification to NetworkProcess.
+        Introduced NetworkContentRuleListManager to handle the content blockers in NetworkProcess.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * NetworkProcess/NetworkLoadChecker.cpp:
+        (WebKit::NetworkLoadChecker::checkRequest):
+        (WebKit::NetworkLoadChecker::continueCheckingRequest):
+        (WebKit::NetworkLoadChecker::processContentExtensionRulesForLoad):
+        * NetworkProcess/NetworkLoadChecker.h:
+        (WebKit::NetworkLoadChecker::setContentExtensionController):
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::didReceiveMessage):
+        * NetworkProcess/NetworkProcess.h:
+        (WebKit::NetworkProcess::networkUserContentController):
+        * NetworkProcess/NetworkResourceLoadParameters.cpp:
+        (WebKit::NetworkResourceLoadParameters::encode const):
+        (WebKit::NetworkResourceLoadParameters::decode):
+        * NetworkProcess/NetworkResourceLoadParameters.h:
+        * NetworkProcess/NetworkContentRuleListManager.cpp: Added.
+        (WebKit::NetworkContentRuleListManager::contentExtensionsBackend):
+        (WebKit::NetworkContentRuleListManager::addContentRuleLists):
+        (WebKit::NetworkContentRuleListManager::removeContentRuleList):
+        (WebKit::NetworkContentRuleListManager::removeAllContentRuleLists):
+        (WebKit::NetworkContentRuleListManager::remove):
+        * NetworkProcess/NetworkContentRuleListManager.h: Added.
+        * NetworkProcess/NetworkContentRuleListManager.messages.in: Added.
+        * NetworkProcess/PingLoad.cpp:
+        * Scripts/webkit/messages.py:
+        * Shared/UserContentControllerIdentifier.h: Added.
+        * Shared/WebPageCreationParameters.cpp:
+        (WebKit::WebPageCreationParameters::decode):
+        * Shared/WebPageCreationParameters.h:
+        * Shared/WebPageGroupData.cpp:
+        (WebKit::WebPageGroupData::decode):
+        * Shared/WebPageGroupData.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::~NetworkProcessProxy):
+        (WebKit::NetworkProcessProxy::contentExtensionRules):
+        (WebKit::NetworkProcessProxy::didDestroyWebUserContentControllerProxy):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/Network/NetworkProcessProxy.messages.in:
+        * UIProcess/UserContent/WebUserContentControllerProxy.cpp:
+        (WebKit::WebUserContentControllerProxy::get):
+        (WebKit::WebUserContentControllerProxy::WebUserContentControllerProxy):
+        (WebKit::WebUserContentControllerProxy::~WebUserContentControllerProxy):
+        (WebKit::WebUserContentControllerProxy::addProcess):
+        (WebKit::WebUserContentControllerProxy::removeProcess):
+        (WebKit::WebUserContentControllerProxy::addUserContentWorldUse):
+        (WebKit::WebUserContentControllerProxy::removeUserContentWorldUses):
+        (WebKit::WebUserContentControllerProxy::addUserScript):
+        (WebKit::WebUserContentControllerProxy::removeUserScript):
+        (WebKit::WebUserContentControllerProxy::removeAllUserScripts):
+        (WebKit::WebUserContentControllerProxy::addUserStyleSheet):
+        (WebKit::WebUserContentControllerProxy::removeUserStyleSheet):
+        (WebKit::WebUserContentControllerProxy::removeAllUserStyleSheets):
+        (WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler):
+        (WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName):
+        (WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers):
+        (WebKit::WebUserContentControllerProxy::addContentRuleList):
+        (WebKit::WebUserContentControllerProxy::removeContentRuleList):
+        (WebKit::WebUserContentControllerProxy::removeAllContentRuleLists):
+        * UIProcess/UserContent/WebUserContentControllerProxy.h:
+        (WebKit::WebUserContentControllerProxy::create):
+        (WebKit::WebUserContentControllerProxy::addNetworkProcess):
+        (WebKit::WebUserContentControllerProxy::removeNetworkProcess):
+        (WebKit::WebUserContentControllerProxy::contentExtensionRules):
+        (WebKit::WebUserContentControllerProxy::identifier const):
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::startPingLoad):
+        * WebProcess/UserContent/WebUserContentController.cpp:
+        (WebKit::WebUserContentController::getOrCreate):
+        (WebKit::WebUserContentController::WebUserContentController):
+        (WebKit::WebUserContentController::~WebUserContentController):
+        * WebProcess/UserContent/WebUserContentController.h:
+        * WebProcess/WebPage/WebPage.h:
+        (WebKit::WebPage::userContentControllerIdentifier const):
+
 2018-04-02  Beth Dakin  <bda...@apple.com>
 
         Fix the managed configurations build

Modified: trunk/Source/WebKit/DerivedSources.make (230209 => 230210)


--- trunk/Source/WebKit/DerivedSources.make	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/DerivedSources.make	2018-04-03 17:58:48 UTC (rev 230210)
@@ -115,6 +115,7 @@
     NetworkRTCSocket \
     NetworkResourceLoader \
     NetworkSocketStream \
+    NetworkContentRuleListManager \
     PluginControllerProxy \
     PluginProcess \
     PluginProcessConnection \

Added: trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp (0 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 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 "config.h"
+#include "NetworkContentRuleListManager.h"
+
+#if ENABLE(CONTENT_EXTENSIONS)
+
+#include "NetworkProcess.h"
+#include "NetworkProcessProxyMessages.h"
+#include "WebCompiledContentRuleList.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+NetworkContentRuleListManager::NetworkContentRuleListManager() = default;
+NetworkContentRuleListManager::~NetworkContentRuleListManager()
+{
+    auto pendingCallbacks = WTFMove(m_pendingCallbacks);
+    if (pendingCallbacks.isEmpty())
+        return;
+
+    WebCore::ContentExtensions::ContentExtensionsBackend backend;
+    for (auto& callbacks : pendingCallbacks.values()) {
+        for (auto& callback : callbacks)
+            callback(backend);
+    }
+}
+
+void NetworkContentRuleListManager::contentExtensionsBackend(UserContentControllerIdentifier identifier, BackendCallback&& callback)
+{
+    auto iterator = m_contentExtensionBackends.find(identifier);
+    if (iterator != m_contentExtensionBackends.end()) {
+        callback(*iterator->value);
+        return;
+    }
+    m_pendingCallbacks.ensure(identifier, [] {
+        return Vector<BackendCallback> { };
+    }).iterator->value.append(WTFMove(callback));
+    NetworkProcess::singleton().parentProcessConnection()->send(Messages::NetworkProcessProxy::ContentExtensionRules { identifier }, 0);
+}
+
+void NetworkContentRuleListManager::addContentRuleLists(UserContentControllerIdentifier identifier, const Vector<std::pair<String, WebCompiledContentRuleListData>>& contentRuleLists)
+{
+    auto& backend = *m_contentExtensionBackends.ensure(identifier, [] {
+        return std::make_unique<WebCore::ContentExtensions::ContentExtensionsBackend>();
+    }).iterator->value;
+
+    for (const auto& contentRuleList : contentRuleLists) {
+        WebCompiledContentRuleListData contentRuleListData = contentRuleList.second;
+        auto compiledContentRuleList = WebCompiledContentRuleList::create(WTFMove(contentRuleListData));
+        backend.addContentExtension(contentRuleList.first, WTFMove(compiledContentRuleList));
+    }
+
+    auto pendingCallbacks = m_pendingCallbacks.take(identifier);
+    for (auto& callback : pendingCallbacks)
+        callback(backend);
+
+}
+
+void NetworkContentRuleListManager::removeContentRuleList(UserContentControllerIdentifier identifier, const String& name)
+{
+    auto iterator = m_contentExtensionBackends.find(identifier);
+    if (iterator == m_contentExtensionBackends.end())
+        return;
+
+    iterator->value->removeContentExtension(name);
+}
+
+void NetworkContentRuleListManager::removeAllContentRuleLists(UserContentControllerIdentifier identifier)
+{
+    auto iterator = m_contentExtensionBackends.find(identifier);
+    if (iterator == m_contentExtensionBackends.end())
+        return;
+
+    iterator->value->removeAllContentExtensions();
+}
+
+void NetworkContentRuleListManager::remove(UserContentControllerIdentifier identifier)
+{
+    m_contentExtensionBackends.remove(identifier);
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(CONTENT_EXTENSIONS)

Copied: trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h (from rev 230208, trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h) (0 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#pragma once
+
+#if ENABLE(CONTENT_EXTENSIONS)
+
+#include "UserContentControllerIdentifier.h"
+#include "WebCompiledContentRuleListData.h"
+#include <WebCore/ContentExtensionsBackend.h>
+#include <WebCore/UserContentProvider.h>
+
+namespace IPC {
+class Connection;
+class Decoder;
+}
+
+namespace WebKit {
+
+class NetworkContentRuleListManager {
+public:
+    NetworkContentRuleListManager();
+    ~NetworkContentRuleListManager();
+
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
+
+    using BackendCallback = CompletionHandler<void(WebCore::ContentExtensions::ContentExtensionsBackend&)>;
+    void contentExtensionsBackend(UserContentControllerIdentifier, BackendCallback&&);
+
+private:
+    void addContentRuleLists(UserContentControllerIdentifier, const Vector<std::pair<String, WebCompiledContentRuleListData>>&);
+    void removeContentRuleList(UserContentControllerIdentifier, const String& name);
+    void removeAllContentRuleLists(UserContentControllerIdentifier);
+    void remove(UserContentControllerIdentifier);
+
+    HashMap<UserContentControllerIdentifier, std::unique_ptr<WebCore::ContentExtensions::ContentExtensionsBackend>> m_contentExtensionBackends;
+    HashMap<UserContentControllerIdentifier, Vector<BackendCallback>> m_pendingCallbacks;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(CONTENT_EXTENSIONS)

Added: trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.messages.in (0 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.messages.in	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.messages.in	2018-04-03 17:58:48 UTC (rev 230210)
@@ -0,0 +1,32 @@
+# Copyright (C) 2018 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.
+
+#if ENABLE(CONTENT_EXTENSIONS)
+
+messages -> NetworkContentRuleListManager {
+    Remove(WebKit::UserContentControllerIdentifier identifier)
+    AddContentRuleLists(WebKit::UserContentControllerIdentifier identifier, Vector<std::pair<String, WebKit::WebCompiledContentRuleListData>> contentFilters)
+    RemoveContentRuleList(WebKit::UserContentControllerIdentifier identifier, String name)
+    RemoveAllContentRuleLists(WebKit::UserContentControllerIdentifier identifier)
+}
+
+#endif

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -28,7 +28,9 @@
 
 #include "Logging.h"
 #include "NetworkCORSPreflightChecker.h"
+#include "NetworkProcess.h"
 #include "WebCompiledContentRuleList.h"
+#include "WebUserContentController.h"
 #include <WebCore/ContentSecurityPolicy.h>
 #include <WebCore/CrossOriginAccessControl.h>
 #include <WebCore/CrossOriginPreflightResultCache.h>
@@ -95,12 +97,20 @@
 void NetworkLoadChecker::checkRequest(ResourceRequest&& request, ValidationHandler&& handler)
 {
 #if ENABLE(CONTENT_EXTENSIONS)
-    if (processContentExtensionRulesForLoad(request).blockedLoad) {
-        handler(returnError(ASCIILiteral("Blocked by content extension")));
-        return;
-    }
+    processContentExtensionRulesForLoad(WTFMove(request), [this, handler = WTFMove(handler)](auto&& request, auto status) mutable {
+        if (status.blockedLoad) {
+            handler(this->returnError(ASCIILiteral("Blocked by content extension")));
+            return;
+        }
+        this->continueCheckingRequest(WTFMove(request), WTFMove(handler));
+    });
+#else
+    continueCheckingRequest(WTFMove(request), WTFMove(handler));
 #endif
+}
 
+void NetworkLoadChecker::continueCheckingRequest(ResourceRequest&& request, ValidationHandler&& handler)
+{
     if (auto* contentSecurityPolicy = this->contentSecurityPolicy()) {
         if (isRedirected()) {
             URL url = ""
@@ -229,22 +239,19 @@
 }
 
 #if ENABLE(CONTENT_EXTENSIONS)
-ContentExtensions::ContentExtensionsBackend& NetworkLoadChecker::contentExtensionsBackend()
+void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, CompletionHandler<void(WebCore::ResourceRequest&&, const ContentExtensions::BlockedStatus&)>&& callback)
 {
-    if (!m_contentExtensionsBackend) {
-        m_contentExtensionsBackend = std::make_unique<ContentExtensions::ContentExtensionsBackend>();
-        for (auto& pair : m_contentRuleLists)
-            m_contentExtensionsBackend->addContentExtension(pair.first, WebCompiledContentRuleList::create(WTFMove(pair.second)));
+    if (!m_userContentControllerIdentifier) {
+        ContentExtensions::BlockedStatus status;
+        callback(WTFMove(request), status);
+        return;
     }
-    return *m_contentExtensionsBackend;
+    NetworkProcess::singleton().networkContentRuleListManager().contentExtensionsBackend(*m_userContentControllerIdentifier, [protectedThis = makeRef(*this), this, request = WTFMove(request), callback = WTFMove(callback)](auto& backend) mutable {
+        auto status = backend.processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL);
+        applyBlockedStatusToRequest(status, nullptr, request);
+        callback(WTFMove(request), status);
+    });
 }
-
-ContentExtensions::BlockedStatus NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest& request)
-{
-    auto status = contentExtensionsBackend().processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL);
-    applyBlockedStatusToRequest(status, nullptr, request);
-    return status;
-}
 #endif // ENABLE(CONTENT_EXTENSIONS)
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -25,8 +25,8 @@
 
 #pragma once
 
+#include "NetworkContentRuleListManager.h"
 #include "NetworkResourceLoadParameters.h"
-#include <WebCore/ContentExtensionsBackend.h>
 #include <WebCore/ResourceError.h>
 #include <WebCore/ResourceResponse.h>
 #include <wtf/CompletionHandler.h>
@@ -40,9 +40,12 @@
 
 class NetworkCORSPreflightChecker;
 
-class NetworkLoadChecker {
+class NetworkLoadChecker : public RefCounted<NetworkLoadChecker> {
 public:
-    NetworkLoadChecker(WebCore::FetchOptions::Mode, bool shouldFollowRedirects, WebCore::StoredCredentialsPolicy, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&);
+    static Ref<NetworkLoadChecker> create(WebCore::FetchOptions::Mode mode, bool shouldFollowRedirects, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalHeaders, WebCore::URL&& url, RefPtr<WebCore::SecurityOrigin>&& sourceOrigin)
+    {
+        return adoptRef(*new NetworkLoadChecker { mode, shouldFollowRedirects, storedCredentialsPolicy, sessionID, WTFMove(originalHeaders), WTFMove(url), WTFMove(sourceOrigin) });
+    }
     ~NetworkLoadChecker();
 
     using RequestOrError = Expected<WebCore::ResourceRequest, WebCore::ResourceError>;
@@ -52,10 +55,10 @@
 
     void setCSPResponseHeaders(WebCore::ContentSecurityPolicyResponseHeaders&& headers) { m_cspResponseHeaders = WTFMove(headers); }
 #if ENABLE(CONTENT_EXTENSIONS)
-    void setContentExtensionRuleLists(WebCore::URL&& mainDocumentURL, Vector<std::pair<String, WebCompiledContentRuleListData>>&& contentRuleLists)
+    void setContentExtensionController(WebCore::URL&& mainDocumentURL, std::optional<UserContentControllerIdentifier> identifier)
     {
         m_mainDocumentURL = WTFMove(mainDocumentURL);
-        m_contentRuleLists = WTFMove(contentRuleLists);
+        m_userContentControllerIdentifier = identifier;
     }
 #endif
 
@@ -63,6 +66,8 @@
     WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; }
 
 private:
+    NetworkLoadChecker(WebCore::FetchOptions::Mode, bool shouldFollowRedirects, WebCore::StoredCredentialsPolicy, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&);
+
     WebCore::ContentSecurityPolicy* contentSecurityPolicy() const;
     bool isChecking() const { return !!m_corsPreflightChecker; }
     bool isRedirected() const { return m_redirectCount; }
@@ -69,6 +74,8 @@
 
     void checkRequest(WebCore::ResourceRequest&&, ValidationHandler&&);
 
+    void continueCheckingRequest(WebCore::ResourceRequest&&, ValidationHandler&&);
+
     bool doesNotNeedCORSCheck(const WebCore::URL&) const;
     void checkCORSRequest(WebCore::ResourceRequest&&, ValidationHandler&&);
     void checkCORSRedirectedRequest(WebCore::ResourceRequest&&, ValidationHandler&&);
@@ -77,8 +84,7 @@
     RequestOrError returnError(String&& error);
 
 #if ENABLE(CONTENT_EXTENSIONS)
-    WebCore::ContentExtensions::ContentExtensionsBackend& contentExtensionsBackend();
-    WebCore::ContentExtensions::BlockedStatus processContentExtensionRulesForLoad(WebCore::ResourceRequest&);
+    void processContentExtensionRulesForLoad(WebCore::ResourceRequest&&, CompletionHandler<void(WebCore::ResourceRequest&&, const WebCore::ContentExtensions::BlockedStatus&)>&&);
 #endif
 
     WebCore::FetchOptions::Mode m_mode;
@@ -92,7 +98,7 @@
     std::optional<WebCore::ContentSecurityPolicyResponseHeaders> m_cspResponseHeaders;
 #if ENABLE(CONTENT_EXTENSIONS)
     WebCore::URL m_mainDocumentURL;
-    Vector<std::pair<String, WebCompiledContentRuleListData>> m_contentRuleLists;
+    std::optional<UserContentControllerIdentifier> m_userContentControllerIdentifier;
 #endif
 
     std::unique_ptr<NetworkCORSPreflightChecker> m_corsPreflightChecker;
@@ -99,9 +105,6 @@
     bool m_isSameOriginRequest { true };
     bool m_isSimpleRequest { true };
     mutable std::unique_ptr<WebCore::ContentSecurityPolicy> m_contentSecurityPolicy;
-#if ENABLE(CONTENT_EXTENSIONS)
-    std::unique_ptr<WebCore::ContentExtensions::ContentExtensionsBackend> m_contentExtensionsBackend;
-#endif
     size_t m_redirectCount { 0 };
     WebCore::URL m_previousURL;
 };

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -39,6 +39,7 @@
 #include "Logging.h"
 #include "NetworkBlobRegistry.h"
 #include "NetworkConnectionToWebProcess.h"
+#include "NetworkContentRuleListManagerMessages.h"
 #include "NetworkProcessCreationParameters.h"
 #include "NetworkProcessPlatformStrategies.h"
 #include "NetworkProcessProxyMessages.h"
@@ -171,6 +172,13 @@
         return;
     }
 
+#if ENABLE(CONTENT_EXTENSIONS)
+    if (decoder.messageReceiverName() == Messages::NetworkContentRuleListManager::messageReceiverName()) {
+        m_NetworkContentRuleListManager.didReceiveMessage(connection, decoder);
+        return;
+    }
+#endif
+
     didReceiveNetworkProcessMessage(connection, decoder);
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -29,6 +29,7 @@
 #include "ChildProcess.h"
 #include "DownloadManager.h"
 #include "MessageReceiverMap.h"
+#include "NetworkContentRuleListManager.h"
 #include <WebCore/DiagnosticLoggingClient.h>
 #include <memory>
 #include <pal/SessionID.h>
@@ -157,6 +158,10 @@
     void setSessionIsControlledByAutomation(PAL::SessionID, bool);
     bool sessionIsControlledByAutomation(PAL::SessionID) const;
 
+#if ENABLE(CONTENT_EXTENSIONS)
+    NetworkContentRuleListManager& networkContentRuleListManager() { return m_NetworkContentRuleListManager; }
+#endif
+
 private:
     NetworkProcess();
     ~NetworkProcess();
@@ -291,6 +296,10 @@
 #if PLATFORM(IOS)
     WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
 #endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    NetworkContentRuleListManager m_NetworkContentRuleListManager;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -93,7 +93,7 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
     encoder << mainDocumentURL;
-    encoder << contentRuleLists;
+    encoder << userContentControllerIdentifier;
 #endif
 }
 
@@ -184,11 +184,11 @@
     if (!decoder.decode(result.mainDocumentURL))
         return false;
 
-    std::optional<Vector<std::pair<String, WebCompiledContentRuleListData>>> contentRuleLists;
-    decoder >> contentRuleLists;
-    if (!contentRuleLists)
+    std::optional<std::optional<UserContentControllerIdentifier>> userContentControllerIdentifier;
+    decoder >> userContentControllerIdentifier;
+    if (!userContentControllerIdentifier)
         return false;
-    result.contentRuleLists = WTFMove(*contentRuleLists);
+    result.userContentControllerIdentifier = *userContentControllerIdentifier;
 #endif
 
     return true;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -27,7 +27,7 @@
 
 #include "NetworkLoadParameters.h"
 #include "SandboxExtension.h"
-#include "WebCompiledContentRuleListData.h"
+#include "UserContentControllerIdentifier.h"
 #include <WebCore/ContentSecurityPolicyResponseHeaders.h>
 #include <WebCore/FetchOptions.h>
 #include <WebCore/ResourceLoaderOptions.h>
@@ -61,7 +61,7 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
     WebCore::URL mainDocumentURL;
-    Vector<std::pair<String, WebCompiledContentRuleListData>> contentRuleLists;
+    std::optional<UserContentControllerIdentifier> userContentControllerIdentifier;
 #endif
 };
 

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.cpp (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -42,13 +42,13 @@
     : m_parameters(WTFMove(parameters))
     , m_completionHandler(WTFMove(completionHandler))
     , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired)
-    , m_networkLoadChecker(makeUniqueRef<NetworkLoadChecker>(m_parameters.mode, m_parameters.shouldFollowRedirects, m_parameters.storedCredentialsPolicy, m_parameters.sessionID, WTFMove(originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef()))
+    , m_networkLoadChecker(NetworkLoadChecker::create(m_parameters.mode, m_parameters.shouldFollowRedirects, m_parameters.storedCredentialsPolicy, m_parameters.sessionID, WTFMove(originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef()))
 {
 
     if (m_parameters.cspResponseHeaders)
         m_networkLoadChecker->setCSPResponseHeaders(WTFMove(m_parameters.cspResponseHeaders.value()));
 #if ENABLE(CONTENT_EXTENSIONS)
-    m_networkLoadChecker->setContentExtensionRuleLists(WTFMove(m_parameters.mainDocumentURL), WTFMove(m_parameters.contentRuleLists));
+    m_networkLoadChecker->setContentExtensionController(WTFMove(m_parameters.mainDocumentURL), m_parameters.userContentControllerIdentifier);
 #endif
 
     // If the server never responds, this object will hang around forever.

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.h (230209 => 230210)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -70,7 +70,7 @@
     WTF::CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)> m_completionHandler;
     RefPtr<NetworkDataTask> m_task;
     WebCore::Timer m_timeoutTimer;
-    UniqueRef<NetworkLoadChecker> m_networkLoadChecker;
+    Ref<NetworkLoadChecker> m_networkLoadChecker;
     std::optional<WebCore::ResourceRequest> m_lastRedirectionRequest;
 };
 

Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (230209 => 230210)


--- trunk/Source/WebKit/Scripts/webkit/messages.py	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py	2018-04-03 17:58:48 UTC (rev 230210)
@@ -185,6 +185,7 @@
             types_by_namespace['IPC'].update([('class', 'Connection')])
 
     no_forward_declaration_types = frozenset([
+        'String',
         'WebCore::DocumentIdentifier',
         'WebCore::ServiceWorkerIdentifier',
         'WebCore::ServiceWorkerJobIdentifier',
@@ -192,7 +193,7 @@
         'WebCore::ServiceWorkerOrClientIdentifier',
         'WebCore::ServiceWorkerRegistrationIdentifier',
         'WebCore::SWServerConnectionIdentifier',
-        'String',
+        'WebKit::UserContentControllerIdentifier',
     ])
 
     for parameter in receiver.iterparameters():

Copied: trunk/Source/WebKit/Shared/UserContentControllerIdentifier.h (from rev 230208, trunk/Source/WebKit/Shared/WebPageGroupData.h) (0 => 230210)


--- trunk/Source/WebKit/Shared/UserContentControllerIdentifier.h	                        (rev 0)
+++ trunk/Source/WebKit/Shared/UserContentControllerIdentifier.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#pragma once
+
+#include <wtf/ObjectIdentifier.h>
+
+namespace WebKit {
+
+enum UserContentControllerIdentifierType { };
+using UserContentControllerIdentifier = ObjectIdentifier<UserContentControllerIdentifierType>;
+
+}

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (230209 => 230210)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -179,8 +179,13 @@
         return std::nullopt;
     if (!decoder.decode(parameters.highestUsedBackForwardItemID))
         return std::nullopt;
-    if (!decoder.decode(parameters.userContentControllerID))
+
+    std::optional<UserContentControllerIdentifier> userContentControllerIdentifier;
+    decoder >> userContentControllerIdentifier;
+    if (!userContentControllerIdentifier)
         return std::nullopt;
+    parameters.userContentControllerID = *userContentControllerIdentifier;
+
     if (!decoder.decode(parameters.visitedLinkTableID))
         return std::nullopt;
     if (!decoder.decode(parameters.websiteDataStoreID))

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (230209 => 230210)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -98,7 +98,7 @@
     PAL::SessionID sessionID;
     uint64_t highestUsedBackForwardItemID;
 
-    uint64_t userContentControllerID;
+    UserContentControllerIdentifier userContentControllerID;
     uint64_t visitedLinkTableID;
     uint64_t websiteDataStoreID;
     bool canRunBeforeUnloadConfirmPanel;

Modified: trunk/Source/WebKit/Shared/WebPageGroupData.cpp (230209 => 230210)


--- trunk/Source/WebKit/Shared/WebPageGroupData.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/Shared/WebPageGroupData.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -53,10 +53,11 @@
     bool visibleToHistoryClient;
     if (!decoder.decode(visibleToHistoryClient))
         return std::nullopt;
-    uint64_t userContentControllerIdentifier;
-    if (!decoder.decode(userContentControllerIdentifier))
+    std::optional<UserContentControllerIdentifier> userContentControllerIdentifier;
+    decoder >> userContentControllerIdentifier;
+    if (!userContentControllerIdentifier)
         return std::nullopt;
-    return { { id, pageGroupID, visibleToInjectedBundle, visibleToHistoryClient, userContentControllerIdentifier } };
+    return { { id, pageGroupID, visibleToInjectedBundle, visibleToHistoryClient, *userContentControllerIdentifier } };
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/WebPageGroupData.h (230209 => 230210)


--- trunk/Source/WebKit/Shared/WebPageGroupData.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/Shared/WebPageGroupData.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "UserContentControllerIdentifier.h"
 #include <wtf/text/WTFString.h>
 
 namespace IPC {
@@ -43,7 +44,7 @@
     bool visibleToInjectedBundle;
     bool visibleToHistoryClient;
 
-    uint64_t userContentControllerIdentifier;
+    UserContentControllerIdentifier userContentControllerIdentifier;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (230209 => 230210)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "NetworkProcessProxy.h"
 
+#include "APIContentRuleList.h"
 #include "AuthenticationChallengeProxy.h"
 #include "DownloadProxyMessages.h"
 #if ENABLE(LEGACY_CUSTOM_PROTOCOL_MANAGER)
@@ -32,13 +33,16 @@
 #include "LegacyCustomProtocolManagerProxyMessages.h"
 #endif
 #include "Logging.h"
+#include "NetworkContentRuleListManagerMessages.h"
 #include "NetworkProcessCreationParameters.h"
 #include "NetworkProcessMessages.h"
 #include "SandboxExtension.h"
 #include "StorageProcessMessages.h"
+#include "WebCompiledContentRuleList.h"
 #include "WebPageProxy.h"
 #include "WebProcessMessages.h"
 #include "WebProcessPool.h"
+#include "WebUserContentControllerProxy.h"
 #include "WebsiteData.h"
 #include <wtf/CompletionHandler.h>
 
@@ -85,6 +89,10 @@
     ASSERT(m_pendingFetchWebsiteDataCallbacks.isEmpty());
     ASSERT(m_pendingDeleteWebsiteDataCallbacks.isEmpty());
     ASSERT(m_pendingDeleteWebsiteDataForOriginsCallbacks.isEmpty());
+#if ENABLE(CONTENT_EXTENSIONS)
+    for (auto* proxy : m_webUserContentControllerProxies)
+        proxy->removeNetworkProcess(*this);
+#endif
 }
 
 void NetworkProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
@@ -540,4 +548,28 @@
     }
 }
 
+
+#if ENABLE(CONTENT_EXTENSIONS)
+void NetworkProcessProxy::contentExtensionRules(UserContentControllerIdentifier identifier)
+{
+    if (auto* webUserContentControllerProxy = WebUserContentControllerProxy::get(identifier)) {
+        m_webUserContentControllerProxies.add(webUserContentControllerProxy);
+        webUserContentControllerProxy->addNetworkProcess(*this);
+
+        auto rules = WTF::map(webUserContentControllerProxy->contentExtensionRules(), [](auto&& keyValue) -> std::pair<String, WebCompiledContentRuleListData> {
+            return std::make_pair(keyValue.value->name(), keyValue.value->compiledRuleList().data());
+        });
+        send(Messages::NetworkContentRuleListManager::AddContentRuleLists { identifier, rules }, 0);
+        return;
+    }
+    send(Messages::NetworkContentRuleListManager::AddContentRuleLists { identifier, { } }, 0);
+}
+
+void NetworkProcessProxy::didDestroyWebUserContentControllerProxy(WebUserContentControllerProxy& proxy)
+{
+    send(Messages::NetworkContentRuleListManager::Remove { proxy.identifier() }, 0);
+    m_webUserContentControllerProxies.remove(&proxy);
+}
+#endif
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (230209 => 230210)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -33,6 +33,7 @@
 #include "ProcessLauncher.h"
 #include "ProcessThrottler.h"
 #include "ProcessThrottlerClient.h"
+#include "UserContentControllerIdentifier.h"
 #include "WebProcessProxyMessages.h"
 #include <memory>
 #include <wtf/Deque.h>
@@ -59,6 +60,7 @@
 enum class WebsiteDataFetchOption;
 enum class WebsiteDataType;
 struct NetworkProcessCreationParameters;
+class WebUserContentControllerProxy;
 struct WebsiteData;
 
 class NetworkProcessProxy : public ChildProcessProxy, private ProcessThrottlerClient {
@@ -94,6 +96,10 @@
     ProcessThrottler& throttler() { return m_throttler; }
     WebProcessPool& processPool() { return m_processPool; }
 
+#if ENABLE(CONTENT_EXTENSIONS)
+    void didDestroyWebUserContentControllerProxy(WebUserContentControllerProxy&);
+#endif
+
 private:
     NetworkProcessProxy(WebProcessPool&);
 
@@ -139,6 +145,10 @@
     void allStorageAccessEntriesResult(Vector<String>&& domains, uint64_t contextId);
 #endif
 
+#if ENABLE(CONTENT_EXTENSIONS)
+    void contentExtensionRules(UserContentControllerIdentifier);
+#endif
+
     // ProcessLauncher::Client
     void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;
 
@@ -161,6 +171,10 @@
     HashMap<uint64_t, CompletionHandler<void(bool success)>> m_writeBlobToFilePathCallbackMap;
     HashMap<uint64_t, WTF::CompletionHandler<void(bool wasGranted)>> m_storageAccessResponseCallbackMap;
     HashMap<uint64_t, CompletionHandler<void(Vector<String>&& domains)>> m_allStorageAccessEntriesCallbackMap;
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    HashSet<WebUserContentControllerProxy*> m_webUserContentControllerProxies;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (230209 => 230210)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2018-04-03 17:58:48 UTC (rev 230210)
@@ -47,4 +47,8 @@
 #if HAVE(CFNETWORK_STORAGE_PARTITIONING)
     StorageAccessRequestResult(bool wasGranted, uint64_t contextId)
     AllStorageAccessEntriesResult(Vector<String> domains, uint64_t contextId)
+
+#if ENABLE(CONTENT_EXTENSIONS)
+    ContentExtensionRules(WebKit::UserContentControllerIdentifier identifier)
+#endif
 }

Modified: trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp (230209 => 230210)


--- trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -31,6 +31,8 @@
 #include "APIUserScript.h"
 #include "APIUserStyleSheet.h"
 #include "DataReference.h"
+#include "NetworkContentRuleListManagerMessages.h"
+#include "NetworkProcessProxy.h"
 #include "WebPageCreationParameters.h"
 #include "WebProcessProxy.h"
 #include "WebScriptMessageHandler.h"
@@ -46,18 +48,37 @@
 
 namespace WebKit {
 
+static HashMap<UserContentControllerIdentifier, WebUserContentControllerProxy*>& webUserContentControllerProxies()
+{
+    static NeverDestroyed<HashMap<UserContentControllerIdentifier, WebUserContentControllerProxy*>> proxies;
+    return proxies;
+}
+
+
+WebUserContentControllerProxy* WebUserContentControllerProxy::get(UserContentControllerIdentifier identifier)
+{
+    return webUserContentControllerProxies().get(identifier);
+}
+    
 WebUserContentControllerProxy::WebUserContentControllerProxy()
-    : m_userScripts(API::Array::create())
+    : m_identifier(generateObjectIdentifier<UserContentControllerIdentifierType>())
+    , m_userScripts(API::Array::create())
     , m_userStyleSheets(API::Array::create())
 {
+    webUserContentControllerProxies().add(m_identifier, this);
 }
 
 WebUserContentControllerProxy::~WebUserContentControllerProxy()
 {
-    for (WebProcessProxy* process : m_processes) {
-        process->removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier());
+    webUserContentControllerProxies().remove(m_identifier);
+    for (auto* process : m_processes) {
+        process->removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier().toUInt64());
         process->didDestroyWebUserContentControllerProxy(*this);
     }
+#if ENABLE(CONTENT_EXTENSIONS)
+    for (auto* process : m_networkProcesses)
+        process->didDestroyWebUserContentControllerProxy(*this);
+#endif
 }
 
 void WebUserContentControllerProxy::addProcess(WebProcessProxy& webProcessProxy, WebPageCreationParameters& parameters)
@@ -65,7 +86,7 @@
     if (!m_processes.add(&webProcessProxy).isNewEntry)
         return;
 
-    webProcessProxy.addMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier(), *this);
+    webProcessProxy.addMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier().toUInt64(), *this);
 
     ASSERT(parameters.userContentWorlds.isEmpty());
     for (const auto& world : m_userContentWorlds)
@@ -95,7 +116,7 @@
     ASSERT(m_processes.contains(&webProcessProxy));
 
     m_processes.remove(&webProcessProxy);
-    webProcessProxy.removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier());
+    webProcessProxy.removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier().toUInt64());
 }
 
 void WebUserContentControllerProxy::addUserContentWorldUse(API::UserContentWorld& world)
@@ -106,7 +127,7 @@
     auto addResult = m_userContentWorlds.add(&world);
     if (addResult.isNewEntry) {
         for (WebProcessProxy* process : m_processes)
-            process->send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), identifier());
+            process->send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), identifier().toUInt64());
     }
 }
 
@@ -130,7 +151,7 @@
 {
     if (shouldSendRemoveUserContentWorldsMessage(world, numberOfUsesToRemove)) {
         for (WebProcessProxy* process : m_processes)
-            process->send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), identifier());
+            process->send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), identifier().toUInt64());
     }
 }
 
@@ -143,7 +164,7 @@
     }
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), identifier());
+        process->send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), identifier().toUInt64());
 }
 
 void WebUserContentControllerProxy::addUserScript(API::UserScript& userScript)
@@ -155,7 +176,7 @@
     m_userScripts->elements().append(&userScript);
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }), identifier());
+        process->send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }), identifier().toUInt64());
 }
 
 void WebUserContentControllerProxy::removeUserScript(API::UserScript& userScript)
@@ -163,7 +184,7 @@
     Ref<API::UserContentWorld> world = userScript.userContentWorld();
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), identifier());
+        process->send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), identifier().toUInt64());
 
     m_userScripts->elements().removeAll(&userScript);
 
@@ -173,7 +194,7 @@
 void WebUserContentControllerProxy::removeAllUserScripts(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), identifier());
+        process->send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), identifier().toUInt64());
 
     unsigned userScriptsRemoved = m_userScripts->removeAllOfTypeMatching<API::UserScript>([&](const auto& userScript) {
         return &userScript->userContentWorld() == &world;
@@ -194,7 +215,7 @@
         worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier());
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), identifier());
+        process->send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), identifier().toUInt64());
 
     m_userScripts->elements().clear();
 
@@ -210,7 +231,7 @@
     m_userStyleSheets->elements().append(&userStyleSheet);
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), identifier());
+        process->send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), identifier().toUInt64());
 }
 
 void WebUserContentControllerProxy::removeUserStyleSheet(API::UserStyleSheet& userStyleSheet)
@@ -218,7 +239,7 @@
     Ref<API::UserContentWorld> world = userStyleSheet.userContentWorld();
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), identifier());
+        process->send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), identifier().toUInt64());
 
     m_userStyleSheets->elements().removeAll(&userStyleSheet);
 
@@ -228,7 +249,7 @@
 void WebUserContentControllerProxy::removeAllUserStyleSheets(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), identifier());
+        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), identifier().toUInt64());
 
     unsigned userStyleSheetsRemoved = m_userStyleSheets->removeAllOfTypeMatching<API::UserStyleSheet>([&](const auto& userStyleSheet) {
         return &userStyleSheet->userContentWorld() == &world;
@@ -249,7 +270,7 @@
         worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier());
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), identifier());
+        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), identifier().toUInt64());
 
     m_userStyleSheets->elements().clear();
 
@@ -270,7 +291,7 @@
     m_scriptMessageHandlers.add(handler.identifier(), &handler);
 
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), identifier());
+        process->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), identifier().toUInt64());
     
     return true;
 }
@@ -280,7 +301,7 @@
     for (auto it = m_scriptMessageHandlers.begin(), end = m_scriptMessageHandlers.end(); it != end; ++it) {
         if (it->value->name() == name && &it->value->userContentWorld() == &world) {
             for (WebProcessProxy* process : m_processes)
-                process->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), identifier());
+                process->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), identifier().toUInt64());
 
             m_scriptMessageHandlers.remove(it);
 
@@ -293,7 +314,7 @@
 void WebUserContentControllerProxy::removeAllUserMessageHandlers(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), identifier());
+        process->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), identifier().toUInt64());
 
     unsigned numberRemoved = 0;
     m_scriptMessageHandlers.removeIf([&](auto& entry) {
@@ -330,8 +351,11 @@
 
     auto pair = std::make_pair(contentRuleList.name(), contentRuleList.compiledRuleList().data());
 
-    for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::AddContentRuleLists({ pair }), identifier());
+    for (auto* process : m_processes)
+        process->send(Messages::WebUserContentController::AddContentRuleLists({ pair }), identifier().toUInt64());
+
+    for (auto* process : m_networkProcesses)
+        process->send(Messages::NetworkContentRuleListManager::AddContentRuleLists { identifier(), { pair } }, 0);
 }
 
 void WebUserContentControllerProxy::removeContentRuleList(const String& name)
@@ -338,8 +362,11 @@
 {
     m_contentRuleLists.remove(name);
 
-    for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveContentRuleList(name), identifier());
+    for (auto* process : m_processes)
+        process->send(Messages::WebUserContentController::RemoveContentRuleList(name), identifier().toUInt64());
+
+    for (auto* process : m_networkProcesses)
+        process->send(Messages::NetworkContentRuleListManager::RemoveContentRuleList { identifier(), name }, 0);
 }
 
 void WebUserContentControllerProxy::removeAllContentRuleLists()
@@ -346,8 +373,11 @@
 {
     m_contentRuleLists.clear();
 
-    for (WebProcessProxy* process : m_processes)
-        process->send(Messages::WebUserContentController::RemoveAllContentRuleLists(), identifier());
+    for (auto* process : m_processes)
+        process->send(Messages::WebUserContentController::RemoveAllContentRuleLists(), identifier().toUInt64());
+
+    for (auto* process : m_networkProcesses)
+        process->send(Messages::NetworkContentRuleListManager::RemoveAllContentRuleLists { identifier() }, 0);
 }
 #endif
 

Modified: trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h (230209 => 230210)


--- trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -27,11 +27,11 @@
 
 #include "APIObject.h"
 #include "MessageReceiver.h"
+#include "UserContentControllerIdentifier.h"
 #include <wtf/Forward.h>
 #include <wtf/HashCountedSet.h>
 #include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
-#include <wtf/Identified.h>
 #include <wtf/Ref.h>
 #include <wtf/RefCounted.h>
 #include <wtf/text/StringHash.h>
@@ -54,20 +54,23 @@
 
 namespace WebKit {
 
+class NetworkProcessProxy;
 class WebProcessProxy;
 class WebScriptMessageHandler;
 struct FrameInfoData;
 struct WebPageCreationParameters;
 
-class WebUserContentControllerProxy : public API::ObjectImpl<API::Object::Type::UserContentController>, private IPC::MessageReceiver, public Identified<WebUserContentControllerProxy> {
+class WebUserContentControllerProxy : public API::ObjectImpl<API::Object::Type::UserContentController>, private IPC::MessageReceiver {
 public:
     static Ref<WebUserContentControllerProxy> create()
     { 
         return adoptRef(*new WebUserContentControllerProxy);
-    } 
-    explicit WebUserContentControllerProxy();
+    }
+    WebUserContentControllerProxy();
     ~WebUserContentControllerProxy();
 
+    static WebUserContentControllerProxy* get(UserContentControllerIdentifier);
+
     void addProcess(WebProcessProxy&, WebPageCreationParameters&);
     void removeProcess(WebProcessProxy&);
 
@@ -91,11 +94,17 @@
     void removeAllUserMessageHandlers(API::UserContentWorld&);
 
 #if ENABLE(CONTENT_EXTENSIONS)
+    void addNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.remove(&proxy); }
+    void removeNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.add(&proxy); }
+
     void addContentRuleList(API::ContentRuleList&);
     void removeContentRuleList(const String&);
     void removeAllContentRuleLists();
+    const HashMap<String, RefPtr<API::ContentRuleList>>& contentExtensionRules() { return m_contentRuleLists; }
 #endif
 
+    UserContentControllerIdentifier identifier() const { return m_identifier; }
+
 private:
     // IPC::MessageReceiver.
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
@@ -107,7 +116,8 @@
     void removeUserContentWorldUses(HashCountedSet<RefPtr<API::UserContentWorld>>&);
     bool shouldSendRemoveUserContentWorldsMessage(API::UserContentWorld&, unsigned numberOfUsesToRemove);
 
-    HashSet<WebProcessProxy*> m_processes;    
+    UserContentControllerIdentifier m_identifier;
+    HashSet<WebProcessProxy*> m_processes;
     Ref<API::Array> m_userScripts;
     Ref<API::Array> m_userStyleSheets;
     HashMap<uint64_t, RefPtr<WebScriptMessageHandler>> m_scriptMessageHandlers;
@@ -114,6 +124,7 @@
     HashCountedSet<RefPtr<API::UserContentWorld>> m_userContentWorlds;
 
 #if ENABLE(CONTENT_EXTENSIONS)
+    HashSet<NetworkProcessProxy*> m_networkProcesses;
     HashMap<String, RefPtr<API::ContentRuleList>> m_contentRuleLists;
 #endif
 };

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (230209 => 230210)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2018-04-03 17:58:48 UTC (rev 230210)
@@ -958,6 +958,7 @@
 		41FAF5F51E3C0649001AE678 /* WebRTCResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 41FAF5F41E3C0641001AE678 /* WebRTCResolver.h */; };
 		41FAF5F81E3C1021001AE678 /* LibWebRTCResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 41FAF5F61E3C0B47001AE678 /* LibWebRTCResolver.h */; };
 		41FAF5F91E3C1025001AE678 /* LibWebRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */; };
+		41FBE826206DF7FA000F0741 /* NetworkContentRuleListManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41FBE824206DA79C000F0741 /* NetworkContentRuleListManager.cpp */; };
 		4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */; };
 		460F488F1F996F7100CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 460F488D1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp */; };
 		460F48901F996F7100CF4B87 /* WebSWContextManagerConnectionMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 460F488E1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessages.h */; };
@@ -1196,6 +1197,7 @@
 		52D5A1B01C57495A00DE34A3 /* VideoFullscreenManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 52D5A1AA1C57494E00DE34A3 /* VideoFullscreenManagerProxy.h */; };
 		52D5A1B11C57496200DE34A3 /* VideoFullscreenManagerProxy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 52D5A1AC1C57494E00DE34A3 /* VideoFullscreenManagerProxy.mm */; };
 		52D5A1B71C574A0200DE34A3 /* VideoFullscreenManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 52D5A1B41C5749F200DE34A3 /* VideoFullscreenManager.mm */; };
+		52F060E11654318500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52F060DD1654317500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp */; };
 		5302583B1DCBBD2200DA89C2 /* NetworkCaptureResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5302582E1DCBBD1D00DA89C2 /* NetworkCaptureResource.cpp */; };
 		5302583C1DCBBD2200DA89C2 /* NetworkCaptureResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 5302582F1DCBBD1D00DA89C2 /* NetworkCaptureResource.h */; };
 		5302583D1DCBBD2200DA89C2 /* NetworkCaptureEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 530258301DCBBD1D00DA89C2 /* NetworkCaptureEvent.cpp */; };
@@ -3342,6 +3344,10 @@
 		41FAF5F41E3C0641001AE678 /* WebRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebRTCResolver.h; path = Network/webrtc/WebRTCResolver.h; sourceTree = "<group>"; };
 		41FAF5F61E3C0B47001AE678 /* LibWebRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCResolver.h; path = Network/webrtc/LibWebRTCResolver.h; sourceTree = "<group>"; };
 		41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCResolver.cpp; path = Network/webrtc/LibWebRTCResolver.cpp; sourceTree = "<group>"; };
+		41FBE821206D87F6000F0741 /* UserContentControllerIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserContentControllerIdentifier.h; sourceTree = "<group>"; };
+		41FBE822206DA79C000F0741 /* NetworkContentRuleListManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkContentRuleListManager.h; path = NetworkProcess/NetworkContentRuleListManager.h; sourceTree = "<group>"; };
+		41FBE823206DA79C000F0741 /* NetworkContentRuleListManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NetworkContentRuleListManager.messages.in; path = NetworkProcess/NetworkContentRuleListManager.messages.in; sourceTree = "<group>"; };
+		41FBE824206DA79C000F0741 /* NetworkContentRuleListManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkContentRuleListManager.cpp; path = NetworkProcess/NetworkContentRuleListManager.cpp; sourceTree = "<group>"; };
 		4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedMemoryCocoa.cpp; sourceTree = "<group>"; };
 		460F488D1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSWContextManagerConnectionMessageReceiver.cpp; sourceTree = "<group>"; };
 		460F488E1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnectionMessages.h; sourceTree = "<group>"; };
@@ -3624,6 +3630,7 @@
 		52D5A1B21C5749F200DE34A3 /* VideoFullscreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoFullscreenManager.h; sourceTree = "<group>"; };
 		52D5A1B31C5749F200DE34A3 /* VideoFullscreenManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VideoFullscreenManager.messages.in; sourceTree = "<group>"; };
 		52D5A1B41C5749F200DE34A3 /* VideoFullscreenManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoFullscreenManager.mm; sourceTree = "<group>"; };
+		52F060DD1654317500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkContentRuleListManagerMessageReceiver.cpp; sourceTree = "<group>"; };
 		5302582E1DCBBD1D00DA89C2 /* NetworkCaptureResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkCaptureResource.cpp; path = NetworkProcess/capture/NetworkCaptureResource.cpp; sourceTree = "<group>"; };
 		5302582F1DCBBD1D00DA89C2 /* NetworkCaptureResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkCaptureResource.h; path = NetworkProcess/capture/NetworkCaptureResource.h; sourceTree = "<group>"; };
 		530258301DCBBD1D00DA89C2 /* NetworkCaptureEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkCaptureEvent.cpp; path = NetworkProcess/capture/NetworkCaptureEvent.cpp; sourceTree = "<group>"; };
@@ -5271,6 +5278,7 @@
 				1A64245C12DE29A100CAAE2C /* UpdateInfo.h */,
 				5C19A51E1FD0B14600EEA323 /* URLSchemeTaskParameters.cpp */,
 				5C19A51F1FD0B14700EEA323 /* URLSchemeTaskParameters.h */,
+				41FBE821206D87F6000F0741 /* UserContentControllerIdentifier.h */,
 				1AC1336518565B5700F3EC05 /* UserData.cpp */,
 				1AC1336618565B5700F3EC05 /* UserData.h */,
 				2684054A18B866FF0022C38B /* VisibleContentRectUpdateInfo.cpp */,
@@ -6359,6 +6367,9 @@
 				513A16491630A9BF005D7D22 /* NetworkConnectionToWebProcess.cpp */,
 				513A164A1630A9BF005D7D22 /* NetworkConnectionToWebProcess.h */,
 				513A164B1630A9BF005D7D22 /* NetworkConnectionToWebProcess.messages.in */,
+				41FBE824206DA79C000F0741 /* NetworkContentRuleListManager.cpp */,
+				41FBE822206DA79C000F0741 /* NetworkContentRuleListManager.h */,
+				41FBE823206DA79C000F0741 /* NetworkContentRuleListManager.messages.in */,
 				46DF06391F3905E5001980BB /* NetworkCORSPreflightChecker.cpp */,
 				46DF063A1F3905E5001980BB /* NetworkCORSPreflightChecker.h */,
 				532159511DBAE6FC0054AA3C /* NetworkDataTask.cpp */,
@@ -8244,6 +8255,7 @@
 				2984F57B164B915F004BC0C6 /* LegacyCustomProtocolManagerProxyMessages.h */,
 				51DD9F2616367DA2001578E9 /* NetworkConnectionToWebProcessMessageReceiver.cpp */,
 				51DD9F2716367DA2001578E9 /* NetworkConnectionToWebProcessMessages.h */,
+				52F060DD1654317500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp */,
 				517CF0E1163A486C00C2950E /* NetworkProcessConnectionMessageReceiver.cpp */,
 				517CF0E2163A486C00C2950E /* NetworkProcessConnectionMessages.h */,
 				51ACC9341628064800342550 /* NetworkProcessMessageReceiver.cpp */,
@@ -10659,6 +10671,8 @@
 				5302583B1DCBBD2200DA89C2 /* NetworkCaptureResource.cpp in Sources */,
 				513A164C1630A9BF005D7D22 /* NetworkConnectionToWebProcess.cpp in Sources */,
 				51DD9F2816367DA2001578E9 /* NetworkConnectionToWebProcessMessageReceiver.cpp in Sources */,
+				41FBE826206DF7FA000F0741 /* NetworkContentRuleListManager.cpp in Sources */,
+				52F060E11654318500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp in Sources */,
 				46DF063B1F3905F8001980BB /* NetworkCORSPreflightChecker.cpp in Sources */,
 				532159541DBAE71D0054AA3C /* NetworkDataTask.cpp in Sources */,
 				53BA47D01DC2EF5E004DF4AD /* NetworkDataTaskBlob.cpp in Sources */,

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (230209 => 230210)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -456,6 +456,9 @@
         return;
     }
 
+    WebFrameLoaderClient* webFrameLoaderClient = toWebFrameLoaderClient(frame.loader().client());
+    WebFrame* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
+
     NetworkResourceLoadParameters loadParameters;
     loadParameters.identifier = generateLoadIdentifier();
     loadParameters.request = request;
@@ -472,13 +475,11 @@
 
 #if ENABLE(CONTENT_EXTENSIONS)
     loadParameters.mainDocumentURL = document->topDocument().url();
-
-    if (auto* documentLoader = frame.loader().documentLoader()) {
-        if (auto* page = frame.page()) {
-            page->userContentProvider().forEachContentExtension([&loadParameters](const String& identifier, ContentExtensions::ContentExtension& contentExtension) {
-                loadParameters.contentRuleLists.append(std::make_pair(identifier, static_cast<const WebCompiledContentRuleList&>(contentExtension.compiledExtension()).data()));
-            }, *documentLoader);
-        }
+    // FIXME: Instead of passing userContentControllerIdentifier, we should just pass webPageId to NetworkProcess.
+    if (auto* page = frame.page()) {
+        WebPage* webPage = webFrame ? webFrame->page() : nullptr;
+        if (webPage)
+            loadParameters.userContentControllerIdentifier = webPage->userContentControllerIdentifier();
     }
 #endif
 

Modified: trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp (230209 => 230210)


--- trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp	2018-04-03 17:58:48 UTC (rev 230210)
@@ -50,9 +50,9 @@
 
 namespace WebKit {
 
-static HashMap<uint64_t, WebUserContentController*>& userContentControllers()
+static HashMap<UserContentControllerIdentifier, WebUserContentController*>& userContentControllers()
 {
-    static NeverDestroyed<HashMap<uint64_t, WebUserContentController*>> userContentControllers;
+    static NeverDestroyed<HashMap<UserContentControllerIdentifier, WebUserContentController*>> userContentControllers;
 
     return userContentControllers;
 }
@@ -66,7 +66,7 @@
     return map;
 }
 
-Ref<WebUserContentController> WebUserContentController::getOrCreate(uint64_t identifier)
+Ref<WebUserContentController> WebUserContentController::getOrCreate(UserContentControllerIdentifier identifier)
 {
     auto& userContentControllerPtr = userContentControllers().add(identifier, nullptr).iterator->value;
     if (userContentControllerPtr)
@@ -78,10 +78,10 @@
     return userContentController.releaseNonNull();
 }
 
-WebUserContentController::WebUserContentController(uint64_t identifier)
+WebUserContentController::WebUserContentController(UserContentControllerIdentifier identifier)
     : m_identifier(identifier)
 {
-    WebProcess::singleton().addMessageReceiver(Messages::WebUserContentController::messageReceiverName(), m_identifier, *this);
+    WebProcess::singleton().addMessageReceiver(Messages::WebUserContentController::messageReceiverName(), m_identifier.toUInt64(), *this);
 }
 
 WebUserContentController::~WebUserContentController()
@@ -88,7 +88,7 @@
 {
     ASSERT(userContentControllers().contains(m_identifier));
 
-    WebProcess::singleton().removeMessageReceiver(Messages::WebUserContentController::messageReceiverName(), m_identifier);
+    WebProcess::singleton().removeMessageReceiver(Messages::WebUserContentController::messageReceiverName(), m_identifier.toUInt64());
 
     userContentControllers().remove(m_identifier);
 }
@@ -242,7 +242,7 @@
         if (!webPage)
             return;
 
-        WebProcess::singleton().parentProcessConnection()->send(Messages::WebUserContentControllerProxy::DidPostMessage(webPage->pageID(), webFrame->info(), m_identifier, IPC::DataReference(value->data())), m_controller->identifier());
+        WebProcess::singleton().parentProcessConnection()->send(Messages::WebUserContentControllerProxy::DidPostMessage(webPage->pageID(), webFrame->info(), m_identifier, IPC::DataReference(value->data())), m_controller->identifier().toUInt64());
     }
 
     RefPtr<WebUserContentController> m_controller;

Modified: trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.h (230209 => 230210)


--- trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/WebProcess/UserContent/WebUserContentController.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "MessageReceiver.h"
+#include "UserContentControllerIdentifier.h"
 #include "WebScriptMessageHandler.h"
 #include "WebUserContentControllerDataTypes.h"
 #include <WebCore/UserContentProvider.h>
@@ -49,10 +50,10 @@
 
 class WebUserContentController final : public WebCore::UserContentProvider, private IPC::MessageReceiver {
 public:
-    static Ref<WebUserContentController> getOrCreate(uint64_t identifier);
+    static Ref<WebUserContentController> getOrCreate(UserContentControllerIdentifier);
     virtual ~WebUserContentController();
 
-    uint64_t identifier() { return m_identifier; } 
+    UserContentControllerIdentifier identifier() { return m_identifier; }
 
     void addUserScript(InjectedBundleScriptWorld&, WebCore::UserScript&&);
     void removeUserScriptWithURL(InjectedBundleScriptWorld&, const WebCore::URL&);
@@ -71,7 +72,7 @@
 #endif
 
 private:
-    explicit WebUserContentController(uint64_t identifier);
+    explicit WebUserContentController(UserContentControllerIdentifier);
 
     // WebCore::UserContentProvider
     void forEachUserScript(Function<void(WebCore::DOMWrapperWorld&, const WebCore::UserScript&)>&&) const final;
@@ -111,7 +112,7 @@
     void removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&, uint64_t userScriptMessageHandlerIdentifier);
 #endif
 
-    uint64_t m_identifier;
+    UserContentControllerIdentifier m_identifier;
 
     typedef HashMap<RefPtr<InjectedBundleScriptWorld>, Vector<std::pair<uint64_t, WebCore::UserScript>>> WorldToUserScriptMap;
     WorldToUserScriptMap m_userScripts;
@@ -126,7 +127,6 @@
 #if ENABLE(CONTENT_EXTENSIONS)
     WebCore::ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend;
 #endif
-
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (230209 => 230210)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-04-03 17:38:59 UTC (rev 230209)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-04-03 17:58:48 UTC (rev 230210)
@@ -46,6 +46,7 @@
 #include "SharedMemory.h"
 #include "UserData.h"
 #include "WebURLSchemeHandler.h"
+#include "WebUserContentController.h"
 #include <WebCore/ActivityState.h>
 #include <WebCore/DictionaryPopupInfo.h>
 #include <WebCore/FrameLoaderTypes.h>
@@ -1069,6 +1070,8 @@
     void openGLDisplayMaskChanged(uint32_t displayMask);
 #endif
 
+    UserContentControllerIdentifier userContentControllerIdentifier() const { return m_userContentController->identifier(); }
+
 private:
     WebPage(uint64_t pageID, WebPageCreationParameters&&);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to