REGRESSION(r195479) First main resource load in new WebProcess bypasses content exten...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Apr 2017 00:40:00 +0000 (00:40 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Apr 2017 00:40:00 +0000 (00:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=170707
<rdar://problem/27788755>

Patch by Alex Christensen <achristensen@webkit.org> on 2017-04-10
Reviewed by Tim Horton.

Source/WebKit2:

We fix this by sending the UserContentController with the WebPageCreationParameters
instead of in a IPC message immediately following creation.  By the time the WebPage
receives its second message, it has already started loading the first main resource.

I also changed all instances of calling ChildProcessProxy::connection() to send a message
in favor of calling ChildProcessProxy::send, which does the same thing except if a child
process has not started, it will put the message in a queue and send it when the process
is finished launching.  This was necessary because the UserContentController is now connected
to the process sooner, so there were some API tests that would try to send messages between
initiating a process launch and finishing a process launch, and this change preserves the
existing behavior in those cases.

* Shared/WebPageCreationParameters.cpp:
(WebKit::WebPageCreationParameters::encode):
(WebKit::WebPageCreationParameters::decode):
* Shared/WebPageCreationParameters.h:
* UIProcess/Databases/DatabaseProcessProxy.cpp:
(WebKit::DatabaseProcessProxy::getDatabaseProcessConnection):
(WebKit::DatabaseProcessProxy::didFinishLaunching):
* UIProcess/Downloads/DownloadProxy.cpp:
(WebKit::DownloadProxy::cancel):
(WebKit::DownloadProxy::canAuthenticateAgainstProtectionSpace):
(WebKit::DownloadProxy::willSendRequest):
(WebKit::DownloadProxy::decideDestinationWithSuggestedFilenameAsync):
* UIProcess/UserContent/WebUserContentControllerProxy.cpp:
(WebKit::WebUserContentControllerProxy::addProcess):
(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::addContentExtension):
(WebKit::WebUserContentControllerProxy::removeContentExtension):
(WebKit::WebUserContentControllerProxy::removeAllContentExtensions):
* UIProcess/UserContent/WebUserContentControllerProxy.h:
* UIProcess/VisitedLinkStore.cpp:
(WebKit::VisitedLinkStore::removeAll):
(WebKit::VisitedLinkStore::pendingVisitedLinksTimerFired):
(WebKit::VisitedLinkStore::sendTable):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::finishInitializingWebPageAfterProcessLaunch):
(WebKit::WebPageProxy::creationParameters):
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::addWebUserContentControllerProxy):
* UIProcess/WebProcessProxy.h:
* WebProcess/UserContent/WebUserContentController.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::m_backgroundCPULimit):

Tools:

