Changeset 283438 in webkit
- Timestamp:
- Oct 2, 2021, 4:57:48 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 22 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/push-api/pushEvent.any.js (modified) (1 diff)
-
LayoutTests/http/wpt/push-api/pushEvent.any.serviceworker-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt (modified) (1 diff)
-
Source/WebCore/CMakeLists.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/DerivedSources-input.xcfilelist (modified) (1 diff)
-
Source/WebCore/DerivedSources-output.xcfilelist (modified) (1 diff)
-
Source/WebCore/DerivedSources.make (modified) (1 diff)
-
Source/WebCore/Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl (added)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (2 diffs)
-
Source/WebCore/bindings/js/WebCoreBuiltinNames.h (modified) (2 diffs)
-
Source/WebCore/dom/EventNames.h (modified) (1 diff)
-
Source/WebCore/testing/ServiceWorkerInternals.cpp (modified) (1 diff)
-
Source/WebCore/testing/ServiceWorkerInternals.h (modified) (2 diffs)
-
Source/WebCore/testing/ServiceWorkerInternals.idl (modified) (1 diff)
-
Source/WebCore/workers/service/context/SWContextManager.cpp (modified) (1 diff)
-
Source/WebCore/workers/service/context/SWContextManager.h (modified) (1 diff)
-
Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (modified) (4 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerThread.h (modified) (3 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp (modified) (2 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r283435 r283438 1 2021-10-02 Youenn Fablet <youenn@apple.com> 2 3 Add support for ServiceWorkerGlobalScope push event handler 4 https://bugs.webkit.org/show_bug.cgi?id=231008 5 <rdar://problem/83710760> 6 7 Reviewed by Chris Dumez. 8 9 * http/wpt/push-api/pushEvent.any.js: 10 * http/wpt/push-api/pushEvent.any.serviceworker-expected.txt: 11 1 12 2021-10-01 Commit Queue <commit-queue@webkit.org> 2 13 -
trunk/LayoutTests/http/wpt/push-api/pushEvent.any.js
r283377 r283438 53 53 assert_throws_dom("SyntaxError", () => event.data.json()); 54 54 }, "PushEvent with bad json"); 55 56 let activatePromise = new Promise(resolve => self.onactivate = resolve); 57 promise_test(async () => { 58 return activatePromise; 59 }, "Wait for activate promise"); 60 61 promise_test(async () => { 62 const promise = self.internals.schedulePushEvent("test"); 63 const event = await new Promise(resolve => self.onpush = resolve); 64 assert_equals(event.data.text(), "test"); 65 assert_true(await promise); 66 }, "Simulating firing of a push event"); 67 68 promise_test(async () => { 69 if (!self.internals) 70 return; 71 72 let resolveWaitUntilPromise; 73 const waitUntilPromise = new Promise(resolve => resolveWaitUntilPromise = resolve); 74 75 let isPushEventPromiseResolved = false; 76 const promise = internals.schedulePushEvent("test"); 77 promise.then(() => isPushEventPromiseResolved = true); 78 79 const event = await new Promise(resolve => self.onpush = (event) => { 80 event.waitUntil(waitUntilPromise); 81 resolve(event); 82 }); 83 assert_equals(event.data.text(), "test"); 84 85 await new Promise(resolve => self.setTimeout(resolve, 100)); 86 assert_false(isPushEventPromiseResolved); 87 88 resolveWaitUntilPromise(); 89 assert_true(await promise); 90 }, "Simulating firing of a push event - successful waitUntil"); 91 92 promise_test(async () => { 93 if (!self.internals) 94 return; 95 96 const promise = internals.schedulePushEvent("test"); 97 const event = await new Promise(resolve => self.onpush = (event) => { 98 event.waitUntil(Promise.resolve()); 99 event.waitUntil(Promise.reject('error')); 100 resolve(event); 101 }); 102 assert_equals(event.data.text(), "test"); 103 assert_false(await promise); 104 }, "Simulating firing of a push event - unsuccessful waitUntil"); -
trunk/LayoutTests/http/wpt/push-api/pushEvent.any.serviceworker-expected.txt
r283377 r283438 4 4 PASS PushEvent arrayBuffer handling 5 5 PASS PushEvent with bad json 6 PASS Wait for activate promise 7 PASS Simulating firing of a push event 8 PASS Simulating firing of a push event - successful waitUntil 9 PASS Simulating firing of a push event - unsuccessful waitUntil 6 10 -
trunk/LayoutTests/imported/w3c/ChangeLog
r283434 r283438 1 2021-10-02 Youenn Fablet <youenn@apple.com> 2 3 Add support for ServiceWorkerGlobalScope push event handler 4 https://bugs.webkit.org/show_bug.cgi?id=231008 5 <rdar://problem/83710760> 6 7 Reviewed by Chris Dumez. 8 9 * web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt: 10 1 11 2021-10-01 Nikos Mouchtaris <nmouchtaris@apple.com> 2 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt
r283377 r283438 80 80 FAIL ServiceWorkerRegistration interface: attribute pushManager assert_true: The prototype object must have a property "pushManager" expected true got false 81 81 FAIL ServiceWorkerRegistration interface: registration must inherit property "pushManager" with the proper type assert_inherits: property "pushManager" not found in prototype chain 82 FAIL ServiceWorkerGlobalScope interface: attribute onpush assert_own_property: The global object must have a property "onpush" expected property "onpush" missing 82 PASS ServiceWorkerGlobalScope interface: attribute onpush 83 83 FAIL ServiceWorkerGlobalScope interface: attribute onpushsubscriptionchange assert_own_property: The global object must have a property "onpushsubscriptionchange" expected property "onpushsubscriptionchange" missing 84 FAIL ServiceWorkerGlobalScope interface: self must inherit property "onpush" with the proper type assert_own_property: expected property "onpush" missing 84 PASS ServiceWorkerGlobalScope interface: self must inherit property "onpush" with the proper type 85 85 FAIL ServiceWorkerGlobalScope interface: self must inherit property "onpushsubscriptionchange" with the proper type assert_own_property: expected property "onpushsubscriptionchange" missing 86 86 -
trunk/Source/WebCore/CMakeLists.txt
r283377 r283438 502 502 Modules/push-api/PushEventInit.idl 503 503 Modules/push-api/PushMessageData.idl 504 Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl 504 505 505 506 Modules/remoteplayback/RemotePlayback.idl -
trunk/Source/WebCore/ChangeLog
r283437 r283438 1 2021-10-02 Youenn Fablet <youenn@apple.com> 2 3 Add support for ServiceWorkerGlobalScope push event handler 4 https://bugs.webkit.org/show_bug.cgi?id=231008 5 <rdar://problem/83710760> 6 7 Reviewed by Chris Dumez. 8 9 Implement https://w3c.github.io/push-api/#receiving-a-push-message step 6. 10 In particular we ensure that if any waitUntil promise rejects, the push event is considered to fail. 11 This status should then be sent back to the emiter of the push message to decide whether to acknowledge the message, retry it or discard it. 12 13 We keep push API completion handler in a map to ensure we respond to them even if the service worker gets terminated while processing the push event. 14 15 Add necessary internals API to enable testing within the service worker itself. 16 17 Covered by added subtests in http/wpt/service-workers/pushEvent.any.serviceworker.html. 18 19 * CMakeLists.txt: 20 * DerivedSources-input.xcfilelist: 21 * DerivedSources-output.xcfilelist: 22 * DerivedSources.make: 23 * Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl: Added. 24 * WebCore.xcodeproj/project.pbxproj: 25 * bindings/js/WebCoreBuiltinNames.h: 26 * dom/EventNames.h: 27 * testing/ServiceWorkerInternals.cpp: 28 * testing/ServiceWorkerInternals.h: 29 * testing/ServiceWorkerInternals.idl: 30 * workers/service/context/SWContextManager.cpp: 31 * workers/service/context/SWContextManager.h: 32 * workers/service/context/ServiceWorkerThread.cpp: 33 * workers/service/context/ServiceWorkerThread.h: 34 * workers/service/context/ServiceWorkerThreadProxy.cpp: 35 * workers/service/context/ServiceWorkerThreadProxy.h: 36 1 37 2021-10-02 Philippe Normand <pnormand@igalia.com> 2 38 -
trunk/Source/WebCore/DerivedSources-input.xcfilelist
r283377 r283438 425 425 $(PROJECT_DIR)/Modules/push-api/PushEventInit.idl 426 426 $(PROJECT_DIR)/Modules/push-api/PushMessageData.idl 427 $(PROJECT_DIR)/Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl 427 428 $(PROJECT_DIR)/Modules/remoteplayback/HTMLMediaElement+RemotePlayback.idl 428 429 $(PROJECT_DIR)/Modules/remoteplayback/RemotePlayback.idl -
trunk/Source/WebCore/DerivedSources-output.xcfilelist
r283377 r283438 2230 2230 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerContainer.cpp 2231 2231 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerContainer.h 2232 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerGlobalScope+PushAPI.cpp 2233 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerGlobalScope+PushAPI.h 2232 2234 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerGlobalScope.cpp 2233 2235 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSServiceWorkerGlobalScope.h -
trunk/Source/WebCore/DerivedSources.make
r283377 r283438 350 350 $(WebCore)/Modules/push-api/PushEventInit.idl \ 351 351 $(WebCore)/Modules/push-api/PushMessageData.idl \ 352 $(WebCore)/Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl \ 352 353 $(WebCore)/Modules/remoteplayback/HTMLMediaElement+RemotePlayback.idl \ 353 354 $(WebCore)/Modules/remoteplayback/RemotePlayback.idl \ -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r283377 r283438 8114 8114 418FCBC02706E4F800F96ECA /* PushEvent.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushEvent.idl; sourceTree = "<group>"; }; 8115 8115 418FCBC32706E62C00F96ECA /* PushEventInit.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushEventInit.idl; sourceTree = "<group>"; }; 8116 418FCBCB2706F3CD00F96ECA /* ServiceWorkerGlobalScope+PushAPI.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = "ServiceWorkerGlobalScope+PushAPI.idl"; sourceTree = "<group>"; }; 8117 418FCBCC2706F43400F96ECA /* ServiceWorkerGlobalScopePushAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerGlobalScopePushAPI.h; sourceTree = "<group>"; }; 8118 418FCBCD2706F43400F96ECA /* ServiceWorkerGlobalScopePushAPI.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerGlobalScopePushAPI.cpp; sourceTree = "<group>"; }; 8116 8119 4190F3A1249D152700531C57 /* FrameRateMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FrameRateMonitor.cpp; sourceTree = "<group>"; }; 8117 8120 4190F3A3249D152800531C57 /* FrameRateMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrameRateMonitor.h; sourceTree = "<group>"; }; … … 19884 19887 418FCBBC2706E4F600F96ECA /* PushMessageData.h */, 19885 19888 418FCBBA2706E4F500F96ECA /* PushMessageData.idl */, 19889 418FCBCB2706F3CD00F96ECA /* ServiceWorkerGlobalScope+PushAPI.idl */, 19890 418FCBCD2706F43400F96ECA /* ServiceWorkerGlobalScopePushAPI.cpp */, 19891 418FCBCC2706F43400F96ECA /* ServiceWorkerGlobalScopePushAPI.h */, 19886 19892 ); 19887 19893 path = "push-api"; -
trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h
r283377 r283438 403 403 macro(matchingElementInFlatTree) \ 404 404 macro(mediaStreamTrackConstraints) \ 405 macro(o penDatabase) \405 macro(onpush) \ 406 406 macro(onrtctransform) \ 407 407 macro(ontouchcancel) \ … … 418 418 macro(onvrdisplayfocus) \ 419 419 macro(onvrdisplaypresentchange) \ 420 macro(openDatabase) \ 420 421 macro(opener) \ 421 422 macro(operations) \ -
trunk/Source/WebCore/dom/EventNames.h
r282198 r283438 222 222 macro(processorerror) \ 223 223 macro(progress) \ 224 macro(push) \ 224 225 macro(ratechange) \ 225 226 macro(readystatechange) \ -
trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp
r282860 r283438 55 55 callOnMainThread([identifier = m_identifier] () { 56 56 SWContextManager::singleton().terminateWorker(identifier, Seconds::infinity(), [] { }); 57 }); 58 } 59 60 void ServiceWorkerInternals::schedulePushEvent(const String& message, RefPtr<DeferredPromise>&& promise) 61 { 62 auto counter = ++m_pushEventCounter; 63 m_pushEventPromises.add(counter, WTFMove(promise)); 64 65 std::optional<Vector<uint8_t>> data; 66 if (!message.isNull()) { 67 auto utf8 = message.utf8(); 68 data = Vector<uint8_t> { reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length()}; 69 } 70 callOnMainThread([identifier = m_identifier, data = WTFMove(data), weakThis = makeWeakPtr(this), counter]() mutable { 71 SWContextManager::singleton().firePushEvent(identifier, WTFMove(data), [identifier, weakThis = WTFMove(weakThis), counter](bool result) mutable { 72 if (auto* proxy = SWContextManager::singleton().workerByID(identifier)) { 73 proxy->thread().runLoop().postTaskForMode([weakThis = WTFMove(weakThis), counter, result](auto&) { 74 if (!weakThis) 75 return; 76 if (auto promise = weakThis->m_pushEventPromises.take(counter)) 77 promise->resolve<IDLBoolean>(result); 78 }, WorkerRunLoop::defaultMode()); 79 } 80 }); 57 81 }); 58 82 } -
trunk/Source/WebCore/testing/ServiceWorkerInternals.h
r279750 r283438 53 53 Ref<FetchResponse> createOpaqueWithBlobBodyResponse(ScriptExecutionContext&); 54 54 55 void schedulePushEvent(const String&, RefPtr<DeferredPromise>&&); 55 56 Vector<String> fetchResponseHeaderList(FetchResponse&); 56 57 … … 68 69 ServiceWorkerIdentifier m_identifier; 69 70 RefPtr<DeferredPromise> m_lastNavigationWasAppInitiatedPromise; 71 HashMap<uint64_t, RefPtr<DeferredPromise>> m_pushEventPromises; 72 uint64_t m_pushEventCounter { 0 }; 70 73 }; 71 74 -
trunk/Source/WebCore/testing/ServiceWorkerInternals.idl
r279750 r283438 39 39 sequence<ByteString> fetchResponseHeaderList(FetchResponse response); 40 40 41 Promise<boolean> schedulePushEvent(optional DOMString data); 42 41 43 readonly attribute DOMString processName; 42 44 readonly attribute boolean isThrottleable; -
trunk/Source/WebCore/workers/service/context/SWContextManager.cpp
r282860 r283438 110 110 } 111 111 112 void SWContextManager::firePushEvent(ServiceWorkerIdentifier identifier, std::optional<Vector<uint8_t>>&& data, CompletionHandler<void(bool)>&& callback) 113 { 114 auto* serviceWorker = m_workerMap.get(identifier); 115 if (!serviceWorker) { 116 callback(false); 117 return; 118 } 119 120 serviceWorker->firePushEvent(WTFMove(data), WTFMove(callback)); 121 } 122 123 112 124 void SWContextManager::terminateWorker(ServiceWorkerIdentifier identifier, Seconds timeout, Function<void()>&& completionHandler) 113 125 { -
trunk/Source/WebCore/workers/service/context/SWContextManager.h
r279583 r283438 91 91 WEBCORE_EXPORT void fireInstallEvent(ServiceWorkerIdentifier); 92 92 WEBCORE_EXPORT void fireActivateEvent(ServiceWorkerIdentifier); 93 WEBCORE_EXPORT void firePushEvent(ServiceWorkerIdentifier, std::optional<Vector<uint8_t>>&&, CompletionHandler<void(bool)>&&); 94 93 95 WEBCORE_EXPORT void terminateWorker(ServiceWorkerIdentifier, Seconds timeout, Function<void()>&&); 94 96 WEBCORE_EXPORT void didSaveScriptsToDisk(ServiceWorkerIdentifier, ScriptBuffer&&, HashMap<URL, ScriptBuffer>&& importedScripts); -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp
r283295 r283438 38 38 #include "Logging.h" 39 39 #include "PlatformStrategies.h" 40 #include "PushEvent.h" 40 41 #include "SWContextManager.h" 41 42 #include "SecurityOrigin.h" … … 213 214 } 214 215 216 void ServiceWorkerThread::queueTaskToFirePushEvent(std::optional<Vector<uint8_t>>&& data, Function<void(bool)>&& callback) 217 { 218 auto& serviceWorkerGlobalScope = downcast<ServiceWorkerGlobalScope>(*globalScope()); 219 serviceWorkerGlobalScope.eventLoop().queueTask(TaskSource::DOMManipulation, [weakThis = makeWeakPtr(this), serviceWorkerGlobalScope = Ref { serviceWorkerGlobalScope }, data = WTFMove(data), callback = WTFMove(callback)]() mutable { 220 RELEASE_LOG(ServiceWorker, "ServiceWorkerThread::queueTaskToFirePushEvent firing event for worker %" PRIu64, serviceWorkerGlobalScope->thread().identifier().toUInt64()); 221 222 auto pushEvent = PushEvent::create(eventNames().pushEvent, { }, WTFMove(data), ExtendableEvent::IsTrusted::Yes); 223 serviceWorkerGlobalScope->dispatchEvent(pushEvent); 224 225 pushEvent->whenAllExtendLifetimePromisesAreSettled([weakThis = WTFMove(weakThis), callback = WTFMove(callback)](auto&& extendLifetimePromises) mutable { 226 bool hasRejectedAnyPromise = false; 227 for (auto& promise : extendLifetimePromises) { 228 if (promise->status() == DOMPromise::Status::Rejected) { 229 hasRejectedAnyPromise = true; 230 break; 231 } 232 } 233 callback(!hasRejectedAnyPromise); 234 }); 235 }); 236 } 237 215 238 void ServiceWorkerThread::finishedEvaluatingScript() 216 239 { … … 245 268 } 246 269 270 void ServiceWorkerThread::startPushEventMonitoring() 271 { 272 m_isHandlingPushEvent = true; 273 startHeartBeatTimer(); 274 } 275 247 276 void ServiceWorkerThread::startHeartBeatTimer() 248 277 { … … 267 296 { 268 297 if (!m_ongoingHeartBeatCheck) { 269 if (m_state == State::Installing || m_state == State::Activating || m_isHandlingFetchEvent || m_ messageEventCount)298 if (m_state == State::Installing || m_state == State::Activating || m_isHandlingFetchEvent || m_isHandlingPushEvent || m_messageEventCount) 270 299 startHeartBeatTimer(); 271 300 return; -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h
r283295 r283438 67 67 void queueTaskToFireInstallEvent(); 68 68 void queueTaskToFireActivateEvent(); 69 void queueTaskToFirePushEvent(std::optional<Vector<uint8_t>>&&, Function<void(bool)>&&); 69 70 70 71 ServiceWorkerIdentifier identifier() const { return m_serviceWorkerIdentifier; } … … 74 75 void startFetchEventMonitoring(); 75 76 void stopFetchEventMonitoring() { m_isHandlingFetchEvent = false; } 77 void startPushEventMonitoring(); 78 void stopPushEventMonitoring() { m_isHandlingPushEvent = false; } 76 79 77 80 protected: … … 102 105 103 106 bool m_isHandlingFetchEvent { false }; 107 bool m_isHandlingPushEvent { false }; 104 108 uint64_t m_messageEventCount { 0 }; 105 109 enum class State { Idle, Starting, Installing, Activating }; -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp
r283295 r283438 123 123 ASSERT(allServiceWorkerThreadProxies().contains(this)); 124 124 allServiceWorkerThreadProxies().remove(this); 125 126 auto pushTasks = WTFMove(m_ongoingPushTasks); 127 for (auto& callback : pushTasks.values()) 128 callback(false); 125 129 } 126 130 … … 295 299 } 296 300 301 void ServiceWorkerThreadProxy::firePushEvent(std::optional<Vector<uint8_t>>&& data, CompletionHandler<void(bool)>&& callback) 302 { 303 if (m_ongoingPushTasks.isEmpty()) 304 thread().startPushEventMonitoring(); 305 306 auto identifier = ++m_pushTasksCounter; 307 ASSERT(!m_ongoingPushTasks.contains(identifier)); 308 m_ongoingPushTasks.add(identifier, WTFMove(callback)); 309 bool isPosted = postTaskForModeToWorkerOrWorkletGlobalScope([this, protectedThis = Ref { *this }, identifier, data = WTFMove(data)](auto&) mutable { 310 thread().queueTaskToFirePushEvent(WTFMove(data), [this, protectedThis = WTFMove(protectedThis), identifier](bool result) mutable { 311 callOnMainThread([this, protectedThis = WTFMove(protectedThis), identifier, result]() mutable { 312 if (auto callback = m_ongoingPushTasks.take(identifier)) 313 callback(result); 314 if (m_ongoingPushTasks.isEmpty()) 315 thread().stopPushEventMonitoring(); 316 }); 317 }); 318 }, WorkerRunLoop::defaultMode()); 319 if (!isPosted) 320 m_ongoingPushTasks.take(identifier)(false); 321 } 322 297 323 } // namespace WebCore 298 324 -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h
r283295 r283438 81 81 void fireInstallEvent(); 82 82 void fireActivateEvent(); 83 void firePushEvent(std::optional<Vector<uint8_t>>&&, CompletionHandler<void(bool)>&&); 84 83 85 void didSaveScriptsToDisk(ScriptBuffer&&, HashMap<URL, ScriptBuffer>&& importedScripts); 84 86 … … 113 115 ServiceWorkerInspectorProxy m_inspectorProxy; 114 116 HashMap<std::pair<SWServerConnectionIdentifier, FetchIdentifier>, Ref<ServiceWorkerFetch::Client>> m_ongoingFetchTasks; 117 uint64_t m_pushTasksCounter { 0 }; 118 HashMap<uint64_t, CompletionHandler<void(bool)>> m_ongoingPushTasks; 115 119 }; 116 120
Note:
See TracChangeset
for help on using the changeset viewer.