Title: [227242] trunk
Revision
227242
Author
[email protected]
Date
2018-01-19 14:58:48 -0800 (Fri, 19 Jan 2018)

Log Message

Do not go to the storage process when registering a service worker client if there is no service worker registered
https://bugs.webkit.org/show_bug.cgi?id=181740
<rdar://problem/36650400>

Patch by Youenn Fablet <[email protected]> on 2018-01-19
Reviewed by Chris Dumez.

Source/WebCore:

Register a document as service worker client only if there is an existing service worker connection.
This allows not creating any connection if no service worker is registered.

Add internals API to test whether a service worker connection was created or not.
This is used by API tests that cover the changes.

* dom/Document.cpp:
(WebCore::Document::privateBrowsingStateDidChange): No need to create a service worker connection if client is not registered yet.
(WebCore::Document::setServiceWorkerConnection): No need to unregister/register if service worker connection is the same.
Similarly, if Document is to be destroyed or suspended, we should not register it.
* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::commitData):
* testing/Internals.cpp:
(WebCore::Internals::hasServiceWorkerConnection):
* testing/Internals.h:
* testing/Internals.idl:
* workers/service/ServiceWorkerProvider.cpp:
(WebCore::ServiceWorkerProvider::registerServiceWorkerClients):
* workers/service/ServiceWorkerProvider.h:

Source/WebKit:

UIProcess notifies all web processes to register their service worker clients when spinning the service worker process.
Add private API to set the number of web processes for testing purposes.

* UIProcess/API/Cocoa/WKProcessPool.mm:
(-[WKProcessPool _setMaximumNumberOfProcesses:]):
* UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::registerServiceWorkerClients):
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in:

Tools:

Add support for internals inside API tests.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/InjectInternals_Bundle.cpp: Added.
(TestWebKitAPI::InternalsInjectedBundleTest::InternalsInjectedBundleTest):
(TestWebKitAPI::InternalsInjectedBundleTest::initialize):
(TestWebKitAPI::InternalsInjectedBundleTest::didCreatePage):
(TestWebKitAPI::InternalsInjectedBundleTest::didClearWindowForFrame):
* TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
(setConfigurationInjectedBundlePath):
(-[RegularPageMessageHandler userContentController:didReceiveScriptMessage:]):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (227241 => 227242)


--- trunk/Source/WebCore/ChangeLog	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/ChangeLog	2018-01-19 22:58:48 UTC (rev 227242)
@@ -1,3 +1,31 @@
+2018-01-19  Youenn Fablet  <[email protected]>
+
+        Do not go to the storage process when registering a service worker client if there is no service worker registered
+        https://bugs.webkit.org/show_bug.cgi?id=181740
+        <rdar://problem/36650400>
+
+        Reviewed by Chris Dumez.
+
+        Register a document as service worker client only if there is an existing service worker connection.
+        This allows not creating any connection if no service worker is registered.
+
+        Add internals API to test whether a service worker connection was created or not.
+        This is used by API tests that cover the changes.
+
+        * dom/Document.cpp:
+        (WebCore::Document::privateBrowsingStateDidChange): No need to create a service worker connection if client is not registered yet.
+        (WebCore::Document::setServiceWorkerConnection): No need to unregister/register if service worker connection is the same.
+        Similarly, if Document is to be destroyed or suspended, we should not register it.
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::commitData):
+        * testing/Internals.cpp:
+        (WebCore::Internals::hasServiceWorkerConnection):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+        * workers/service/ServiceWorkerProvider.cpp:
+        (WebCore::ServiceWorkerProvider::registerServiceWorkerClients):
+        * workers/service/ServiceWorkerProvider.h:
+
 2018-01-19  Dean Jackson  <[email protected]>
 
         REGRESSION (r221092): Swipe actions are hard to perform in FastMail app

Modified: trunk/Source/WebCore/dom/Document.cpp (227241 => 227242)