* TestWebKitAPI/Tests/WebKit2Cocoa/WKUserContentExtensionStore.mm:
(-[ContentExtensionDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TEST_F):
* TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:
(-[ContentBlockingWebsitePoliciesDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(-[ContentBlockingWebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
(TEST):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@215212 268f45cc-cd09-0410-ab3c-d52691b4dbfc

16 files changed:
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/WebPageCreationParameters.cpp
Source/WebKit2/Shared/WebPageCreationParameters.h
Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp
Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h
Source/WebKit2/UIProcess/VisitedLinkStore.cpp
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/UIProcess/WebProcessProxy.cpp
Source/WebKit2/UIProcess/WebProcessProxy.h
Source/WebKit2/WebProcess/UserContent/WebUserContentController.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKUserContentExtensionStore.mm
Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm

index dc1a98b..fe56457 100644 (file)
@@ -1,5 +1,68 @@
 2017-04-10  Alex Christensen  <achristensen@webkit.org>
 
+        REGRESSION(r195479) First main resource load in new WebProcess bypasses content extensions
+        https://bugs.webkit.org/show_bug.cgi?id=170707
+        <rdar://problem/27788755>
+
+        Reviewed by Tim Horton.
+
+        We fix this by sending the UserContentController with the WebPageCreationParameters
+        instead of in a IPC message immediately following creation.  By the time the WebPage
+        receives its second message, it has already started loading the first main resource.
+        
+        I also changed all instances of calling ChildProcessProxy::connection() to send a message
+        in favor of calling ChildProcessProxy::send, which does the same thing except if a child
+        process has not started, it will put the message in a queue and send it when the process
+        is finished launching.  This was necessary because the UserContentController is now connected
+        to the process sooner, so there were some API tests that would try to send messages between
+        initiating a process launch and finishing a process launch, and this change preserves the
+        existing behavior in those cases.
+
+        * Shared/WebPageCreationParameters.cpp:
+        (WebKit::WebPageCreationParameters::encode):
+        (WebKit::WebPageCreationParameters::decode):
+        * Shared/WebPageCreationParameters.h:
+        * UIProcess/Databases/DatabaseProcessProxy.cpp:
+        (WebKit::DatabaseProcessProxy::getDatabaseProcessConnection):
+        (WebKit::DatabaseProcessProxy::didFinishLaunching):
+        * UIProcess/Downloads/DownloadProxy.cpp:
+        (WebKit::DownloadProxy::cancel):
+        (WebKit::DownloadProxy::canAuthenticateAgainstProtectionSpace):
+        (WebKit::DownloadProxy::willSendRequest):
+        (WebKit::DownloadProxy::decideDestinationWithSuggestedFilenameAsync):
+        * UIProcess/UserContent/WebUserContentControllerProxy.cpp:
+        (WebKit::WebUserContentControllerProxy::addProcess):
+        (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::addContentExtension):
+        (WebKit::WebUserContentControllerProxy::removeContentExtension):
+        (WebKit::WebUserContentControllerProxy::removeAllContentExtensions):
+        * UIProcess/UserContent/WebUserContentControllerProxy.h:
+        * UIProcess/VisitedLinkStore.cpp:
+        (WebKit::VisitedLinkStore::removeAll):
+        (WebKit::VisitedLinkStore::pendingVisitedLinksTimerFired):
+        (WebKit::VisitedLinkStore::sendTable):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::finishInitializingWebPageAfterProcessLaunch):
+        (WebKit::WebPageProxy::creationParameters):
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::addWebUserContentControllerProxy):
+        * UIProcess/WebProcessProxy.h:
+        * WebProcess/UserContent/WebUserContentController.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::m_backgroundCPULimit):
+
+2017-04-10  Alex Christensen  <achristensen@webkit.org>
+
         Add API to get available content extension identifiers in a WKContentExtensionStore
         https://bugs.webkit.org/show_bug.cgi?id=170093
 
index 513f1b9..ec24f2f 100644 (file)
@@ -101,6 +101,13 @@ void WebPageCreationParameters::encode(IPC::Encoder& encoder) const
     encoder << enumeratingAllNetworkInterfacesEnabled;
 #endif
 #endif
+    encoder << userContentWorlds;
+    encoder << userScripts;
+    encoder << userStyleSheets;
+    encoder << messageHandlers;
+#if ENABLE(CONTENT_EXTENSIONS)
+    encoder << contentExtensions;
+#endif
 }
 
 bool WebPageCreationParameters::decode(IPC::Decoder& decoder, WebPageCreationParameters& parameters)
@@ -237,6 +244,18 @@ bool WebPageCreationParameters::decode(IPC::Decoder& decoder, WebPageCreationPar
         return false;
 #endif
 #endif
+    if (!decoder.decode(parameters.userContentWorlds))
+        return false;
+    if (!decoder.decode(parameters.userScripts))
+        return false;
+    if (!decoder.decode(parameters.userStyleSheets))
+        return false;
+    if (!decoder.decode(parameters.messageHandlers))
+        return false;
+#if ENABLE(CONTENT_EXTENSIONS)
+    if (!decoder.decode(parameters.contentExtensions))
+        return false;
+#endif
     return true;
 }
 
index c4833b4..bb48926 100644 (file)
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebPageCreationParameters_h
-#define WebPageCreationParameters_h
+#pragma once
 
 #include "DrawingAreaInfo.h"
 #include "LayerTreeContext.h"
 #include "SessionState.h"
+#include "WebCompiledContentExtensionData.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebPageGroupData.h"
 #include "WebPreferencesStore.h"
+#include "WebUserContentControllerDataTypes.h"
 #include <WebCore/ActivityState.h>
 #include <WebCore/Color.h>
 #include <WebCore/FloatSize.h>
@@ -156,8 +157,15 @@ struct WebPageCreationParameters {
     bool enumeratingAllNetworkInterfacesEnabled { false };
 #endif
 #endif
+
+    // UserContentController members
+    Vector<std::pair<uint64_t, String>> userContentWorlds;
+    Vector<WebUserScriptData> userScripts;
+    Vector<WebUserStyleSheetData> userStyleSheets;
+    Vector<WebScriptMessageHandlerData> messageHandlers;
+#if ENABLE(CONTENT_EXTENSIONS)
+    Vector<std::pair<String, WebCompiledContentExtensionData>> contentExtensions;
+#endif
 };
 
 } // namespace WebKit
