зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1205112 - Make `PushEvent.data` nullable. r=mt,smaug
--HG-- extra : commitid : 8kofiFgB7WB extra : rebase_source : 1ff780efd336a9a4214800149c397d9fd3fd6429
This commit is contained in:
Родитель
cc7189cb64
Коммит
556109257e
|
@ -34,7 +34,7 @@ interface nsIServiceWorkerInfo : nsISupports
|
|||
readonly attribute DOMString waitingCacheName;
|
||||
};
|
||||
|
||||
[scriptable, builtinclass, uuid(02d52950-f311-42c7-b573-fd3a2c5d3210)]
|
||||
[scriptable, builtinclass, uuid(471b2d5d-64c3-4dea-bde1-219853dcaac8)]
|
||||
interface nsIServiceWorkerManager : nsISupports
|
||||
{
|
||||
/**
|
||||
|
@ -141,10 +141,10 @@ interface nsIServiceWorkerManager : nsISupports
|
|||
in AString aIcon,
|
||||
in AString aData,
|
||||
in AString aBehavior);
|
||||
void sendPushEvent(in ACString aOriginAttributes,
|
||||
in ACString aScope,
|
||||
in uint32_t aDataLength,
|
||||
[array, size_is(aDataLength)] in uint8_t aDataBytes);
|
||||
[optional_argc] void sendPushEvent(in ACString aOriginAttributes,
|
||||
in ACString aScope,
|
||||
[optional] in uint32_t aDataLength,
|
||||
[optional, array, size_is(aDataLength)] in uint8_t aDataBytes);
|
||||
void sendPushSubscriptionChangeEvent(in ACString aOriginAttributes,
|
||||
in ACString scope);
|
||||
|
||||
|
|
|
@ -23,12 +23,12 @@ var processType = Cc["@mozilla.org/xre/app-info;1"]
|
|||
var isParent = processType === Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
|
||||
|
||||
Services.cpmm.addMessageListener("push", function (aMessage) {
|
||||
let {payload} = aMessage.data;
|
||||
let length = payload ? payload.length : 0;
|
||||
swm.sendPushEvent(aMessage.data.originAttributes,
|
||||
aMessage.data.scope,
|
||||
length,
|
||||
payload);
|
||||
let {originAttributes, scope, payload} = aMessage.data;
|
||||
if (payload) {
|
||||
swm.sendPushEvent(originAttributes, scope, payload.length, payload);
|
||||
} else {
|
||||
swm.sendPushEvent(originAttributes, scope);
|
||||
}
|
||||
});
|
||||
|
||||
Services.cpmm.addMessageListener("pushsubscriptionchange", function (aMessage) {
|
||||
|
|
|
@ -132,6 +132,20 @@ http://creativecommons.org/licenses/publicdomain/
|
|||
});
|
||||
}).then(text => {
|
||||
is(text, "Hi! \ud83d\udc40", "Wrong blob data for message with emoji");
|
||||
is(text, "Hi! \ud83d\udc40", "Wrong blob data for message with emoji");
|
||||
// Send a blank message.
|
||||
return Promise.all([
|
||||
controlledFrame.contentWindow.waitOnPushMessage(pushSubscription),
|
||||
fetch("http://mochi.test:8888/tests/dom/push/test/push-server.sjs", {
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"X-Push-Method": "POST",
|
||||
"X-Push-Server": pushSubscription.endpoint,
|
||||
},
|
||||
}),
|
||||
]).then(([message]) => message);
|
||||
}).then(message => {
|
||||
ok(!message.data, "Should exclude data for blank messages");
|
||||
return pushSubscription;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
Func="nsContentUtils::PushEnabled",
|
||||
Exposed=ServiceWorker]
|
||||
interface PushEvent : ExtendableEvent {
|
||||
readonly attribute PushMessageData data;
|
||||
readonly attribute PushMessageData? data;
|
||||
};
|
||||
|
||||
typedef (BufferSource or USVString) PushMessageDataInit;
|
||||
|
|
|
@ -240,7 +240,7 @@ public:
|
|||
mServiceWorker = aServiceWorker;
|
||||
}
|
||||
|
||||
PushMessageData* Data()
|
||||
PushMessageData* GetData() const
|
||||
{
|
||||
return mData;
|
||||
}
|
||||
|
|
|
@ -2297,22 +2297,22 @@ public:
|
|||
|
||||
class SendPushEventRunnable final : public WorkerRunnable
|
||||
{
|
||||
nsTArray<uint8_t> mData;
|
||||
Maybe<nsTArray<uint8_t>> mData;
|
||||
nsMainThreadPtrHandle<ServiceWorker> mServiceWorker;
|
||||
|
||||
public:
|
||||
SendPushEventRunnable(
|
||||
WorkerPrivate* aWorkerPrivate,
|
||||
nsMainThreadPtrHandle<ServiceWorker>& aServiceWorker)
|
||||
: SendPushEventRunnable(aWorkerPrivate, aServiceWorker,
|
||||
Nothing()) {}
|
||||
|
||||
SendPushEventRunnable(
|
||||
WorkerPrivate* aWorkerPrivate,
|
||||
const nsTArray<uint8_t>& aData,
|
||||
nsMainThreadPtrHandle<ServiceWorker>& aServiceWorker)
|
||||
: WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount)
|
||||
, mData(aData)
|
||||
, mServiceWorker(aServiceWorker)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
MOZ_ASSERT(aWorkerPrivate->IsServiceWorker());
|
||||
}
|
||||
: SendPushEventRunnable(aWorkerPrivate, aServiceWorker,
|
||||
Some(aData)) {}
|
||||
|
||||
bool
|
||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
|
||||
|
@ -2320,12 +2320,16 @@ public:
|
|||
MOZ_ASSERT(aWorkerPrivate);
|
||||
GlobalObject globalObj(aCx, aWorkerPrivate->GlobalScope()->GetWrapper());
|
||||
|
||||
JSObject* data = Uint8Array::Create(aCx, mData.Length(), mData.Elements());
|
||||
if (!data) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PushEventInit pei;
|
||||
pei.mData.Construct().SetAsArrayBufferView().Init(data);
|
||||
if (mData) {
|
||||
const nsTArray<uint8_t>& bytes = mData.ref();
|
||||
JSObject* data = Uint8Array::Create(aCx, bytes.Length(), bytes.Elements());
|
||||
if (!data) {
|
||||
return false;
|
||||
}
|
||||
pei.mData.Construct().SetAsArrayBufferView().Init(data);
|
||||
}
|
||||
pei.mBubbles = false;
|
||||
pei.mCancelable = false;
|
||||
|
||||
|
@ -2349,6 +2353,20 @@ public:
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SendPushEventRunnable(
|
||||
WorkerPrivate* aWorkerPrivate,
|
||||
nsMainThreadPtrHandle<ServiceWorker>& aServiceWorker,
|
||||
Maybe<nsTArray<uint8_t>> aData)
|
||||
: WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount)
|
||||
, mData(aData)
|
||||
, mServiceWorker(aServiceWorker)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
MOZ_ASSERT(aWorkerPrivate->IsServiceWorker());
|
||||
}
|
||||
};
|
||||
|
||||
class SendPushSubscriptionChangeEventRunnable final : public WorkerRunnable
|
||||
|
@ -2395,7 +2413,8 @@ NS_IMETHODIMP
|
|||
ServiceWorkerManager::SendPushEvent(const nsACString& aOriginAttributes,
|
||||
const nsACString& aScope,
|
||||
uint32_t aDataLength,
|
||||
uint8_t* aDataBytes)
|
||||
uint8_t* aDataBytes,
|
||||
uint8_t optional_argc)
|
||||
{
|
||||
#ifdef MOZ_SIMPLEPUSH
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
@ -2414,15 +2433,20 @@ ServiceWorkerManager::SendPushEvent(const nsACString& aOriginAttributes,
|
|||
nsMainThreadPtrHandle<ServiceWorker> serviceWorkerHandle(
|
||||
new nsMainThreadPtrHolder<ServiceWorker>(serviceWorker));
|
||||
|
||||
nsTArray<uint8_t> data;
|
||||
if (!data.InsertElementsAt(0, aDataBytes, aDataLength, fallible)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
nsRefPtr<SendPushEventRunnable> r;
|
||||
if (optional_argc == 2) {
|
||||
nsTArray<uint8_t> data;
|
||||
if (!data.InsertElementsAt(0, aDataBytes, aDataLength, fallible)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
r = new SendPushEventRunnable(serviceWorker->GetWorkerPrivate(), data,
|
||||
serviceWorkerHandle);
|
||||
} else {
|
||||
MOZ_ASSERT(optional_argc == 0);
|
||||
r = new SendPushEventRunnable(serviceWorker->GetWorkerPrivate(),
|
||||
serviceWorkerHandle);
|
||||
}
|
||||
|
||||
nsRefPtr<SendPushEventRunnable> r =
|
||||
new SendPushEventRunnable(serviceWorker->GetWorkerPrivate(), data,
|
||||
serviceWorkerHandle);
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
if (NS_WARN_IF(!r->Dispatch(jsapi.cx()))) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче