Title: [225031] trunk
Revision
225031
Author
[email protected]
Date
2017-11-18 23:19:00 -0800 (Sat, 18 Nov 2017)

Log Message

ASSERTION FAILED: registration in WebCore::SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier)
https://bugs.webkit.org/show_bug.cgi?id=179846

Reviewed by Darin Adler.

Source/WebCore:

We have seen crashes on the bots in SWServerJobQueue because methods such as scriptContextStarted()
can get called after the jobQueue has been cleared. This is because when a jobQueue is cleared,
an asynchronous operation may be pending (e.g. script fetch, service worker starting, install event).

To address the issue, we now pass the identifier of the job that started the asynchronous operation
when calling the methods on SWServerJobQueue. If the identifier does not match the identifier of
the current job in the JobQueue, we ignore it.

This patch also starts using a strongly typed identifier (ServiceWorkerJobIdentifier) for
ServiceWorkerJob, instead of a uint64_t. It also introduces a ServiceWorkerJobDataIdentifier type
which contains both a SWServerConnectionIdentifier and a ServiceWorkerJobIdentifier. This is useful
because ServiceWorkerJobData is passed to the StorageProcess and it needs a globally unique identifier.
ServiceWorkerJobIdentifier is only guaranteed to be unique within a single WebProcess. Augmenting it
with the SWServerConnectionIdentifier of the WebProcess makes it globally unique.

No new tests, unskipped exiting test.

* WebCore.xcodeproj/project.pbxproj:
* workers/service/ServiceWorkerContainer.cpp:
(WebCore::ServiceWorkerContainer::scheduleJob):
(WebCore::ServiceWorkerContainer::startScriptFetchForJob):
(WebCore::ServiceWorkerContainer::jobFinishedLoadingScript):
(WebCore::ServiceWorkerContainer::jobFailedLoadingScript):
(WebCore::ServiceWorkerContainer::jobDidFinish):
* workers/service/ServiceWorkerContainer.h:
* workers/service/ServiceWorkerContextData.cpp:
(WebCore::ServiceWorkerContextData::isolatedCopy const):
* workers/service/ServiceWorkerContextData.h:
(WebCore::ServiceWorkerContextData::encode const):
(WebCore::ServiceWorkerContextData::decode):
* workers/service/ServiceWorkerFetchResult.h:
(WebCore::ServiceWorkerFetchResult::encode const):
(WebCore::ServiceWorkerFetchResult::decode):
* workers/service/ServiceWorkerJob.h:
(WebCore::ServiceWorkerJob::identifier const):
* workers/service/ServiceWorkerJobData.cpp:
(WebCore::ServiceWorkerJobData::ServiceWorkerJobData):
(WebCore::ServiceWorkerJobData::isolatedCopy const):
* workers/service/ServiceWorkerJobData.h:
(WebCore::ServiceWorkerJobData::connectionIdentifier const):
(WebCore::ServiceWorkerJobData::identifier const):
(WebCore::ServiceWorkerJobData::encode const):
(WebCore::ServiceWorkerJobData::decode):
* workers/service/ServiceWorkerJobDataIdentifier.h: Copied from Source/WebCore/workers/service/ServiceWorkerFetchResult.h.
(WebCore::ServiceWorkerJobDataIdentifier::operator== const):
(WebCore::ServiceWorkerJobDataIdentifier::loggingString const):
(WebCore::ServiceWorkerJobDataIdentifier::encode const):
(WebCore::ServiceWorkerJobDataIdentifier::decode):
* workers/service/ServiceWorkerTypes.h:
* workers/service/context/SWContextManager.cpp:
(WebCore::SWContextManager::registerServiceWorkerThreadForInstall):
* workers/service/context/SWContextManager.h:
* workers/service/context/ServiceWorkerThread.cpp:
(WebCore::ServiceWorkerThread::fireInstallEvent):
* workers/service/server/SWClientConnection.cpp:
(WebCore::SWClientConnection::scheduleJob):
(WebCore::SWClientConnection::finishedFetchingScript):
(WebCore::SWClientConnection::failedFetchingScript):
(WebCore::SWClientConnection::jobRejectedInServer):
(WebCore::SWClientConnection::registrationJobResolvedInServer):
(WebCore::SWClientConnection::unregistrationJobResolvedInServer):
(WebCore::SWClientConnection::startScriptFetchForServer):
* workers/service/server/SWClientConnection.h:
* workers/service/server/SWServer.cpp:
(WebCore::SWServer::Connection::scheduleJobInServer):
(WebCore::SWServer::rejectJob):
(WebCore::SWServer::resolveRegistrationJob):
(WebCore::SWServer::startScriptFetch):
(WebCore::SWServer::scriptFetchFinished):
(WebCore::SWServer::scriptContextFailedToStart):
(WebCore::SWServer::scriptContextStarted):
(WebCore::SWServer::didFinishInstall):
(WebCore::SWServer::updateWorker):
* workers/service/server/SWServer.h:
* workers/service/server/SWServerJobQueue.cpp:
(WebCore::SWServerJobQueue::isCurrentlyProcessingJob const):
(WebCore::SWServerJobQueue::scriptFetchFinished):
(WebCore::SWServerJobQueue::scriptContextFailedToStart):
(WebCore::SWServerJobQueue::scriptContextStarted):
(WebCore::SWServerJobQueue::didFinishInstall):
* workers/service/server/SWServerJobQueue.h:
* workers/service/server/SWServerToContextConnection.cpp:
(WebCore::SWServerToContextConnection::scriptContextFailedToStart):
(WebCore::SWServerToContextConnection::scriptContextStarted):
(WebCore::SWServerToContextConnection::didFinishInstall):
* workers/service/server/SWServerToContextConnection.h:
* workers/service/server/SWServerWorker.cpp:
(WebCore::SWServerWorker::scriptContextFailedToStart):
(WebCore::SWServerWorker::scriptContextStarted):
(WebCore::SWServerWorker::didFinishInstall):
* workers/service/server/SWServerWorker.h:

Source/WebKit:

* StorageProcess/ServiceWorker/WebSWServerConnection.cpp:
(WebKit::WebSWServerConnection::rejectJobInClient):
(WebKit::WebSWServerConnection::resolveRegistrationJobInClient):
(WebKit::WebSWServerConnection::resolveUnregistrationJobInClient):
(WebKit::WebSWServerConnection::startScriptFetchInClient):
* StorageProcess/ServiceWorker/WebSWServerConnection.h:
* StorageProcess/ServiceWorker/WebSWServerToContextConnection.messages.in:
* WebProcess/Storage/WebSWClientConnection.messages.in:
* WebProcess/Storage/WebSWContextManagerConnection.cpp:
(WebKit::WebSWContextManagerConnection::serviceWorkerStartedWithMessage):
(WebKit::WebSWContextManagerConnection::didFinishInstall):
* WebProcess/Storage/WebSWContextManagerConnection.h:

Source/WTF:

Add a generateThreadSafeObjectIdentifier() for generating an ObjectIdentifier
in a thread-safe manner, using std::atomic.

* wtf/ObjectIdentifier.h:
(WTF::generateObjectIdentifier):
(WTF::generateThreadSafeObjectIdentifier):

LayoutTests:

Unskip test that use to flakily crash.

* platform/mac/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (225030 => 225031)


--- trunk/LayoutTests/ChangeLog	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/LayoutTests/ChangeLog	2017-11-19 07:19:00 UTC (rev 225031)
@@ -1,3 +1,14 @@
+2017-11-18  Chris Dumez  <[email protected]>
+
+        ASSERTION FAILED: registration in WebCore::SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier)
+        https://bugs.webkit.org/show_bug.cgi?id=179846
+
+        Reviewed by Darin Adler.
+
+        Unskip test that use to flakily crash.
+
+        * platform/mac/TestExpectations:
+
 2017-11-18  Nan Wang  <[email protected]>
 
         AX: AOM: Implement number type properties

Modified: trunk/LayoutTests/platform/mac/TestExpectations (225030 => 225031)


--- trunk/LayoutTests/platform/mac/TestExpectations	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2017-11-19 07:19:00 UTC (rev 225031)
@@ -1752,4 +1752,3 @@
 [ HighSierra+ ] imported/w3c/web-platform-tests/media-source/mediasource-redundant-seek.html [ Failure ]
 [ HighSierra+ ] imported/w3c/web-platform-tests/media-source/mediasource-remove.html [ Failure ]
 
-webkit.org/b/179846 imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https.html [ Skip ]

Modified: trunk/Source/WTF/ChangeLog (225030 => 225031)


--- trunk/Source/WTF/ChangeLog	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WTF/ChangeLog	2017-11-19 07:19:00 UTC (rev 225031)
@@ -1,3 +1,17 @@
+2017-11-18  Chris Dumez  <[email protected]>
+
+        ASSERTION FAILED: registration in WebCore::SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier)
+        https://bugs.webkit.org/show_bug.cgi?id=179846
+
+        Reviewed by Darin Adler.
+
+        Add a generateThreadSafeObjectIdentifier() for generating an ObjectIdentifier
+        in a thread-safe manner, using std::atomic.
+
+        * wtf/ObjectIdentifier.h:
+        (WTF::generateObjectIdentifier):
+        (WTF::generateThreadSafeObjectIdentifier):
+
 2017-11-18  Yusuke Suzuki  <[email protected]>
 
         [WTF] Remove CPU(HPPA) in StackBounds by using runtime stack direction test

Modified: trunk/Source/WTF/wtf/ObjectIdentifier.h (225030 => 225031)


--- trunk/Source/WTF/wtf/ObjectIdentifier.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WTF/wtf/ObjectIdentifier.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -25,7 +25,9 @@
 
 #pragma once
 