-
-#endif // WebPageCreationParameters_h
index 262cd26..6546b6b 100644 (file)
@@ -122,7 +122,7 @@ void DatabaseProcessProxy::getDatabaseProcessConnection(Ref<Messages::WebProcess
         return;
     }
 
-    connection()->send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+    send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
 }
 
 void DatabaseProcessProxy::didClose(IPC::Connection&)
@@ -217,7 +217,7 @@ void DatabaseProcessProxy::didFinishLaunching(ProcessLauncher* launcher, IPC::Co
     }
 
     for (unsigned i = 0; i < m_numPendingConnectionRequests; ++i)
-        connection()->send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0);
+        send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0);
     
     m_numPendingConnectionRequests = 0;
 }
index b23adbd..57d8e3d 100644 (file)
@@ -75,7 +75,7 @@ void DownloadProxy::cancel()
         return;
 
     if (NetworkProcessProxy* networkProcess = m_processPool->networkProcess())
-        networkProcess->connection()->send(Messages::NetworkProcess::CancelDownload(m_downloadID), 0);
+        networkProcess->send(Messages::NetworkProcess::CancelDownload(m_downloadID), 0);
 }
 
 void DownloadProxy::invalidate()
@@ -126,7 +126,7 @@ void DownloadProxy::canAuthenticateAgainstProtectionSpace(const ProtectionSpace&
 
     bool result = m_processPool->downloadClient().canAuthenticateAgainstProtectionSpace(getPtr(WebProtectionSpace::create(protectionSpace)));
     
-    networkProcessProxy->connection()->send(Messages::NetworkProcess::ContinueCanAuthenticateAgainstProtectionSpaceDownload(m_downloadID, result), 0);
+    networkProcessProxy->send(Messages::NetworkProcess::ContinueCanAuthenticateAgainstProtectionSpaceDownload(m_downloadID, result), 0);
 }
 #endif
 
@@ -144,7 +144,7 @@ void DownloadProxy::willSendRequest(const ResourceRequest& proposedRequest, cons
         if (!networkProcessProxy)
             return;
         
-        networkProcessProxy->connection()->send(Messages::NetworkProcess::ContinueWillSendRequest(protectedThis->m_downloadID, newRequest), 0);
+        networkProcessProxy->send(Messages::NetworkProcess::ContinueWillSendRequest(protectedThis->m_downloadID, newRequest), 0);
     });
 }
 #endif
@@ -189,7 +189,7 @@ void DownloadProxy::decideDestinationWithSuggestedFilenameAsync(DownloadID downl
         SandboxExtension::createHandle(destination, SandboxExtension::ReadWrite, sandboxExtensionHandle);
 
     if (NetworkProcessProxy* networkProcess = m_processPool->networkProcess())
-        networkProcess->connection()->send(Messages::NetworkProcess::ContinueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle, allowOverwrite), 0);
+        networkProcess->send(Messages::NetworkProcess::ContinueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle, allowOverwrite), 0);
 }
 
 #if !USE(NETWORK_SESSION)
