Bug 1205112 - Make `PushEvent.data` nullable. r=mt,smaug

--HG--
extra : commitid : 8kofiFgB7WB
extra : rebase_source : 1ff780efd336a9a4214800149c397d9fd3fd6429
This commit is contained in:
Kit Cambridge 2015-09-17 05:13:04 -07:00
Родитель cc7189cb64
Коммит 556109257e
6 изменённых файлов: 73 добавлений и 35 удалений

Просмотреть файл

@ -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()))) {