--- trunk/Source/WebCore/dom/Document.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/dom/Document.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -4919,16 +4919,16 @@
 
     resumeScheduledTasks(reason);
 
+    m_visualUpdatesAllowed = true;
+
+    m_isSuspended = false;
+
 #if ENABLE(SERVICE_WORKER)
     if (RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled() && reason == ActiveDOMObject::ReasonForSuspension::PageCache) {
         ASSERT_WITH_MESSAGE(!activeServiceWorker(), "Documents with an active service worker should not go into PageCache in the first place");
-        setServiceWorkerConnection(&ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(sessionID()));
+        setServiceWorkerConnection(ServiceWorkerProvider::singleton().existingServiceWorkerConnectionForSession(sessionID()));
     }
 #endif
-
-    m_visualUpdatesAllowed = true;
-
-    m_isSuspended = false;
 }
 
 void Document::registerForDocumentSuspensionCallbacks(Element* e)
@@ -4996,7 +4996,7 @@
         element->privateBrowsingStateDidChange();
 
 #if ENABLE(SERVICE_WORKER)
-    if (RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled())
+    if (RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled() && m_serviceWorkerConnection)
         setServiceWorkerConnection(&ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(sessionID()));
 #endif
 }
@@ -7720,6 +7720,9 @@
 #if ENABLE(SERVICE_WORKER)
 void Document::setServiceWorkerConnection(SWClientConnection* serviceWorkerConnection)
 {
+    if (m_serviceWorkerConnection == serviceWorkerConnection || m_hasPreparedForDestruction || m_isSuspended)
+        return;
+
     if (m_serviceWorkerConnection)
         m_serviceWorkerConnection->unregisterServiceWorkerClient(identifier());
 

Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (227241 => 227242)


--- trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -907,7 +907,7 @@
             }
 
             if (m_frame->document()->activeServiceWorker() || SchemeRegistry::canServiceWorkersHandleURLScheme(m_frame->document()->url().protocol().toStringWithoutCopying()))
-                m_frame->document()->setServiceWorkerConnection(&ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(m_frame->page()->sessionID()));
+                m_frame->document()->setServiceWorkerConnection(ServiceWorkerProvider::singleton().existingServiceWorkerConnectionForSession(m_frame->page()->sessionID()));
         }
 #endif
         // Call receivedFirstData() exactly once per load. We should only reach this point multiple times

Modified: trunk/Source/WebCore/testing/Internals.cpp (227241 => 227242)


--- trunk/Source/WebCore/testing/Internals.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/testing/Internals.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -4309,6 +4309,14 @@
 
     ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(contextDocument()->sessionID()).syncTerminateWorker(worker.identifier());
 }
+
+bool Internals::hasServiceWorkerConnection()
+{
+    if (!contextDocument())
+        return false;
+
+    return ServiceWorkerProvider::singleton().existingServiceWorkerConnectionForSession(contextDocument()->sessionID());
+}
 #endif
 
 String Internals::timelineDescription(AnimationTimeline& timeline)

Modified: trunk/Source/WebCore/testing/Internals.h (227241 => 227242)


--- trunk/Source/WebCore/testing/Internals.h	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/testing/Internals.h	2018-01-19 22:58:48 UTC (rev 227242)
@@ -628,6 +628,7 @@
     using HasRegistrationPromise = DOMPromiseDeferred<IDLBoolean>;
     void hasServiceWorkerRegistration(const String& clientURL, HasRegistrationPromise&&);
     void terminateServiceWorker(ServiceWorker&);
+    bool hasServiceWorkerConnection();
 #endif
 
 #if ENABLE(APPLE_PAY)

Modified: trunk/Source/WebCore/testing/Internals.idl (227241 => 227242)