index 7af8ca9..ff520e8 100644 (file)
@@ -67,40 +67,33 @@ WebUserContentControllerProxy::~WebUserContentControllerProxy()
     }
 }
 
-void WebUserContentControllerProxy::addProcess(WebProcessProxy& webProcessProxy)
+void WebUserContentControllerProxy::addProcess(WebProcessProxy& webProcessProxy, WebPageCreationParameters& parameters)
 {
-    ASSERT(webProcessProxy.state() == WebProcessProxy::State::Running);
-
     if (!m_processes.add(&webProcessProxy).isNewEntry)
         return;
 
     webProcessProxy.addMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), m_identifier, *this);
 
-    Vector<std::pair<uint64_t, String>> userContentWorlds;
+    ASSERT(parameters.userContentWorlds.isEmpty());
     for (const auto& world : m_userContentWorlds)
-        userContentWorlds.append(std::make_pair(world.key->identifier(), world.key->name()));
-    webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserContentWorlds(userContentWorlds), m_identifier);
+        parameters.userContentWorlds.append(std::make_pair(world.key->identifier(), world.key->name()));
 
-    Vector<WebUserScriptData> userScripts;
+    ASSERT(parameters.userScripts.isEmpty());
     for (const auto& userScript : m_userScripts->elementsOfType<API::UserScript>())
-        userScripts.append({ userScript->identifier(), userScript->userContentWorld().identifier(), userScript->userScript() });
-    webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScripts(userScripts), m_identifier);
+        parameters.userScripts.append({ userScript->identifier(), userScript->userContentWorld().identifier(), userScript->userScript() });
 
-    Vector<WebUserStyleSheetData> userStyleSheets;
+    ASSERT(parameters.userStyleSheets.isEmpty());
     for (const auto& userStyleSheet : m_userStyleSheets->elementsOfType<API::UserStyleSheet>())
-        userStyleSheets.append({ userStyleSheet->identifier(), userStyleSheet->userContentWorld().identifier(), userStyleSheet->userStyleSheet() });
-    webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier);
+        parameters.userStyleSheets.append({ userStyleSheet->identifier(), userStyleSheet->userContentWorld().identifier(), userStyleSheet->userStyleSheet() });
 
-    Vector<WebScriptMessageHandlerData> messageHandlers;
+    ASSERT(parameters.messageHandlers.isEmpty());
     for (auto& handler : m_scriptMessageHandlers.values())
-        messageHandlers.append({ handler->identifier(), handler->userContentWorld().identifier(), handler->name() });
-    webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlers), m_identifier);
+        parameters.messageHandlers.append({ handler->identifier(), handler->userContentWorld().identifier(), handler->name() });
 
 #if ENABLE(CONTENT_EXTENSIONS)
-    Vector<std::pair<String, WebCompiledContentExtensionData>> contentExtensions;
+    ASSERT(parameters.contentExtensions.isEmpty());
     for (const auto& contentExtension : m_contentExtensions.values())
-        contentExtensions.append(std::make_pair(contentExtension->name(), contentExtension->compiledExtension().data()));
-    webProcessProxy.connection()->send(Messages::WebUserContentController::AddContentExtensions(contentExtensions), m_identifier);
+        parameters.contentExtensions.append(std::make_pair(contentExtension->name(), contentExtension->compiledExtension().data()));
 #endif
 }
 
@@ -120,7 +113,7 @@ void WebUserContentControllerProxy::addUserContentWorldUse(API::UserContentWorld
     auto addResult = m_userContentWorlds.add(&world);
     if (addResult.isNewEntry) {
         for (WebProcessProxy* process : m_processes)
-            process->connection()->send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), m_identifier);
+            process->send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), m_identifier);
     }
 }
 
@@ -144,7 +137,7 @@ void WebUserContentControllerProxy::removeUserContentWorldUses(API::UserContentW
 {
     if (shouldSendRemoveUserContentWorldsMessage(world, numberOfUsesToRemove)) {
         for (WebProcessProxy* process : m_processes)
-            process->connection()->send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), m_identifier);
+            process->send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), m_identifier);
     }
 }
 