+#include <atomic>
 #include <wtf/HashTraits.h>
+#include <wtf/NeverDestroyed.h>
 #include <wtf/text/WTFString.h>
 
 namespace WTF {
@@ -73,6 +75,7 @@
 
 private:
     template<typename U> friend ObjectIdentifier<U> generateObjectIdentifier();
+    template<typename U> friend ObjectIdentifier<U> generateThreadSafeObjectIdentifier();
     template<typename U> friend ObjectIdentifier<U> makeObjectIdentifier(uint64_t);
     friend struct HashTraits<ObjectIdentifier>;
     template<typename U> friend struct ObjectIdentifierHash;
@@ -86,16 +89,20 @@
     }
 
     uint64_t m_identifier { 0 };
-    static uint64_t s_currentIdentifier;
 };
 
-template<typename T> uint64_t ObjectIdentifier<T>::s_currentIdentifier;
-
 template<typename T> inline ObjectIdentifier<T> generateObjectIdentifier()
 {
-    return ObjectIdentifier<T> { ++ObjectIdentifier<T>::s_currentIdentifier };
+    static uint64_t currentIdentifier;
+    return ObjectIdentifier<T> { ++currentIdentifier };
 }
 
+template<typename T> inline ObjectIdentifier<T> generateThreadSafeObjectIdentifier()
+{
+    static NeverDestroyed<std::atomic<uint64_t>> currentIdentifier;
+    return ObjectIdentifier<T> { ++currentIdentifier.get() };
+}
+
 template<typename T> inline ObjectIdentifier<T> makeObjectIdentifier(uint64_t identifier)
 {
     return ObjectIdentifier<T> { identifier };
@@ -117,4 +124,5 @@
 
 using WTF::ObjectIdentifier;
 using WTF::generateObjectIdentifier;
+using WTF::generateThreadSafeObjectIdentifier;
 using WTF::makeObjectIdentifier;

Modified: trunk/Source/WebCore/ChangeLog (225030 => 225031)


--- trunk/Source/WebCore/ChangeLog	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/ChangeLog	2017-11-19 07:19:00 UTC (rev 225031)
@@ -1,3 +1,102 @@
+2017-11-18  Chris Dumez  <[email protected]>
+
+        ASSERTION FAILED: registration in WebCore::SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier)
+        https://bugs.webkit.org/show_bug.cgi?id=179846
+
+        Reviewed by Darin Adler.
+
+        We have seen crashes on the bots in SWServerJobQueue because methods such as scriptContextStarted()
+        can get called after the jobQueue has been cleared. This is because when a jobQueue is cleared,
+        an asynchronous operation may be pending (e.g. script fetch, service worker starting, install event).
+
+        To address the issue, we now pass the identifier of the job that started the asynchronous operation
+        when calling the methods on SWServerJobQueue. If the identifier does not match the identifier of
+        the current job in the JobQueue, we ignore it.
+
+        This patch also starts using a strongly typed identifier (ServiceWorkerJobIdentifier) for
+        ServiceWorkerJob, instead of a uint64_t. It also introduces a ServiceWorkerJobDataIdentifier type
+        which contains both a SWServerConnectionIdentifier and a ServiceWorkerJobIdentifier. This is useful
+        because ServiceWorkerJobData is passed to the StorageProcess and it needs a globally unique identifier.
+        ServiceWorkerJobIdentifier is only guaranteed to be unique within a single WebProcess. Augmenting it
+        with the SWServerConnectionIdentifier of the WebProcess makes it globally unique.
+
+        No new tests, unskipped exiting test.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * workers/service/ServiceWorkerContainer.cpp:
+        (WebCore::ServiceWorkerContainer::scheduleJob):
+        (WebCore::ServiceWorkerContainer::startScriptFetchForJob):
+        (WebCore::ServiceWorkerContainer::jobFinishedLoadingScript):
+        (WebCore::ServiceWorkerContainer::jobFailedLoadingScript):
+        (WebCore::ServiceWorkerContainer::jobDidFinish):
+        * workers/service/ServiceWorkerContainer.h:
+        * workers/service/ServiceWorkerContextData.cpp:
+        (WebCore::ServiceWorkerContextData::isolatedCopy const):
+        * workers/service/ServiceWorkerContextData.h:
+        (WebCore::ServiceWorkerContextData::encode const):
+        (WebCore::ServiceWorkerContextData::decode):
+        * workers/service/ServiceWorkerFetchResult.h:
+        (WebCore::ServiceWorkerFetchResult::encode const):
+        (WebCore::ServiceWorkerFetchResult::decode):
+        * workers/service/ServiceWorkerJob.h:
+        (WebCore::ServiceWorkerJob::identifier const):
+        * workers/service/ServiceWorkerJobData.cpp:
+        (WebCore::ServiceWorkerJobData::ServiceWorkerJobData):
+        (WebCore::ServiceWorkerJobData::isolatedCopy const):
+        * workers/service/ServiceWorkerJobData.h:
+        (WebCore::ServiceWorkerJobData::connectionIdentifier const):
+        (WebCore::ServiceWorkerJobData::identifier const):
+        (WebCore::ServiceWorkerJobData::encode const):
+        (WebCore::ServiceWorkerJobData::decode):
+        * workers/service/ServiceWorkerJobDataIdentifier.h: Copied from Source/WebCore/workers/service/ServiceWorkerFetchResult.h.
+        (WebCore::ServiceWorkerJobDataIdentifier::operator== const):
+        (WebCore::ServiceWorkerJobDataIdentifier::loggingString const):
+        (WebCore::ServiceWorkerJobDataIdentifier::encode const):
+        (WebCore::ServiceWorkerJobDataIdentifier::decode):
+        * workers/service/ServiceWorkerTypes.h:
+        * workers/service/context/SWContextManager.cpp:
+        (WebCore::SWContextManager::registerServiceWorkerThreadForInstall):
+        * workers/service/context/SWContextManager.h:
+        * workers/service/context/ServiceWorkerThread.cpp:
+        (WebCore::ServiceWorkerThread::fireInstallEvent):
+        * workers/service/server/SWClientConnection.cpp:
+        (WebCore::SWClientConnection::scheduleJob):
+        (WebCore::SWClientConnection::finishedFetchingScript):
+        (WebCore::SWClientConnection::failedFetchingScript):
+        (WebCore::SWClientConnection::jobRejectedInServer):
+        (WebCore::SWClientConnection::registrationJobResolvedInServer):
+        (WebCore::SWClientConnection::unregistrationJobResolvedInServer):
+        (WebCore::SWClientConnection::startScriptFetchForServer):
+        * workers/service/server/SWClientConnection.h:
+        * workers/service/server/SWServer.cpp:
+        (WebCore::SWServer::Connection::scheduleJobInServer):
+        (WebCore::SWServer::rejectJob):
+        (WebCore::SWServer::resolveRegistrationJob):
+        (WebCore::SWServer::startScriptFetch):
+        (WebCore::SWServer::scriptFetchFinished):
+        (WebCore::SWServer::scriptContextFailedToStart):
+        (WebCore::SWServer::scriptContextStarted):
+        (WebCore::SWServer::didFinishInstall):
+        (WebCore::SWServer::updateWorker):
+        * workers/service/server/SWServer.h:
+        * workers/service/server/SWServerJobQueue.cpp:
+        (WebCore::SWServerJobQueue::isCurrentlyProcessingJob const):
+        (WebCore::SWServerJobQueue::scriptFetchFinished):
+        (WebCore::SWServerJobQueue::scriptContextFailedToStart):
+        (WebCore::SWServerJobQueue::scriptContextStarted):
+        (WebCore::SWServerJobQueue::didFinishInstall):
+        * workers/service/server/SWServerJobQueue.h:
+        * workers/service/server/SWServerToContextConnection.cpp:
+        (WebCore::SWServerToContextConnection::scriptContextFailedToStart):
+        (WebCore::SWServerToContextConnection::scriptContextStarted):
+        (WebCore::SWServerToContextConnection::didFinishInstall):
+        * workers/service/server/SWServerToContextConnection.h:
+        * workers/service/server/SWServerWorker.cpp:
+        (WebCore::SWServerWorker::scriptContextFailedToStart):
+        (WebCore::SWServerWorker::scriptContextStarted):
+        (WebCore::SWServerWorker::didFinishInstall):
+        * workers/service/server/SWServerWorker.h:
+
 2017-11-18  Nan Wang  <[email protected]>
 
         AX: AOM: Implement number type properties

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (225030 => 225031)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-11-19 07:19:00 UTC (rev 225031)
@@ -2202,6 +2202,7 @@
 		837FB3451F9EA06D00D0FC31 /* ExtendableMessageEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 837FB3401F9EA06600D0FC31 /* ExtendableMessageEvent.h */; };
 		8386A96D19F61B2E00E1EC4A /* StyleBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8386A96C19F61B2E00E1EC4A /* StyleBuilder.h */; };
 		838867351D13BA5F003697D0 /* RenderObjectEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 838867341D13BA59003697D0 /* RenderObjectEnums.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		838CA6BD1FC0DFE9005D9FA5 /* ServiceWorkerJobDataIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 838CA6BB1FC0DFDD005D9FA5 /* ServiceWorkerJobDataIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		838EF5381DC149E2008F0C39 /* IDBTransactionMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 838EF5361DC149DA008F0C39 /* IDBTransactionMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		838EF53C1DC14A7C008F0C39 /* JSIDBTransactionMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 838EF53A1DC14A75008F0C39 /* JSIDBTransactionMode.h */; };
 		838F86DA1F509E7400E8CFC5 /* FileCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 838F86D81F509E6C00E8CFC5 /* FileCallback.h */; };