--- trunk/Source/WebCore/testing/Internals.idl	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/testing/Internals.idl	2018-01-19 22:58:48 UTC (rev 227242)
@@ -570,6 +570,7 @@
 
     [Conditional=SERVICE_WORKER] Promise<boolean> hasServiceWorkerRegistration(DOMString scopeURL);
     [Conditional=SERVICE_WORKER] void terminateServiceWorker(ServiceWorker worker);
+    [Conditional=SERVICE_WORKER] boolean hasServiceWorkerConnection();
 
     void testIncomingSyncIPCMessageWhileWaitingForSyncReply();
 

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerProvider.cpp (227241 => 227242)


--- trunk/Source/WebCore/workers/service/ServiceWorkerProvider.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerProvider.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -28,6 +28,8 @@
 
 #if ENABLE(SERVICE_WORKER)
 
+#include "SchemeRegistry.h"
+
 namespace WebCore {
 
 static ServiceWorkerProvider* sharedProvider;
@@ -52,6 +54,15 @@
     return connection->mayHaveServiceWorkerRegisteredForOrigin(origin);
 }
 
+void ServiceWorkerProvider::registerServiceWorkerClients(PAL::SessionID sessionID)
+{
+    auto& connection = serviceWorkerConnectionForSession(sessionID);
+    for (auto* document : Document::allDocuments()) {
+        if (SchemeRegistry::canServiceWorkersHandleURLScheme(document->url().protocol().toStringWithoutCopying()))
+            document->setServiceWorkerConnection(&connection);
+    }
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerProvider.h (227241 => 227242)


--- trunk/Source/WebCore/workers/service/ServiceWorkerProvider.h	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerProvider.h	2018-01-19 22:58:48 UTC (rev 227242)
@@ -47,6 +47,8 @@
     virtual SWClientConnection* existingServiceWorkerConnectionForSession(PAL::SessionID) = 0;
     virtual SWClientConnection& serviceWorkerConnectionForSession(PAL::SessionID) = 0;
 
+    WEBCORE_EXPORT void registerServiceWorkerClients(PAL::SessionID);
+
     void setHasRegisteredServiceWorkers(bool value) { m_hasRegisteredServiceWorkers = value; }
 
 private:

Modified: trunk/Source/WebKit/ChangeLog (227241 => 227242)


--- trunk/Source/WebKit/ChangeLog	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/ChangeLog	2018-01-19 22:58:48 UTC (rev 227242)
@@ -1,3 +1,24 @@
+2018-01-19  Youenn Fablet  <[email protected]>
+
+        Do not go to the storage process when registering a service worker client if there is no service worker registered
+        https://bugs.webkit.org/show_bug.cgi?id=181740
+        <rdar://problem/36650400>
+
+        Reviewed by Chris Dumez.
+
+        UIProcess notifies all web processes to register their service worker clients when spinning the service worker process.
+        Add private API to set the number of web processes for testing purposes.
+
+        * UIProcess/API/Cocoa/WKProcessPool.mm:
+        (-[WKProcessPool _setMaximumNumberOfProcesses:]):
+        * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::registerServiceWorkerClients):
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebProcess.messages.in:
+
 2018-01-19  Dean Jackson  <[email protected]>
 
         REGRESSION (r221092): Swipe actions are hard to perform in FastMail app

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm (227241 => 227242)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm	2018-01-19 22:58:48 UTC (rev 227242)
@@ -187,6 +187,11 @@
     _processPool->registerURLSchemeServiceWorkersCanHandle(scheme);
 }
 