@@ -157,7 +150,7 @@ void WebUserContentControllerProxy::removeUserContentWorldUses(HashCountedSet<Re
     }
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), m_identifier);
 }
 
 void WebUserContentControllerProxy::addUserScript(API::UserScript& userScript)
@@ -169,7 +162,7 @@ void WebUserContentControllerProxy::addUserScript(API::UserScript& userScript)
     m_userScripts->elements().append(&userScript);
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }), m_identifier);
+        process->send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }), m_identifier);
 }
 
 void WebUserContentControllerProxy::removeUserScript(API::UserScript& userScript)
@@ -177,7 +170,7 @@ void WebUserContentControllerProxy::removeUserScript(API::UserScript& userScript
     Ref<API::UserContentWorld> world = userScript.userContentWorld();
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), m_identifier);
 
     m_userScripts->elements().removeAll(&userScript);
 
@@ -187,7 +180,7 @@ void WebUserContentControllerProxy::removeUserScript(API::UserScript& userScript
 void WebUserContentControllerProxy::removeAllUserScripts(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), m_identifier);
 
     unsigned userScriptsRemoved = m_userScripts->removeAllOfTypeMatching<API::UserScript>([&](const auto& userScript) {
         return &userScript->userContentWorld() == &world;
@@ -208,7 +201,7 @@ void WebUserContentControllerProxy::removeAllUserScripts()
         worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier());
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), m_identifier);
 
     m_userScripts->elements().clear();
 
@@ -224,7 +217,7 @@ void WebUserContentControllerProxy::addUserStyleSheet(API::UserStyleSheet& userS
     m_userStyleSheets->elements().append(&userStyleSheet);
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), m_identifier);
+        process->send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), m_identifier);
 }
 
 void WebUserContentControllerProxy::removeUserStyleSheet(API::UserStyleSheet& userStyleSheet)
@@ -232,7 +225,7 @@ void WebUserContentControllerProxy::removeUserStyleSheet(API::UserStyleSheet& us
     Ref<API::UserContentWorld> world = userStyleSheet.userContentWorld();
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), m_identifier);
 
     m_userStyleSheets->elements().removeAll(&userStyleSheet);
 
@@ -242,7 +235,7 @@ void WebUserContentControllerProxy::removeUserStyleSheet(API::UserStyleSheet& us
 void WebUserContentControllerProxy::removeAllUserStyleSheets(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), m_identifier);
 
     unsigned userStyleSheetsRemoved = m_userStyleSheets->removeAllOfTypeMatching<API::UserStyleSheet>([&](const auto& userStyleSheet) {
         return &userStyleSheet->userContentWorld() == &world;
@@ -263,7 +256,7 @@ void WebUserContentControllerProxy::removeAllUserStyleSheets()
         worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier());
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), m_identifier);
 
     m_userStyleSheets->elements().clear();
 
@@ -284,7 +277,7 @@ bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessage
     m_scriptMessageHandlers.add(handler.identifier(), &handler);
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), m_identifier);
+        process->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), m_identifier);
     
     return true;
 }
@@ -294,7 +287,7 @@ void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String
     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->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), m_identifier);
+                process->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), m_identifier);
 
             m_scriptMessageHandlers.remove(it);
 
@@ -307,7 +300,7 @@ void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String
 void WebUserContentControllerProxy::removeAllUserMessageHandlers(API::UserContentWorld& world)
 {
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), m_identifier);
 
     unsigned numberRemoved = 0;
     m_scriptMessageHandlers.removeIf([&](auto& entry) {
@@ -345,7 +338,7 @@ void WebUserContentControllerProxy::addContentExtension(API::ContentExtension& c
     auto pair = std::make_pair(contentExtension.name(), contentExtension.compiledExtension().data());
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::AddContentExtensions({ pair }), m_identifier);
+        process->send(Messages::WebUserContentController::AddContentExtensions({ pair }), m_identifier);
 }
 
 void WebUserContentControllerProxy::removeContentExtension(const String& name)
@@ -353,7 +346,7 @@ void WebUserContentControllerProxy::removeContentExtension(const String& name)
     m_contentExtensions.remove(name);
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveContentExtension(name), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveContentExtension(name), m_identifier);
 }
 
 void WebUserContentControllerProxy::removeAllContentExtensions()
