Diff
Modified: trunk/LayoutTests/ChangeLog (221197 => 221198)
--- trunk/LayoutTests/ChangeLog 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/LayoutTests/ChangeLog 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1,3 +1,15 @@
+2017-08-25 Brady Eidson <beid...@apple.com>
+
+ Introduce ServerWorkerRegistration task queues.
+ https://bugs.webkit.org/show_bug.cgi?id=175851
+
+ Reviewed by Andy Estes.
+
+ * http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt: Added.
+ * http/tests/workers/service/registration-task-queue-scheduling-1.html: Added.
+ * http/tests/workers/service/resources/registration-task-queue-scheduling-1-second-window.html: Added.
+ * http/tests/workers/service/resources/registration-task-queue-scheduling-1.js: Added.
+
2017-07-25 Frederic Wang <fw...@igalia.com>
Add flag allow-modals to iframe sandbox
Added: trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt (0 => 221198)
--- trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,2 @@
+ALERT: Done
+
Added: trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1.html (0 => 221198)
--- trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1.html (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1.html 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,9 @@
+<html>
+<head>
+<script src=""
+</head>
+<body>
+
+<script src=""
+</body>
+</html>
Added: trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1-second-window.html (0 => 221198)
--- trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1-second-window.html (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1-second-window.html 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,16 @@
+<script>
+
+if (!window.opener)
+ alert("This HTML file should not be opened directly")
+
+for (var i = 0; i < 1000; ++i) {
+ navigator.serviceWorker.register("empty-worker.js", { })
+ .then(function(r) {
+ alert("Popup window resolved successfully (unexpected)")
+ opener.postMessage("done", "*");
+ }, function(e) {
+ opener.postMessage("responded", "*");
+ })
+}
+
+</script>
\ No newline at end of file
Added: trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1.js (0 => 221198)
--- trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1.js (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/resources/registration-task-queue-scheduling-1.js 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,60 @@
+// This test makes sure that two different windows from two different domains who spam SW registrations get responses intertwined with each other
+// as each registration should operate on its own task queue.
+
+if (location.hostname != "127.0.0.1")
+ alert("This test must be initiated from the hostname 127.0.0.1");
+
+window._onmessage_ = function(evt)
+{
+ if (evt.data == "done") {
+ alert("Error in popup window");
+ finishSWTest();
+ } else if (evt.data == "responded") {
+ if (!window.popupTimestamp)
+ window.popupTimestamp = new Date();
+
+ responded();
+ } else {
+ alert("Unexpected event from popup window");
+ finishSWTest();
+ }
+}
+
+function responded()
+{
+ if (!window.thisTimestamp) {
+ window.thisTimestamp = new Date();
+
+ if (window.popupTimestamp)
+ alert("Registrations in second window should not have responded before the first");
+
+ return;
+ }
+
+ if (!window.popupTimestamp)
+ return;
+
+ if (window.popupTimestamp < window.thisTimestamp)
+ alert("Popup should not have popped up before this main window");
+ else
+ alert("Done");
+
+ finishSWTest();
+}
+
+for (var i = 0; i < 1000; ++i) {
+ navigator.serviceWorker.register("resources/empty-worker.js", { })
+ .then(function(r) {
+ console.log("Original window resolved successfully (unexpected)")
+ done();
+ }, function(e) {
+ if (e+"" != "UnknownError: serviceWorker job scheduling is not yet implemented") {
+ alert("Unexpected error received from server");
+ finishSWTest();
+ }
+
+ responded();
+ })
+}
+
+otherWindow = window.open("http://localhost:8000/workers/service/resources/registration-task-queue-scheduling-1-second-window.html", "other");
Modified: trunk/Source/WebCore/CMakeLists.txt (221197 => 221198)
--- trunk/Source/WebCore/CMakeLists.txt 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/CMakeLists.txt 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1545,6 +1545,7 @@
dom/EventNames.cpp
dom/EventPath.cpp
dom/EventTarget.cpp
+ dom/ExceptionData.cpp
dom/ExtensionStyleSheets.cpp
dom/FocusEvent.cpp
dom/GenericEventQueue.cpp
@@ -2990,12 +2991,15 @@
workers/service/ServiceWorkerContainer.cpp
workers/service/ServiceWorkerGlobalScope.cpp
workers/service/ServiceWorkerJob.cpp
+ workers/service/ServiceWorkerJobData.cpp
workers/service/ServiceWorkerProvider.cpp
workers/service/ServiceWorkerRegistration.cpp
- workers/service/ServiceWorkerRegistrationParameters.cpp
+ workers/service/ServiceWorkerRegistrationKey.cpp
+ workers/service/ServiceWorkerRegistrationOptions.cpp
workers/service/server/SWClientConnection.cpp
workers/service/server/SWServer.cpp
+ workers/service/server/SWServerRegistration.cpp
xml/DOMParser.cpp
xml/NativeXPathNSResolver.cpp
Modified: trunk/Source/WebCore/ChangeLog (221197 => 221198)
--- trunk/Source/WebCore/ChangeLog 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/ChangeLog 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1,3 +1,105 @@
+2017-08-25 Brady Eidson <beid...@apple.com>
+
+ Introduce ServerWorkerRegistration task queues.
+ https://bugs.webkit.org/show_bug.cgi?id=175851
+
+ Reviewed by Andy Estes.
+
+ Test: http/tests/workers/service/registration-task-queue-scheduling-1.html
+
+ This change introduces:
+ - A task thread/queue owned by each SWServer object.
+ - The SWServerRegistration object, which is the in-server representation of a
+ service worker registration scope.
+ - A registration job queue per SWServerRegistration object which actually runs the
+ jobs as tasks on the owning SWServer's thread.
+
+ With that infrastructure in place, it moves the "register" job to something that is
+ scheduled and rejected asynchronously, as opposed to synchronously rejected.
+
+ The test verifies that two different registration scopes (localhost and 127.0.0.1)
+ can both spam the SWServer with registration requests, but neither of their queues
+ starve the other.
+
+ The rest of this change is a lot of support and plumbing for making the above happen.
+
+ * CMakeLists.txt:
+ * WebCore.xcodeproj/project.pbxproj:
+
+ * dom/ExceptionData.cpp:
+ (WebCore::ExceptionData::isolatedCopy const):
+ * dom/ExceptionData.h:
+
+ * workers/service/ServiceWorkerContainer.cpp:
+ (WebCore::ServiceWorkerContainer::addRegistration):
+ (WebCore::ServiceWorkerContainer::connectionIdentifier):
+ * workers/service/ServiceWorkerContainer.h:
+
+ * workers/service/ServiceWorkerJob.cpp:
+ (WebCore::ServiceWorkerJob::ServiceWorkerJob):
+ (WebCore::ServiceWorkerJob::data const): Deleted.
+ * workers/service/ServiceWorkerJob.h:
+ (WebCore::ServiceWorkerJob::create):
+ (WebCore::ServiceWorkerJob::data const):
+ (WebCore::ServiceWorkerJob::createRegisterJob): Deleted.
+
+ * workers/service/ServiceWorkerJobClient.h:
+
+ * workers/service/ServiceWorkerJobData.cpp:
+ (WebCore::ServiceWorkerJobData::ServiceWorkerJobData):
+ (WebCore::ServiceWorkerJobData::registrationKey const):
+ (WebCore::ServiceWorkerJobData::isolatedCopy const):
+ * workers/service/ServiceWorkerJobData.h:
+ (WebCore::ServiceWorkerJobData::jobIdentifier const):
+ (WebCore::ServiceWorkerJobData::connectionIdentifier const):
+ (WebCore::ServiceWorkerJobData::encode const):
+ (WebCore::ServiceWorkerJobData::decode):
+
+ * workers/service/ServiceWorkerRegistrationKey.cpp:
+ (WebCore::ServiceWorkerRegistrationKey::emptyKey):
+ (WebCore::ServiceWorkerRegistrationKey::hash const):
+ (WebCore::ServiceWorkerRegistrationKey::operator== const):
+ * workers/service/ServiceWorkerRegistrationKey.h:
+ (WTF::ServiceWorkerRegistrationKeyHash::hash):
+ (WTF::ServiceWorkerRegistrationKeyHash::equal):
+ (WTF::HashTraits<WebCore::ServiceWorkerRegistrationKey>::emptyValue):
+ (WTF::HashTraits<WebCore::ServiceWorkerRegistrationKey>::constructDeletedValue):
+ (WTF::HashTraits<WebCore::ServiceWorkerRegistrationKey>::isDeletedValue):
+
+ * workers/service/ServiceWorkerRegistrationOptions.cpp:
+ (WebCore::RegistrationOptions::isolatedCopy const):
+ * workers/service/ServiceWorkerRegistrationOptions.h:
+ (WebCore::RegistrationOptions::encode const):
+ (WebCore::RegistrationOptions::decode):
+
+ * workers/service/server/SWClientConnection.h:
+
+ * workers/service/server/SWServer.cpp:
+ (WebCore::SWServer::Connection::Connection):
+ (WebCore::SWServer::~SWServer):
+ (WebCore::SWServer::Connection::scheduleJobInServer):
+ (WebCore::SWServer::SWServer):
+ (WebCore::SWServer::scheduleJob):
+ (WebCore::SWServer::rejectJob):
+ (WebCore::SWServer::taskThreadEntryPoint):
+ (WebCore::SWServer::postTask):
+ (WebCore::SWServer::postTaskReply):
+ (WebCore::SWServer::handleTaskRepliesOnMainThread):
+ (WebCore::SWServer::registerConnection):
+ (WebCore::SWServer::unregisterConnection):
+ * workers/service/server/SWServer.h:
+ (WebCore::SWServer::Connection::identifier const):
+
+ * workers/service/server/SWServerRegistration.cpp: Added.
+ (WebCore::SWServerRegistration::SWServerRegistration):
+ (WebCore::SWServerRegistration::~SWServerRegistration):
+ (WebCore::SWServerRegistration::enqueueJob):
+ (WebCore::SWServerRegistration::startNextJob):
+ (WebCore::SWServerRegistration::performCurrentJob):
+ (WebCore::SWServerRegistration::rejectCurrentJob):
+ (WebCore::SWServerRegistration::finishCurrentJob):
+ * workers/service/server/SWServerRegistration.h:
+
2017-08-25 Michael Catanzaro <mcatanz...@igalia.com>
Unreviewed, add comment warning that some flags have been copied into Epiphany
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (221197 => 221198)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-08-25 18:57:44 UTC (rev 221198)
@@ -2297,6 +2297,9 @@
517A52F11F4754E700DCDC0A /* SWServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A52EF1F47535900DCDC0A /* SWServer.cpp */; };
517A531C1F4B53B100DCDC0A /* SWClientConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A52FE1F478CCE00DCDC0A /* SWClientConnection.cpp */; };
517A531D1F4B53B100DCDC0A /* SWClientConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 517A52FF1F478CCE00DCDC0A /* SWClientConnection.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 517A53251F4B905500DCDC0A /* ServiceWorkerJobData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A53241F4B904A00DCDC0A /* ServiceWorkerJobData.cpp */; };
+ 517A53281F4B90B900DCDC0A /* ServiceWorkerRegistrationKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A53271F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.cpp */; };
+ 517A53291F4B90B900DCDC0A /* ServiceWorkerRegistrationKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 517A53261F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
517A63C31B74318700E7DCDC /* KeyedDecoderCF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A63BF1B74317E00E7DCDC /* KeyedDecoderCF.cpp */; };
517A63C41B74318B00E7DCDC /* KeyedEncoderCF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517A63C11B74317E00E7DCDC /* KeyedEncoderCF.cpp */; };
517A63C51B74318F00E7DCDC /* KeyedDecoderCF.h in Headers */ = {isa = PBXBuildFile; fileRef = 517A63C01B74317E00E7DCDC /* KeyedDecoderCF.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -2464,13 +2467,15 @@
51F175661F3EBC8300C74950 /* ServiceWorkerProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F1754E1F3EBC0C00C74950 /* ServiceWorkerProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
51F175671F3EBC8300C74950 /* ServiceWorkerRegistration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F1754D1F3EBC0C00C74950 /* ServiceWorkerRegistration.cpp */; };
51F175681F3EBC8300C74950 /* ServiceWorkerRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F1754C1F3EBC0C00C74950 /* ServiceWorkerRegistration.h */; };
- 51F175691F3EBC8300C74950 /* ServiceWorkerRegistrationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F1754A1F3EBC0C00C74950 /* ServiceWorkerRegistrationOptions.h */; };
- 51F1756A1F3EBC8300C74950 /* ServiceWorkerRegistrationParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F175491F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.cpp */; };
- 51F1756B1F3EBC8300C74950 /* ServiceWorkerRegistrationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F175481F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.h */; };
+ 51F175691F3EBC8300C74950 /* ServiceWorkerRegistrationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F1754A1F3EBC0C00C74950 /* ServiceWorkerRegistrationOptions.h */; settings = {ATTRIBUTES = (Private, ); }; };
51F1756C1F3EBC8300C74950 /* ServiceWorkerUpdateViaCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F175471F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.h */; };
51F645621F45398F00B54DED /* ExceptionData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F645601F45398B00B54DED /* ExceptionData.h */; settings = {ATTRIBUTES = (Private, ); }; };
51F645691F4539B900B54DED /* ServiceWorkerJobData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F645661F45399F00B54DED /* ServiceWorkerJobData.h */; settings = {ATTRIBUTES = (Private, ); }; };
51F6456A1F4539C000B54DED /* ServiceWorkerJobType.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F645651F45399F00B54DED /* ServiceWorkerJobType.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 51F645961F4A686F00B54DED /* SWServerRegistration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F645951F4A686100B54DED /* SWServerRegistration.cpp */; };
+ 51F645971F4A686F00B54DED /* SWServerRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F645941F4A684F00B54DED /* SWServerRegistration.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 51F645A21F4BF53C00B54DED /* ServiceWorkerRegistrationOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F645A01F4BF51600B54DED /* ServiceWorkerRegistrationOptions.cpp */; };
+ 51F645A41F4C001700B54DED /* ExceptionData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F645A31F4C000C00B54DED /* ExceptionData.cpp */; };
51F798EF1BE880E7008AE491 /* IDBIndexInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51F798EB1BE880D3008AE491 /* IDBIndexInfo.cpp */; };
51F798F01BE880E7008AE491 /* IDBIndexInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F798EC1BE880D3008AE491 /* IDBIndexInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
51F886C01F32923100C193EF /* JSNavigatorServiceWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F886BF1F32920700C193EF /* JSNavigatorServiceWorker.h */; };
@@ -10074,6 +10079,9 @@
517A52EF1F47535900DCDC0A /* SWServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SWServer.cpp; sourceTree = "<group>"; };
517A52FE1F478CCE00DCDC0A /* SWClientConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SWClientConnection.cpp; sourceTree = "<group>"; };
517A52FF1F478CCE00DCDC0A /* SWClientConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWClientConnection.h; sourceTree = "<group>"; };
+ 517A53241F4B904A00DCDC0A /* ServiceWorkerJobData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerJobData.cpp; sourceTree = "<group>"; };
+ 517A53261F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerRegistrationKey.h; sourceTree = "<group>"; };
+ 517A53271F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerRegistrationKey.cpp; sourceTree = "<group>"; };
517A63BF1B74317E00E7DCDC /* KeyedDecoderCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyedDecoderCF.cpp; sourceTree = "<group>"; };
517A63C01B74317E00E7DCDC /* KeyedDecoderCF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyedDecoderCF.h; sourceTree = "<group>"; };
517A63C11B74317E00E7DCDC /* KeyedEncoderCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyedEncoderCF.cpp; sourceTree = "<group>"; };
@@ -10227,8 +10235,6 @@
51F175051F358BDE00C74950 /* JSWorkerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWorkerType.h; sourceTree = "<group>"; };
51F175461F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ServiceWorkerUpdateViaCache.idl; sourceTree = "<group>"; };
51F175471F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerUpdateViaCache.h; sourceTree = "<group>"; };
- 51F175481F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerRegistrationParameters.h; sourceTree = "<group>"; };
- 51F175491F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerRegistrationParameters.cpp; sourceTree = "<group>"; };
51F1754A1F3EBC0C00C74950 /* ServiceWorkerRegistrationOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerRegistrationOptions.h; sourceTree = "<group>"; };
51F1754B1F3EBC0C00C74950 /* ServiceWorkerRegistration.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ServiceWorkerRegistration.idl; sourceTree = "<group>"; };
51F1754C1F3EBC0C00C74950 /* ServiceWorkerRegistration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerRegistration.h; sourceTree = "<group>"; };
@@ -10250,6 +10256,10 @@
51F645601F45398B00B54DED /* ExceptionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExceptionData.h; sourceTree = "<group>"; };
51F645651F45399F00B54DED /* ServiceWorkerJobType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerJobType.h; sourceTree = "<group>"; };
51F645661F45399F00B54DED /* ServiceWorkerJobData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerJobData.h; sourceTree = "<group>"; };
+ 51F645941F4A684F00B54DED /* SWServerRegistration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWServerRegistration.h; sourceTree = "<group>"; };
+ 51F645951F4A686100B54DED /* SWServerRegistration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SWServerRegistration.cpp; sourceTree = "<group>"; };
+ 51F645A01F4BF51600B54DED /* ServiceWorkerRegistrationOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerRegistrationOptions.cpp; sourceTree = "<group>"; };
+ 51F645A31F4C000C00B54DED /* ExceptionData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExceptionData.cpp; sourceTree = "<group>"; };
51F6A3D50663BF04004D2919 /* HTMLCanvasElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLCanvasElement.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
51F6A3D60663BF04004D2919 /* HTMLCanvasElement.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = HTMLCanvasElement.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
51F798EB1BE880D3008AE491 /* IDBIndexInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBIndexInfo.cpp; sourceTree = "<group>"; };
@@ -18659,6 +18669,8 @@
517A52FF1F478CCE00DCDC0A /* SWClientConnection.h */,
517A52EF1F47535900DCDC0A /* SWServer.cpp */,
517A52EE1F47535900DCDC0A /* SWServer.h */,
+ 51F645951F4A686100B54DED /* SWServerRegistration.cpp */,
+ 51F645941F4A684F00B54DED /* SWServerRegistration.h */,
);
path = server;
sourceTree = "<group>";
@@ -18756,6 +18768,7 @@
51F175521F3EBC0C00C74950 /* ServiceWorkerJob.cpp */,
51F175511F3EBC0C00C74950 /* ServiceWorkerJob.h */,
51F175501F3EBC0C00C74950 /* ServiceWorkerJobClient.h */,
+ 517A53241F4B904A00DCDC0A /* ServiceWorkerJobData.cpp */,
51F645661F45399F00B54DED /* ServiceWorkerJobData.h */,
51F645651F45399F00B54DED /* ServiceWorkerJobType.h */,
51F1754F1F3EBC0C00C74950 /* ServiceWorkerProvider.cpp */,
@@ -18763,9 +18776,10 @@
51F1754D1F3EBC0C00C74950 /* ServiceWorkerRegistration.cpp */,
51F1754C1F3EBC0C00C74950 /* ServiceWorkerRegistration.h */,
51F1754B1F3EBC0C00C74950 /* ServiceWorkerRegistration.idl */,
+ 517A53271F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.cpp */,
+ 517A53261F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.h */,
+ 51F645A01F4BF51600B54DED /* ServiceWorkerRegistrationOptions.cpp */,
51F1754A1F3EBC0C00C74950 /* ServiceWorkerRegistrationOptions.h */,
- 51F175491F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.cpp */,
- 51F175481F3EBC0C00C74950 /* ServiceWorkerRegistrationParameters.h */,
51F175471F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.h */,
51F175461F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.idl */,
);
@@ -25875,6 +25889,7 @@
CDCE5CD014633BC900D47CCA /* EventTargetFactory.in */,
93D196321D6CAB8200FC7E47 /* Exception.h */,
935FBCF109BA143B00E230B1 /* ExceptionCode.h */,
+ 51F645A31F4C000C00B54DED /* ExceptionData.cpp */,
51F645601F45398B00B54DED /* ExceptionData.h */,
93D196301D6CAB7600FC7E47 /* ExceptionOr.h */,
E47E276716036EDC00EE2AFB /* ExtensionStyleSheets.cpp */,
@@ -29526,8 +29541,8 @@
51F6456A1F4539C000B54DED /* ServiceWorkerJobType.h in Headers */,
51F175661F3EBC8300C74950 /* ServiceWorkerProvider.h in Headers */,
51F175681F3EBC8300C74950 /* ServiceWorkerRegistration.h in Headers */,
+ 517A53291F4B90B900DCDC0A /* ServiceWorkerRegistrationKey.h in Headers */,
51F175691F3EBC8300C74950 /* ServiceWorkerRegistrationOptions.h in Headers */,
- 51F1756B1F3EBC8300C74950 /* ServiceWorkerRegistrationParameters.h in Headers */,
51F1756C1F3EBC8300C74950 /* ServiceWorkerUpdateViaCache.h in Headers */,
93309E10099E64920056E581 /* SetNodeAttributeCommand.h in Headers */,
B8DBDB4C130B0F8A00F5CDB1 /* SetSelectionCommand.h in Headers */,
@@ -29946,6 +29961,7 @@
B2E4EC980D00C22B00432643 /* SVGZoomEvent.h in Headers */,
517A531D1F4B53B100DCDC0A /* SWClientConnection.h in Headers */,
517A52F01F47535B00DCDC0A /* SWServer.h in Headers */,
+ 51F645971F4A686F00B54DED /* SWServerRegistration.h in Headers */,
E180811716FCF9CB00B80D07 /* SynchronousLoaderClient.h in Headers */,
26FAE4CF1852E3A5004C8C46 /* SynchronousResourceHandleCFURLConnectionDelegate.h in Headers */,
0F03C0741884695E00A5F8CA /* SystemMemory.h in Headers */,
@@ -31356,6 +31372,7 @@
E0FEF372B27C53EAC1C1FBEE /* EventSource.cpp in Sources */,
E12EDBEA0B308E0B002704B6 /* EventTarget.cpp in Sources */,
262EC41D1D110B9000BA78FC /* EventTrackingRegions.cpp in Sources */,
+ 51F645A41F4C001700B54DED /* ExceptionData.cpp in Sources */,
724ED32C1A3A7E5400F5F13C /* EXTBlendMinMax.cpp in Sources */,
31DCDF431DA1C45400EA5B93 /* ExtendedColor.cpp in Sources */,
6E67D2A61280E8A4008758F7 /* Extensions3DOpenGL.cpp in Sources */,
@@ -33394,9 +33411,11 @@
51F1755E1F3EBC8300C74950 /* ServiceWorkerContainer.cpp in Sources */,
51F175601F3EBC8300C74950 /* ServiceWorkerGlobalScope.cpp in Sources */,
51F175621F3EBC8300C74950 /* ServiceWorkerJob.cpp in Sources */,
+ 517A53251F4B905500DCDC0A /* ServiceWorkerJobData.cpp in Sources */,
51F175651F3EBC8300C74950 /* ServiceWorkerProvider.cpp in Sources */,
51F175671F3EBC8300C74950 /* ServiceWorkerRegistration.cpp in Sources */,
- 51F1756A1F3EBC8300C74950 /* ServiceWorkerRegistrationParameters.cpp in Sources */,
+ 517A53281F4B90B900DCDC0A /* ServiceWorkerRegistrationKey.cpp in Sources */,
+ 51F645A21F4BF53C00B54DED /* ServiceWorkerRegistrationOptions.cpp in Sources */,
93309E0F099E64920056E581 /* SetNodeAttributeCommand.cpp in Sources */,
B8DBDB4B130B0F8A00F5CDB1 /* SetSelectionCommand.cpp in Sources */,
14C9A5EA0B3D105F005A0232 /* Settings.cpp in Sources */,
@@ -33701,6 +33720,7 @@
B2E4EC970D00C22B00432643 /* SVGZoomEvent.cpp in Sources */,
517A531C1F4B53B100DCDC0A /* SWClientConnection.cpp in Sources */,
517A52F11F4754E700DCDC0A /* SWServer.cpp in Sources */,
+ 51F645961F4A686F00B54DED /* SWServerRegistration.cpp in Sources */,
E180811216FCF42F00B80D07 /* SynchronousLoaderClient.cpp in Sources */,
E180811616FCF9CB00B80D07 /* SynchronousLoaderClient.mm in Sources */,
442ABCD617D9262F00D30715 /* SynchronousLoaderClientCFNet.cpp in Sources */,
Copied: trunk/Source/WebCore/dom/ExceptionData.cpp (from rev 221197, trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.cpp) (0 => 221198)
--- trunk/Source/WebCore/dom/ExceptionData.cpp (rev 0)
+++ trunk/Source/WebCore/dom/ExceptionData.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2017 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 "ExceptionData.h"
+
+namespace WebCore {
+
+ExceptionData ExceptionData::isolatedCopy() const
+{
+ ExceptionData result;
+ result.code = code;
+ result.message = message.isolatedCopy();
+
+ return result;
+}
+
+} // namespace WebCore
Modified: trunk/Source/WebCore/dom/ExceptionData.h (221197 => 221198)
--- trunk/Source/WebCore/dom/ExceptionData.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/dom/ExceptionData.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -34,6 +34,8 @@
ExceptionCode code;
String message;
+ ExceptionData isolatedCopy() const;
+
template<class Encoder> void encode(Encoder&) const;
template<class Decoder> static bool decode(Decoder&, ExceptionData&);
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -34,8 +34,8 @@
#include "ScriptExecutionContext.h"
#include "SecurityOrigin.h"
#include "ServiceWorkerJob.h"
+#include "ServiceWorkerJobData.h"
#include "ServiceWorkerProvider.h"
-#include "ServiceWorkerRegistrationParameters.h"
#include "URL.h"
#include <wtf/RunLoop.h>
@@ -88,20 +88,21 @@
return;
}
- ServiceWorkerRegistrationParameters parameters;
- parameters.scriptURL = context->completeURL(relativeScriptURL);
- if (!parameters.scriptURL.isValid()) {
+ ServiceWorkerJobData jobData(m_swConnection->identifier());
+
+ jobData.scriptURL = context->completeURL(relativeScriptURL);
+ if (!jobData.scriptURL.isValid()) {
promise->reject(Exception { TypeError, ASCIILiteral("serviceWorker.register() must be called with a valid relative script URL") });
return;
}
// FIXME: The spec disallows scripts outside of HTTP(S), but we'll likely support app custom URL schemes in WebKit.
- if (!parameters.scriptURL.protocolIsInHTTPFamily()) {
+ if (!jobData.scriptURL.protocolIsInHTTPFamily()) {
promise->reject(Exception { TypeError, ASCIILiteral("serviceWorker.register() must be called with a script URL whose protocol is either HTTP or HTTPS") });
return;
}
- String path = parameters.scriptURL.path();
+ String path = jobData.scriptURL.path();
if (path.containsIgnoringASCIICase("%2f") || path.containsIgnoringASCIICase("%5c")) {
promise->reject(Exception { TypeError, ASCIILiteral("serviceWorker.register() must be called with a script URL whose path does not contain '%%2f' or '%%5c'") });
return;
@@ -109,13 +110,14 @@
String scope = options.scope.isEmpty() ? ASCIILiteral("./") : options.scope;
if (!scope.isEmpty())
- parameters.scopeURL = context->completeURL(scope);
+ jobData.scopeURL = context->completeURL(scope);
- parameters.clientCreationURL = context->url();
- parameters.topOrigin = SecurityOriginData::fromSecurityOrigin(context->topOrigin());
- parameters.options = options;
+ jobData.clientCreationURL = context->url();
+ jobData.topOrigin = SecurityOriginData::fromSecurityOrigin(context->topOrigin());
+ jobData.type = ServiceWorkerJobType::Register;
+ jobData.registrationOptions = std::make_unique<RegistrationOptions>(options);
- scheduleJob(ServiceWorkerJob::createRegisterJob(*this, WTFMove(promise), WTFMove(parameters)));
+ scheduleJob(ServiceWorkerJob::create(*this, WTFMove(promise), WTFMove(jobData)));
}
void ServiceWorkerContainer::scheduleJob(Ref<ServiceWorkerJob>&& job)
@@ -149,6 +151,12 @@
ASSERT_UNUSED(taken, taken.get() == &job);
}
+uint64_t ServiceWorkerContainer::connectionIdentifier()
+{
+ ASSERT(m_swConnection);
+ return m_swConnection->identifier();
+}
+
const char* ServiceWorkerContainer::activeDOMObjectName() const
{
return "ServiceWorkerContainer";
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -71,6 +71,7 @@
private:
void scheduleJob(Ref<ServiceWorkerJob>&&);
void jobDidFinish(ServiceWorkerJob&) final;
+ uint64_t connectionIdentifier() final;
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJob.cpp (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerJob.cpp 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJob.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -30,18 +30,17 @@
#include "JSDOMPromiseDeferred.h"
#include "ServiceWorkerJobData.h"
-#include "ServiceWorkerRegistrationParameters.h"
namespace WebCore {
static std::atomic<uint64_t> currentIdentifier;
-ServiceWorkerJob::ServiceWorkerJob(ServiceWorkerJobClient& client, Ref<DeferredPromise>&& promise, ServiceWorkerRegistrationParameters&& parameters)
+ServiceWorkerJob::ServiceWorkerJob(ServiceWorkerJobClient& client, Ref<DeferredPromise>&& promise, ServiceWorkerJobData&& jobData)
: m_client(client)
+ , m_jobData(WTFMove(jobData))
, m_promise(WTFMove(promise))
, m_identifier(++currentIdentifier)
{
- m_registrationParameters = std::make_unique<ServiceWorkerRegistrationParameters>(WTFMove(parameters));
}
ServiceWorkerJob::~ServiceWorkerJob()
@@ -61,11 +60,6 @@
m_client->jobDidFinish(*this);
}
-ServiceWorkerJobData ServiceWorkerJob::data() const
-{
- return { m_identifier, m_type };
-}
-
} // namespace WebCore
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJob.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerJob.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJob.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -28,6 +28,7 @@
#if ENABLE(SERVICE_WORKER)
#include "ServiceWorkerJobClient.h"
+#include "ServiceWorkerJobData.h"
#include <wtf/RefPtr.h>
#include <wtf/RunLoop.h>
#include <wtf/ThreadSafeRefCounted.h>
@@ -38,14 +39,12 @@
class DeferredPromise;
class Exception;
enum class ServiceWorkerJobType;
-struct ServiceWorkerJobData;
-struct ServiceWorkerRegistrationParameters;
class ServiceWorkerJob : public ThreadSafeRefCounted<ServiceWorkerJob> {
public:
- static Ref<ServiceWorkerJob> createRegisterJob(ServiceWorkerJobClient& client, Ref<DeferredPromise>&& promise, ServiceWorkerRegistrationParameters&& parameters)
+ static Ref<ServiceWorkerJob> create(ServiceWorkerJobClient& client, Ref<DeferredPromise>&& promise, ServiceWorkerJobData&& jobData)
{
- return adoptRef(*new ServiceWorkerJob(client, WTFMove(promise), WTFMove(parameters)));
+ return adoptRef(*new ServiceWorkerJob(client, WTFMove(promise), WTFMove(jobData)));
}
WEBCORE_EXPORT ~ServiceWorkerJob();
@@ -54,20 +53,18 @@
uint64_t identifier() const { return m_identifier; }
- ServiceWorkerJobData data() const;
+ ServiceWorkerJobData data() const { return m_jobData; }
private:
- ServiceWorkerJob(ServiceWorkerJobClient&, Ref<DeferredPromise>&&, ServiceWorkerRegistrationParameters&&);
+ ServiceWorkerJob(ServiceWorkerJobClient&, Ref<DeferredPromise>&&, ServiceWorkerJobData&&);
Ref<ServiceWorkerJobClient> m_client;
- std::unique_ptr<ServiceWorkerRegistrationParameters> m_registrationParameters;
+ ServiceWorkerJobData m_jobData;
Ref<DeferredPromise> m_promise;
bool m_completed { false };
uint64_t m_identifier;
- ServiceWorkerJobType m_type;
-
Ref<RunLoop> m_runLoop { RunLoop::current() };
#if !ASSERT_DISABLED
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJobClient.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerJobClient.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobClient.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -36,6 +36,7 @@
virtual ~ServiceWorkerJobClient() { };
virtual void jobDidFinish(ServiceWorkerJob&) = 0;
+ virtual uint64_t connectionIdentifier() = 0;
virtual void ref() = 0;
virtual void deref() = 0;
Copied: trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp (from rev 221197, trunk/Source/WebCore/workers/service/server/SWServer.cpp) (0 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2017 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 "ServiceWorkerJobData.h"
+
+#if ENABLE(SERVICE_WORKER)
+
+namespace WebCore {
+
+static std::atomic<uint64_t> currentJobIdentifier;
+
+ServiceWorkerJobData::ServiceWorkerJobData(uint64_t connectionIdentifier)
+ : m_jobIdentifier(++currentJobIdentifier)
+ , m_connectionIdentifier(connectionIdentifier)
+{
+}
+
+ServiceWorkerJobData::ServiceWorkerJobData(const ServiceWorkerJobData& other)
+{
+ m_jobIdentifier = other.m_jobIdentifier;
+ m_connectionIdentifier = other.m_connectionIdentifier;
+ scriptURL = other.scriptURL;
+ clientCreationURL = other.clientCreationURL;
+ topOrigin = other.topOrigin;
+ scopeURL = other.scopeURL;
+ type = other.type;
+
+ if (other.registrationOptions)
+ registrationOptions = std::make_unique<RegistrationOptions>(*other.registrationOptions);
+}
+
+ServiceWorkerRegistrationKey ServiceWorkerJobData::registrationKey() const
+{
+ return { clientCreationURL, topOrigin };
+}
+
+ServiceWorkerJobData ServiceWorkerJobData::isolatedCopy() const
+{
+ ServiceWorkerJobData result;
+ result.m_jobIdentifier = m_jobIdentifier;
+ result.m_connectionIdentifier = m_connectionIdentifier;
+ result.type = type;
+
+ result.scriptURL = scriptURL.isolatedCopy();
+ result.clientCreationURL = clientCreationURL.isolatedCopy();
+ result.topOrigin = topOrigin.isolatedCopy();
+ result.scopeURL = scopeURL.isolatedCopy();
+
+ if (registrationOptions)
+ result.registrationOptions = std::make_unique<RegistrationOptions>(registrationOptions->isolatedCopy());
+ return result;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -27,33 +27,81 @@
#if ENABLE(SERVICE_WORKER)
+#include "SecurityOriginData.h"
+#include "ServiceWorkerJobType.h"
+#include "ServiceWorkerRegistrationKey.h"
+#include "ServiceWorkerRegistrationOptions.h"
+#include "URL.h"
+
namespace WebCore {
-enum class ServiceWorkerJobType;
+struct ServiceWorkerJobData {
+public:
+ explicit ServiceWorkerJobData(uint64_t connectionIdentifier);
+ ServiceWorkerJobData(const ServiceWorkerJobData&);
+ ServiceWorkerJobData() = default;
-struct ServiceWorkerJobData {
- uint64_t identifier;
+ uint64_t jobIdentifier() const { return m_jobIdentifier; }
+ uint64_t connectionIdentifier() const { return m_connectionIdentifier; }
+
+ URL scriptURL;
+ URL clientCreationURL;
+ SecurityOriginData topOrigin;
+ URL scopeURL;
ServiceWorkerJobType type;
+ std::unique_ptr<RegistrationOptions> registrationOptions;
+
+ ServiceWorkerRegistrationKey registrationKey() const;
+ ServiceWorkerJobData isolatedCopy() const;
+
template<class Encoder> void encode(Encoder&) const;
template<class Decoder> static bool decode(Decoder&, ServiceWorkerJobData&);
+
+private:
+ uint64_t m_jobIdentifier { 0 };
+ uint64_t m_connectionIdentifier { 0 };
};
template<class Encoder>
void ServiceWorkerJobData::encode(Encoder& encoder) const
{
- encoder << identifier;
+ encoder << m_jobIdentifier << m_connectionIdentifier << scriptURL << clientCreationURL << topOrigin << scopeURL;
encoder.encodeEnum(type);
+ switch (type) {
+ case ServiceWorkerJobType::Register:
+ RELEASE_ASSERT(registrationOptions);
+ encoder << *registrationOptions;
+ break;
+ }
}
template<class Decoder>
bool ServiceWorkerJobData::decode(Decoder& decoder, ServiceWorkerJobData& jobData)
{
- if (!decoder.decode(jobData.identifier))
+ if (!decoder.decode(jobData.m_jobIdentifier))
return false;
+ if (!decoder.decode(jobData.m_connectionIdentifier))
+ return false;
+ if (!decoder.decode(jobData.scriptURL))
+ return false;
+ if (!decoder.decode(jobData.clientCreationURL))
+ return false;
+ if (!decoder.decode(jobData.topOrigin))
+ return false;
+ if (!decoder.decode(jobData.scopeURL))
+ return false;
if (!decoder.decodeEnum(jobData.type))
return false;
+ switch (jobData.type) {
+ case ServiceWorkerJobType::Register:
+ jobData.registrationOptions = std::make_unique<RegistrationOptions>();
+ if (!decoder.decode(*jobData.registrationOptions))
+ return false;
+ break;
+ }
+
return true;
}
Copied: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.cpp (from rev 221197, trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.cpp) (0 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.cpp (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 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 "ServiceWorkerRegistrationKey.h"
+
+#if ENABLE(SERVICE_WORKER)
+
+#include "URLHash.h"
+
+namespace WebCore {
+
+ServiceWorkerRegistrationKey ServiceWorkerRegistrationKey::emptyKey()
+{
+ return { };
+}
+
+unsigned ServiceWorkerRegistrationKey::hash() const
+{
+ unsigned hashes[2];
+ hashes[0] = URLHash::hash(clientCreationURL);
+ hashes[1] = SecurityOriginDataHash::hash(topOrigin);
+
+ return StringHasher::hashMemory(hashes, sizeof(hashes));
+}
+
+bool ServiceWorkerRegistrationKey::operator==(const ServiceWorkerRegistrationKey& other) const
+{
+ return clientCreationURL == other.clientCreationURL && topOrigin == other.topOrigin;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Copied: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.h (from rev 221197, trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.h) (0 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.h (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationKey.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2017 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(SERVICE_WORKER)
+
+#include "SecurityOriginData.h"
+#include "URL.h"
+
+namespace WebCore {
+
+struct ServiceWorkerRegistrationKey {
+ URL clientCreationURL;
+ SecurityOriginData topOrigin;
+
+ static ServiceWorkerRegistrationKey emptyKey();
+ unsigned hash() const;
+
+ bool operator==(const ServiceWorkerRegistrationKey&) const;
+};
+
+} // namespace WebCore
+
+namespace WTF {
+
+struct ServiceWorkerRegistrationKeyHash {
+ static unsigned hash(const WebCore::ServiceWorkerRegistrationKey& key) { return key.hash(); }
+ static bool equal(const WebCore::ServiceWorkerRegistrationKey& a, const WebCore::ServiceWorkerRegistrationKey& b) { return a == b; }
+ static const bool safeToCompareToEmptyOrDeleted = false;
+};
+
+template<> struct HashTraits<WebCore::ServiceWorkerRegistrationKey> : GenericHashTraits<WebCore::ServiceWorkerRegistrationKey> {
+ static WebCore::ServiceWorkerRegistrationKey emptyValue() { return WebCore::ServiceWorkerRegistrationKey::emptyKey(); }
+
+ static void constructDeletedValue(WebCore::ServiceWorkerRegistrationKey& slot) { slot.clientCreationURL = WebCore::URL(HashTableDeletedValue); }
+ static bool isDeletedValue(const WebCore::ServiceWorkerRegistrationKey& slot) { return slot.clientCreationURL.isHashTableDeletedValue(); }
+};
+
+template<> struct DefaultHash<WebCore::ServiceWorkerRegistrationKey> {
+ typedef ServiceWorkerRegistrationKeyHash Hash;
+};
+
+} // namespace WTF
+
+#endif // ENABLE(SERVICE_WORKER)
Copied: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.cpp (from rev 221197, trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.h) (0 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.cpp (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2017 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 "ServiceWorkerRegistrationOptions.h"
+
+#if ENABLE(SERVICE_WORKER)
+
+namespace WebCore {
+
+RegistrationOptions RegistrationOptions::isolatedCopy() const
+{
+ RegistrationOptions result;
+ result.scope = scope.isolatedCopy();
+ result.type = type;
+ result.updateViaCache = updateViaCache;
+
+ return result;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationOptions.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -38,8 +38,34 @@
String scope;
WorkerType type;
ServiceWorkerUpdateViaCache updateViaCache;
+
+ RegistrationOptions isolatedCopy() const;
+
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static bool decode(Decoder&, RegistrationOptions&);
};
+template<class Encoder>
+void RegistrationOptions::encode(Encoder& encoder) const
+{
+ encoder << scope;
+ encoder.encodeEnum(type);
+ encoder.encodeEnum(updateViaCache);
+}
+
+template<class Decoder>
+bool RegistrationOptions::decode(Decoder& decoder, RegistrationOptions& options)
+{
+ if (!decoder.decode(options.scope))
+ return false;
+ if (!decoder.decodeEnum(options.type))
+ return false;
+ if (!decoder.decodeEnum(options.updateViaCache))
+ return false;
+
+ return true;
+}
+
} // namespace WebCore
#endif // ENABLE(SERVICE_WORKER)
Deleted: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.cpp (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.cpp 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2017 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 "ServiceWorkerRegistrationParameters.h"
-
-#if ENABLE(SERVICE_WORKER)
-
-namespace WebCore {
-
-} // namespace WebCore
-
-#endif // ENABLE(SERVICE_WORKER)
Deleted: trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistrationParameters.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2017 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(SERVICE_WORKER)
-
-#include "SecurityOriginData.h"
-#include "ServiceWorkerRegistrationOptions.h"
-#include "URL.h"
-#include <pal/SessionID.h>
-
-namespace WebCore {
-
-struct ServiceWorkerRegistrationParameters {
- URL scriptURL;
- URL clientCreationURL;
- SecurityOriginData topOrigin;
- URL scopeURL;
- RegistrationOptions options;
-};
-
-} // namespace WebCore
-
-#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/server/SWClientConnection.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/server/SWClientConnection.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/server/SWClientConnection.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -42,6 +42,8 @@
void scheduleJob(ServiceWorkerJob&);
+ virtual uint64_t identifier() const = 0;
+
protected:
WEBCORE_EXPORT void jobRejectedInServer(uint64_t jobIdentifier, const ExceptionData&);
Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (221197 => 221198)
--- trunk/Source/WebCore/workers/service/server/SWServer.cpp 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -31,13 +31,15 @@
#include "ExceptionCode.h"
#include "ExceptionData.h"
#include "Logging.h"
+#include "SWServerRegistration.h"
#include "ServiceWorkerJobData.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
-SWServer::Connection::Connection(SWServer& server)
+SWServer::Connection::Connection(SWServer& server, uint64_t identifier)
: m_server(server)
+ , m_identifier(identifier)
{
m_server.registerConnection(*this);
}
@@ -47,34 +49,108 @@
m_server.unregisterConnection(*this);
}
-
SWServer::~SWServer()
{
RELEASE_ASSERT(m_connections.isEmpty());
+ RELEASE_ASSERT(m_registrations.isEmpty());
+
+ // For a SWServer to be cleanly shut down its thread must have finished and gone away.
+ // At this stage in development of the feature that actually never happens.
+ // But once it does start happening, this ASSERT will catch us doing it wrong.
+ Locker<Lock> locker(m_taskThreadLock);
+ ASSERT(!m_taskThread);
}
void SWServer::Connection::scheduleJobInServer(const ServiceWorkerJobData& jobData)
{
- LOG(ServiceWorker, "Scheduling ServiceWorker job %" PRIu64 " in server", jobData.identifier);
- m_server.scheduleJob(*this, jobData);
+ LOG(ServiceWorker, "Scheduling ServiceWorker job %" PRIu64 "-%" PRIu64 " in server", jobData.connectionIdentifier(), jobData.jobIdentifier());
+ ASSERT(identifier() == jobData.connectionIdentifier());
+
+ m_server.scheduleJob(jobData);
}
-void SWServer::scheduleJob(Connection& connection, const ServiceWorkerJobData& jobData)
+SWServer::SWServer()
{
- // FIXME: For now, all scheduled jobs immediately reject.
- connection.rejectJobInClient(jobData.identifier, ExceptionData { UnknownError, ASCIILiteral("serviceWorker job scheduling is not yet implemented") });
+ m_taskThread = Thread::create(ASCIILiteral("ServiceWorker Task Thread"), [this] {
+ taskThreadEntryPoint();
+ });
}
+void SWServer::scheduleJob(const ServiceWorkerJobData& jobData)
+{
+ ASSERT(m_connections.contains(jobData.connectionIdentifier()));
+
+ auto result = m_registrations.add(jobData.registrationKey(), nullptr);
+ if (result.isNewEntry)
+ result.iterator->value = std::make_unique<SWServerRegistration>(*this);
+
+ ASSERT(result.iterator->value);
+
+ result.iterator->value->enqueueJob(jobData);
+}
+
+void SWServer::rejectJob(const ServiceWorkerJobData& jobData, const ExceptionData& exceptionData)
+{
+ LOG(ServiceWorker, "Rejected ServiceWorker job %" PRIu64 "-%" PRIu64 " in server", jobData.connectionIdentifier(), jobData.jobIdentifier());
+ auto* connection = m_connections.get(jobData.connectionIdentifier());
+ if (!connection)
+ return;
+
+ connection->rejectJobInClient(jobData.jobIdentifier(), exceptionData);
+}
+
+void SWServer::taskThreadEntryPoint()
+{
+ ASSERT(!isMainThread());
+
+ while (!m_taskQueue.isKilled())
+ m_taskQueue.waitForMessage().performTask();
+
+ Locker<Lock> locker(m_taskThreadLock);
+ m_taskThread = nullptr;
+}
+
+void SWServer::postTask(CrossThreadTask&& task)
+{
+ m_taskQueue.append(WTFMove(task));
+}
+
+void SWServer::postTaskReply(CrossThreadTask&& task)
+{
+ m_taskReplyQueue.append(WTFMove(task));
+
+ Locker<Lock> locker(m_mainThreadReplyLock);
+ if (m_mainThreadReplyScheduled)
+ return;
+
+ m_mainThreadReplyScheduled = true;
+ callOnMainThread([this] {
+ handleTaskRepliesOnMainThread();
+ });
+}
+
+void SWServer::handleTaskRepliesOnMainThread()
+{
+ {
+ Locker<Lock> locker(m_mainThreadReplyLock);
+ m_mainThreadReplyScheduled = false;
+ }
+
+ while (auto task = m_taskReplyQueue.tryGetMessage())
+ task->performTask();
+}
+
void SWServer::registerConnection(Connection& connection)
{
- auto result = m_connections.add(&connection);
- ASSERT_UNUSED(result, result.isNewEntry);
+ auto result = m_connections.add(connection.identifier(), nullptr);
+ ASSERT(result.isNewEntry);
+ result.iterator->value = &connection;
}
void SWServer::unregisterConnection(Connection& connection)
{
- ASSERT(m_connections.contains(&connection));
- m_connections.remove(&connection);
+ ASSERT(m_connections.get(connection.identifier()) == &connection);
+ m_connections.remove(connection.identifier());
}
} // namespace WebCore
Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (221197 => 221198)
--- trunk/Source/WebCore/workers/service/server/SWServer.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -27,13 +27,20 @@
#if ENABLE(SERVICE_WORKER)
+#include "SWServerRegistration.h"
#include "ServiceWorkerJob.h"
+#include "ServiceWorkerRegistrationKey.h"
+#include <wtf/CrossThreadQueue.h>
+#include <wtf/CrossThreadTask.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
+#include <wtf/RunLoop.h>
#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/Threading.h>
namespace WebCore {
+class SWServerRegistration;
struct ExceptionData;
class SWServer {
@@ -43,8 +50,10 @@
public:
WEBCORE_EXPORT virtual ~Connection();
+ uint64_t identifier() const { return m_identifier; };
+
protected:
- WEBCORE_EXPORT Connection(SWServer&);
+ WEBCORE_EXPORT Connection(SWServer&, uint64_t identifier);
SWServer& server() { return m_server; }
WEBCORE_EXPORT void scheduleJobInServer(const ServiceWorkerJobData&);
@@ -53,17 +62,36 @@
virtual void rejectJobInClient(uint64_t jobIdentifier, const ExceptionData&) = 0;
SWServer& m_server;
+ uint64_t m_identifier;
};
+ WEBCORE_EXPORT SWServer();
WEBCORE_EXPORT ~SWServer();
- WEBCORE_EXPORT void scheduleJob(Connection&, const ServiceWorkerJobData&);
+ void scheduleJob(const ServiceWorkerJobData&);
+ void rejectJob(const ServiceWorkerJobData&, const ExceptionData&);
+ void postTask(CrossThreadTask&&);
+ void postTaskReply(CrossThreadTask&&);
+
private:
void registerConnection(Connection&);
void unregisterConnection(Connection&);
- HashSet<Connection*> m_connections;
+ void taskThreadEntryPoint();
+ void handleTaskRepliesOnMainThread();
+
+ HashMap<uint64_t, Connection*> m_connections;
+ HashMap<ServiceWorkerRegistrationKey, std::unique_ptr<SWServerRegistration>> m_registrations;
+
+ RefPtr<Thread> m_taskThread;
+ Lock m_taskThreadLock;
+
+ CrossThreadQueue<CrossThreadTask> m_taskQueue;
+ CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
+
+ Lock m_mainThreadReplyLock;
+ bool m_mainThreadReplyScheduled { false };
};
} // namespace WebCore
Added: trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp (0 => 221198)
--- trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp (rev 0)
+++ trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017 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 "SWServerRegistration.h"
+
+#if ENABLE(SERVICE_WORKER)
+
+#include "ExceptionData.h"
+#include "SWServer.h"
+
+namespace WebCore {
+
+SWServerRegistration::SWServerRegistration(SWServer& server)
+ : m_jobTimer(*this, &SWServerRegistration::startNextJob)
+ , m_server(server)
+{
+}
+
+SWServerRegistration::~SWServerRegistration()
+{
+ ASSERT(m_jobQueue.isEmpty());
+}
+
+void SWServerRegistration::enqueueJob(const ServiceWorkerJobData& jobData)
+{
+ // FIXME: Per the spec, check if this job is equivalent to the last job on the queue.
+ // If it is, stack it along with that job.
+
+ m_jobQueue.append(jobData);
+
+ if (m_currentJob)
+ return;
+
+ if (!m_jobTimer.isActive())
+ m_jobTimer.startOneShot(0_s);
+}
+
+void SWServerRegistration::startNextJob()
+{
+ ASSERT(isMainThread());
+ ASSERT(!m_currentJob);
+ ASSERT(!m_jobQueue.isEmpty());
+
+ m_currentJob = std::make_unique<ServiceWorkerJobData>(m_jobQueue.takeFirst().isolatedCopy());
+ m_server.postTask(createCrossThreadTask(*this, &SWServerRegistration::performCurrentJob));
+}
+
+void SWServerRegistration::performCurrentJob()
+{
+ ASSERT(!isMainThread());
+
+ auto exception = ExceptionData { UnknownError, ASCIILiteral("serviceWorker job scheduling is not yet implemented") };
+ m_server.postTaskReply(createCrossThreadTask(*this, &SWServerRegistration::rejectCurrentJob, exception));
+}
+
+void SWServerRegistration::rejectCurrentJob(const ExceptionData& exceptionData)
+{
+ ASSERT(isMainThread());
+ ASSERT(m_currentJob);
+
+ m_server.rejectJob(*m_currentJob, exceptionData);
+
+ finishCurrentJob();
+}
+
+void SWServerRegistration::finishCurrentJob()
+{
+ ASSERT(m_currentJob);
+ ASSERT(!m_jobTimer.isActive());
+
+ m_currentJob = nullptr;
+ if (m_jobQueue.isEmpty())
+ return;
+
+ startNextJob();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Copied: trunk/Source/WebCore/workers/service/server/SWServerRegistration.h (from rev 221197, trunk/Source/WebCore/workers/service/server/SWClientConnection.h) (0 => 221198)
--- trunk/Source/WebCore/workers/service/server/SWServerRegistration.h (rev 0)
+++ trunk/Source/WebCore/workers/service/server/SWServerRegistration.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 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(SERVICE_WORKER)
+
+#include "ServiceWorkerJobData.h"
+#include "Timer.h"
+#include <wtf/Deque.h>
+
+namespace WebCore {
+
+class SWServer;
+struct ExceptionData;
+
+class SWServerRegistration {
+public:
+ explicit SWServerRegistration(SWServer&);
+ SWServerRegistration(const SWServerRegistration&) = delete;
+ ~SWServerRegistration();
+
+ void enqueueJob(const ServiceWorkerJobData&);
+
+private:
+ void jobTimerFired();
+ void performCurrentJob();
+ void rejectCurrentJob(const ExceptionData&);
+
+ void startNextJob();
+ void finishCurrentJob();
+
+ Deque<ServiceWorkerJobData> m_jobQueue;
+ std::unique_ptr<ServiceWorkerJobData> m_currentJob;
+
+ Timer m_jobTimer;
+ SWServer& m_server;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebKit/ChangeLog (221197 => 221198)
--- trunk/Source/WebKit/ChangeLog 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebKit/ChangeLog 2017-08-25 18:57:44 UTC (rev 221198)
@@ -1,3 +1,18 @@
+2017-08-25 Brady Eidson <beid...@apple.com>
+
+ Introduce ServerWorkerRegistration task queues.
+ https://bugs.webkit.org/show_bug.cgi?id=175851
+
+ Reviewed by Andy Estes.
+
+ * StorageProcess/ServiceWorker/WebSWServerConnection.cpp:
+ (WebKit::WebSWServerConnection::WebSWServerConnection):
+ * StorageProcess/ServiceWorker/WebSWServerConnection.h:
+ (WebKit::WebSWServerConnection::identifier const): Deleted.
+
+ * WebProcess/Storage/WebSWClientConnection.h:
+ (WebKit::WebSWClientConnection::identifier const): Deleted.
+
2017-08-25 Youenn Fablet <you...@apple.com>
[Cache API] UIProcess should provide the directory path where to store Cache Storage data
Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp (221197 => 221198)
--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp 2017-08-25 18:57:44 UTC (rev 221198)
@@ -45,9 +45,8 @@
namespace WebKit {
WebSWServerConnection::WebSWServerConnection(SWServer& server, IPC::Connection& connection, uint64_t connectionIdentifier, const SessionID& sessionID)
- : SWServer::Connection(server)
+ : SWServer::Connection(server, connectionIdentifier)
, m_sessionID(sessionID)
- , m_identifier(connectionIdentifier)
, m_connection(connection)
{
}
Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (221197 => 221198)
--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -44,8 +44,6 @@
WebSWServerConnection(const WebSWServerConnection&) = delete;
~WebSWServerConnection() final;
- uint64_t identifier() const { return m_identifier; }
-
void disconnectedFromWebProcess();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -54,10 +52,9 @@
void rejectJobInClient(uint64_t jobIdentifier, const WebCore::ExceptionData&) final;
IPC::Connection* messageSenderConnection() final { return m_connection.ptr(); }
- uint64_t messageSenderDestinationID() final { return m_identifier; }
+ uint64_t messageSenderDestinationID() final { return identifier(); }
PAL::SessionID m_sessionID;
- uint64_t m_identifier;
Ref<IPC::Connection> m_connection;
}; // class WebSWServerConnection
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (221197 => 221198)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2017-08-25 18:54:55 UTC (rev 221197)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2017-08-25 18:57:44 UTC (rev 221198)
@@ -45,7 +45,7 @@
WebSWClientConnection(const WebSWClientConnection&) = delete;
~WebSWClientConnection() final;
- uint64_t identifier() const { return m_identifier; }
+ uint64_t identifier() const final { return m_identifier; }
void scheduleJobInServer(const WebCore::ServiceWorkerJobData&) final;