+- (void)_setMaximumNumberOfProcesses:(NSUInteger)value
+{
+    _processPool->setMaximumNumberOfProcesses(value);
+}
+
 - (void)_setCanHandleHTTPSServerTrustEvaluation:(BOOL)value
 {
     _processPool->setCanHandleHTTPSServerTrustEvaluation(value);

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h (227241 => 227242)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h	2018-01-19 22:58:48 UTC (rev 227242)
@@ -96,6 +96,7 @@
 // Test only.
 - (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (void)_registerURLSchemeServiceWorkersCanHandle:(NSString *)scheme WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (void)_setMaximumNumberOfProcesses:(NSUInteger)value WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @property (nonatomic, getter=_isCookieStoragePartitioningEnabled, setter=_setCookieStoragePartitioningEnabled:) BOOL _cookieStoragePartitioningEnabled WK_API_AVAILABLE(macosx(10.12.3), ios(10.3));
 @property (nonatomic, getter=_isStorageAccessAPIEnabled, setter=_setStorageAccessAPIEnabled:) BOOL _storageAccessAPIEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (227241 => 227242)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -612,6 +612,7 @@
 
     auto serviceWorkerProcessProxy = ServiceWorkerProcessProxy::create(*this, *websiteDataStore);
     m_serviceWorkerProcess = serviceWorkerProcessProxy.ptr();
+    sendToAllProcesses(Messages::WebProcess::RegisterServiceWorkerClients { websiteDataStore->sessionID() });
 
     updateProcessAssertions();
     initializeNewWebProcess(serviceWorkerProcessProxy.get(), *websiteDataStore);

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (227241 => 227242)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -1651,6 +1651,12 @@
     auto& ipcConnection = ensureWebToStorageProcessConnection(initialSessionID).connection();
     SWContextManager::singleton().setConnection(std::make_unique<WebSWContextManagerConnection>(ipcConnection, pageID, store));
 }
+
+void WebProcess::registerServiceWorkerClients(PAL::SessionID sessionID)
+{
+    ServiceWorkerProvider::singleton().registerServiceWorkerClients(sessionID);
+}
+
 #endif
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (227241 => 227242)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2018-01-19 22:58:48 UTC (rev 227242)
@@ -303,7 +303,8 @@
     void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&);
 #endif
 #if ENABLE(SERVICE_WORKER)
-    void establishWorkerContextConnectionToStorageProcess(uint64_t pageID, const WebPreferencesStore&, PAL::SessionID initialSessionID);
+    void establishWorkerContextConnectionToStorageProcess(uint64_t pageID, const WebPreferencesStore&, PAL::SessionID);
+    void registerServiceWorkerClients(PAL::SessionID);
 #endif
 
     void releasePageCache();

Modified: trunk/Source/WebKit/WebProcess/WebProcess.messages.in (227241 => 227242)


--- trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2018-01-19 22:58:48 UTC (rev 227242)
@@ -117,5 +117,6 @@
 
 #if ENABLE(SERVICE_WORKER)
     EstablishWorkerContextConnectionToStorageProcess(uint64_t pageID, struct WebKit::WebPreferencesStore store, PAL::SessionID initialSessionID)
+    RegisterServiceWorkerClients(PAL::SessionID sessionID)
 #endif
 }

Modified: trunk/Tools/ChangeLog (227241 => 227242)


--- trunk/Tools/ChangeLog	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Tools/ChangeLog	2018-01-19 22:58:48 UTC (rev 227242)
@@ -1,3 +1,23 @@
+2018-01-19  Youenn Fablet  <[email protected]>
+
+        Do not go to the storage process when registering a service worker client if there is no service worker registered
+        https://bugs.webkit.org/show_bug.cgi?id=181740
+        <rdar://problem/36650400>
+
+        Reviewed by Chris Dumez.
+
+        Add support for internals inside API tests.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/InjectInternals_Bundle.cpp: Added.
+        (TestWebKitAPI::InternalsInjectedBundleTest::InternalsInjectedBundleTest):
+        (TestWebKitAPI::InternalsInjectedBundleTest::initialize):
+        (TestWebKitAPI::InternalsInjectedBundleTest::didCreatePage):
+        (TestWebKitAPI::InternalsInjectedBundleTest::didClearWindowForFrame):
+        * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
+        (setConfigurationInjectedBundlePath):
+        (-[RegularPageMessageHandler userContentController:didReceiveScriptMessage:]):
+
 2018-01-19  John Wilander  <[email protected]>
 
         Resource Load Statistics: Implement callback support for removal of WebsiteDataType::ResourceLoadStatistics

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (227241 => 227242)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-01-19 22:58:48 UTC (rev 227242)
@@ -147,6 +147,8 @@
 		3FBD1B4A1D3D66AB00E6D6FA /* FullscreenLayoutConstraints.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */; };
 		3FCC4FE51EC4E8520076E37C /* PictureInPictureDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */; };
 		3FCC4FE81EC4E8CA0076E37C /* PictureInPictureDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */; };
