Backed out changeset efa6394f2a4a (bug 1453925) for mochitest failures on test_broadcastchannel_worker_alive.html. a=backout

This commit is contained in:
Cosmin Sabou 2018-04-15 02:45:33 +03:00
parent 6c47714197
commit 5748e6f517
2 changed files with 63 additions and 4 deletions

View File

@ -125,6 +125,48 @@ private:
ErrorResult& mRv;
};
class BCPostMessageRunnable final : public nsIRunnable,
public nsICancelableRunnable
{
public:
NS_DECL_ISUPPORTS
BCPostMessageRunnable(BroadcastChannelChild* aActor,
BroadcastChannelMessage* aData)
: mActor(aActor)
, mData(aData)
{
MOZ_ASSERT(mActor);
}
NS_IMETHOD Run() override
{
MOZ_ASSERT(mActor);
if (mActor->IsActorDestroyed()) {
return NS_OK;
}
ClonedMessageData message;
mData->BuildClonedMessageDataForBackgroundChild(mActor->Manager(), message);
mActor->SendPostMessage(message);
return NS_OK;
}
nsresult Cancel() override
{
mActor = nullptr;
return NS_OK;
}
private:
~BCPostMessageRunnable() {}
RefPtr<BroadcastChannelChild> mActor;
RefPtr<BroadcastChannelMessage> mData;
};
NS_IMPL_ISUPPORTS(BCPostMessageRunnable, nsICancelableRunnable, nsIRunnable)
class CloseRunnable final : public nsIRunnable,
public nsICancelableRunnable
{
@ -356,6 +398,14 @@ BroadcastChannel::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
return;
}
PostMessageInternal(aCx, aMessage, aRv);
}
void
BroadcastChannel::PostMessageInternal(JSContext* aCx,
JS::Handle<JS::Value> aMessage,
ErrorResult& aRv)
{
RefPtr<BroadcastChannelMessage> data = new BroadcastChannelMessage();
data->Write(aCx, aMessage, aRv);
@ -363,11 +413,20 @@ BroadcastChannel::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
return;
}
PostMessageData(data);
}
void
BroadcastChannel::PostMessageData(BroadcastChannelMessage* aData)
{
RemoveDocFromBFCache();
ClonedMessageData message;
data->BuildClonedMessageDataForBackgroundChild(mActor->Manager(), message);
mActor->SendPostMessage(message);
RefPtr<BCPostMessageRunnable> runnable =
new BCPostMessageRunnable(mActor, aData);
if (NS_FAILED(NS_DispatchToCurrentThread(runnable))) {
NS_WARNING("Failed to dispatch to the current thread!");
}
}
void

View File

@ -23,10 +23,10 @@ async function useBroadcastChannel(contentWindow) {
count += 1;
const name = `test_event_listener_leaks-${count}`;
let bc = new contentWindow.BroadcastChannel(name);
let outer = new BroadcastChannel(name);
outer.postMessage('foo');
let bc = new contentWindow.BroadcastChannel(name);
await new Promise(resolve => {
bc.onmessage = e => {
contentWindow.messageCount += 1;