Changeset 286044 in webkit
- Timestamp:
- Nov 18, 2021, 8:18:12 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 26 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/push-api/pushSubscriptionChangeEvent.any.js (modified) (2 diffs)
-
LayoutTests/http/wpt/push-api/pushSubscriptionChangeEvent.any.serviceworker-expected.txt (modified) (1 diff)
-
LayoutTests/http/wpt/service-workers/resources/routines.js (modified) (1 diff)
-
LayoutTests/http/wpt/service-workers/service-worker-spinning-push.https-expected.txt (added)
-
LayoutTests/http/wpt/service-workers/service-worker-spinning-push.https.html (added)
-
LayoutTests/http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https-expected.txt (added)
-
LayoutTests/http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https.html (added)
-
LayoutTests/http/wpt/service-workers/service-worker-spinning-worker.js (modified) (4 diffs)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt (modified) (1 diff)
-
LayoutTests/platform/ios-simulator-wk2/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/push-api/PushSubscription.cpp (modified) (3 diffs)
-
Source/WebCore/Modules/push-api/PushSubscription.h (modified) (3 diffs)
-
Source/WebCore/Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl (modified) (1 diff)
-
Source/WebCore/bindings/js/WebCoreBuiltinNames.h (modified) (1 diff)
-
Source/WebCore/dom/EventNames.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (3 diffs)
-
Source/WebCore/testing/ServiceWorkerInternals.cpp (modified) (3 diffs)
-
Source/WebCore/testing/ServiceWorkerInternals.h (modified) (1 diff)
-
Source/WebCore/testing/ServiceWorkerInternals.idl (modified) (1 diff)
-
Source/WebCore/workers/service/ServiceWorkerContainer.cpp (modified) (3 diffs)
-
Source/WebCore/workers/service/ServiceWorkerRegistration.h (modified) (1 diff)
-
Source/WebCore/workers/service/context/SWContextManager.cpp (modified) (1 diff)
-
Source/WebCore/workers/service/context/SWContextManager.h (modified) (2 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (modified) (4 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerThread.h (modified) (5 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
r286021 r286044 1 2021-11-18 Ben Nham <nham@apple.com> 2 3 Add support for onpushsubscriptionchange event handler 4 https://bugs.webkit.org/show_bug.cgi?id=233088 5 6 Reviewed by Youenn Fablet. 7 8 - Modified the pushsubscriptionchange test to send a real event to the service worker. 9 - Modified the service worker spinning tests to test for guarding against infinite loops in 10 the push and pushsubscriptionchange event handlers. 11 12 Note that the existing spinning tests are marked as flaky on ios-wk2. We do the same here 13 since the test passes locally but is flaky in EWS. 14 15 * http/wpt/push-api/pushSubscriptionChangeEvent.any.js: 16 (promise_test): 17 (assertSubscriptionsAreEqual): 18 (test): Deleted. 19 (promise_test.async newSubscription): Deleted. 20 (promise_test.async return): Deleted. 21 * http/wpt/push-api/pushSubscriptionChangeEvent.any.serviceworker-expected.txt: 22 * http/wpt/service-workers/resources/routines.js: 23 (async sendSyncMessage): 24 * http/wpt/service-workers/service-worker-spinning-push.https-expected.txt: Added. 25 * http/wpt/service-workers/service-worker-spinning-push.https.html: Added. 26 * http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https-expected.txt: Added. 27 * http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https.html: Added. 28 * http/wpt/service-workers/service-worker-spinning-worker.js: 29 (respondToPendingEvent): 30 (pushTest): 31 * platform/ios-simulator-wk2/TestExpectations: 32 1 33 2021-11-18 Wenson Hsieh <wenson_hsieh@apple.com> 2 34 -
trunk/LayoutTests/http/wpt/push-api/pushSubscriptionChangeEvent.any.js
r285564 r286044 3 3 // META: script=constants.js 4 4 5 test(() => { 6 let event = new PushSubscriptionChangeEvent("pushsubscriptionchange"); 7 assert_equals(event.newSubscription, null, "new"); 8 assert_equals(event.oldSubscription, null, "old"); 9 }, "PushSubscriptionChangeEvent without data"); 10 11 test(() => { 12 let event = new PushSubscriptionChangeEvent("pushsubscriptionchange", { newSubscription: null, oldSubscription: null }); 13 assert_equals(event.newSubscription, null, "new"); 14 assert_equals(event.oldSubscription, null, "old"); 15 }, "PushSubscriptionChangeEvent without subscriptions"); 5 let activatePromise = new Promise(resolve => self.onactivate = resolve); 6 promise_test(() => { 7 return activatePromise; 8 }, "wait for active service worker"); 16 9 17 10 let newSubscription = null; 18 11 let oldSubscription = null; 19 12 20 let activatePromise = new Promise(resolve => self.onactivate = resolve); 21 promise_test(async () => { 22 return activatePromise; 23 }, "wait for active service worker"); 13 function assertSubscriptionsAreEqual(a, b, reason) 14 { 15 if (!a || !b) 16 assert_equals(a, b, reason); 17 else 18 assert_equals(JSON.stringify(a.toJSON()), JSON.stringify(b.toJSON()), reason); 19 } 24 20 25 promise_test( async() => {21 promise_test(() => { 26 22 newSubscription = self.internals.createPushSubscription(ENDPOINT, EXPIRATION_TIME, VALID_SERVER_KEY, CLIENT_KEY_1, AUTH); 27 23 oldSubscription = self.internals.createPushSubscription(ENDPOINT, EXPIRATION_TIME, VALID_SERVER_KEY, CLIENT_KEY_2, AUTH); … … 33 29 }, "create subscriptions"); 34 30 35 test(() => { 36 let event = new PushSubscriptionChangeEvent("pushsubscriptionchange", { newSubscription }); 37 assert_equals(event.newSubscription, newSubscription, "new"); 38 assert_equals(event.oldSubscription, null, "old"); 31 promise_test(async() => { 32 self.internals.schedulePushSubscriptionChangeEvent(null, null); 33 let event = await new Promise(resolve => self.onpushsubscriptionchange = resolve); 34 assertSubscriptionsAreEqual(event.newSubscription, null, "new"); 35 assertSubscriptionsAreEqual(event.oldSubscription, null, "old"); 36 }, "PushSubscriptionChangeEvent without subscriptions"); 37 38 promise_test(async() => { 39 self.internals.schedulePushSubscriptionChangeEvent(newSubscription, null); 40 let event = await new Promise(resolve => self.onpushsubscriptionchange = resolve); 41 assertSubscriptionsAreEqual(event.newSubscription, newSubscription, "new"); 42 assertSubscriptionsAreEqual(event.oldSubscription, null, "old"); 39 43 }, "PushSubscriptionChangeEvent with new subscription"); 40 44 41 test(() => { 42 let event = new PushSubscriptionChangeEvent("pushsubscriptionchange", { oldSubscription }); 43 assert_equals(event.newSubscription, null, "new"); 44 assert_equals(event.oldSubscription, oldSubscription, "old"); 45 promise_test(async() => { 46 self.internals.schedulePushSubscriptionChangeEvent(null, oldSubscription); 47 let event = await new Promise(resolve => self.onpushsubscriptionchange = resolve); 48 assertSubscriptionsAreEqual(event.newSubscription, null, "new"); 49 assertSubscriptionsAreEqual(event.oldSubscription, oldSubscription, "old"); 45 50 }, "PushSubscriptionChangeEvent with old subscription"); 46 51 47 test(() => { 48 let event = new PushSubscriptionChangeEvent("pushsubscriptionchange", { newSubscription, oldSubscription }); 49 assert_equals(event.newSubscription, newSubscription, "new"); 50 assert_equals(event.oldSubscription, oldSubscription, "old"); 52 promise_test(async() => { 53 self.internals.schedulePushSubscriptionChangeEvent(newSubscription, oldSubscription); 54 let event = await new Promise(resolve => self.onpushsubscriptionchange = resolve); 55 assertSubscriptionsAreEqual(event.newSubscription, newSubscription, "new"); 56 assertSubscriptionsAreEqual(event.oldSubscription, oldSubscription, "old"); 51 57 }, "PushSubscriptionChangeEvent with new and old subscription"); -
trunk/LayoutTests/http/wpt/push-api/pushSubscriptionChangeEvent.any.serviceworker-expected.txt
r285564 r286044 1 1 2 PASS PushSubscriptionChangeEvent without data3 PASS PushSubscriptionChangeEvent without subscriptions4 2 PASS wait for active service worker 5 3 PASS create subscriptions 4 PASS PushSubscriptionChangeEvent without subscriptions 6 5 PASS PushSubscriptionChangeEvent with new subscription 7 6 PASS PushSubscriptionChangeEvent with old subscription -
trunk/LayoutTests/http/wpt/service-workers/resources/routines.js
r259859 r286044 29 29 } 30 30 31 async function sendSyncMessage(worker, messageName, timeout) 32 { 33 if (!window.internals) 34 return Promise.reject("requires internals"); 35 36 const channel = new MessageChannel(); 37 const receivedMessage = new Promise(resolve => channel.port1.onmessage = resolve); 38 const timedOut = new Promise((resolve, reject) => setTimeout(reject, timeout || 5000)); 39 worker.postMessage(messageName, [channel.port2]); 40 return Promise.race([receivedMessage, timedOut]); 41 } 42 31 43 async function waitForServiceWorkerNoLongerRunning(worker) 32 44 { -
trunk/LayoutTests/http/wpt/service-workers/service-worker-spinning-worker.js
r253898 r286044 1 let pendingEvent = null; 2 3 function respondToPendingEvent() 4 { 5 if (!pendingEvent) 6 return; 7 8 pendingEvent.ports[0].postMessage('received'); 9 pendingEvent = null; 10 } 11 1 12 if (self.registration.scope.includes("spin-run")) 2 13 while(true) { }; … … 20 31 function messageTest(event) 21 32 { 33 switch (event.data) { 34 case "push": 35 self.internals.schedulePushEvent("test"); 36 pendingEvent = event; 37 return; 38 case "pushsubscriptionchange": 39 self.internals.schedulePushSubscriptionChangeEvent(null, null); 40 pendingEvent = event; 41 return; 42 } 43 22 44 if (self.registration.scope.includes("spin-message")) 23 45 while(true) { }; … … 35 57 } 36 58 59 function pushTest(event) 60 { 61 respondToPendingEvent(); 62 63 if (self.registration.scope.includes("spin-push")) 64 while(true) { }; 65 if (self.registration.scope.includes("spin-after-push")) 66 self.setTimeout(() => { while(true) { }; }, 0); 67 } 68 69 function pushSubscriptionChangeTest(event) 70 { 71 respondToPendingEvent(); 72 73 if (self.registration.scope.includes("spin-pushsubscriptionchange")) 74 while(true) { }; 75 if (self.registration.scope.includes("spin-after-pushsubscriptionchange")) 76 self.setTimeout(() => { while(true) { }; }, 0); 77 } 37 78 38 79 self.addEventListener("install", installTest); … … 40 81 self.addEventListener("message", messageTest); 41 82 self.addEventListener("fetch", fetchTest); 83 self.addEventListener("push", pushTest); 84 self.addEventListener("pushsubscriptionchange", pushSubscriptionChangeTest); -
trunk/LayoutTests/imported/w3c/ChangeLog
r286002 r286044 1 2021-11-18 Ben Nham <nham@apple.com> 2 3 Add support for onpushsubscriptionchange event handler 4 https://bugs.webkit.org/show_bug.cgi?id=233088 5 6 Reviewed by Youenn Fablet. 7 8 Rebaseline test results since we now support onpushsubscriptionchange. 9 10 * web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt: 11 1 12 2021-11-18 Martin Robinson <mrobinson@webkit.org> 2 13 -
trunk/LayoutTests/imported/w3c/web-platform-tests/push-api/idlharness.https.any.serviceworker-expected.txt
r285564 r286044 81 81 PASS ServiceWorkerRegistration interface: registration must inherit property "pushManager" with the proper type 82 82 PASS ServiceWorkerGlobalScope interface: attribute onpush 83 FAIL ServiceWorkerGlobalScope interface: attribute onpushsubscriptionchange assert_own_property: The global object must have a property "onpushsubscriptionchange" expected property "onpushsubscriptionchange" missing 83 PASS ServiceWorkerGlobalScope interface: attribute onpushsubscriptionchange 84 84 PASS ServiceWorkerGlobalScope interface: self must inherit property "onpush" with the proper type 85 FAIL ServiceWorkerGlobalScope interface: self must inherit property "onpushsubscriptionchange" with the proper type assert_own_property: expected property "onpushsubscriptionchange" missing 85 PASS ServiceWorkerGlobalScope interface: self must inherit property "onpushsubscriptionchange" with the proper type 86 86 -
trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations
r285554 r286044 137 137 webkit.org/b/217669 http/wpt/service-workers/service-worker-spinning-install.https.html [ Pass Timeout Failure ] 138 138 webkit.org/b/217669 http/wpt/service-workers/service-worker-spinning-message.https.html [ Pass Timeout Failure ] 139 webkit.org/b/217669 http/wpt/service-workers/service-worker-spinning-push.https.html [ Pass Timeout Failure ] 140 webkit.org/b/217669 http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https.html [ Pass Timeout Failure ] 139 141 140 142 webkit.org/b/217687 accessibility/aria-current.html [ Pass Timeout ] -
trunk/Source/WebCore/ChangeLog
r286042 r286044 1 2021-11-18 Ben Nham <nham@apple.com> 2 3 Add support for onpushsubscriptionchange event handler 4 https://bugs.webkit.org/show_bug.cgi?id=233088 5 6 Reviewed by Youenn Fablet. 7 8 This adds the ability to send a pushsubscriptionchange event to the appropriate handler on 9 ServiceWorkerGlobalScope. I didn't implement a completion handler for the event (as we do 10 for the push event) since it's not required by the standard and I don't think we'd use it. 11 We only plan on firing this event the first time you visit an origin after we deregister a 12 PushSubscription for receiving too many silent pushes. 13 14 Tests: http/wpt/service-workers/service-worker-spinning-push.https.html 15 http/wpt/service-workers/service-worker-spinning-pushsubscriptionchange.https.html 16 17 * Modules/push-api/PushSubscription.cpp: 18 (WebCore::PushSubscription::PushSubscription): 19 (WebCore::PushSubscription::data const): 20 (WebCore::PushSubscription::endpoint const): 21 (WebCore::PushSubscription::expirationTime const): 22 (WebCore::PushSubscription::options const): 23 (WebCore::PushSubscription::clientECDHPublicKey const): 24 (WebCore::PushSubscription::sharedAuthenticationSecret const): 25 (WebCore::PushSubscription::getKey const): 26 (WebCore::PushSubscription::toJSON const): 27 * Modules/push-api/PushSubscription.h: 28 * Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl: 29 * bindings/js/WebCoreBuiltinNames.h: 30 * dom/EventNames.h: 31 * testing/Internals.cpp: 32 (WebCore::Internals::createPushSubscription): 33 * testing/ServiceWorkerInternals.cpp: 34 (WebCore::ServiceWorkerInternals::schedulePushSubscriptionChangeEvent): 35 (WebCore::ServiceWorkerInternals::createPushSubscription): 36 * testing/ServiceWorkerInternals.h: 37 * testing/ServiceWorkerInternals.idl: 38 * workers/service/ServiceWorkerContainer.cpp: 39 (WebCore::ServiceWorkerContainer::subscribeToPushService): 40 (WebCore::ServiceWorkerContainer::getPushSubscription): 41 (WebCore::createPushSubscriptionFromData): Deleted. 42 * workers/service/ServiceWorkerRegistration.h: 43 * workers/service/context/SWContextManager.cpp: 44 (WebCore::SWContextManager::firePushSubscriptionChangeEvent): 45 * workers/service/context/SWContextManager.h: 46 * workers/service/context/ServiceWorkerThread.cpp: 47 (WebCore::ServiceWorkerThread::queueTaskToFirePushSubscriptionChangeEvent): 48 (WebCore::ServiceWorkerThread::heartBeatTimerFired): 49 (WebCore::ServiceWorkerThread::willPostTaskToFirePushSubscriptionChangeEvent): 50 (WebCore::ServiceWorkerThread::finishedFiringPushSubscriptionChangeEvent): 51 * workers/service/context/ServiceWorkerThread.h: 52 * workers/service/context/ServiceWorkerThreadProxy.cpp: 53 (WebCore::ServiceWorkerThreadProxy::firePushSubscriptionChangeEvent): 54 * workers/service/context/ServiceWorkerThreadProxy.h: 55 1 56 2021-11-18 Mark Lam <mark.lam@apple.com> 2 57 -
trunk/Source/WebCore/Modules/push-api/PushSubscription.cpp
r285564 r286044 41 41 WTF_MAKE_ISO_ALLOCATED_IMPL(PushSubscription); 42 42 43 PushSubscription::PushSubscription(String&& endpoint, std::optional<EpochTimeStamp> expirationTime, Vector<uint8_t>&& serverVAPIDPublicKey, Vector<uint8_t>&& clientECDHPublicKey, Vector<uint8_t>&& sharedAuthenticationSecret) 44 : m_endpoint(WTFMove(endpoint)) 45 , m_expirationTime(expirationTime) 46 , m_options(PushSubscriptionOptions::create(WTFMove(serverVAPIDPublicKey))) 47 , m_clientECDHPublicKey(WTFMove(clientECDHPublicKey)) 48 , m_sharedAuthenticationSecret(WTFMove(sharedAuthenticationSecret)) 49 { 50 } 51 52 PushSubscription::PushSubscription(Ref<ServiceWorkerRegistration>&& registration, String&& endpoint, std::optional<EpochTimeStamp> expirationTime, Vector<uint8_t>&& serverVAPIDPublicKey, Vector<uint8_t>&& clientECDHPublicKey, Vector<uint8_t>&& sharedAuthenticationSecret) 53 : m_serviceWorkerRegistration(WTFMove(registration)) 54 , m_endpoint(WTFMove(endpoint)) 55 , m_expirationTime(expirationTime) 56 , m_options(PushSubscriptionOptions::create(WTFMove(serverVAPIDPublicKey))) 57 , m_clientECDHPublicKey(WTFMove(clientECDHPublicKey)) 58 , m_sharedAuthenticationSecret(WTFMove(sharedAuthenticationSecret)) 43 PushSubscription::PushSubscription(PushSubscriptionData&& data, RefPtr<ServiceWorkerRegistration>&& registration) 44 : m_data(WTFMove(data)) 45 , m_serviceWorkerRegistration(WTFMove(registration)) 59 46 { 60 47 } … … 62 49 PushSubscription::~PushSubscription() = default; 63 50 51 const PushSubscriptionData& PushSubscription::data() const 52 { 53 return m_data; 54 } 55 64 56 const String& PushSubscription::endpoint() const 65 57 { 66 return m_ endpoint;58 return m_data.endpoint; 67 59 } 68 60 69 61 std::optional<EpochTimeStamp> PushSubscription::expirationTime() const 70 62 { 71 return m_ expirationTime;63 return m_data.expirationTime; 72 64 } 73 65 74 66 PushSubscriptionOptions& PushSubscription::options() const 75 67 { 76 return m_options; 68 if (!m_options) { 69 auto key = m_data.serverVAPIDPublicKey; 70 m_options = PushSubscriptionOptions::create(WTFMove(key)); 71 } 72 73 return *m_options; 74 } 75 76 const Vector<uint8_t>& PushSubscription::clientECDHPublicKey() const 77 { 78 return m_data.clientECDHPublicKey; 79 } 80 81 const Vector<uint8_t>& PushSubscription::sharedAuthenticationSecret() const 82 { 83 return m_data.sharedAuthenticationSecret; 77 84 } 78 85 79 86 ExceptionOr<RefPtr<JSC::ArrayBuffer>> PushSubscription::getKey(PushEncryptionKeyName name) const 80 87 { 81 const Vector<uint8_t> *source = nullptr;88 const Vector<uint8_t>* source = nullptr; 82 89 83 90 switch (name) { 84 91 case PushEncryptionKeyName::P256dh: 85 source = & m_clientECDHPublicKey;92 source = &clientECDHPublicKey(); 86 93 break; 87 94 case PushEncryptionKeyName::Auth: 88 source = & m_sharedAuthenticationSecret;95 source = &sharedAuthenticationSecret(); 89 96 break; 90 97 default: … … 113 120 { 114 121 return PushSubscriptionJSON { 115 m_endpoint,116 m_expirationTime,122 endpoint(), 123 expirationTime(), 117 124 Vector<KeyValuePair<String, String>> { 118 { "p256dh"_s, base64URLEncodeToString( m_clientECDHPublicKey) },119 { "auth"_s, base64URLEncodeToString( m_sharedAuthenticationSecret) }125 { "p256dh"_s, base64URLEncodeToString(clientECDHPublicKey()) }, 126 { "auth"_s, base64URLEncodeToString(sharedAuthenticationSecret()) } 120 127 } 121 128 }; -
trunk/Source/WebCore/Modules/push-api/PushSubscription.h
r285564 r286044 32 32 #include "JSDOMPromiseDeferred.h" 33 33 #include "PushEncryptionKeyName.h" 34 #include "PushSubscriptionData.h" 34 35 #include "PushSubscriptionJSON.h" 35 36 … … 52 53 WEBCORE_EXPORT ~PushSubscription(); 53 54 55 WEBCORE_EXPORT const PushSubscriptionData& data() const; 56 54 57 const String& endpoint() const; 55 58 std::optional<EpochTimeStamp> expirationTime() const; 56 59 PushSubscriptionOptions& options() const; 60 const Vector<uint8_t>& clientECDHPublicKey() const; 61 const Vector<uint8_t>& sharedAuthenticationSecret() const; 62 57 63 ExceptionOr<RefPtr<JSC::ArrayBuffer>> getKey(PushEncryptionKeyName) const; 58 64 void unsubscribe(ScriptExecutionContext&, DOMPromiseDeferred<IDLBoolean>&&); … … 61 67 62 68 private: 63 WEBCORE_EXPORT PushSubscription(String&& endpoint, std::optional<EpochTimeStamp> expirationTime, Vector<uint8_t>&& serverVAPIDPublicKey, Vector<uint8_t>&& clientECDHPublicKey, Vector<uint8_t>&& auth); 64 PushSubscription(Ref<ServiceWorkerRegistration>&&, String&& endpoint, std::optional<EpochTimeStamp> expirationTime, Vector<uint8_t>&& serverVAPIDPublicKey, Vector<uint8_t>&& clientECDHPublicKey, Vector<uint8_t>&& auth); 69 WEBCORE_EXPORT explicit PushSubscription(PushSubscriptionData&&, RefPtr<ServiceWorkerRegistration>&& = nullptr); 65 70 71 PushSubscriptionData m_data; 66 72 RefPtr<ServiceWorkerRegistration> m_serviceWorkerRegistration; 67 String m_endpoint; 68 std::optional<EpochTimeStamp> m_expirationTime; 69 Ref<PushSubscriptionOptions> m_options; 70 Vector<uint8_t> m_clientECDHPublicKey; 71 Vector<uint8_t> m_sharedAuthenticationSecret; 73 mutable RefPtr<PushSubscriptionOptions> m_options; 72 74 }; 73 75 -
trunk/Source/WebCore/Modules/push-api/ServiceWorkerGlobalScope+PushAPI.idl
r285867 r286044 28 28 ] partial interface ServiceWorkerGlobalScope { 29 29 attribute EventHandler onpush; 30 attribute EventHandler onpushsubscriptionchange; 30 31 }; -
trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h
r285731 r286044 454 454 macro(mediaStreamTrackConstraints) \ 455 455 macro(onpush) \ 456 macro(onpushsubscriptionchange) \ 456 457 macro(onrtctransform) \ 457 458 macro(ontouchcancel) \ -
trunk/Source/WebCore/dom/EventNames.h
r283438 r286044 223 223 macro(progress) \ 224 224 macro(push) \ 225 macro(pushsubscriptionchange) \ 225 226 macro(ratechange) \ 226 227 macro(readystatechange) \ -
trunk/Source/WebCore/testing/Internals.cpp
r286021 r286044 166 166 #include "PseudoElement.h" 167 167 #include "PushSubscription.h" 168 #include "PushSubscriptionData.h" 168 169 #include "RTCRtpSFrameTransform.h" 169 170 #include "Range.h" … … 195 196 #include "ServiceWorker.h" 196 197 #include "ServiceWorkerProvider.h" 198 #include "ServiceWorkerRegistration.h" 197 199 #include "ServiceWorkerRegistrationData.h" 198 200 #include "Settings.h" … … 6595 6597 Vector<uint8_t> myAuth { static_cast<const uint8_t*>(auth.data()), auth.byteLength() }; 6596 6598 6597 return PushSubscription::create( WTFMove(myEndpoint), expirationTime, WTFMove(myServerVAPIDPublicKey), WTFMove(myClientECDHPublicKey), WTFMove(myAuth));6599 return PushSubscription::create(PushSubscriptionData { WTFMove(myEndpoint), expirationTime, WTFMove(myServerVAPIDPublicKey), WTFMove(myClientECDHPublicKey), WTFMove(myAuth) }); 6598 6600 } 6599 6601 #endif -
trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp
r285564 r286044 32 32 #include "JSFetchResponse.h" 33 33 #include "PushSubscription.h" 34 #include "PushSubscriptionData.h" 34 35 #include "SWContextManager.h" 36 #include "ServiceWorkerRegistration.h" 35 37 #include <wtf/ProcessID.h> 36 38 … … 80 82 } 81 83 }); 84 }); 85 } 86 87 void ServiceWorkerInternals::schedulePushSubscriptionChangeEvent(PushSubscription* newSubscription, PushSubscription* oldSubscription) 88 { 89 std::optional<PushSubscriptionData> newSubscriptionData; 90 std::optional<PushSubscriptionData> oldSubscriptionData; 91 92 if (newSubscription) 93 newSubscriptionData = newSubscription->data().isolatedCopy(); 94 if (oldSubscription) 95 oldSubscriptionData = oldSubscription->data().isolatedCopy(); 96 97 callOnMainThread([identifier = m_identifier, newSubscriptionData = WTFMove(newSubscriptionData), oldSubscriptionData = WTFMove(oldSubscriptionData)]() mutable { 98 SWContextManager::singleton().firePushSubscriptionChangeEvent(identifier, WTFMove(newSubscriptionData), WTFMove(oldSubscriptionData)); 82 99 }); 83 100 } … … 169 186 Vector<uint8_t> myAuth { static_cast<const uint8_t*>(auth.data()), auth.byteLength() }; 170 187 171 return PushSubscription::create( WTFMove(myEndpoint), expirationTime, WTFMove(myServerVAPIDPublicKey), WTFMove(myClientECDHPublicKey), WTFMove(myAuth));188 return PushSubscription::create(PushSubscriptionData { WTFMove(myEndpoint), expirationTime, WTFMove(myServerVAPIDPublicKey), WTFMove(myClientECDHPublicKey), WTFMove(myAuth) }); 172 189 } 173 190 -
trunk/Source/WebCore/testing/ServiceWorkerInternals.h
r285564 r286044 57 57 58 58 void schedulePushEvent(const String&, RefPtr<DeferredPromise>&&); 59 void schedulePushSubscriptionChangeEvent(PushSubscription* newSubscription, PushSubscription* oldSubscription); 59 60 Vector<String> fetchResponseHeaderList(FetchResponse&); 60 61 -
trunk/Source/WebCore/testing/ServiceWorkerInternals.idl
r285564 r286044 40 40 41 41 Promise<boolean> schedulePushEvent(optional DOMString data); 42 undefined schedulePushSubscriptionChangeEvent(PushSubscription? newSubscription, PushSubscription? oldSubscription); 42 43 43 44 readonly attribute DOMString processName; -
trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp
r286012 r286044 553 553 } 554 554 555 static Ref<PushSubscription> createPushSubscriptionFromData(Ref<ServiceWorkerRegistration> registration, PushSubscriptionData&& data)556 {557 return PushSubscription::create(WTFMove(registration), WTFMove(data.endpoint), data.expirationTime, WTFMove(data.serverVAPIDPublicKey), WTFMove(data.clientECDHPublicKey), WTFMove(data.sharedAuthenticationSecret));558 }559 560 555 void ServiceWorkerContainer::subscribeToPushService(ServiceWorkerRegistration& registration, const Vector<uint8_t>& applicationServerKey, DOMPromiseDeferred<IDLInterface<PushSubscription>>&& promise) 561 556 { … … 566 561 } 567 562 568 promise.resolve( createPushSubscriptionFromData(WTFMove(protectedRegistration), result.releaseReturnValue()));563 promise.resolve(PushSubscription::create(result.releaseReturnValue(), WTFMove(protectedRegistration))); 569 564 }); 570 565 } … … 591 586 } 592 587 593 promise.resolve( createPushSubscriptionFromData(WTFMove(protectedRegistration), WTFMove(*optionalPushSubscriptionData)).ptr());588 promise.resolve(PushSubscription::create(WTFMove(*optionalPushSubscriptionData), WTFMove(protectedRegistration)).ptr()); 594 589 }); 595 590 } -
trunk/Source/WebCore/workers/service/ServiceWorkerRegistration.h
r285564 r286044 46 46 47 47 class ServiceWorkerRegistration final : public RefCounted<ServiceWorkerRegistration>, public Supplementable<ServiceWorkerRegistration>, public EventTargetWithInlineData, public ActiveDOMObject { 48 WTF_MAKE_ISO_ALLOCATED (ServiceWorkerRegistration);48 WTF_MAKE_ISO_ALLOCATED_EXPORT(ServiceWorkerRegistration, WEBCORE_EXPORT); 49 49 public: 50 50 static Ref<ServiceWorkerRegistration> getOrCreate(ScriptExecutionContext&, Ref<ServiceWorkerContainer>&&, ServiceWorkerRegistrationData&&); 51 51 52 ~ServiceWorkerRegistration();52 WEBCORE_EXPORT ~ServiceWorkerRegistration(); 53 53 54 54 ServiceWorkerRegistrationIdentifier identifier() const { return m_registrationData.identifier; } -
trunk/Source/WebCore/workers/service/context/SWContextManager.cpp
r286012 r286044 120 120 } 121 121 122 void SWContextManager::firePushSubscriptionChangeEvent(ServiceWorkerIdentifier identifier, std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData) 123 { 124 auto* serviceWorker = m_workerMap.get(identifier); 125 if (!serviceWorker) 126 return; 127 128 serviceWorker->firePushSubscriptionChangeEvent(WTFMove(newSubscriptionData), WTFMove(oldSubscriptionData)); 129 } 130 122 131 123 132 void SWContextManager::terminateWorker(ServiceWorkerIdentifier identifier, Seconds timeout, Function<void()>&& completionHandler) -
trunk/Source/WebCore/workers/service/context/SWContextManager.h
r286012 r286044 29 29 30 30 #include "ExceptionOr.h" 31 #include "PushSubscriptionData.h" 31 32 #include "ServiceWorkerClientData.h" 32 33 #include "ServiceWorkerClientQueryOptions.h" … … 92 93 WEBCORE_EXPORT void fireActivateEvent(ServiceWorkerIdentifier); 93 94 WEBCORE_EXPORT void firePushEvent(ServiceWorkerIdentifier, std::optional<Vector<uint8_t>>&&, CompletionHandler<void(bool)>&&); 95 WEBCORE_EXPORT void firePushSubscriptionChangeEvent(ServiceWorkerIdentifier, std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData); 94 96 95 97 WEBCORE_EXPORT void terminateWorker(ServiceWorkerIdentifier, Seconds timeout, Function<void()>&&); -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp
r286012 r286044 39 39 #include "PlatformStrategies.h" 40 40 #include "PushEvent.h" 41 #include "PushSubscription.h" 42 #include "PushSubscriptionChangeEvent.h" 41 43 #include "SWContextManager.h" 42 44 #include "SecurityOrigin.h" … … 236 238 } 237 239 240 void ServiceWorkerThread::queueTaskToFirePushSubscriptionChangeEvent(std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData) 241 { 242 Ref serviceWorkerGlobalScope = downcast<ServiceWorkerGlobalScope>(*globalScope()); 243 serviceWorkerGlobalScope->eventLoop().queueTask(TaskSource::DOMManipulation, [weakThis = WeakPtr { *this }, serviceWorkerGlobalScope, newSubscriptionData = WTFMove(newSubscriptionData), oldSubscriptionData = WTFMove(oldSubscriptionData)]() mutable { 244 RELEASE_LOG(ServiceWorker, "ServiceWorkerThread::queueTaskToFirePushSubscriptionChangeEvent firing event for worker %" PRIu64, serviceWorkerGlobalScope->thread().identifier().toUInt64()); 245 246 RefPtr<PushSubscription> newSubscription; 247 RefPtr<PushSubscription> oldSubscription; 248 249 if (newSubscriptionData) 250 newSubscription = PushSubscription::create(WTFMove(*newSubscriptionData), &serviceWorkerGlobalScope->registration()); 251 if (oldSubscriptionData) 252 oldSubscription = PushSubscription::create(WTFMove(*oldSubscriptionData)); 253 254 auto pushSubscriptionChangeEvent = PushSubscriptionChangeEvent::create(eventNames().pushsubscriptionchangeEvent, { }, WTFMove(newSubscription), WTFMove(oldSubscription), ExtendableEvent::IsTrusted::Yes); 255 serviceWorkerGlobalScope->dispatchEvent(pushSubscriptionChangeEvent); 256 257 pushSubscriptionChangeEvent->whenAllExtendLifetimePromisesAreSettled([weakThis = WTFMove(weakThis)](auto&&) mutable { 258 callOnMainThread([weakThis = WTFMove(weakThis)] { 259 RELEASE_LOG(ServiceWorker, "ServiceWorkerThread::queueTaskToFirePushSubscriptionChangeEvent finishing for worker %llu", weakThis ? weakThis->identifier().toUInt64() : 0); 260 if (weakThis) 261 weakThis->finishedFiringPushSubscriptionChangeEvent(); 262 }); 263 }); 264 }); 265 } 266 238 267 void ServiceWorkerThread::finishedEvaluatingScript() 239 268 { … … 296 325 { 297 326 if (!m_ongoingHeartBeatCheck) { 298 if (m_state == State::Installing || m_state == State::Activating || m_isHandlingFetchEvent || m_isHandlingPushEvent || m_ messageEventCount)327 if (m_state == State::Installing || m_state == State::Activating || m_isHandlingFetchEvent || m_isHandlingPushEvent || m_pushSubscriptionChangeEventCount || m_messageEventCount) 299 328 startHeartBeatTimer(); 300 329 return; … … 363 392 } 364 393 394 void ServiceWorkerThread::willPostTaskToFirePushSubscriptionChangeEvent() 395 { 396 if (!m_pushSubscriptionChangeEventCount++) 397 startHeartBeatTimer(); 398 } 399 400 void ServiceWorkerThread::finishedFiringPushSubscriptionChangeEvent() 401 { 402 ASSERT(m_pushSubscriptionChangeEventCount); 403 --m_pushSubscriptionChangeEventCount; 404 } 405 365 406 } // namespace WebCore 366 407 -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h
r286012 r286044 28 28 #if ENABLE(SERVICE_WORKER) 29 29 30 #include "PushSubscriptionData.h" 30 31 #include "ScriptExecutionContextIdentifier.h" 31 32 #include "ServiceWorkerContextData.h" … … 62 63 void willPostTaskToFireActivateEvent(); 63 64 void willPostTaskToFireMessageEvent(); 65 void willPostTaskToFirePushSubscriptionChangeEvent(); 64 66 65 67 void queueTaskToFireFetchEvent(Ref<ServiceWorkerFetch::Client>&&, std::optional<ScriptExecutionContextIdentifier>&&, ResourceRequest&&, String&& referrer, FetchOptions&&); … … 68 70 void queueTaskToFireActivateEvent(); 69 71 void queueTaskToFirePushEvent(std::optional<Vector<uint8_t>>&&, Function<void(bool)>&&); 72 void queueTaskToFirePushSubscriptionChangeEvent(std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData); 70 73 71 74 ServiceWorkerIdentifier identifier() const { return m_serviceWorkerIdentifier; } … … 91 94 void finishedFiringActivateEvent(); 92 95 void finishedFiringMessageEvent(); 96 void finishedFiringPushSubscriptionChangeEvent(); 93 97 void finishedStarting(); 94 98 … … 106 110 bool m_isHandlingFetchEvent { false }; 107 111 bool m_isHandlingPushEvent { false }; 112 uint64_t m_pushSubscriptionChangeEventCount { 0 }; 108 113 uint64_t m_messageEventCount { 0 }; 109 114 enum class State { Idle, Starting, Installing, Activating }; -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp
r286012 r286044 46 46 #include "Settings.h" 47 47 #include "WorkerGlobalScope.h" 48 #include <wtf/CrossThreadCopier.h> 48 49 #include <wtf/MainThread.h> 49 50 #include <wtf/RunLoop.h> … … 321 322 } 322 323 324 void ServiceWorkerThreadProxy::firePushSubscriptionChangeEvent(std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData) 325 { 326 thread().willPostTaskToFirePushSubscriptionChangeEvent(); 327 thread().runLoop().postTask([this, protectedThis = Ref { *this }, newSubscriptionData = crossThreadCopy(WTFMove(newSubscriptionData)), oldSubscriptionData = crossThreadCopy(WTFMove(oldSubscriptionData))](auto&) mutable { 328 thread().queueTaskToFirePushSubscriptionChangeEvent(WTFMove(newSubscriptionData), WTFMove(oldSubscriptionData)); 329 }); 330 } 331 323 332 } // namespace WebCore 324 333 -
trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h
r286012 r286044 32 32 #include "FetchIdentifier.h" 33 33 #include "Page.h" 34 #include "PushSubscriptionData.h" 34 35 #include "ServiceWorkerDebuggable.h" 35 36 #include "ServiceWorkerIdentifier.h" … … 82 83 void fireActivateEvent(); 83 84 void firePushEvent(std::optional<Vector<uint8_t>>&&, CompletionHandler<void(bool)>&&); 85 void firePushSubscriptionChangeEvent(std::optional<PushSubscriptionData>&& newSubscriptionData, std::optional<PushSubscriptionData>&& oldSubscriptionData); 84 86 85 87 void didSaveScriptsToDisk(ScriptBuffer&&, HashMap<URL, ScriptBuffer>&& importedScripts);
Note:
See TracChangeset
for help on using the changeset viewer.