Diff
Modified: trunk/Source/WebCore/ChangeLog (224378 => 224379)
--- trunk/Source/WebCore/ChangeLog 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/ChangeLog 2017-11-03 04:36:20 UTC (rev 224379)
@@ -1,3 +1,53 @@
+2017-11-02 Brady Eidson <beid...@apple.com>
+
+ SW: Implement "Update Registration State" algorithm (unused for now)
+ https://bugs.webkit.org/show_bug.cgi?id=179186
+
+ Reviewed by Chris Dumez.
+
+ No new tests (No behavior change yet).
+
+ This algorithm is very simple, and this patch plumbs it through.
+ But it's not useful to start using this algorithm without "Update Worker State" also.
+ So to keep this patch small, it's unused for now. Will be used in the next patch.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+ * workers/service/ServiceWorkerContainer.cpp:
+ (WebCore::ServiceWorkerContainer::jobResolvedWithRegistration):
+
+ * workers/service/ServiceWorkerRegistration.cpp:
+ (WebCore::ServiceWorkerRegistration::ServiceWorkerRegistration):
+ (WebCore::ServiceWorkerRegistration::~ServiceWorkerRegistration):
+ (WebCore::ServiceWorkerRegistration::updateStateFromServer):
+ * workers/service/ServiceWorkerRegistration.h:
+
+ * workers/service/ServiceWorkerTypes.h: Copied from Source/WebCore/workers/service/server/SWServerRegistration.cpp.
+
+ * workers/service/server/SWClientConnection.cpp:
+ (WebCore::SWClientConnection::addServiceWorkerRegistration):
+ (WebCore::SWClientConnection::removeServiceWorkerRegistration):
+ (WebCore::SWClientConnection::updateRegistrationState):
+ * workers/service/server/SWClientConnection.h:
+
+ * workers/service/server/SWServer.cpp:
+ (WebCore::SWServer::Connection::addServiceWorkerRegistrationInServer):
+ (WebCore::SWServer::Connection::removeServiceWorkerRegistrationInServer):
+ (WebCore::SWServer::addClientServiceWorkerRegistration):
+ (WebCore::SWServer::removeClientServiceWorkerRegistration):
+ * workers/service/server/SWServer.h:
+ (WebCore::SWServer::getConnection):
+
+ * workers/service/server/SWServerJobQueue.cpp:
+ (WebCore::SWServerJobQueue::runRegisterJob):
+
+ * workers/service/server/SWServerRegistration.cpp:
+ (WebCore::SWServerRegistration::SWServerRegistration):
+ (WebCore::SWServerRegistration::updateRegistrationState):
+ (WebCore::SWServerRegistration::addClientServiceWorkerRegistration):
+ (WebCore::SWServerRegistration::removeClientServiceWorkerRegistration):
+ * workers/service/server/SWServerRegistration.h:
+
2017-11-01 Ryosuke Niwa <rn...@webkit.org>
Assert that updateStyle and updateLayout are only called when it's safe to dispatch events
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (224378 => 224379)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-11-03 04:36:20 UTC (rev 224379)
@@ -1310,6 +1310,7 @@
515BE1951D54F5FB00DD7C68 /* PlatformGamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = 515BE18E1D54F5F600DD7C68 /* PlatformGamepad.h */; settings = {ATTRIBUTES = (Private, ); }; };
515BE19C1D54F6C100DD7C68 /* HIDGamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = 515BE1981D54F6BD00DD7C68 /* HIDGamepad.h */; settings = {ATTRIBUTES = (Private, ); }; };
515BE19E1D54F6C100DD7C68 /* HIDGamepadProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 515BE19A1D54F6BD00DD7C68 /* HIDGamepadProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 515E37F61FAA940200D7F22A /* ServiceWorkerTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 515E37F41FAA938800D7F22A /* ServiceWorkerTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
515F79541CFCA3D500CCED93 /* WebCoreCrossThreadCopier.h in Headers */ = {isa = PBXBuildFile; fileRef = 515F79521CFCA3C700CCED93 /* WebCoreCrossThreadCopier.h */; settings = {ATTRIBUTES = (Private, ); }; };
5160712F1BD8307800DBC4F2 /* IDBObjectStoreInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 5160712D1BD8307200DBC4F2 /* IDBObjectStoreInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
516071321BD8308B00DBC4F2 /* TransactionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5160712B1BD8305300DBC4F2 /* TransactionOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -7588,6 +7589,7 @@
515BE1981D54F6BD00DD7C68 /* HIDGamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HIDGamepad.h; sourceTree = "<group>"; };
515BE1991D54F6BD00DD7C68 /* HIDGamepadProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HIDGamepadProvider.cpp; sourceTree = "<group>"; };
515BE19A1D54F6BD00DD7C68 /* HIDGamepadProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HIDGamepadProvider.h; sourceTree = "<group>"; };
+ 515E37F41FAA938800D7F22A /* ServiceWorkerTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerTypes.h; sourceTree = "<group>"; };
515F79511CFCA3C700CCED93 /* WebCoreCrossThreadCopier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebCoreCrossThreadCopier.cpp; sourceTree = "<group>"; };
515F79521CFCA3C700CCED93 /* WebCoreCrossThreadCopier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreCrossThreadCopier.h; sourceTree = "<group>"; };
5160300A0CC4251200C8AC25 /* FileSystemPOSIX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileSystemPOSIX.cpp; sourceTree = "<group>"; };
@@ -17267,6 +17269,7 @@
517A53261F4B90B200DCDC0A /* ServiceWorkerRegistrationKey.h */,
51F645A01F4BF51600B54DED /* ServiceWorkerRegistrationOptions.cpp */,
51F1754A1F3EBC0C00C74950 /* ServiceWorkerRegistrationOptions.h */,
+ 515E37F41FAA938800D7F22A /* ServiceWorkerTypes.h */,
51F175471F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.h */,
51F175461F3EBC0C00C74950 /* ServiceWorkerUpdateViaCache.idl */,
46EF14251F97B7BA00C2A524 /* ServiceWorkerWindowClient.cpp */,
@@ -28906,6 +28909,7 @@
51F175691F3EBC8300C74950 /* ServiceWorkerRegistrationOptions.h in Headers */,
51BCCE301F8F179E006BA0ED /* ServiceWorkerThread.h in Headers */,
4112B5431F9F9CA000E67875 /* ServiceWorkerThreadProxy.h in Headers */,
+ 515E37F61FAA940200D7F22A /* ServiceWorkerTypes.h in Headers */,
51F1756C1F3EBC8300C74950 /* ServiceWorkerUpdateViaCache.h in Headers */,
46EF142A1F97B7D800C2A524 /* ServiceWorkerWindowClient.h in Headers */,
93309E10099E64920056E581 /* SetNodeAttributeCommand.h in Headers */,
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -250,7 +250,10 @@
}
activeServiceWorker->setState(ServiceWorker::State::Installing);
- auto registration = ServiceWorkerRegistration::create(*context, WTFMove(data), *activeServiceWorker);
+
+ ASSERT(m_swConnection);
+ auto registration = ServiceWorkerRegistration::create(*context, *m_swConnection, WTFMove(data), *activeServiceWorker);
+
job.promise().resolve<IDLInterface<ServiceWorkerRegistration>>(registration.get());
// Use a microtask because we need to make sure this is executed after the promise above is resolved.
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -31,20 +31,25 @@
#include "Document.h"
#include "ServiceWorker.h"
#include "ServiceWorkerContainer.h"
+#include "ServiceWorkerTypes.h"
#include "WorkerGlobalScope.h"
namespace WebCore {
-ServiceWorkerRegistration::ServiceWorkerRegistration(ScriptExecutionContext& context, ServiceWorkerRegistrationData&& registrationData, Ref<ServiceWorker>&& serviceWorker)
+ServiceWorkerRegistration::ServiceWorkerRegistration(ScriptExecutionContext& context, SWClientConnection& connection, ServiceWorkerRegistrationData&& registrationData, Ref<ServiceWorker>&& serviceWorker)
: ActiveDOMObject(&context)
, m_registrationData(WTFMove(registrationData))
, m_serviceWorker(WTFMove(serviceWorker))
+ , m_connection(connection)
{
suspendIfNeeded();
+
+ m_connection->addServiceWorkerRegistration(*this);
}
ServiceWorkerRegistration::~ServiceWorkerRegistration()
{
+ m_connection->removeServiceWorkerRegistration(*this);
}
ServiceWorker* ServiceWorkerRegistration::installing()
@@ -101,6 +106,13 @@
container->removeRegistration(m_registrationData.scopeURL, WTFMove(promise));
}
+void ServiceWorkerRegistration::updateStateFromServer(ServiceWorkerRegistrationState state, const String& workerID)
+{
+ // FIXME: Implement here along with "Update Worker State" algorithm
+ UNUSED_PARAM(state);
+ UNUSED_PARAM(workerID);
+}
+
EventTargetInterface ServiceWorkerRegistration::eventTargetInterface() const
{
return ServiceWorkerRegistrationEventTargetInterfaceType;
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.h (224378 => 224379)
--- trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -30,7 +30,9 @@
#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "JSDOMPromiseDeferred.h"
+#include "SWClientConnection.h"
#include "ServiceWorkerRegistrationData.h"
+#include <wtf/Identified.h>
namespace WebCore {
@@ -37,11 +39,11 @@
class ScriptExecutionContext;
class ServiceWorker;
-class ServiceWorkerRegistration final : public RefCounted<ServiceWorkerRegistration>, public EventTargetWithInlineData, public ActiveDOMObject {
+class ServiceWorkerRegistration final : public RefCounted<ServiceWorkerRegistration>, public EventTargetWithInlineData, public ActiveDOMObject, public ThreadSafeIdentified<ServiceWorkerRegistration> {
public:
- static Ref<ServiceWorkerRegistration> create(ScriptExecutionContext& context, ServiceWorkerRegistrationData&& data, Ref<ServiceWorker>&& serviceWorker)
+ template <typename... Args> static Ref<ServiceWorkerRegistration> create(Args&&... args)
{
- return adoptRef(*new ServiceWorkerRegistration(context, WTFMove(data), WTFMove(serviceWorker)));
+ return adoptRef(*new ServiceWorkerRegistration(std::forward<Args>(args)...));
}
~ServiceWorkerRegistration();
@@ -58,9 +60,13 @@
using RefCounted::ref;
using RefCounted::deref;
+
+ const ServiceWorkerRegistrationData& data() const { return m_registrationData; }
+ void updateStateFromServer(ServiceWorkerRegistrationState, const String& workerID);
+
private:
- ServiceWorkerRegistration(ScriptExecutionContext&, ServiceWorkerRegistrationData&&, Ref<ServiceWorker>&&);
+ ServiceWorkerRegistration(ScriptExecutionContext&, SWClientConnection&, ServiceWorkerRegistrationData&&, Ref<ServiceWorker>&&);
EventTargetInterface eventTargetInterface() const final;
ScriptExecutionContext* scriptExecutionContext() const final;
@@ -72,6 +78,7 @@
ServiceWorkerRegistrationData m_registrationData;
Ref<ServiceWorker> m_serviceWorker;
+ Ref<SWClientConnection> m_connection;
};
} // namespace WebCore
Copied: trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h (from rev 224378, trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp) (0 => 224379)
--- trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h (rev 0)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -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.
+ */
+
+#pragma once
+
+#if ENABLE(SERVICE_WORKER)
+
+namespace WebCore {
+
+enum class ServiceWorkerRegistrationState {
+ Installing = 0,
+ Waiting = 1,
+ Active = 2,
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWClientConnection.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -34,6 +34,7 @@
#include "ServiceWorkerContainer.h"
#include "ServiceWorkerFetchResult.h"
#include "ServiceWorkerJobData.h"
+#include "ServiceWorkerRegistration.h"
namespace WebCore {
@@ -63,6 +64,32 @@
finishFetchingScriptInServer({ job.data().identifier(), job.data().connectionIdentifier(), job.data().registrationKey(), { }, error });
}
+void SWClientConnection::addServiceWorkerRegistration(ServiceWorkerRegistration& registration)
+{
+ auto result = m_registrations.ensure(registration.data().key, [] {
+ return std::make_unique<HashSet<ServiceWorkerRegistration*>>();
+ });
+
+ ASSERT(!result.iterator->value->contains(®istration));
+ result.iterator->value->add(®istration);
+
+ addServiceWorkerRegistrationInServer(registration.data().key, registration.identifier());
+}
+
+void SWClientConnection::removeServiceWorkerRegistration(ServiceWorkerRegistration& registration)
+{
+ auto iterator = m_registrations.find(registration.data().key);
+
+ ASSERT(iterator != m_registrations.end());
+ ASSERT(iterator->value && iterator->value->contains(®istration));
+ iterator->value->remove(®istration);
+
+ if (iterator->value->isEmpty())
+ m_registrations.remove(iterator);
+
+ removeServiceWorkerRegistrationInServer(registration.data().key, registration.identifier());
+}
+
void SWClientConnection::jobRejectedInServer(uint64_t jobIdentifier, const ExceptionData& exceptionData)
{
auto job = m_scheduledJobs.take(jobIdentifier);
@@ -137,6 +164,16 @@
container->dispatchEvent(messageEvent);
}
+void SWClientConnection::updateRegistrationState(const ServiceWorkerRegistrationKey& key, ServiceWorkerRegistrationState state, const String& workerID)
+{
+ auto* registrations = m_registrations.get(key);
+ if (!registrations)
+ return;
+
+ for (auto& registration : *registrations)
+ registration->updateStateFromServer(state, workerID);
+}
+
} // namespace WebCore
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/server/SWClientConnection.h (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWClientConnection.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWClientConnection.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -36,7 +36,9 @@
class ResourceError;
class SecurityOrigin;
class SerializedScriptValue;
+class ServiceWorkerRegistration;
class SharedBuffer;
+enum class ServiceWorkerRegistrationState;
struct ExceptionData;
struct ServiceWorkerFetchResult;
struct ServiceWorkerRegistrationData;
@@ -43,29 +45,36 @@
class SWClientConnection : public ThreadSafeRefCounted<SWClientConnection> {
public:
- WEBCORE_EXPORT SWClientConnection();
WEBCORE_EXPORT virtual ~SWClientConnection();
void scheduleJob(ServiceWorkerJob&);
void finishedFetchingScript(ServiceWorkerJob&, const String&);
void failedFetchingScript(ServiceWorkerJob&, const ResourceError&);
+ void addServiceWorkerRegistration(ServiceWorkerRegistration&);
+ void removeServiceWorkerRegistration(ServiceWorkerRegistration&);
+
virtual void postMessageToServiceWorkerGlobalScope(uint64_t destinationServiceWorkerIdentifier, Ref<SerializedScriptValue>&&, ScriptExecutionContext& source) = 0;
-
virtual uint64_t identifier() const = 0;
virtual bool hasServiceWorkerRegisteredForOrigin(const SecurityOrigin&) const = 0;
protected:
+ WEBCORE_EXPORT SWClientConnection();
+
WEBCORE_EXPORT void jobRejectedInServer(uint64_t jobIdentifier, const ExceptionData&);
WEBCORE_EXPORT void registrationJobResolvedInServer(uint64_t jobIdentifier, ServiceWorkerRegistrationData&&);
WEBCORE_EXPORT void unregistrationJobResolvedInServer(uint64_t jobIdentifier, bool unregistrationResult);
WEBCORE_EXPORT void startScriptFetchForServer(uint64_t jobIdentifier);
WEBCORE_EXPORT void postMessageToServiceWorkerClient(uint64_t destinationScriptExecutionContextIdentifier, Ref<SerializedScriptValue>&& message, uint64_t sourceServiceWorkerIdentifier, const String& sourceOrigin);
+ WEBCORE_EXPORT void updateRegistrationState(const ServiceWorkerRegistrationKey&, ServiceWorkerRegistrationState, const String& workerID);
private:
virtual void scheduleJobInServer(const ServiceWorkerJobData&) = 0;
virtual void finishFetchingScriptInServer(const ServiceWorkerFetchResult&) = 0;
+ virtual void addServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier) = 0;
+ virtual void removeServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier) = 0;
HashMap<uint64_t, RefPtr<ServiceWorkerJob>> m_scheduledJobs;
+ HashMap<ServiceWorkerRegistrationKey, std::unique_ptr<HashSet<ServiceWorkerRegistration*>>> m_registrations;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWServer.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -99,6 +99,16 @@
m_server.scriptFetchFinished(*this, result);
}
+void SWServer::Connection::addServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey& key, uint64_t clientRegistrationIdentifier)
+{
+ m_server.addClientServiceWorkerRegistration(*this, key, clientRegistrationIdentifier);
+}
+
+void SWServer::Connection::removeServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey& key, uint64_t clientRegistrationIdentifier)
+{
+ m_server.removeClientServiceWorkerRegistration(*this, key, clientRegistrationIdentifier);
+}
+
void SWServer::Connection::scriptContextFailedToStart(const ServiceWorkerRegistrationKey& registrationKey, const String& workerID, const String& message)
{
m_server.scriptContextFailedToStart(*this, registrationKey, workerID, message);
@@ -201,6 +211,28 @@
jobQueue->scriptContextStarted(connection, serviceWorkerIdentifier, workerID);
}
+void SWServer::addClientServiceWorkerRegistration(Connection& connection, const ServiceWorkerRegistrationKey& key, uint64_t registrationIdentifier)
+{
+ auto* registration = m_registrations.get(key);
+ if (!registration) {
+ LOG_ERROR("Request to add client-side ServiceWorkerRegistration to non-existent server-side registration");
+ return;
+ }
+
+ registration->addClientServiceWorkerRegistration(connection.identifier(), registrationIdentifier);
+}
+
+void SWServer::removeClientServiceWorkerRegistration(Connection& connection, const ServiceWorkerRegistrationKey& key, uint64_t registrationIdentifier)
+{
+ auto* registration = m_registrations.get(key);
+ if (!registration) {
+ LOG_ERROR("Request to remove client-side ServiceWorkerRegistration from non-existent server-side registration");
+ return;
+ }
+
+ registration->removeClientServiceWorkerRegistration(connection.identifier(), registrationIdentifier);
+}
+
Ref<SWServerWorker> SWServer::updateWorker(Connection& connection, const ServiceWorkerRegistrationKey& registrationKey, const URL& url, const String& script, WorkerType type)
{
String workerID = createCanonicalUUIDString();
Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWServer.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -43,6 +43,7 @@
class SWServerJobQueue;
class SWServerRegistration;
class SWServerWorker;
+enum class ServiceWorkerRegistrationState;
struct ExceptionData;
struct ServiceWorkerContextData;
struct ServiceWorkerFetchResult;
@@ -57,6 +58,9 @@
WEBCORE_EXPORT void scriptContextFailedToStart(const ServiceWorkerRegistrationKey&, const String& workerID, const String& message);
WEBCORE_EXPORT void scriptContextStarted(const ServiceWorkerRegistrationKey&, uint64_t serviceWorkerIdentifier, const String& workerID);
+
+ // Messages to the client WebProcess
+ virtual void updateRegistrationStateInClient(const ServiceWorkerRegistrationKey&, ServiceWorkerRegistrationState, const String& serviceWorkerID) = 0;
protected:
WEBCORE_EXPORT Connection(SWServer&, uint64_t identifier);
@@ -64,6 +68,8 @@
WEBCORE_EXPORT void scheduleJobInServer(const ServiceWorkerJobData&);
WEBCORE_EXPORT void finishFetchingScriptInServer(const ServiceWorkerFetchResult&);
+ WEBCORE_EXPORT void addServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey&, uint64_t clientRegistrationIdentifier);
+ WEBCORE_EXPORT void removeServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey&, uint64_t clientRegistrationIdentifier);
private:
// Messages to the client WebProcess
@@ -96,6 +102,8 @@
Ref<SWServerWorker> updateWorker(Connection&, const ServiceWorkerRegistrationKey&, const URL&, const String& script, WorkerType);
+ Connection* getConnection(uint64_t identifier) { return m_connections.get(identifier); }
+
private:
void registerConnection(Connection&);
void unregisterConnection(Connection&);
@@ -107,6 +115,9 @@
void scriptContextFailedToStart(Connection&, const ServiceWorkerRegistrationKey&, const String& workerID, const String& message);
void scriptContextStarted(Connection&, const ServiceWorkerRegistrationKey&, uint64_t serviceWorkerIdentifier, const String& workerID);
+ void addClientServiceWorkerRegistration(Connection&, const ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier);
+ void removeClientServiceWorkerRegistration(Connection&, const ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier);
+
HashMap<uint64_t, Connection*> m_connections;
HashMap<ServiceWorkerRegistrationKey, std::unique_ptr<SWServerRegistration>> m_registrations;
HashMap<ServiceWorkerRegistrationKey, std::unique_ptr<SWServerJobQueue>> m_jobQueues;
Modified: trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWServerJobQueue.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -148,7 +148,7 @@
return;
}
} else {
- auto newRegistration = std::make_unique<SWServerRegistration>(m_registrationKey, job.registrationOptions.updateViaCache, job.scopeURL, job.scriptURL);
+ auto newRegistration = std::make_unique<SWServerRegistration>(m_server, m_registrationKey, job.registrationOptions.updateViaCache, job.scopeURL, job.scriptURL);
m_server.addRegistration(WTFMove(newRegistration));
}
Modified: trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWServerRegistration.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -30,15 +30,17 @@
#include "SWServer.h"
#include "SWServerWorker.h"
+#include "ServiceWorkerTypes.h"
#include "ServiceWorkerUpdateViaCache.h"
namespace WebCore {
-SWServerRegistration::SWServerRegistration(const ServiceWorkerRegistrationKey& key, ServiceWorkerUpdateViaCache updateViaCache, const URL& scopeURL, const URL& scriptURL)
+SWServerRegistration::SWServerRegistration(SWServer& server, const ServiceWorkerRegistrationKey& key, ServiceWorkerUpdateViaCache updateViaCache, const URL& scopeURL, const URL& scriptURL)
: m_registrationKey(key)
, m_updateViaCache(updateViaCache)
, m_scopeURL(scopeURL)
, m_scriptURL(scriptURL)
+ , m_server(server)
{
m_scopeURL.removeFragmentIdentifier();
}
@@ -57,11 +59,57 @@
return m_activeWorker.get();
}
+void SWServerRegistration::updateRegistrationState(ServiceWorkerRegistrationState state, SWServerWorker* worker)
+{
+ switch (state) {
+ case ServiceWorkerRegistrationState::Installing:
+ m_installingWorker = worker;
+ break;
+ case ServiceWorkerRegistrationState::Waiting:
+ m_waitingWorker = worker;
+ break;
+ case ServiceWorkerRegistrationState::Active:
+ m_activeWorker = worker;
+ break;
+ };
+
+ String workerID;
+ if (worker)
+ workerID = worker->workerID();
+
+ for (auto& connectionIdentifierWithClients : m_clientRegistrationsByConnection.keys()) {
+ if (auto* connection = m_server.getConnection(connectionIdentifierWithClients))
+ connection->updateRegistrationStateInClient(m_registrationKey, state, workerID);
+ }
+}
+
ServiceWorkerRegistrationData SWServerRegistration::data() const
{
return { m_registrationKey, identifier(), m_activeServiceWorkerIdentifier, m_scopeURL, m_scriptURL, m_updateViaCache };
}
+void SWServerRegistration::addClientServiceWorkerRegistration(uint64_t connectionIdentifier, uint64_t clientRegistrationIdentifier)
+{
+ auto result = m_clientRegistrationsByConnection.ensure(connectionIdentifier, [] {
+ return std::make_unique<HashSet<uint64_t>>();
+ });
+
+ ASSERT(!result.iterator->value->contains(clientRegistrationIdentifier));
+ result.iterator->value->add(clientRegistrationIdentifier);
+}
+
+void SWServerRegistration::removeClientServiceWorkerRegistration(uint64_t connectionIdentifier, uint64_t clientRegistrationIdentifier)
+{
+ auto iterator = m_clientRegistrationsByConnection.find(connectionIdentifier);
+ if (iterator == m_clientRegistrationsByConnection.end() || !iterator->value)
+ return;
+
+ ASSERT(iterator->value->contains(clientRegistrationIdentifier));
+ iterator->value->remove(clientRegistrationIdentifier);
+ if (iterator->value->isEmpty())
+ m_clientRegistrationsByConnection.remove(iterator);
+}
+
} // namespace WebCore
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebCore/workers/service/server/SWServerRegistration.h (224378 => 224379)
--- trunk/Source/WebCore/workers/service/server/SWServerRegistration.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebCore/workers/service/server/SWServerRegistration.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -33,13 +33,15 @@
namespace WebCore {
+class SWServer;
class SWServerWorker;
+enum class ServiceWorkerRegistrationState;
struct ExceptionData;
struct ServiceWorkerFetchResult;
class SWServerRegistration : public ThreadSafeIdentified<SWServerRegistration> {
public:
- SWServerRegistration(const ServiceWorkerRegistrationKey&, ServiceWorkerUpdateViaCache, const URL& scopeURL, const URL& scriptURL);
+ SWServerRegistration(SWServer&, const ServiceWorkerRegistrationKey&, ServiceWorkerUpdateViaCache, const URL& scopeURL, const URL& scriptURL);
~SWServerRegistration();
const ServiceWorkerRegistrationKey& key() const { return m_registrationKey; }
@@ -55,6 +57,11 @@
void setActiveServiceWorkerIdentifier(uint64_t identifier) { m_activeServiceWorkerIdentifier = identifier; }
+ void updateRegistrationState(ServiceWorkerRegistrationState, SWServerWorker*);
+
+ void addClientServiceWorkerRegistration(uint64_t connectionIdentifier, uint64_t clientRegistrationIdentifier);
+ void removeClientServiceWorkerRegistration(uint64_t connectionIdentifier, uint64_t clientRegistrationIdentifier);
+
private:
ServiceWorkerRegistrationKey m_registrationKey;
ServiceWorkerUpdateViaCache m_updateViaCache;
@@ -62,13 +69,16 @@
URL m_scriptURL;
bool m_uninstalling { false };
- std::unique_ptr<SWServerWorker> m_installingWorker;
- std::unique_ptr<SWServerWorker> m_waitingWorker;
- std::unique_ptr<SWServerWorker> m_activeWorker;
+ RefPtr<SWServerWorker> m_installingWorker;
+ RefPtr<SWServerWorker> m_waitingWorker;
+ RefPtr<SWServerWorker> m_activeWorker;
uint64_t m_activeServiceWorkerIdentifier { 0 };
double m_lastUpdateTime { 0 };
+
+ HashMap<uint64_t, std::unique_ptr<HashSet<uint64_t>>> m_clientRegistrationsByConnection;
+ SWServer& m_server;
};
} // namespace WebCore
Modified: trunk/Source/WebKit/ChangeLog (224378 => 224379)
--- trunk/Source/WebKit/ChangeLog 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/ChangeLog 2017-11-03 04:36:20 UTC (rev 224379)
@@ -1,3 +1,26 @@
+2017-11-02 Brady Eidson <beid...@apple.com>
+
+ SW: Implement "Update Registration State" algorithm (unused for now)
+ https://bugs.webkit.org/show_bug.cgi?id=179186
+
+ Reviewed by Chris Dumez.
+
+ * Scripts/webkit/messages.py:
+ (headers_for_type):
+
+ * Shared/WebCoreArgumentCoders.h:
+
+ * StorageProcess/ServiceWorker/WebSWServerConnection.cpp:
+ (WebKit::WebSWServerConnection::updateRegistrationStateInClient):
+ * StorageProcess/ServiceWorker/WebSWServerConnection.h:
+ * StorageProcess/ServiceWorker/WebSWServerConnection.messages.in:
+
+ * WebProcess/Storage/WebSWClientConnection.cpp:
+ (WebKit::WebSWClientConnection::addServiceWorkerRegistrationInServer):
+ (WebKit::WebSWClientConnection::removeServiceWorkerRegistrationInServer):
+ * WebProcess/Storage/WebSWClientConnection.h:
+ * WebProcess/Storage/WebSWClientConnection.messages.in:
+
2017-11-02 Alex Christensen <achristen...@webkit.org>
Use CompletionHandlers for redirects
Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (224378 => 224379)
--- trunk/Source/WebKit/Scripts/webkit/messages.py 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py 2017-11-03 04:36:20 UTC (rev 224379)
@@ -370,7 +370,9 @@
'WebCore::PaymentAuthorizationResult': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
'WebCore::PaymentMethodUpdate': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
'WebCore::PluginInfo': ['<WebCore/PluginData.h>'],
+ 'WebCore::PolicyAction': ['<WebCore/FrameLoaderTypes.h>'],
'WebCore::RecentSearch': ['<WebCore/SearchPopupMenu.h>'],
+ 'WebCore::ServiceWorkerRegistrationState': ['<WebCore/ServiceWorkerTypes.h>'],
'WebCore::ShippingContactUpdate': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
'WebCore::ShippingMethodUpdate': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
'WebCore::ShouldSample': ['<WebCore/DiagnosticLoggingClient.h>'],
@@ -388,7 +390,6 @@
'WebKit::WebMouseEvent': ['"WebEvent.h"'],
'WebKit::WebTouchEvent': ['"WebEvent.h"'],
'WebKit::WebWheelEvent': ['"WebEvent.h"'],
- 'WebCore::PolicyAction': ['<WebCore/FrameLoaderTypes.h>'],
'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'],
'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'],
'struct WebKit::WebScriptMessageHandlerData': ['"WebUserContentControllerDataTypes.h"'],
Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h (224378 => 224379)
--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -39,6 +39,7 @@
#include <WebCore/PaymentHeaders.h>
#include <WebCore/RealtimeMediaSource.h>
#include <WebCore/ScrollSnapOffsetsInfo.h>
+#include <WebCore/ServiceWorkerTypes.h>
#include <WebCore/ServiceWorkerUpdateViaCache.h>
#include <WebCore/StoredCredentialsPolicy.h>
@@ -805,6 +806,15 @@
WebCore::ServiceWorkerUpdateViaCache::None
>;
};
+
+template <> struct EnumTraits<WebCore::ServiceWorkerRegistrationState> {
+ using values = EnumValues<
+ WebCore::ServiceWorkerRegistrationState,
+ WebCore::ServiceWorkerRegistrationState::Installing,
+ WebCore::ServiceWorkerRegistrationState::Waiting,
+ WebCore::ServiceWorkerRegistrationState::Active
+ >;
+};
#endif
} // namespace WTF
Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp (224378 => 224379)
--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -96,6 +96,11 @@
send(Messages::WebSWClientConnection::StartScriptFetchForServer(jobIdentifier));
}
+void WebSWServerConnection::updateRegistrationStateInClient(const ServiceWorkerRegistrationKey& key, ServiceWorkerRegistrationState state, const String& workerID)
+{
+ send(Messages::WebSWClientConnection::UpdateRegistrationState(key, state, workerID));
+}
+
void WebSWServerConnection::updateServiceWorkerContext(const ServiceWorkerContextData& data)
{
if (sendToContextProcess(Messages::WebSWContextManagerConnection::UpdateServiceWorker(identifier(), data)))
Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (224378 => 224379)
--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -65,6 +65,7 @@
void resolveRegistrationJobInClient(uint64_t jobIdentifier, const WebCore::ServiceWorkerRegistrationData&) final;
void resolveUnregistrationJobInClient(uint64_t jobIdentifier, const WebCore::ServiceWorkerRegistrationKey&, bool unregistrationResult) final;
void startScriptFetchInClient(uint64_t jobIdentifier) final;
+ void updateRegistrationStateInClient(const WebCore::ServiceWorkerRegistrationKey&, WebCore::ServiceWorkerRegistrationState, const String& serviceWorkerID) final;
void startFetch(uint64_t fetchIdentifier, uint64_t serviceWorkerIdentifier, const WebCore::ResourceRequest&, const WebCore::FetchOptions&);
Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.messages.in (224378 => 224379)
--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.messages.in 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.messages.in 2017-11-03 04:36:20 UTC (rev 224379)
@@ -26,6 +26,8 @@
# When possible, these messages can be implemented directly by WebCore::SWClientConnection
ScheduleJobInServer(struct WebCore::ServiceWorkerJobData jobData)
FinishFetchingScriptInServer(struct WebCore::ServiceWorkerFetchResult result)
+ AddServiceWorkerRegistrationInServer(struct WebCore::ServiceWorkerRegistrationKey key, uint64_t registrationIdentifier)
+ RemoveServiceWorkerRegistrationInServer(struct WebCore::ServiceWorkerRegistrationKey key, uint64_t registrationIdentifier)
StartFetch(uint64_t identifier, uint64_t serviceWorkerIdentifier, WebCore::ResourceRequest request, struct WebCore::FetchOptions options)
PostMessageToServiceWorkerGlobalScope(uint64_t destinationServiceWorkerIdentifier, IPC::DataReference message, uint64_t sourceScriptExecutionContextIdentifier, String sourceOrigin)
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (224378 => 224379)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2017-11-03 04:36:20 UTC (rev 224379)
@@ -69,6 +69,16 @@
send(Messages::WebSWServerConnection::FinishFetchingScriptInServer(result));
}
+void WebSWClientConnection::addServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey& key, uint64_t registrationIdentifier)
+{
+ send(Messages::WebSWServerConnection::AddServiceWorkerRegistrationInServer(key, registrationIdentifier));
+}
+
+void WebSWClientConnection::removeServiceWorkerRegistrationInServer(const ServiceWorkerRegistrationKey& key, uint64_t registrationIdentifier)
+{
+ send(Messages::WebSWServerConnection::RemoveServiceWorkerRegistrationInServer(key, registrationIdentifier));
+}
+
void WebSWClientConnection::postMessageToServiceWorkerGlobalScope(uint64_t destinationServiceWorkerIdentifier, Ref<SerializedScriptValue>&& scriptValue, ScriptExecutionContext& source)
{
// FIXME: Add support for posting messages from workers.
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (224378 => 224379)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2017-11-03 04:36:20 UTC (rev 224379)
@@ -56,6 +56,8 @@
void scheduleJobInServer(const WebCore::ServiceWorkerJobData&) final;
void finishFetchingScriptInServer(const WebCore::ServiceWorkerFetchResult&) final;
+ void addServiceWorkerRegistrationInServer(const WebCore::ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier) final;
+ void removeServiceWorkerRegistrationInServer(const WebCore::ServiceWorkerRegistrationKey&, uint64_t registrationIdentifier) final;
void postMessageToServiceWorkerGlobalScope(uint64_t destinationServiceWorkerIdentifier, Ref<WebCore::SerializedScriptValue>&&, WebCore::ScriptExecutionContext& source) final;
void disconnectedFromWebProcess();
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in (224378 => 224379)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in 2017-11-03 03:48:11 UTC (rev 224378)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in 2017-11-03 04:36:20 UTC (rev 224379)
@@ -28,6 +28,7 @@
RegistrationJobResolvedInServer(uint64_t identifier, struct WebCore::ServiceWorkerRegistrationData registration)
UnregistrationJobResolvedInServer(uint64_t identifier, bool unregistrationResult)
StartScriptFetchForServer(uint64_t jobIdentifier)
+ UpdateRegistrationState(struct WebCore::ServiceWorkerRegistrationKey key, enum WebCore::ServiceWorkerRegistrationState state, String workerID)
SetSWOriginTableSharedMemory(WebKit::SharedMemory::Handle handle)
PostMessageToServiceWorkerClient(uint64_t destinationScriptExecutionContextIdentifier, IPC::DataReference message, uint64_t sourceServiceWorkerIdentifier, String sourceOrigin)