From 438cdbd913109771d695093c5cb5d5106c613663 Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Fri, 7 Apr 2023 09:56:33 +0800 Subject: [PATCH] Issue #2197 - Part 1a: postMessages should have transferable as [] by default Based on https://bugzilla.mozilla.org/show_bug.cgi?id=1336020 --- dom/base/nsGlobalWindow.cpp | 9 +++--- dom/base/nsGlobalWindow.h | 2 +- dom/messagechannel/MessagePort.cpp | 15 +++++----- dom/messagechannel/MessagePort.h | 2 +- dom/webidl/Client.webidl | 2 +- dom/webidl/DedicatedWorkerGlobalScope.webidl | 2 +- dom/webidl/MessagePort.webidl | 2 +- dom/webidl/ServiceWorker.webidl | 2 +- dom/webidl/Window.webidl | 2 +- dom/webidl/Worker.webidl | 2 +- dom/workers/ServiceWorker.cpp | 2 +- dom/workers/ServiceWorker.h | 2 +- dom/workers/ServiceWorkerClient.cpp | 10 +++---- dom/workers/ServiceWorkerClient.h | 2 +- dom/workers/ServiceWorkerPrivate.cpp | 2 +- dom/workers/ServiceWorkerPrivate.h | 2 +- dom/workers/SharedWorker.cpp | 2 +- dom/workers/SharedWorker.h | 2 +- dom/workers/WorkerPrivate.cpp | 30 +++++++++----------- dom/workers/WorkerPrivate.h | 12 ++++---- dom/workers/WorkerScope.cpp | 2 +- dom/workers/WorkerScope.h | 2 +- 22 files changed, 52 insertions(+), 58 deletions(-) diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index b9bb459eba..307ec495ca 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -8888,18 +8888,17 @@ nsGlobalWindow::PostMessageMoz(JSContext* aCx, JS::Handle aMessage, void nsGlobalWindow::PostMessageMoz(JSContext* aCx, JS::Handle aMessage, const nsAString& aTargetOrigin, - const Optional>& aTransfer, + const Sequence& aTransfer, nsIPrincipal& aSubjectPrincipal, ErrorResult& aError) { JS::Rooted transferArray(aCx, JS::UndefinedValue()); - if (aTransfer.WasPassed()) { - const Sequence& values = aTransfer.Value(); - + if (!aTransfer.IsEmpty()) { // The input sequence only comes from the generated bindings code, which // ensures it is rooted. JS::HandleValueArray elements = - JS::HandleValueArray::fromMarkedLocation(values.Length(), values.Elements()); + JS::HandleValueArray::fromMarkedLocation(aTransfer.Length(), + aTransfer.Elements()); transferArray = JS::ObjectOrNullValue(JS_NewArrayObject(aCx, elements)); if (transferArray.isNull()) { diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h index e42835a0b2..f4829ccac8 100644 --- a/dom/base/nsGlobalWindow.h +++ b/dom/base/nsGlobalWindow.h @@ -933,7 +933,7 @@ public: void Print(mozilla::ErrorResult& aError); void PostMessageMoz(JSContext* aCx, JS::Handle aMessage, const nsAString& aTargetOrigin, - const mozilla::dom::Optional >& aTransfer, + const mozilla::dom::Sequence& aTransfer, nsIPrincipal& aSubjectPrincipal, mozilla::ErrorResult& aError); int32_t SetTimeout(JSContext* aCx, mozilla::dom::Function& aFunction, diff --git a/dom/messagechannel/MessagePort.cpp b/dom/messagechannel/MessagePort.cpp index 6f7a1abc19..515a0f3ef1 100644 --- a/dom/messagechannel/MessagePort.cpp +++ b/dom/messagechannel/MessagePort.cpp @@ -394,20 +394,19 @@ MessagePort::WrapObject(JSContext* aCx, JS::Handle aGivenProto) } void -MessagePort::PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, +MessagePort::PostMessage(JSContext* aCx, + JS::Handle aMessage, + const Sequence& aTransferable, ErrorResult& aRv) { // We *must* clone the data here, or the JS::Value could be modified // by script JS::Rooted transferable(aCx, JS::UndefinedValue()); - if (aTransferable.WasPassed()) { - const Sequence& realTransferable = aTransferable.Value(); - + if (!aTransferable.IsEmpty()) { // Here we want to check if the transerable object list contains // this port. No other checks are done. - for (const JS::Value& value : realTransferable) { + for (const JS::Value& value : aTransferable) { if (!value.isObject()) { continue; } @@ -429,8 +428,8 @@ MessagePort::PostMessage(JSContext* aCx, JS::Handle aMessage, // The input sequence only comes from the generated bindings code, which // ensures it is rooted. JS::HandleValueArray elements = - JS::HandleValueArray::fromMarkedLocation(realTransferable.Length(), - realTransferable.Elements()); + JS::HandleValueArray::fromMarkedLocation(aTransferable.Length(), + aTransferable.Elements()); JSObject* array = JS_NewArrayObject(aCx, elements); diff --git a/dom/messagechannel/MessagePort.h b/dom/messagechannel/MessagePort.h index 0ed2af11c1..2c012925a4 100644 --- a/dom/messagechannel/MessagePort.h +++ b/dom/messagechannel/MessagePort.h @@ -62,7 +62,7 @@ public: void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); void Start(); diff --git a/dom/webidl/Client.webidl b/dom/webidl/Client.webidl index 3e79c6a635..df73a79d79 100644 --- a/dom/webidl/Client.webidl +++ b/dom/webidl/Client.webidl @@ -15,7 +15,7 @@ interface Client { readonly attribute DOMString id; [Throws] - void postMessage(any message, optional sequence transfer); + void postMessage(any message, optional sequence transfer = []); }; [Exposed=ServiceWorker] diff --git a/dom/webidl/DedicatedWorkerGlobalScope.webidl b/dom/webidl/DedicatedWorkerGlobalScope.webidl index 26dca58dab..75a4032676 100644 --- a/dom/webidl/DedicatedWorkerGlobalScope.webidl +++ b/dom/webidl/DedicatedWorkerGlobalScope.webidl @@ -16,7 +16,7 @@ Exposed=DedicatedWorker] interface DedicatedWorkerGlobalScope : WorkerGlobalScope { [Throws] - void postMessage(any message, optional sequence transfer); + void postMessage(any message, optional sequence transfer = []); attribute EventHandler onmessage; }; diff --git a/dom/webidl/MessagePort.webidl b/dom/webidl/MessagePort.webidl index 59c61a7149..aef7e4bd11 100644 --- a/dom/webidl/MessagePort.webidl +++ b/dom/webidl/MessagePort.webidl @@ -10,7 +10,7 @@ [Exposed=(Window,Worker,System)] interface MessagePort : EventTarget { [Throws] - void postMessage(any message, optional sequence transferable); + void postMessage(any message, optional sequence transferable = []); void start(); void close(); diff --git a/dom/webidl/ServiceWorker.webidl b/dom/webidl/ServiceWorker.webidl index 8c3749e940..17fc903dcb 100644 --- a/dom/webidl/ServiceWorker.webidl +++ b/dom/webidl/ServiceWorker.webidl @@ -21,7 +21,7 @@ interface ServiceWorker : EventTarget { // FIXME(catalinb): Should inherit this from Worker. [Throws] - void postMessage(any message, optional sequence transferable); + void postMessage(any message, optional sequence transferable = []); }; ServiceWorker implements AbstractWorker; diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl index 1b98042473..199a846bd1 100644 --- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl @@ -80,7 +80,7 @@ typedef any Transferable; [Throws, UnsafeInPrerendering] void print(); [Throws, CrossOriginCallable, NeedsSubjectPrincipal] - void postMessage(any message, DOMString targetOrigin, optional sequence transfer); + void postMessage(any message, DOMString targetOrigin, optional sequence transfer = []); // also has obsolete members }; diff --git a/dom/webidl/Worker.webidl b/dom/webidl/Worker.webidl index 158a502d60..4bc79e9e15 100644 --- a/dom/webidl/Worker.webidl +++ b/dom/webidl/Worker.webidl @@ -19,7 +19,7 @@ interface Worker : EventTarget { void terminate(); [Throws] - void postMessage(any message, optional sequence transfer); + void postMessage(any message, optional sequence transfer = []); attribute EventHandler onmessage; }; diff --git a/dom/workers/ServiceWorker.cpp b/dom/workers/ServiceWorker.cpp index 16dd28b8ad..257c2ba007 100644 --- a/dom/workers/ServiceWorker.cpp +++ b/dom/workers/ServiceWorker.cpp @@ -77,7 +77,7 @@ ServiceWorker::GetScriptURL(nsString& aURL) const void ServiceWorker::PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { if (State() == ServiceWorkerState::Redundant) { diff --git a/dom/workers/ServiceWorker.h b/dom/workers/ServiceWorker.h index 3a3cce8260..ac3c2abe1d 100644 --- a/dom/workers/ServiceWorker.h +++ b/dom/workers/ServiceWorker.h @@ -63,7 +63,7 @@ public: void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); private: diff --git a/dom/workers/ServiceWorkerClient.cpp b/dom/workers/ServiceWorkerClient.cpp index 1f845a947b..9b9e43b2b6 100644 --- a/dom/workers/ServiceWorkerClient.cpp +++ b/dom/workers/ServiceWorkerClient.cpp @@ -190,7 +190,7 @@ private: void ServiceWorkerClient::PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); @@ -198,12 +198,10 @@ ServiceWorkerClient::PostMessage(JSContext* aCx, JS::Handle aMessage, workerPrivate->AssertIsOnWorkerThread(); JS::Rooted transferable(aCx, JS::UndefinedValue()); - if (aTransferable.WasPassed()) { - const Sequence& realTransferable = aTransferable.Value(); - + if (!aTransferable.IsEmpty()) { JS::HandleValueArray elements = - JS::HandleValueArray::fromMarkedLocation(realTransferable.Length(), - realTransferable.Elements()); + JS::HandleValueArray::fromMarkedLocation(aTransferable.Length(), + aTransferable.Elements()); JSObject* array = JS_NewArrayObject(aCx, elements); if (!array) { diff --git a/dom/workers/ServiceWorkerClient.h b/dom/workers/ServiceWorkerClient.h index 46bcdbc4c4..bbf7ddf489 100644 --- a/dom/workers/ServiceWorkerClient.h +++ b/dom/workers/ServiceWorkerClient.h @@ -91,7 +91,7 @@ public: void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; diff --git a/dom/workers/ServiceWorkerPrivate.cpp b/dom/workers/ServiceWorkerPrivate.cpp index 2f5b8f7500..acb666415d 100644 --- a/dom/workers/ServiceWorkerPrivate.cpp +++ b/dom/workers/ServiceWorkerPrivate.cpp @@ -141,7 +141,7 @@ NS_IMPL_ISUPPORTS0(MessageWaitUntilHandler) nsresult ServiceWorkerPrivate::SendMessageEvent(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, UniquePtr&& aClientInfo) { ErrorResult rv(SpawnWorkerIfNeeded(MessageEvent, nullptr)); diff --git a/dom/workers/ServiceWorkerPrivate.h b/dom/workers/ServiceWorkerPrivate.h index 8ce021c8cf..bd55749277 100644 --- a/dom/workers/ServiceWorkerPrivate.h +++ b/dom/workers/ServiceWorkerPrivate.h @@ -74,7 +74,7 @@ public: nsresult SendMessageEvent(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, UniquePtr&& aClientInfo); // This is used to validate the worker script and continue the installation diff --git a/dom/workers/SharedWorker.cpp b/dom/workers/SharedWorker.cpp index 97df0f57fd..7ef96c281e 100644 --- a/dom/workers/SharedWorker.cpp +++ b/dom/workers/SharedWorker.cpp @@ -142,7 +142,7 @@ SharedWorker::Close() void SharedWorker::PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { AssertIsOnMainThread(); diff --git a/dom/workers/SharedWorker.h b/dom/workers/SharedWorker.h index 4820b4e7c1..2b4862f9db 100644 --- a/dom/workers/SharedWorker.h +++ b/dom/workers/SharedWorker.h @@ -95,7 +95,7 @@ private: // Only called by MessagePort. void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); }; diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index cf270703e0..6a95544704 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -3009,7 +3009,7 @@ void WorkerPrivateParent::PostMessageInternal( JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, UniquePtr&& aClientInfo, PromiseNativeHandler* aHandler, ErrorResult& aRv) @@ -3024,14 +3024,12 @@ WorkerPrivateParent::PostMessageInternal( } JS::Rooted transferable(aCx, JS::UndefinedValue()); - if (aTransferable.WasPassed()) { - const Sequence& realTransferable = aTransferable.Value(); - + if (!aTransferable.IsEmpty()) { // The input sequence only comes from the generated bindings code, which // ensures it is rooted. JS::HandleValueArray elements = - JS::HandleValueArray::fromMarkedLocation(realTransferable.Length(), - realTransferable.Elements()); + JS::HandleValueArray::fromMarkedLocation(aTransferable.Length(), + aTransferable.Elements()); JSObject* array = JS_NewArrayObject(aCx, elements); @@ -3083,8 +3081,9 @@ WorkerPrivateParent::PostMessageInternal( template void WorkerPrivateParent::PostMessage( - JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + JSContext* aCx, + JS::Handle aMessage, + const Sequence& aTransferable, ErrorResult& aRv) { PostMessageInternal(aCx, aMessage, aTransferable, nullptr, nullptr, aRv); @@ -3093,8 +3092,9 @@ WorkerPrivateParent::PostMessage( template void WorkerPrivateParent::PostMessageToServiceWorker( - JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + JSContext* aCx, + JS::Handle aMessage, + const Sequence& aTransferable, UniquePtr&& aClientInfo, PromiseNativeHandler* aHandler, ErrorResult& aRv) @@ -5677,20 +5677,18 @@ void WorkerPrivate::PostMessageToParentInternal( JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { AssertIsOnWorkerThread(); JS::Rooted transferable(aCx, JS::UndefinedValue()); - if (aTransferable.WasPassed()) { - const Sequence& realTransferable = aTransferable.Value(); - + if (!aTransferable.IsEmpty()) { // The input sequence only comes from the generated bindings code, which // ensures it is rooted. JS::HandleValueArray elements = - JS::HandleValueArray::fromMarkedLocation(realTransferable.Length(), - realTransferable.Elements()); + JS::HandleValueArray::fromMarkedLocation(aTransferable.Length(), + aTransferable.Elements()); JSObject* array = JS_NewArrayObject(aCx, elements); if (!array) { diff --git a/dom/workers/WorkerPrivate.h b/dom/workers/WorkerPrivate.h index b638c1ef11..dd0f990ba8 100644 --- a/dom/workers/WorkerPrivate.h +++ b/dom/workers/WorkerPrivate.h @@ -287,7 +287,7 @@ private: void PostMessageInternal(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, UniquePtr&& aClientInfo, PromiseNativeHandler* aHandler, ErrorResult& aRv); @@ -400,12 +400,12 @@ public: void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); void PostMessageToServiceWorker(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, UniquePtr&& aClientInfo, PromiseNativeHandler* aHandler, ErrorResult& aRv); @@ -1161,7 +1161,7 @@ public: void PostMessageToParent(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { PostMessageToParentInternal(aCx, aMessage, aTransferable, aRv); @@ -1171,7 +1171,7 @@ public: PostMessageToParentMessagePort( JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); void @@ -1471,7 +1471,7 @@ private: void PostMessageToParentInternal(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); void diff --git a/dom/workers/WorkerScope.cpp b/dom/workers/WorkerScope.cpp index ec42364b52..3b9215a8e9 100644 --- a/dom/workers/WorkerScope.cpp +++ b/dom/workers/WorkerScope.cpp @@ -535,7 +535,7 @@ DedicatedWorkerGlobalScope::WrapGlobalObject(JSContext* aCx, void DedicatedWorkerGlobalScope::PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv) { mWorkerPrivate->AssertIsOnWorkerThread(); diff --git a/dom/workers/WorkerScope.h b/dom/workers/WorkerScope.h index 8d06152da2..a8062298e9 100644 --- a/dom/workers/WorkerScope.h +++ b/dom/workers/WorkerScope.h @@ -215,7 +215,7 @@ public: void PostMessage(JSContext* aCx, JS::Handle aMessage, - const Optional>& aTransferable, + const Sequence& aTransferable, ErrorResult& aRv); IMPL_EVENT_HANDLER(message)