@@ -9455,6 +9456,7 @@
 		8386A96E19F61E4F00E1EC4A /* StyleBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleBuilder.cpp; sourceTree = "<group>"; };
 		838867341D13BA59003697D0 /* RenderObjectEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderObjectEnums.h; sourceTree = "<group>"; };
 		838869EB1CE81E9E00D16A9E /* JSTextCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextCustom.cpp; sourceTree = "<group>"; };
+		838CA6BB1FC0DFDD005D9FA5 /* ServiceWorkerJobDataIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerJobDataIdentifier.h; sourceTree = "<group>"; };
 		838EF5361DC149DA008F0C39 /* IDBTransactionMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBTransactionMode.h; sourceTree = "<group>"; };
 		838EF5371DC149DA008F0C39 /* IDBTransactionMode.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = IDBTransactionMode.idl; sourceTree = "<group>"; };
 		838EF5391DC14A75008F0C39 /* JSIDBTransactionMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBTransactionMode.cpp; sourceTree = "<group>"; };
@@ -17293,6 +17295,7 @@
 				51F175501F3EBC0C00C74950 /* ServiceWorkerJobClient.h */,
 				517A53241F4B904A00DCDC0A /* ServiceWorkerJobData.cpp */,
 				51F645661F45399F00B54DED /* ServiceWorkerJobData.h */,
+				838CA6BB1FC0DFDD005D9FA5 /* ServiceWorkerJobDataIdentifier.h */,
 				51F645651F45399F00B54DED /* ServiceWorkerJobType.h */,
 				51F1754F1F3EBC0C00C74950 /* ServiceWorkerProvider.cpp */,
 				51F1754E1F3EBC0C00C74950 /* ServiceWorkerProvider.h */,
@@ -28949,6 +28952,7 @@
 				51F175631F3EBC8300C74950 /* ServiceWorkerJob.h in Headers */,
 				51F175641F3EBC8300C74950 /* ServiceWorkerJobClient.h in Headers */,
 				51F645691F4539B900B54DED /* ServiceWorkerJobData.h in Headers */,
+				838CA6BD1FC0DFE9005D9FA5 /* ServiceWorkerJobDataIdentifier.h in Headers */,
 				51F6456A1F4539C000B54DED /* ServiceWorkerJobType.h in Headers */,
 				51F175661F3EBC8300C74950 /* ServiceWorkerProvider.h in Headers */,
 				51F175681F3EBC8300C74950 /* ServiceWorkerRegistration.h in Headers */,

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -197,7 +197,7 @@
     setPendingActivity(this);
 
     ServiceWorkerJob& rawJob = job.get();
-    auto result = m_jobMap.add(rawJob.data().identifier(), WTFMove(job));
+    auto result = m_jobMap.add(rawJob.identifier(), WTFMove(job));
     ASSERT_UNUSED(result, result.isNewEntry);
 
     m_swConnection->scheduleJob(rawJob);