@@ -361,7 +354,7 @@ void WebUserContentControllerProxy::removeAllContentExtensions()
     m_contentExtensions.clear();
 
     for (WebProcessProxy* process : m_processes)
-        process->connection()->send(Messages::WebUserContentController::RemoveAllContentExtensions(), m_identifier);
+        process->send(Messages::WebUserContentController::RemoveAllContentExtensions(), m_identifier);
 }
 #endif
 
index 7a172f8..0f48d03 100644 (file)
@@ -56,6 +56,7 @@ namespace WebKit {
 class WebProcessProxy;
 class WebScriptMessageHandler;
 struct FrameInfoData;
+struct WebPageCreationParameters;
 
 class WebUserContentControllerProxy : public API::ObjectImpl<API::Object::Type::UserContentController>, private IPC::MessageReceiver {
 public:
@@ -68,7 +69,7 @@ public:
 
     uint64_t identifier() const { return m_identifier; }
 
-    void addProcess(WebProcessProxy&);
+    void addProcess(WebProcessProxy&, WebPageCreationParameters&);
     void removeProcess(WebProcessProxy&);
 
     API::Array& userScripts() { return m_userScripts.get(); }
index 3ed5575..a961a2b 100644 (file)
@@ -111,7 +111,7 @@ void VisitedLinkStore::removeAll()
 
     for (WebProcessProxy* process : m_processes) {
         ASSERT(process->processPool().processes().contains(process));
-        process->connection()->send(Messages::VisitedLinkTableController::RemoveAllVisitedLinks(), m_identifier);
+        process->send(Messages::VisitedLinkTableController::RemoveAllVisitedLinks(), m_identifier);
     }
 }
 
@@ -194,9 +194,9 @@ void VisitedLinkStore::pendingVisitedLinksTimerFired()
         ASSERT(process->processPool().processes().contains(process));
 
         if (addedVisitedLinks.size() > 20)
-            process->connection()->send(Messages::VisitedLinkTableController::AllVisitedLinkStateChanged(), m_identifier);
+            process->send(Messages::VisitedLinkTableController::AllVisitedLinkStateChanged(), m_identifier);
         else
-            process->connection()->send(Messages::VisitedLinkTableController::VisitedLinkStateChanged(addedVisitedLinks), m_identifier);
+            process->send(Messages::VisitedLinkTableController::VisitedLinkStateChanged(addedVisitedLinks), m_identifier);
     }
 }
 
@@ -253,7 +253,7 @@ void VisitedLinkStore::sendTable(WebProcessProxy& process)
     if (!m_table.sharedMemory()->createHandle(handle, SharedMemory::Protection::ReadOnly))
         return;
 
-    process.connection()->send(Messages::VisitedLinkTableController::SetVisitedLinkTable(handle), m_identifier);
+    process.send(Messages::VisitedLinkTableController::SetVisitedLinkTable(handle), m_identifier);
 }
 
 } // namespace WebKit
index ae786ec..a5fc2c9 100644 (file)
@@ -824,8 +824,6 @@ void WebPageProxy::finishInitializingWebPageAfterProcessLaunch()
         return;
 
     m_needsToFinishInitializingWebPageAfterProcessLaunch = false;
-
-    m_process->addWebUserContentControllerProxy(m_userContentController);
     m_process->addVisitedLinkStore(m_visitedLinkStore);
 }
 
@@ -5595,6 +5593,8 @@ WebPageCreationParameters WebPageProxy::creationParameters()
 #endif
 #endif
 
+    m_process->addWebUserContentControllerProxy(m_userContentController, parameters);
+
     return parameters;
 }
 
index 76f2260..1bff76b 100644 (file)
@@ -320,10 +320,10 @@ void WebProcessProxy::addVisitedLinkStore(VisitedLinkStore& store)
     store.addProcess(*this);
 }
 