+		4135FB842011FAA700332139 /* InjectInternals_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4135FB832011FAA300332139 /* InjectInternals_Bundle.cpp */; };
+		4135FB852011FABF00332139 /* libWebCoreTestSupport.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4135FB862011FABF00332139 /* libWebCoreTestSupport.dylib */; };
 		44817A2F1F0486BF00003810 /* WKRequestActivatedElementInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */; };
 		448D7E471EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 448D7E451EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp */; };
 		46397B951DC2C850009A78AE /* DOMNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46397B941DC2C850009A78AE /* DOMNode.mm */; };
@@ -835,7 +837,6 @@
 			dstPath = TestWebKitAPI.resources;
 			dstSubfolderSpec = 7;
 			files = (
-				0EBBCC661FFF9E0C00FA42AB /* pop-up-check.html in Copy Resources */,
 				1A9E52C913E65EF4006917F5 /* 18-characters.html in Copy Resources */,
 				379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
 				1C2B81871C8925A000A5529F /* Ahem.ttf in Copy Resources */,
@@ -1027,6 +1028,7 @@
 				9B7D740F1F8378770006C432 /* paste-rtfd.html in Copy Resources */,
 				3FCC4FE81EC4E8CA0076E37C /* PictureInPictureDelegate.html in Copy Resources */,
 				F415086D1DA040C50044BE9B /* play-audio-on-click.html in Copy Resources */,
+				0EBBCC661FFF9E0C00FA42AB /* pop-up-check.html in Copy Resources */,
 				F41AB9A81EF4696B0083FA08 /* prevent-operation.html in Copy Resources */,
 				F41AB9A91EF4696B0083FA08 /* prevent-start.html in Copy Resources */,
 				F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */,
@@ -1286,6 +1288,8 @@
 		3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = FullscreenLayoutConstraints.html; sourceTree = "<group>"; };
 		3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PictureInPictureDelegate.mm; sourceTree = "<group>"; };
 		3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = PictureInPictureDelegate.html; sourceTree = "<group>"; };
+		4135FB832011FAA300332139 /* InjectInternals_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InjectInternals_Bundle.cpp; path = Tests/InjectInternals_Bundle.cpp; sourceTree = SOURCE_ROOT; };
+		4135FB862011FABF00332139 /* libWebCoreTestSupport.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; path = libWebCoreTestSupport.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		41973B5A1AF2286A006C7B36 /* FileSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileSystem.cpp; sourceTree = "<group>"; };
 		41973B5C1AF22875006C7B36 /* SharedBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedBuffer.cpp; sourceTree = "<group>"; };
 		440A1D3814A0103A008A66F2 /* URL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URL.cpp; sourceTree = "<group>"; };
@@ -1935,6 +1939,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4135FB852011FABF00332139 /* libWebCoreTestSupport.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2278,6 +2283,7 @@
 				0F4FFAA01ED3D0DE00F7111F /* ImageIO.framework */,
 				CDA3159C1ED5643F009F60D3 /* IOKit.framework */,
 				7C83E0331D0A5F2700FEBCF3 /* libicucore.dylib */,
+				4135FB862011FABF00332139 /* libWebCoreTestSupport.dylib */,
 				7C83E0291D0A5CDF00FEBCF3 /* libWTF.a */,
 				7A010BCC1D877C0D00EDE72A /* QuartzCore.framework */,
 			);