@@ -345,7 +345,7 @@
 
 void ServiceWorkerContainer::startScriptFetchForJob(ServiceWorkerJob& job)
 {
-    LOG(ServiceWorker, "SeviceWorkerContainer %p starting script fetch for job %" PRIu64, this, job.data().identifier());
+    LOG(ServiceWorker, "SeviceWorkerContainer %p starting script fetch for job %s", this, job.identifier().loggingString().utf8().data());
 
     auto* context = scriptExecutionContext();
     if (!context) {
@@ -360,7 +360,7 @@
 
 void ServiceWorkerContainer::jobFinishedLoadingScript(ServiceWorkerJob& job, const String& script)
 {
-    LOG(ServiceWorker, "SeviceWorkerContainer %p finished fetching script for job %" PRIu64, this, job.data().identifier());
+    LOG(ServiceWorker, "SeviceWorkerContainer %p finished fetching script for job %s", this, job.identifier().loggingString().utf8().data());
 
     m_swConnection->finishedFetchingScript(job, script);
 }
@@ -367,7 +367,7 @@
 
 void ServiceWorkerContainer::jobFailedLoadingScript(ServiceWorkerJob& job, const ResourceError& error, std::optional<Exception>&& exception)
 {
-    LOG(ServiceWorker, "SeviceWorkerContainer %p failed fetching script for job %" PRIu64, this, job.data().identifier());
+    LOG(ServiceWorker, "SeviceWorkerContainer %p failed fetching script for job %s", this, job.identifier().loggingString().utf8().data());
 
     if (exception)
         job.promise().reject(*exception);
@@ -377,7 +377,7 @@
 
 void ServiceWorkerContainer::jobDidFinish(ServiceWorkerJob& job)
 {
-    auto taken = m_jobMap.take(job.data().identifier());
+    auto taken = m_jobMap.take(job.identifier());
     ASSERT_UNUSED(taken, !taken || taken->ptr() == &job);
 
     unsetPendingActivity(this);

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -111,7 +111,7 @@
     NavigatorBase& m_navigator;
 
     RefPtr<SWClientConnection> m_swConnection;
-    HashMap<uint64_t, Ref<ServiceWorkerJob>> m_jobMap;
+    HashMap<ServiceWorkerJobIdentifier, Ref<ServiceWorkerJob>> m_jobMap;
 
     bool m_isStopped { false };
     HashMap<ServiceWorkerRegistrationIdentifier, ServiceWorkerRegistration*> m_registrations;

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContextData.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContextData.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContextData.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -32,7 +32,7 @@
 
 ServiceWorkerContextData ServiceWorkerContextData::isolatedCopy() const
 {
-    return { registrationKey.isolatedCopy(), serviceWorkerIdentifier, script.isolatedCopy(), scriptURL.isolatedCopy(), workerType };
+    return { jobDataIdentifier, registrationKey.isolatedCopy(), serviceWorkerIdentifier, script.isolatedCopy(), scriptURL.isolatedCopy(), workerType };
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContextData.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContextData.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContextData.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "ServiceWorkerIdentifier.h"
+#include "ServiceWorkerJobDataIdentifier.h"
 #include "ServiceWorkerRegistrationKey.h"
 #include "URL.h"
 #include "WorkerType.h"
@@ -35,6 +36,7 @@
 namespace WebCore {
 
 struct ServiceWorkerContextData {
+    ServiceWorkerJobDataIdentifier jobDataIdentifier;
     ServiceWorkerRegistrationKey registrationKey;
     ServiceWorkerIdentifier serviceWorkerIdentifier;
     String script;
@@ -50,12 +52,17 @@
 template<class Encoder>
 void ServiceWorkerContextData::encode(Encoder& encoder) const
 {
-    encoder << registrationKey << serviceWorkerIdentifier << script << scriptURL << workerType;
+    encoder << jobDataIdentifier << registrationKey << serviceWorkerIdentifier << script << scriptURL << workerType;
 }
 
 template<class Decoder>
 std::optional<ServiceWorkerContextData> ServiceWorkerContextData::decode(Decoder& decoder)
 {
+    std::optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier;
+    decoder >> jobDataIdentifier;
+    if (!jobDataIdentifier)
+        return std::nullopt;
+
     auto registrationKey = ServiceWorkerRegistrationKey::decode(decoder);
     if (!registrationKey)
         return std::nullopt;
@@ -76,7 +83,7 @@
     if (!decoder.decodeEnum(workerType))
         return std::nullopt;
     
-    return {{ WTFMove(*registrationKey), WTFMove(*serviceWorkerIdentifier), WTFMove(script), WTFMove(scriptURL), workerType }};
+    return {{ WTFMove(*jobDataIdentifier), WTFMove(*registrationKey), WTFMove(*serviceWorkerIdentifier), WTFMove(script), WTFMove(scriptURL), workerType }};
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerFetchResult.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerFetchResult.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerFetchResult.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -34,8 +34,7 @@
 namespace WebCore {
 
 struct ServiceWorkerFetchResult {
-    uint64_t jobIdentifier;
-    SWServerConnectionIdentifier connectionIdentifier;
+    ServiceWorkerJobDataIdentifier jobDataIdentifier;
     ServiceWorkerRegistrationKey registrationKey;
     String script;
     ResourceError scriptError;
@@ -47,20 +46,17 @@
 template<class Encoder>
 void ServiceWorkerFetchResult::encode(Encoder& encoder) const
 {
-    encoder << jobIdentifier << connectionIdentifier << registrationKey << script << scriptError;
+    encoder << jobDataIdentifier << registrationKey << script << scriptError;
 }
 
 template<class Decoder>
 bool ServiceWorkerFetchResult::decode(Decoder& decoder, ServiceWorkerFetchResult& result)
 {
-    if (!decoder.decode(result.jobIdentifier))
+    std::optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier;
+    decoder >> jobDataIdentifier;
+    if (!jobDataIdentifier)
         return false;
-
-    std::optional<SWServerConnectionIdentifier> connectionIdentifier;
-    decoder >> connectionIdentifier;
-    if (!connectionIdentifier)
-        return false;
-    result.connectionIdentifier = *connectionIdentifier;
+    result.jobDataIdentifier = WTFMove(*jobDataIdentifier);
     
     auto registrationKey = ServiceWorkerRegistrationKey::decode(decoder);
     if (!registrationKey)

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJob.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerJob.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJob.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -30,6 +30,7 @@
 #include "ResourceResponse.h"
 #include "ServiceWorkerJobClient.h"
 #include "ServiceWorkerJobData.h"
+#include "ServiceWorkerTypes.h"
 #include "WorkerScriptLoader.h"
 #include "WorkerScriptLoaderClient.h"
 #include <wtf/RefPtr.h>
@@ -59,6 +60,9 @@
     void resolvedWithUnregistrationResult(bool);
     void startScriptFetch();
 
+    using Identifier = ServiceWorkerJobIdentifier;
+    Identifier identifier() const { return m_jobData.identifier().jobIdentifier; }
+
     ServiceWorkerJobData data() const { return m_jobData; }
     DeferredPromise& promise() { return m_promise.get(); }
 

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobData.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -30,14 +30,13 @@
 
 namespace WebCore {
 
-ServiceWorkerJobData::ServiceWorkerJobData(uint64_t jobIdentifier, SWServerConnectionIdentifier connectionIdentifier)
-    : ThreadSafeIdentified(jobIdentifier)
-    , m_connectionIdentifier(connectionIdentifier)
+ServiceWorkerJobData::ServiceWorkerJobData(const Identifier& identifier)
+    : m_identifier(identifier)
 {
 }
 
 ServiceWorkerJobData::ServiceWorkerJobData(SWServerConnectionIdentifier connectionIdentifier)
-    : m_connectionIdentifier(connectionIdentifier)
+    : m_identifier { connectionIdentifier, generateThreadSafeObjectIdentifier<ServiceWorkerJobIdentifierType>() }
 {
 }
 
@@ -50,7 +49,7 @@
 
 ServiceWorkerJobData ServiceWorkerJobData::isolatedCopy() const
 {
-    ServiceWorkerJobData result { identifier(), m_connectionIdentifier };
+    ServiceWorkerJobData result { identifier() };
     result.type = type;
 
     result.scriptURL = scriptURL.isolatedCopy();

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobData.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -28,22 +28,22 @@
 #if ENABLE(SERVICE_WORKER)
 
 #include "SecurityOriginData.h"
+#include "ServiceWorkerJobDataIdentifier.h"
 #include "ServiceWorkerJobType.h"
 #include "ServiceWorkerRegistrationKey.h"
 #include "ServiceWorkerRegistrationOptions.h"
 #include "ServiceWorkerTypes.h"
 #include "URL.h"
-#include <wtf/Identified.h>
 
 namespace WebCore {
 
-struct ServiceWorkerJobData : public ThreadSafeIdentified<ServiceWorkerJobData> {
-public:
+struct ServiceWorkerJobData {
+    using Identifier = ServiceWorkerJobDataIdentifier;
     explicit ServiceWorkerJobData(SWServerConnectionIdentifier);
     ServiceWorkerJobData(const ServiceWorkerJobData&) = default;
     ServiceWorkerJobData() = default;
 
-    SWServerConnectionIdentifier connectionIdentifier() const { return m_connectionIdentifier; }
+    SWServerConnectionIdentifier connectionIdentifier() const { return m_identifier.connectionIdentifier; }
 
     URL scriptURL;
     URL clientCreationURL;
@@ -53,6 +53,7 @@
 
     RegistrationOptions registrationOptions;
 
+    Identifier identifier() const { return m_identifier; }
     ServiceWorkerRegistrationKey registrationKey() const;
     ServiceWorkerJobData isolatedCopy() const;
 
@@ -60,15 +61,15 @@
     template<class Decoder> static std::optional<ServiceWorkerJobData> decode(Decoder&);
 
 private:
-    WEBCORE_EXPORT ServiceWorkerJobData(uint64_t jobIdentifier, SWServerConnectionIdentifier);
+    WEBCORE_EXPORT explicit ServiceWorkerJobData(const Identifier&);
 
-    SWServerConnectionIdentifier m_connectionIdentifier;
+    Identifier m_identifier;
 };
 
 template<class Encoder>
 void ServiceWorkerJobData::encode(Encoder& encoder) const
 {
-    encoder << identifier() << m_connectionIdentifier << scriptURL << clientCreationURL << topOrigin << scopeURL;
+    encoder << identifier() << scriptURL << clientCreationURL << topOrigin << scopeURL;
     encoder.encodeEnum(type);
     switch (type) {
     case ServiceWorkerJobType::Register:
@@ -83,17 +84,13 @@
 template<class Decoder>
 std::optional<ServiceWorkerJobData> ServiceWorkerJobData::decode(Decoder& decoder)
 {
-    uint64_t jobIdentifier;
-    if (!decoder.decode(jobIdentifier))
+    std::optional<ServiceWorkerJobDataIdentifier> identifier;
+    decoder >> identifier;
+    if (!identifier)
         return std::nullopt;
 
-    std::optional<SWServerConnectionIdentifier> connectionIdentifier;
-    decoder >> connectionIdentifier;
-    if (!connectionIdentifier)
-        return std::nullopt;
+    std::optional<ServiceWorkerJobData> jobData = { ServiceWorkerJobData { WTFMove(*identifier) } };
 
-    std::optional<ServiceWorkerJobData> jobData = { { jobIdentifier, *connectionIdentifier } };
-
     if (!decoder.decode(jobData->scriptURL))
         return std::nullopt;
     if (!decoder.decode(jobData->clientCreationURL))

Copied: trunk/Source/WebCore/workers/service/ServiceWorkerJobDataIdentifier.h (from rev 225030, trunk/Source/WebCore/workers/service/ServiceWorkerFetchResult.h) (0 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerJobDataIdentifier.h	                        (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerJobDataIdentifier.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -0,0 +1,78 @@
+/*
+ * 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 "ServiceWorkerTypes.h"
+
+namespace WebCore {
+
+struct ServiceWorkerJobDataIdentifier {
+    SWServerConnectionIdentifier connectionIdentifier;
+    ServiceWorkerJobIdentifier jobIdentifier;
+
+#ifndef NDEBUG
+    String loggingString() const
+    {
+        return connectionIdentifier.loggingString() + "-" + jobIdentifier.loggingString();
+    }
+#endif
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<ServiceWorkerJobDataIdentifier> decode(Decoder&);
+};
+
+inline bool operator==(const ServiceWorkerJobDataIdentifier& a, const ServiceWorkerJobDataIdentifier& b)
+{
+    return a.connectionIdentifier == b.connectionIdentifier && a.jobIdentifier == b.jobIdentifier;
+}
+
+template<class Encoder>
+void ServiceWorkerJobDataIdentifier::encode(Encoder& encoder) const
+{
+    encoder << connectionIdentifier << jobIdentifier;
+}
+
+template<class Decoder>
+std::optional<ServiceWorkerJobDataIdentifier> ServiceWorkerJobDataIdentifier::decode(Decoder& decoder)
+{
+    std::optional<SWServerConnectionIdentifier> connectionIdentifier;
+    decoder >> connectionIdentifier;
+    if (!connectionIdentifier)
+        return std::nullopt;
+
+    std::optional<ServiceWorkerJobIdentifier> jobIdentifier;
+    decoder >> jobIdentifier;
+    if (!jobIdentifier)
+        return std::nullopt;
+
+    return { { WTFMove(*connectionIdentifier), WTFMove(*jobIdentifier) } };
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -58,6 +58,9 @@
 enum ServiceWorkerRegistrationIdentifierType { };
 using ServiceWorkerRegistrationIdentifier = ObjectIdentifier<ServiceWorkerRegistrationIdentifierType>;
 
+enum ServiceWorkerJobIdentifierType { };
+using ServiceWorkerJobIdentifier = ObjectIdentifier<ServiceWorkerJobIdentifierType>;
+
 enum SWServerToContextConnectionIdentifierType { };
 using SWServerToContextConnectionIdentifier = ObjectIdentifier<SWServerToContextConnectionIdentifierType>;
 

Modified: trunk/Source/WebCore/workers/service/context/SWContextManager.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/context/SWContextManager.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/context/SWContextManager.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -51,12 +51,13 @@
 void SWContextManager::registerServiceWorkerThreadForInstall(Ref<ServiceWorkerThreadProxy>&& serviceWorkerThreadProxy)
 {
     auto serviceWorkerIdentifier = serviceWorkerThreadProxy->identifier();
+    auto jobDataIdentifier = serviceWorkerThreadProxy->thread().contextData().jobDataIdentifier;
     auto* threadProxy = serviceWorkerThreadProxy.ptr();
     auto result = m_workerMap.add(serviceWorkerIdentifier, WTFMove(serviceWorkerThreadProxy));
     ASSERT_UNUSED(result, result.isNewEntry);
     
-    threadProxy->thread().start([serviceWorkerIdentifier](const String& exceptionMessage) {
-        SWContextManager::singleton().connection()->serviceWorkerStartedWithMessage(serviceWorkerIdentifier, exceptionMessage);
+    threadProxy->thread().start([jobDataIdentifier, serviceWorkerIdentifier](const String& exceptionMessage) {
+        SWContextManager::singleton().connection()->serviceWorkerStartedWithMessage(jobDataIdentifier, serviceWorkerIdentifier, exceptionMessage);
     });
 }
 

Modified: trunk/Source/WebCore/workers/service/context/SWContextManager.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/context/SWContextManager.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/context/SWContextManager.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -46,8 +46,8 @@
         virtual ~Connection() { }
 
         virtual void postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destinationIdentifier, Ref<SerializedScriptValue>&& message, ServiceWorkerIdentifier source, const String& sourceOrigin) = 0;
-        virtual void serviceWorkerStartedWithMessage(ServiceWorkerIdentifier, const String& exceptionMessage) = 0;
-        virtual void didFinishInstall(ServiceWorkerIdentifier, bool wasSuccessful) = 0;
+        virtual void serviceWorkerStartedWithMessage(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, const String& exceptionMessage) = 0;
+        virtual void didFinishInstall(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, bool wasSuccessful) = 0;
         virtual void didFinishActivation(ServiceWorkerIdentifier) = 0;
         virtual void setServiceWorkerHasPendingEvents(ServiceWorkerIdentifier, bool) = 0;
         virtual void workerTerminated(ServiceWorkerIdentifier) = 0;

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -121,12 +121,12 @@
 
 void ServiceWorkerThread::fireInstallEvent()
 {
-    ScriptExecutionContext::Task task([serviceWorkerIdentifier = this->identifier()] (ScriptExecutionContext& context) mutable {
+    ScriptExecutionContext::Task task([jobDataIdentifier = m_data.jobDataIdentifier, serviceWorkerIdentifier = this->identifier()] (ScriptExecutionContext& context) mutable {
         auto& serviceWorkerGlobalScope = downcast<ServiceWorkerGlobalScope>(context);
         auto installEvent = ExtendableEvent::create(eventNames().installEvent, { }, ExtendableEvent::IsTrusted::Yes);
         serviceWorkerGlobalScope.dispatchEvent(installEvent);
 
-        installEvent->whenAllExtendLifetimePromisesAreSettled([serviceWorkerIdentifier](HashSet<Ref<DOMPromise>>&& extendLifetimePromises) {
+        installEvent->whenAllExtendLifetimePromisesAreSettled([jobDataIdentifier, serviceWorkerIdentifier](HashSet<Ref<DOMPromise>>&& extendLifetimePromises) {
             bool hasRejectedAnyPromise = false;
             for (auto& promise : extendLifetimePromises) {
                 if (promise->status() == DOMPromise::Status::Rejected) {
@@ -134,9 +134,9 @@
                     break;
                 }
             }
-            callOnMainThread([serviceWorkerIdentifier, hasRejectedAnyPromise] () mutable {
+            callOnMainThread([jobDataIdentifier, serviceWorkerIdentifier, hasRejectedAnyPromise] () mutable {
                 if (auto* connection = SWContextManager::singleton().connection())
-                    connection->didFinishInstall(serviceWorkerIdentifier, !hasRejectedAnyPromise);
+                    connection->didFinishInstall(jobDataIdentifier, serviceWorkerIdentifier, !hasRejectedAnyPromise);
             });
         });
     });

Modified: trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -45,7 +45,7 @@
 
 void SWClientConnection::scheduleJob(ServiceWorkerJob& job)
 {
-    auto addResult = m_scheduledJobs.add(job.data().identifier(), &job);
+    auto addResult = m_scheduledJobs.add(job.identifier(), &job);
     ASSERT_UNUSED(addResult, addResult.isNewEntry);
 
     scheduleJobInServer(job.data());
@@ -53,23 +53,23 @@
 
 void SWClientConnection::finishedFetchingScript(ServiceWorkerJob& job, const String& script)
 {
-    ASSERT(m_scheduledJobs.get(job.data().identifier()) == &job);
+    ASSERT(m_scheduledJobs.get(job.identifier()) == &job);
 
-    finishFetchingScriptInServer({ job.data().identifier(), job.data().connectionIdentifier(), job.data().registrationKey(), script, { } });
+    finishFetchingScriptInServer({ job.data().identifier(), job.data().registrationKey(), script, { } });
 }
 
 void SWClientConnection::failedFetchingScript(ServiceWorkerJob& job, const ResourceError& error)
 {
-    ASSERT(m_scheduledJobs.get(job.data().identifier()) == &job);
+    ASSERT(m_scheduledJobs.get(job.identifier()) == &job);
 
-    finishFetchingScriptInServer({ job.data().identifier(), job.data().connectionIdentifier(), job.data().registrationKey(), { }, error });
+    finishFetchingScriptInServer({ job.data().identifier(), job.data().registrationKey(), { }, error });
 }
 
-void SWClientConnection::jobRejectedInServer(uint64_t jobIdentifier, const ExceptionData& exceptionData)
+void SWClientConnection::jobRejectedInServer(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const ExceptionData& exceptionData)
 {
-    auto job = m_scheduledJobs.take(jobIdentifier);
+    auto job = m_scheduledJobs.take(jobDataIdentifier.jobIdentifier);
     if (!job) {
-        LOG_ERROR("Job %" PRIu64 " rejected from server, but was not found", jobIdentifier);
+        LOG_ERROR("Job %s rejected from server, but was not found", jobDataIdentifier.loggingString().utf8().data());
         return;
     }
 
@@ -76,11 +76,11 @@
     job->failedWithException(exceptionData.toException());
 }
 
-void SWClientConnection::registrationJobResolvedInServer(uint64_t jobIdentifier, ServiceWorkerRegistrationData&& registrationData, ShouldNotifyWhenResolved shouldNotifyWhenResolved)
+void SWClientConnection::registrationJobResolvedInServer(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerRegistrationData&& registrationData, ShouldNotifyWhenResolved shouldNotifyWhenResolved)
 {
-    auto job = m_scheduledJobs.take(jobIdentifier);
+    auto job = m_scheduledJobs.take(jobDataIdentifier.jobIdentifier);
     if (!job) {
-        LOG_ERROR("Job %" PRIu64 " resolved in server, but was not found", jobIdentifier);
+        LOG_ERROR("Job %s resolved in server, but was not found", jobDataIdentifier.loggingString().utf8().data());
         return;
     }
 
@@ -91,11 +91,11 @@
     });
 }
 
-void SWClientConnection::unregistrationJobResolvedInServer(uint64_t jobIdentifier, bool unregistrationResult)
+void SWClientConnection::unregistrationJobResolvedInServer(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, bool unregistrationResult)
 {
-    auto job = m_scheduledJobs.take(jobIdentifier);
+    auto job = m_scheduledJobs.take(jobDataIdentifier.jobIdentifier);
     if (!job) {
-        LOG_ERROR("Job %" PRIu64 " resolved in server, but was not found", jobIdentifier);
+        LOG_ERROR("Job %s resolved in server, but was not found", jobDataIdentifier.loggingString().utf8().data());
         return;
     }
 
@@ -102,11 +102,11 @@
     job->resolvedWithUnregistrationResult(unregistrationResult);
 }
 
-void SWClientConnection::startScriptFetchForServer(uint64_t jobIdentifier)
+void SWClientConnection::startScriptFetchForServer(const ServiceWorkerJobDataIdentifier& jobDataIdentifier)
 {
-    auto job = m_scheduledJobs.get(jobIdentifier);
+    auto job = m_scheduledJobs.get(jobDataIdentifier.jobIdentifier);
     if (!job) {
-        LOG_ERROR("Job %" PRIu64 " instructed to start fetch from server, but job was not found", jobIdentifier);
+        LOG_ERROR("Job %s instructed to start fetch from server, but job was not found", jobDataIdentifier.loggingString().utf8().data());
 
         // FIXME: Should message back to the server here to signal failure to fetch,
         // but we currently need the registration key to do so, and don't have it here.

Modified: trunk/Source/WebCore/workers/service/server/SWClientConnection.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWClientConnection.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWClientConnection.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -78,10 +78,10 @@
 protected:
     WEBCORE_EXPORT SWClientConnection();
 
-    WEBCORE_EXPORT void jobRejectedInServer(uint64_t jobIdentifier, const ExceptionData&);
-    WEBCORE_EXPORT void registrationJobResolvedInServer(uint64_t jobIdentifier, ServiceWorkerRegistrationData&&, ShouldNotifyWhenResolved);
-    WEBCORE_EXPORT void unregistrationJobResolvedInServer(uint64_t jobIdentifier, bool unregistrationResult);
-    WEBCORE_EXPORT void startScriptFetchForServer(uint64_t jobIdentifier);
+    WEBCORE_EXPORT void jobRejectedInServer(const ServiceWorkerJobDataIdentifier&, const ExceptionData&);
+    WEBCORE_EXPORT void registrationJobResolvedInServer(const ServiceWorkerJobDataIdentifier&, ServiceWorkerRegistrationData&&, ShouldNotifyWhenResolved);
+    WEBCORE_EXPORT void unregistrationJobResolvedInServer(const ServiceWorkerJobDataIdentifier&, bool unregistrationResult);
+    WEBCORE_EXPORT void startScriptFetchForServer(const ServiceWorkerJobDataIdentifier&);
     WEBCORE_EXPORT void postMessageToServiceWorkerClient(uint64_t destinationScriptExecutionContextIdentifier, Ref<SerializedScriptValue>&& message, ServiceWorkerData&& source, const String& sourceOrigin);
     WEBCORE_EXPORT void updateRegistrationState(ServiceWorkerRegistrationIdentifier, ServiceWorkerRegistrationState, const std::optional<ServiceWorkerData>&);
     WEBCORE_EXPORT void updateWorkerState(ServiceWorkerIdentifier, ServiceWorkerState);
@@ -93,7 +93,7 @@
     virtual void finishFetchingScriptInServer(const ServiceWorkerFetchResult&) = 0;
     void forEachContainer(const WTF::Function<void(ServiceWorkerContainer&)>& apply);
 
-    HashMap<uint64_t, RefPtr<ServiceWorkerJob>> m_scheduledJobs;
+    HashMap<ServiceWorkerJobIdentifier, RefPtr<ServiceWorkerJob>> m_scheduledJobs;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServer.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -144,7 +144,7 @@
 
 void SWServer::Connection::scheduleJobInServer(const ServiceWorkerJobData& jobData)
 {
-    LOG(ServiceWorker, "Scheduling ServiceWorker job %s-%" PRIu64 " in server", jobData.connectionIdentifier().loggingString().utf8().data(), jobData.identifier());
+    LOG(ServiceWorker, "Scheduling ServiceWorker job %s in server", jobData.identifier().loggingString().utf8().data());
     ASSERT(identifier() == jobData.connectionIdentifier());
 
     m_server.scheduleJob(jobData);
@@ -208,7 +208,7 @@
 
 void SWServer::rejectJob(const ServiceWorkerJobData& jobData, const ExceptionData& exceptionData)
 {
-    LOG(ServiceWorker, "Rejected ServiceWorker job %s-%" PRIu64 " in server", jobData.connectionIdentifier().loggingString().utf8().data(), jobData.identifier());
+    LOG(ServiceWorker, "Rejected ServiceWorker job %s in server", jobData.identifier().loggingString().utf8().data());
     auto* connection = m_connections.get(jobData.connectionIdentifier());
     if (!connection)
         return;
@@ -218,7 +218,7 @@
 
 void SWServer::resolveRegistrationJob(const ServiceWorkerJobData& jobData, const ServiceWorkerRegistrationData& registrationData, ShouldNotifyWhenResolved shouldNotifyWhenResolved)
 {
-    LOG(ServiceWorker, "Resolved ServiceWorker job %s-%" PRIu64 " in server with registration %s", jobData.connectionIdentifier().loggingString().utf8().data(), jobData.identifier(), registrationData.identifier.loggingString().utf8().data());
+    LOG(ServiceWorker, "Resolved ServiceWorker job %s in server with registration %s", jobData.identifier().loggingString().utf8().data(), registrationData.identifier.loggingString().utf8().data());
     auto* connection = m_connections.get(jobData.connectionIdentifier());
     if (!connection)
         return;
@@ -237,7 +237,7 @@
 
 void SWServer::startScriptFetch(const ServiceWorkerJobData& jobData)
 {
-    LOG(ServiceWorker, "Server issuing startScriptFetch for current job %s-%" PRIu64 " in client", jobData.connectionIdentifier().loggingString().utf8().data(), jobData.identifier());
+    LOG(ServiceWorker, "Server issuing startScriptFetch for current job %s in client", jobData.identifier().loggingString().utf8().data());
     auto* connection = m_connections.get(jobData.connectionIdentifier());
     if (!connection)
         return;
@@ -247,9 +247,9 @@
 
 void SWServer::scriptFetchFinished(Connection& connection, const ServiceWorkerFetchResult& result)
 {
-    LOG(ServiceWorker, "Server handling scriptFetchFinished for current job %s-%" PRIu64 " in client", result.connectionIdentifier.loggingString().utf8().data(), result.jobIdentifier);
+    LOG(ServiceWorker, "Server handling scriptFetchFinished for current job %s in client", result.jobDataIdentifier.loggingString().utf8().data());
 
-    ASSERT(m_connections.contains(result.connectionIdentifier));
+    ASSERT(m_connections.contains(result.jobDataIdentifier.connectionIdentifier));
 
     auto jobQueue = m_jobQueues.get(result.registrationKey);
     if (!jobQueue)
@@ -258,22 +258,22 @@
     jobQueue->scriptFetchFinished(connection, result);
 }
 
-void SWServer::scriptContextFailedToStart(SWServerWorker& worker, const String& message)
+void SWServer::scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, SWServerWorker& worker, const String& message)
 {
     if (auto* jobQueue = m_jobQueues.get(worker.registrationKey()))
-        jobQueue->scriptContextFailedToStart(worker.identifier(), message);
+        jobQueue->scriptContextFailedToStart(jobDataIdentifier, worker.identifier(), message);
 }
 
-void SWServer::scriptContextStarted(SWServerWorker& worker)
+void SWServer::scriptContextStarted(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, SWServerWorker& worker)
 {
     if (auto* jobQueue = m_jobQueues.get(worker.registrationKey()))
-        jobQueue->scriptContextStarted(worker.identifier());
+        jobQueue->scriptContextStarted(jobDataIdentifier, worker.identifier());
 }
 
-void SWServer::didFinishInstall(SWServerWorker& worker, bool wasSuccessful)
+void SWServer::didFinishInstall(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, SWServerWorker& worker, bool wasSuccessful)
 {
     if (auto* jobQueue = m_jobQueues.get(worker.registrationKey()))
-        jobQueue->didFinishInstall(worker.identifier(), wasSuccessful);
+        jobQueue->didFinishInstall(jobDataIdentifier, worker.identifier(), wasSuccessful);
 }
 
 void SWServer::didFinishActivation(SWServerWorker& worker)
@@ -350,11 +350,11 @@
     registration->removeClientUsingRegistration({ connection.identifier(), scriptExecutionContextIdentifier });
 }
 
-void SWServer::updateWorker(Connection&, const ServiceWorkerRegistrationKey& registrationKey, const URL& url, const String& script, WorkerType type)
+void SWServer::updateWorker(Connection&, const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const ServiceWorkerRegistrationKey& registrationKey, const URL& url, const String& script, WorkerType type)
 {
     auto serviceWorkerIdentifier = generateServiceWorkerIdentifier();
 
-    ServiceWorkerContextData data = { registrationKey, serviceWorkerIdentifier, script, url, type };
+    ServiceWorkerContextData data = { jobDataIdentifier, registrationKey, serviceWorkerIdentifier, script, url, type };
 
     // Right now we only ever keep up to one connection to one SW context process.
     // And it should always exist if we're calling updateWorker

Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServer.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -88,10 +88,10 @@
 
     private:
         // Messages to the client WebProcess
-        virtual void rejectJobInClient(uint64_t jobIdentifier, const ExceptionData&) = 0;
-        virtual void resolveRegistrationJobInClient(uint64_t jobIdentifier, const ServiceWorkerRegistrationData&, ShouldNotifyWhenResolved) = 0;
-        virtual void resolveUnregistrationJobInClient(uint64_t jobIdentifier, const ServiceWorkerRegistrationKey&, bool registrationResult) = 0;
-        virtual void startScriptFetchInClient(uint64_t jobIdentifier) = 0;
+        virtual void rejectJobInClient(const ServiceWorkerJobDataIdentifier&, const ExceptionData&) = 0;
+        virtual void resolveRegistrationJobInClient(const ServiceWorkerJobDataIdentifier&, const ServiceWorkerRegistrationData&, ShouldNotifyWhenResolved) = 0;
+        virtual void resolveUnregistrationJobInClient(const ServiceWorkerJobDataIdentifier&, const ServiceWorkerRegistrationKey&, bool registrationResult) = 0;
+        virtual void startScriptFetchInClient(const ServiceWorkerJobDataIdentifier&) = 0;
 
         SWServer& m_server;
         Identifier m_identifier;
@@ -118,7 +118,7 @@
     void postTask(CrossThreadTask&&);
     void postTaskReply(CrossThreadTask&&);
 
-    void updateWorker(Connection&, const ServiceWorkerRegistrationKey&, const URL&, const String& script, WorkerType);
+    void updateWorker(Connection&, const ServiceWorkerJobDataIdentifier&, const ServiceWorkerRegistrationKey&, const URL&, const String& script, WorkerType);
     void terminateWorker(SWServerWorker&);
     void fireInstallEvent(SWServerWorker&);
     void fireActivateEvent(SWServerWorker&);
@@ -127,9 +127,9 @@
     Connection* getConnection(SWServerConnectionIdentifier identifier) { return m_connections.get(identifier); }
     SWOriginStore& originStore() { return m_originStore; }
 
-    void scriptContextFailedToStart(SWServerWorker&, const String& message);
-    void scriptContextStarted(SWServerWorker&);
-    void didFinishInstall(SWServerWorker&, bool wasSuccessful);
+    void scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier&, SWServerWorker&, const String& message);
+    void scriptContextStarted(const ServiceWorkerJobDataIdentifier&, SWServerWorker&);
+    void didFinishInstall(const ServiceWorkerJobDataIdentifier&, SWServerWorker&, bool wasSuccessful);
     void didFinishActivation(SWServerWorker&);
     void workerContextTerminated(SWServerWorker&);
 

Modified: trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -50,14 +50,14 @@
 {
 }
 
-bool SWServerJobQueue::isCurrentlyProcessingJob(uint64_t jobIdentifier) const
+bool SWServerJobQueue::isCurrentlyProcessingJob(const ServiceWorkerJobDataIdentifier& jobDataIdentifier) const
 {
-    return !m_jobQueue.isEmpty() && firstJob().identifier() == jobIdentifier;
+    return !m_jobQueue.isEmpty() && firstJob().identifier() == jobDataIdentifier;
 }
 
 void SWServerJobQueue::scriptFetchFinished(SWServer::Connection& connection, const ServiceWorkerFetchResult& result)
 {
-    if (!isCurrentlyProcessingJob(result.jobIdentifier))
+    if (!isCurrentlyProcessingJob(result.jobDataIdentifier))
         return;
 
     auto& job = firstJob();
@@ -87,12 +87,15 @@
     // - Invoke Finish Job with job and abort these steps.
 
     // FIXME: Support the proper worker type (classic vs module)
-    m_server.updateWorker(connection, m_registrationKey, job.scriptURL, result.script, WorkerType::Classic);
+    m_server.updateWorker(connection, job.identifier(), m_registrationKey, job.scriptURL, result.script, WorkerType::Classic);
 }
 
 // https://w3c.github.io/ServiceWorker/#update-algorithm
-void SWServerJobQueue::scriptContextFailedToStart(ServiceWorkerIdentifier, const String& message)
+void SWServerJobQueue::scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier, const String& message)
 {
+    if (!isCurrentlyProcessingJob(jobDataIdentifier))
+        return;
+
     // If an uncaught runtime script error occurs during the above step, then:
     auto* registration = m_server.getRegistration(m_registrationKey);
     ASSERT(registration);
@@ -108,8 +111,11 @@
     finishCurrentJob();
 }
 
-void SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier identifier)
+void SWServerJobQueue::scriptContextStarted(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier identifier)
 {
+    if (!isCurrentlyProcessingJob(jobDataIdentifier))
+        return;
+
     auto* registration = m_server.getRegistration(m_registrationKey);
     ASSERT(registration);
 
@@ -148,8 +154,11 @@
 }
 
 // https://w3c.github.io/ServiceWorker/#install
-void SWServerJobQueue::didFinishInstall(ServiceWorkerIdentifier identifier, bool wasSuccessful)
+void SWServerJobQueue::didFinishInstall(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier identifier, bool wasSuccessful)
 {
+    if (!isCurrentlyProcessingJob(jobDataIdentifier))
+        return;
+
     auto* registration = m_server.getRegistration(m_registrationKey);
     ASSERT(registration);
     ASSERT(registration->installingWorker());

Modified: trunk/Source/WebCore/workers/service/server/SWServerJobQueue.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerJobQueue.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerJobQueue.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -48,9 +48,9 @@
     void runNextJob();
 
     void scriptFetchFinished(SWServer::Connection&, const ServiceWorkerFetchResult&);
-    void scriptContextFailedToStart(ServiceWorkerIdentifier, const String& message);
-    void scriptContextStarted(ServiceWorkerIdentifier);
-    void didFinishInstall(ServiceWorkerIdentifier, bool wasSuccessful);
+    void scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, const String& message);
+    void scriptContextStarted(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier);
+    void didFinishInstall(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, bool wasSuccessful);
     static void didFinishActivation(SWServerRegistration&, ServiceWorkerIdentifier);
     void didResolveRegistrationPromise();
 
@@ -71,7 +71,7 @@
     static void tryActivate(SWServer&, SWServerRegistration&);
     static void activate(SWServer&, SWServerRegistration&);
 
-    bool isCurrentlyProcessingJob(uint64_t jobIdentifier) const;
+    bool isCurrentlyProcessingJob(const ServiceWorkerJobDataIdentifier&) const;
 
     Deque<ServiceWorkerJobData> m_jobQueue;
 

Modified: trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -72,22 +72,22 @@
     return allConnections().begin()->value;
 }
 
-void SWServerToContextConnection::scriptContextFailedToStart(ServiceWorkerIdentifier serviceWorkerIdentifier, const String& message)
+void SWServerToContextConnection::scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, const String& message)
 {
     if (auto* worker = SWServerWorker::existingWorkerForIdentifier(serviceWorkerIdentifier))
-        worker->scriptContextFailedToStart(message);
+        worker->scriptContextFailedToStart(jobDataIdentifier, message);
 }
 
-void SWServerToContextConnection::scriptContextStarted(ServiceWorkerIdentifier serviceWorkerIdentifier)
+void SWServerToContextConnection::scriptContextStarted(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier)
 {
     if (auto* worker = SWServerWorker::existingWorkerForIdentifier(serviceWorkerIdentifier))
-        worker->scriptContextStarted();
+        worker->scriptContextStarted(jobDataIdentifier);
 }
     
-void SWServerToContextConnection::didFinishInstall(ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
+void SWServerToContextConnection::didFinishInstall(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
 {
     if (auto* worker = SWServerWorker::existingWorkerForIdentifier(serviceWorkerIdentifier))
-        worker->didFinishInstall(wasSuccessful);
+        worker->didFinishInstall(jobDataIdentifier, wasSuccessful);
 }
 
 void SWServerToContextConnection::didFinishActivation(ServiceWorkerIdentifier serviceWorkerIdentifier)

Modified: trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -35,6 +35,7 @@
 
 class SWServer;
 struct ServiceWorkerContextData;
+struct ServiceWorkerJobDataIdentifier;
 
 class SWServerToContextConnection : public ThreadSafeRefCounted<SWServerToContextConnection> {
 public:
@@ -49,9 +50,9 @@
     virtual void terminateWorker(ServiceWorkerIdentifier) = 0;
 
     // Messages back from the SW host process
-    WEBCORE_EXPORT void scriptContextFailedToStart(ServiceWorkerIdentifier, const String& message);
-    WEBCORE_EXPORT void scriptContextStarted(ServiceWorkerIdentifier);
-    WEBCORE_EXPORT void didFinishInstall(ServiceWorkerIdentifier, bool wasSuccessful);
+    WEBCORE_EXPORT void scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, const String& message);
+    WEBCORE_EXPORT void scriptContextStarted(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier);
+    WEBCORE_EXPORT void didFinishInstall(const ServiceWorkerJobDataIdentifier&, ServiceWorkerIdentifier, bool wasSuccessful);
     WEBCORE_EXPORT void didFinishActivation(ServiceWorkerIdentifier);
     WEBCORE_EXPORT void setServiceWorkerHasPendingEvents(ServiceWorkerIdentifier, bool hasPendingEvents);
     WEBCORE_EXPORT void workerTerminated(ServiceWorkerIdentifier);

Modified: trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -65,19 +65,19 @@
     m_server.terminateWorker(*this);
 }
 
-void SWServerWorker::scriptContextFailedToStart(const String& message)
+void SWServerWorker::scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const String& message)
 {
-    m_server.scriptContextFailedToStart(*this, message);
+    m_server.scriptContextFailedToStart(jobDataIdentifier, *this, message);
 }
 
-void SWServerWorker::scriptContextStarted()
+void SWServerWorker::scriptContextStarted(const ServiceWorkerJobDataIdentifier& jobDataIdentifier)
 {
-    m_server.scriptContextStarted(*this);
+    m_server.scriptContextStarted(jobDataIdentifier, *this);
 }
 
-void SWServerWorker::didFinishInstall(bool wasSuccessful)
+void SWServerWorker::didFinishInstall(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, bool wasSuccessful)
 {
-    m_server.didFinishInstall(*this, wasSuccessful);
+    m_server.didFinishInstall(jobDataIdentifier, *this, wasSuccessful);
 }
 
 void SWServerWorker::didFinishActivation()

Modified: trunk/Source/WebCore/workers/service/server/SWServerWorker.h (225030 => 225031)


--- trunk/Source/WebCore/workers/service/server/SWServerWorker.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebCore/workers/service/server/SWServerWorker.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -38,6 +38,7 @@
 
 class SWServer;
 enum class WorkerType;
+struct ServiceWorkerJobDataIdentifier;
 
 class SWServerWorker : public ThreadSafeRefCounted<SWServerWorker> {
 public:
@@ -66,9 +67,9 @@
     bool hasPendingEvents() const { return m_hasPendingEvents; }
     void setHasPendingEvents(bool value) { m_hasPendingEvents = value; }
 
-    void scriptContextFailedToStart(const String& message);
-    void scriptContextStarted();
-    void didFinishInstall(bool wasSuccessful);
+    void scriptContextFailedToStart(const ServiceWorkerJobDataIdentifier&, const String& message);
+    void scriptContextStarted(const ServiceWorkerJobDataIdentifier&);
+    void didFinishInstall(const ServiceWorkerJobDataIdentifier&, bool wasSuccessful);
     void didFinishActivation();
     void contextTerminated();
 

Modified: trunk/Source/WebKit/ChangeLog (225030 => 225031)


--- trunk/Source/WebKit/ChangeLog	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/ChangeLog	2017-11-19 07:19:00 UTC (rev 225031)
@@ -1,3 +1,23 @@
+2017-11-18  Chris Dumez  <[email protected]>
+
+        ASSERTION FAILED: registration in WebCore::SWServerJobQueue::scriptContextStarted(ServiceWorkerIdentifier)
+        https://bugs.webkit.org/show_bug.cgi?id=179846
+
+        Reviewed by Darin Adler.
+
+        * StorageProcess/ServiceWorker/WebSWServerConnection.cpp:
+        (WebKit::WebSWServerConnection::rejectJobInClient):
+        (WebKit::WebSWServerConnection::resolveRegistrationJobInClient):
+        (WebKit::WebSWServerConnection::resolveUnregistrationJobInClient):
+        (WebKit::WebSWServerConnection::startScriptFetchInClient):
+        * StorageProcess/ServiceWorker/WebSWServerConnection.h:
+        * StorageProcess/ServiceWorker/WebSWServerToContextConnection.messages.in:
+        * WebProcess/Storage/WebSWClientConnection.messages.in:
+        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+        (WebKit::WebSWContextManagerConnection::serviceWorkerStartedWithMessage):
+        (WebKit::WebSWContextManagerConnection::didFinishInstall):
+        * WebProcess/Storage/WebSWContextManagerConnection.h:
+
 2017-11-18  Tim Horton  <[email protected]>
 
         Rename some Network Capture debugging defines

Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp (225030 => 225031)


--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -72,24 +72,24 @@
     notImplemented();
 }
 
-void WebSWServerConnection::rejectJobInClient(uint64_t jobIdentifier, const ExceptionData& exceptionData)
+void WebSWServerConnection::rejectJobInClient(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const ExceptionData& exceptionData)
 {
-    send(Messages::WebSWClientConnection::JobRejectedInServer(jobIdentifier, exceptionData));
+    send(Messages::WebSWClientConnection::JobRejectedInServer(jobDataIdentifier, exceptionData));
 }
 
-void WebSWServerConnection::resolveRegistrationJobInClient(uint64_t jobIdentifier, const ServiceWorkerRegistrationData& registrationData, ShouldNotifyWhenResolved shouldNotifyWhenResolved)
+void WebSWServerConnection::resolveRegistrationJobInClient(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const ServiceWorkerRegistrationData& registrationData, ShouldNotifyWhenResolved shouldNotifyWhenResolved)
 {
-    send(Messages::WebSWClientConnection::RegistrationJobResolvedInServer(jobIdentifier, registrationData, shouldNotifyWhenResolved));
+    send(Messages::WebSWClientConnection::RegistrationJobResolvedInServer(jobDataIdentifier, registrationData, shouldNotifyWhenResolved));
 }
 
-void WebSWServerConnection::resolveUnregistrationJobInClient(uint64_t jobIdentifier, const ServiceWorkerRegistrationKey& registrationKey, bool unregistrationResult)
+void WebSWServerConnection::resolveUnregistrationJobInClient(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, const ServiceWorkerRegistrationKey& registrationKey, bool unregistrationResult)
 {
-    send(Messages::WebSWClientConnection::UnregistrationJobResolvedInServer(jobIdentifier, unregistrationResult));
+    send(Messages::WebSWClientConnection::UnregistrationJobResolvedInServer(jobDataIdentifier, unregistrationResult));
 }
 
-void WebSWServerConnection::startScriptFetchInClient(uint64_t jobIdentifier)
+void WebSWServerConnection::startScriptFetchInClient(const ServiceWorkerJobDataIdentifier& jobDataIdentifier)
 {
-    send(Messages::WebSWClientConnection::StartScriptFetchForServer(jobIdentifier));
+    send(Messages::WebSWClientConnection::StartScriptFetchForServer(jobDataIdentifier));
 }
 
 void WebSWServerConnection::updateRegistrationStateInClient(ServiceWorkerRegistrationIdentifier identifier, ServiceWorkerRegistrationState state, const std::optional<ServiceWorkerData>& serviceWorkerData)

Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (225030 => 225031)


--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -66,10 +66,10 @@
 
 private:
     // Implement SWServer::Connection (Messages to the client WebProcess)
-    void rejectJobInClient(uint64_t jobIdentifier, const WebCore::ExceptionData&) final;
-    void resolveRegistrationJobInClient(uint64_t jobIdentifier, const WebCore::ServiceWorkerRegistrationData&, WebCore::ShouldNotifyWhenResolved) final;
-    void resolveUnregistrationJobInClient(uint64_t jobIdentifier, const WebCore::ServiceWorkerRegistrationKey&, bool unregistrationResult) final;
-    void startScriptFetchInClient(uint64_t jobIdentifier) final;
+    void rejectJobInClient(const WebCore::ServiceWorkerJobDataIdentifier&, const WebCore::ExceptionData&) final;
+    void resolveRegistrationJobInClient(const WebCore::ServiceWorkerJobDataIdentifier&, const WebCore::ServiceWorkerRegistrationData&, WebCore::ShouldNotifyWhenResolved) final;
+    void resolveUnregistrationJobInClient(const WebCore::ServiceWorkerJobDataIdentifier&, const WebCore::ServiceWorkerRegistrationKey&, bool unregistrationResult) final;
+    void startScriptFetchInClient(const WebCore::ServiceWorkerJobDataIdentifier&) final;
     void updateRegistrationStateInClient(WebCore::ServiceWorkerRegistrationIdentifier, WebCore::ServiceWorkerRegistrationState, const std::optional<WebCore::ServiceWorkerData>&) final;
     void updateWorkerStateInClient(WebCore::ServiceWorkerIdentifier, WebCore::ServiceWorkerState) final;
     void fireUpdateFoundEvent(WebCore::ServiceWorkerRegistrationIdentifier) final;

Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerToContextConnection.messages.in (225030 => 225031)


--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerToContextConnection.messages.in	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerToContextConnection.messages.in	2017-11-19 07:19:00 UTC (rev 225031)
@@ -25,9 +25,9 @@
 messages -> WebSWServerToContextConnection {
     # When possible, these messages can be implemented directly by WebCore::SWServerToContextConnection
 
-    ScriptContextFailedToStart(WebCore::ServiceWorkerIdentifier identifier, String message);
-    ScriptContextStarted(WebCore::ServiceWorkerIdentifier identifier);
-    DidFinishInstall(WebCore::ServiceWorkerIdentifier identifier, bool wasSuccessful);
+    ScriptContextFailedToStart(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, String message);
+    ScriptContextStarted(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier);
+    DidFinishInstall(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful);
     DidFinishActivation(WebCore::ServiceWorkerIdentifier identifier);
     SetServiceWorkerHasPendingEvents(WebCore::ServiceWorkerIdentifier identifier, bool hasPendingEvents);
     WorkerTerminated(WebCore::ServiceWorkerIdentifier identifier);

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in (225030 => 225031)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in	2017-11-19 07:19:00 UTC (rev 225031)
@@ -24,10 +24,10 @@
 
 messages -> WebSWClientConnection {
     # When possible, these messages can be implemented directly by WebCore::SWServer::Connection
-    JobRejectedInServer(uint64_t identifier, struct WebCore::ExceptionData exception)
-    RegistrationJobResolvedInServer(uint64_t identifier, struct WebCore::ServiceWorkerRegistrationData registration, enum WebCore::ShouldNotifyWhenResolved shouldNotifyWhenResolved)
-    UnregistrationJobResolvedInServer(uint64_t identifier, bool unregistrationResult)
-    StartScriptFetchForServer(uint64_t jobIdentifier)
+    JobRejectedInServer(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, struct WebCore::ExceptionData exception)
+    RegistrationJobResolvedInServer(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, struct WebCore::ServiceWorkerRegistrationData registration, enum WebCore::ShouldNotifyWhenResolved shouldNotifyWhenResolved)
+    UnregistrationJobResolvedInServer(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier, bool unregistrationResult)
+    StartScriptFetchForServer(struct WebCore::ServiceWorkerJobDataIdentifier jobDataIdentifier)
     UpdateRegistrationState(WebCore::ServiceWorkerRegistrationIdentifier identifier, enum WebCore::ServiceWorkerRegistrationState state, std::optional<WebCore::ServiceWorkerData> serviceWorkerIdentifier)
     UpdateWorkerState(WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, enum WebCore::ServiceWorkerState state)
     FireUpdateFoundEvent(WebCore::ServiceWorkerRegistrationIdentifier identifier)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (225030 => 225031)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-11-19 07:19:00 UTC (rev 225031)
@@ -124,12 +124,12 @@
     LOG(ServiceWorker, "Context process PID: %i created worker thread\n", getpid());
 }
 
-void WebSWContextManagerConnection::serviceWorkerStartedWithMessage(ServiceWorkerIdentifier serviceWorkerIdentifier, const String& exceptionMessage)
+void WebSWContextManagerConnection::serviceWorkerStartedWithMessage(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, const String& exceptionMessage)
 {
     if (exceptionMessage.isEmpty())
-        m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::ScriptContextStarted(serviceWorkerIdentifier), 0);
+        m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::ScriptContextStarted(jobDataIdentifier, serviceWorkerIdentifier), 0);
     else
-        m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::ScriptContextFailedToStart(serviceWorkerIdentifier, exceptionMessage), 0);
+        m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::ScriptContextFailedToStart(jobDataIdentifier, serviceWorkerIdentifier, exceptionMessage), 0);
 }
 
 void WebSWContextManagerConnection::startFetch(SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchIdentifier, std::optional<ServiceWorkerIdentifier> serviceWorkerIdentifier, ResourceRequest&& request, FetchOptions&& options, IPC::FormDataReference&& formData)
@@ -171,9 +171,9 @@
     m_connectionToStorageProcess->send(Messages::StorageProcess::PostMessageToServiceWorkerClient(destinationIdentifier, IPC::DataReference { message->data() }, sourceIdentifier, sourceOrigin), 0);
 }
 
-void WebSWContextManagerConnection::didFinishInstall(ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
+void WebSWContextManagerConnection::didFinishInstall(const ServiceWorkerJobDataIdentifier& jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
 {
-    m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::DidFinishInstall(serviceWorkerIdentifier, wasSuccessful), 0);
+    m_connectionToStorageProcess->send(Messages::WebSWServerToContextConnection::DidFinishInstall(jobDataIdentifier, serviceWorkerIdentifier, wasSuccessful), 0);
 }
 
 void WebSWContextManagerConnection::didFinishActivation(ServiceWorkerIdentifier serviceWorkerIdentifier)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h (225030 => 225031)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2017-11-19 06:59:59 UTC (rev 225030)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2017-11-19 07:19:00 UTC (rev 225031)
@@ -57,13 +57,13 @@
 
     // WebCore::SWContextManager::Connection.
     void postMessageToServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, Ref<WebCore::SerializedScriptValue>&& message, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin) final;
-    void didFinishInstall(WebCore::ServiceWorkerIdentifier, bool wasSuccessful) final;
+    void didFinishInstall(const WebCore::ServiceWorkerJobDataIdentifier&, WebCore::ServiceWorkerIdentifier, bool wasSuccessful) final;
     void didFinishActivation(WebCore::ServiceWorkerIdentifier) final;
     void setServiceWorkerHasPendingEvents(WebCore::ServiceWorkerIdentifier, bool) final;
     void workerTerminated(WebCore::ServiceWorkerIdentifier) final;
 
     // IPC messages.
-    void serviceWorkerStartedWithMessage(WebCore::ServiceWorkerIdentifier, const String& exceptionMessage) final;
+    void serviceWorkerStartedWithMessage(const WebCore::ServiceWorkerJobDataIdentifier&, WebCore::ServiceWorkerIdentifier, const String& exceptionMessage) final;
     void installServiceWorker(const WebCore::ServiceWorkerContextData&);
     void startFetch(WebCore::SWServerConnectionIdentifier, uint64_t fetchIdentifier, std::optional<WebCore::ServiceWorkerIdentifier>, WebCore::ResourceRequest&&, WebCore::FetchOptions&&, IPC::FormDataReference&&);
     void postMessageToServiceWorkerGlobalScope(WebCore::ServiceWorkerIdentifier destinationIdentifier, const IPC::DataReference& message, WebCore::ServiceWorkerClientIdentifier sourceIdentifier, WebCore::ServiceWorkerClientData&& sourceData);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to