-void WebProcessProxy::addWebUserContentControllerProxy(WebUserContentControllerProxy& proxy)
+void WebProcessProxy::addWebUserContentControllerProxy(WebUserContentControllerProxy& proxy, WebPageCreationParameters& parameters)
 {
     m_webUserContentControllerProxies.add(&proxy);
-    proxy.addProcess(*this);
+    proxy.addProcess(*this, parameters);
 }
 
 void WebProcessProxy::didDestroyVisitedLinkStore(VisitedLinkStore& store)
index 4a60e84..c2cbbd1 100644 (file)
@@ -98,7 +98,7 @@ public:
     unsigned visiblePageCount() const { return m_visiblePageCounter.value(); }
 
     void addVisitedLinkStore(VisitedLinkStore&);
-    void addWebUserContentControllerProxy(WebUserContentControllerProxy&);
+    void addWebUserContentControllerProxy(WebUserContentControllerProxy&, WebPageCreationParameters&);
     void didDestroyVisitedLinkStore(VisitedLinkStore&);
     void didDestroyWebUserContentControllerProxy(WebUserContentControllerProxy&);
 
index d78221e..abac489 100644 (file)
@@ -62,6 +62,14 @@ public:
     void removeUserStyleSheets(InjectedBundleScriptWorld&);
     void removeAllUserContent();
 
+    void addUserContentWorlds(const Vector<std::pair<uint64_t, String>>&);
+    void addUserScripts(const Vector<WebUserScriptData>&);
+    void addUserStyleSheets(const Vector<WebUserStyleSheetData>&);
+    void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>&);
+#if ENABLE(CONTENT_EXTENSIONS)
+    void addContentExtensions(const Vector<std::pair<String, WebCompiledContentExtensionData>>&);
+#endif
+
 private:
     explicit WebUserContentController(uint64_t identifier);
 
@@ -78,23 +86,18 @@ private:
     // IPC::MessageReceiver.
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
 
-    void addUserContentWorlds(const Vector<std::pair<uint64_t, String>>&);
     void removeUserContentWorlds(const Vector<uint64_t>&);
 
-    void addUserScripts(const Vector<WebUserScriptData>&);
     void removeUserScript(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
     void removeAllUserScripts(const Vector<uint64_t>&);
 
-    void addUserStyleSheets(const Vector<WebUserStyleSheetData>&);
     void removeUserStyleSheet(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
     void removeAllUserStyleSheets(const Vector<uint64_t>&);
 
-    void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>&);
     void removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptIdentifier);
     void removeAllUserScriptMessageHandlers(const Vector<uint64_t>&);
 
 #if ENABLE(CONTENT_EXTENSIONS)
-    void addContentExtensions(const Vector<std::pair<String, WebCompiledContentExtensionData>>&);
     void removeContentExtension(const String& name);
     void removeAllContentExtensions();
 #endif
index 4ddd796..0222613 100644 (file)
@@ -566,6 +566,14 @@ WebPage::WebPage(uint64_t pageID, WebPageCreationParameters&& parameters)
 
     for (auto iterator : parameters.urlSchemeHandlers)
         registerURLSchemeHandler(iterator.value, iterator.key);
+
+    m_userContentController->addUserContentWorlds(parameters.userContentWorlds);
+    m_userContentController->addUserScripts(parameters.userScripts);
+    m_userContentController->addUserStyleSheets(parameters.userStyleSheets);
+    m_userContentController->addUserScriptMessageHandlers(parameters.messageHandlers);
+#if ENABLE(CONTENT_EXTENSIONS)
+    m_userContentController->addContentExtensions(parameters.contentExtensions);
+#endif
 }
 
 #if ENABLE(WEB_RTC)
index aa4e58e..2fcc604 100644 (file)
@@ -1,5 +1,21 @@
 2017-04-10  Alex Christensen  <achristensen@webkit.org>
 