@@ -2576,6 +2582,7 @@
 				F660AA1415A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp */,
 				9B0786A21C58830F00D159E3 /* InjectedBundleMakeAllShadowRootsOpen.cpp */,
 				9B0786A41C5885C300D159E3 /* InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp */,
+				4135FB832011FAA300332139 /* InjectInternals_Bundle.cpp */,
 				93D3D19D17B1A84200C7C415 /* LayoutMilestonesWithAllContentInFrame.cpp */,
 				7A66BDB51EAF14D000CCC924 /* LimitTitleSize.cpp */,
 				52CB47401448FB9300873995 /* LoadAlternateHTMLStringWithNonDirectoryURL.cpp */,
@@ -3741,6 +3748,7 @@
 				F660AA1515A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp in Sources */,
 				BC575A97126E74F1006F0F12 /* InjectedBundleMain.cpp in Sources */,
 				9B0786A51C5885C300D159E3 /* InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp in Sources */,
+				4135FB842011FAA700332139 /* InjectInternals_Bundle.cpp in Sources */,
 				33DC89141419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp in Sources */,
 				33BE5AF9137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp in Sources */,
 				93F1DB3414DA20870024C362 /* NewFirstVisuallyNonEmptyLayout_Bundle.cpp in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/InjectInternals_Bundle.cpp (0 => 227242)


--- trunk/Tools/TestWebKitAPI/Tests/InjectInternals_Bundle.cpp	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/InjectInternals_Bundle.cpp	2018-01-19 22:58:48 UTC (rev 227242)
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2013 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"
+
+#if WK_HAVE_C_SPI
+
+#import "InjectedBundleTest.h"
+
+#import "WebCoreTestSupport.h"
+#import <WebKit/WKBundle.h>
+#import <WebKit/WKBundleFrame.h>
+#import <WebKit/WKBundlePage.h>
+
+namespace TestWebKitAPI {
+
+class InternalsInjectedBundleTest : public TestWebKitAPI::InjectedBundleTest {
+public:
+    InternalsInjectedBundleTest(const std::string& identifier)
+        : InjectedBundleTest(identifier)
+    {
+    }
+
+private:
+    virtual void initialize(WKBundleRef bundle, WKTypeRef)
+    {
+        WKBundleSetServiceWorkerProxyCreationCallback(bundle, WebCoreTestSupport::setupNewlyCreatedServiceWorker);
+    }
+
+    virtual void didCreatePage(WKBundleRef, WKBundlePageRef page)
+    {
+        WKBundlePageLoaderClientV0 loaderClient;
+        memset(&loaderClient, 0, sizeof(loaderClient));
+
+        loaderClient.base.version = 0;
+        loaderClient.base.clientInfo = this;
+        loaderClient.didClearWindowObjectForFrame = didClearWindowForFrame;
+
+        WKBundlePageSetPageLoaderClient(page, &loaderClient.base);
+    }
+    static void didClearWindowForFrame(WKBundlePageRef, WKBundleFrameRef frame, WKBundleScriptWorldRef world, const void*)
+    {
+        JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world);
+        WebCoreTestSupport::injectInternalsObject(context);
+    }
+};
+
+static TestWebKitAPI::InjectedBundleTest::Register<InternalsInjectedBundleTest> registrar("InternalsInjectedBundleTest");
+
+} // namespace TestWebKitAPI
+
+#endif

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (227241 => 227242)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-01-19 22:53:54 UTC (rev 227241)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-01-19 22:58:48 UTC (rev 227242)
@@ -446,4 +446,130 @@
     done = false;
 }
 
+#if WK_HAVE_C_SPI
+
+void setConfigurationInjectedBundlePath(WKWebViewConfiguration* configuration)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+    configuration.processPool = (WKProcessPool *)context.get();
+    auto pool = configuration.processPool;
+    [pool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
+    [pool _setMaximumNumberOfProcesses:5];
+
+    configuration.websiteDataStore = (WKWebsiteDataStore *)WKContextGetWebsiteDataStore(context.get());
+}
+
+@interface RegularPageMessageHandler : NSObject <WKScriptMessageHandler>
+@end
+
+@implementation RegularPageMessageHandler
+- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
+{
+    EXPECT_TRUE([[message body] isEqualToString:@"PASS"]);
+    done = true;
+}
+@end
+
+static const char* regularPageWithoutConnectionBytes = R"SWRESOURCE(
+<script>
+var result = window.internals.hasServiceWorkerConnection() ? "FAIL" : "PASS";
+window.webkit.messageHandlers.regularPage.postMessage(result);
+</script>
+)SWRESOURCE";
+
+static const char* regularPageWithConnectionBytes = R"SWRESOURCE(
+<script>
+var result = window.internals.hasServiceWorkerConnection() ? "PASS" : "FAIL";
+window.webkit.messageHandlers.regularPage.postMessage(result);
+</script>
+)SWRESOURCE";
+
+TEST(ServiceWorkers, StorageConnectionCreation)
+{
+    ASSERT(mainBytes);
+    ASSERT(scriptBytes);
+
+    [WKWebsiteDataStore _allowWebsiteDataRecordsForAllOrigins];
+
+    RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    setConfigurationInjectedBundlePath(configuration.get());
+
+    done = false;
+
+    [[configuration websiteDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    [[configuration websiteDataStore] fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeServiceWorkerRegistrations] completionHandler:^(NSArray<WKWebsiteDataRecord *> *websiteDataRecords) {
+        EXPECT_EQ(0u, [websiteDataRecords count]);
+
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    RetainPtr<SWMessageHandler> messageHandler = adoptNS([[SWMessageHandler alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+    RetainPtr<RegularPageMessageHandler> regularPageMessageHandler = adoptNS([[RegularPageMessageHandler alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:regularPageMessageHandler.get() name:@"regularPage"];
+
+    RetainPtr<SWSchemes> handler = adoptNS([[SWSchemes alloc] init]);
+    handler->resources.set("sw://host/regularPageWithoutConnection.html", ResourceInfo { @"text/html", regularPageWithoutConnectionBytes });
+    handler->resources.set("sw://host/regularPageWithConnection.html", ResourceInfo { @"text/html", regularPageWithConnectionBytes });
+    handler->resources.set("sw://host/main.html", ResourceInfo { @"text/html", mainBytes });
+    handler->resources.set("sw://host/sw.js", ResourceInfo { @"application/_javascript_", scriptBytes });
+    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
+
+    RetainPtr<WKWebView> regularPageWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    RetainPtr<WKWebView> newRegularPageWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    // Test that a regular page does not trigger a service worker connection to storage process if there is no registered service worker.
+    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/regularPageWithoutConnection.html"]];
+
+    [regularPageWebView loadRequest:request];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    // Test that a sw scheme page can register a service worker.
+    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
+
+    [webView loadRequest:request];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+    webView = nullptr;
+
+    // Now that a service worker is registered, the regular page should have a service worker connection.
+    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/regularPageWithConnection.html"]];
+
+    [regularPageWebView loadRequest:request];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+    regularPageWebView = nullptr;
+
+    [newRegularPageWebView loadRequest:request];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+    newRegularPageWebView = nullptr;
+
+    [[configuration websiteDataStore] fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeServiceWorkerRegistrations] completionHandler:^(NSArray<WKWebsiteDataRecord *> *websiteDataRecords) {
+        EXPECT_EQ(1u, [websiteDataRecords count]);
+        EXPECT_TRUE([websiteDataRecords[0].displayName isEqualToString:@"sw host"]);
+
+        done = true;
+    }];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    [[configuration websiteDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+}
+
+#endif // WK_HAVE_C_SPI
+
 #endif // WK_API_ENABLED
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to