bool
nsInProcessTabChildGlobal::DoSendAsyncMessage(JSContext* aCx,
        const nsAString& aMessage,
        const StructuredCloneData& aData,
        JS::Handle<JSObject *> aCpows,
        nsIPrincipal* aPrincipal)
{
    SameProcessMessageQueue* queue = SameProcessMessageQueue::Get();
    nsRefPtr<nsAsyncMessageToParent> ev =
        new nsAsyncMessageToParent(aCx, this, aMessage, aData, aCpows, aPrincipal);
    queue->Push(ev);
    return true;
}
nsresult
nsInProcessTabChildGlobal::DoSendAsyncMessage(JSContext* aCx,
                                              const nsAString& aMessage,
                                              StructuredCloneData& aData,
                                              JS::Handle<JSObject *> aCpows,
                                              nsIPrincipal* aPrincipal)
{
  SameProcessMessageQueue* queue = SameProcessMessageQueue::Get();
  RefPtr<nsAsyncMessageToParent> ev =
    new nsAsyncMessageToParent(aCx, aCpows, this);

  nsresult rv = ev->Init(aCx, aMessage, aData, aPrincipal);
  if (NS_FAILED(rv)) {
    return rv;
  }

  queue->Push(ev);
  return NS_OK;
}
bool
nsInProcessTabChildGlobal::DoSendBlockingMessage(JSContext* aCx,
        const nsAString& aMessage,
        const dom::StructuredCloneData& aData,
        JS::Handle<JSObject *> aCpows,
        nsIPrincipal* aPrincipal,
        nsTArray<OwningSerializedStructuredCloneBuffer>* aRetVal,
        bool aIsSync)
{
    SameProcessMessageQueue* queue = SameProcessMessageQueue::Get();
    queue->Flush();

    if (mChromeMessageManager) {
        SameProcessCpowHolder cpows(js::GetRuntime(aCx), aCpows);
        nsRefPtr<nsFrameMessageManager> mm = mChromeMessageManager;
        nsCOMPtr<nsIFrameLoader> fl = GetFrameLoader();
        mm->ReceiveMessage(mOwner, fl, aMessage, true, &aData, &cpows, aPrincipal,
                           aRetVal);
    }
    return true;
}