+        REGRESSION(r195479) First main resource load in new WebProcess bypasses content extensions
+        https://bugs.webkit.org/show_bug.cgi?id=170707
+        <rdar://problem/27788755>
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebKit2Cocoa/WKUserContentExtensionStore.mm:
+        (-[ContentExtensionDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (TEST_F):
+        * TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:
+        (-[ContentBlockingWebsitePoliciesDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (-[ContentBlockingWebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
+        (TEST):
+
+2017-04-10  Alex Christensen  <achristensen@webkit.org>
+
         Add API to get available content extension identifiers in a WKContentExtensionStore
         https://bugs.webkit.org/show_bug.cgi?id=170093
 
index 809c3e5..ca79d27 100644 (file)
@@ -307,18 +307,10 @@ static bool receivedAlert { false };
 {
     switch (alertCount++) {
     case 0:
-        // FIXME: The first content blocker should be enabled here.
-        // ContentExtensionsBackend::addContentExtension isn't being called in the WebProcess
-        // until after the first main resource starts loading, so we need to send a message to the
-        // WebProcess before loading if we have installed content blockers.
-        // See rdar://problem/27788755
-        EXPECT_STREQ("content blockers disabled", message.UTF8String);
-        break;
-    case 1:
         // Default behavior.
         EXPECT_STREQ("content blockers enabled", message.UTF8String);
         break;
-    case 2:
+    case 1:
         // After having removed the content extension.
         EXPECT_STREQ("content blockers disabled", message.UTF8String);
         break;
@@ -360,10 +352,6 @@ TEST_F(WKContentExtensionStoreTest, AddRemove)
     [webView loadRequest:request];
     TestWebKitAPI::Util::run(&receivedAlert);
 
-    receivedAlert = false;
-    [webView reload];
-    TestWebKitAPI::Util::run(&receivedAlert);
-
     [[configuration userContentController] removeContentExtension:extension.get()];
 
     receivedAlert = false;
index d0f7e83..a9dcaea 100644 (file)
@@ -71,22 +71,14 @@ static size_t alertCount;
 {
     switch (alertCount++) {
     case 0:
-        // FIXME: The first content blocker should be enabled here.
-        // ContentExtensionsBackend::addContentExtension isn't being called in the WebProcess
-        // until after the first main resource starts loading, so we need to send a message to the
-        // WebProcess before loading if we have installed content blockers.
-        // See rdar://problem/27788755
-        EXPECT_STREQ("content blockers disabled", message.UTF8String);
-        break;
-    case 1:
         // Default behavior.
         EXPECT_STREQ("content blockers enabled", message.UTF8String);
         break;
-    case 2:
+    case 1:
         // After having set websitePolicies.contentBlockersEnabled to false.
         EXPECT_STREQ("content blockers disabled", message.UTF8String);
         break;
-    case 3:
+    case 2:
         // After having reloaded without content blockers.
         EXPECT_STREQ("content blockers disabled", message.UTF8String);
         break;
@@ -102,12 +94,9 @@ static size_t alertCount;
     _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
     switch (alertCount) {
     case 0:
-        // Verify an existing bug the first time a page is loaded in a new WebProcess.
-        break;
-    case 1:
         // Verify the content blockers behave correctly with the default behavior.
         break;
-    case 2:
+    case 1:
         {
             // Verify disabling content blockers works correctly.
             websitePolicies.contentBlockersEnabled = false;
@@ -120,7 +109,7 @@ static size_t alertCount;
             });
         }
         return;
-    case 3:
+    case 2:
         // Verify enabling content blockers has no effect when reloading without content blockers.
         websitePolicies.contentBlockersEnabled = true;
         break;
@@ -164,10 +153,6 @@ TEST(WebKit2, WebsitePoliciesContentBlockersEnabled)
     TestWebKitAPI::Util::run(&receivedAlert);
 
     receivedAlert = false;
-    [webView reload];
-    TestWebKitAPI::Util::run(&receivedAlert);
-
-    receivedAlert = false;
     [webView _reloadWithoutContentBlockers];
     TestWebKitAPI::Util::run(&receivedAlert);