Backed out changeset e95ff11012c5 (bug 1910360) as requested for causing Android...
[gecko.git] / dom / ipc / jsactor / JSProcessActorChild.cpp
bloba9379838cfa41ac0c641c0b44ddd3436dc481221
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/dom/ContentChild.h"
8 #include "mozilla/dom/JSProcessActorBinding.h"
9 #include "mozilla/dom/JSProcessActorChild.h"
10 #include "mozilla/dom/InProcessChild.h"
11 #include "mozilla/dom/InProcessParent.h"
13 namespace mozilla::dom {
15 NS_IMPL_CYCLE_COLLECTION_INHERITED(JSProcessActorChild, JSActor, mManager)
17 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(JSProcessActorChild)
18 NS_INTERFACE_MAP_END_INHERITING(JSActor)
20 NS_IMPL_ADDREF_INHERITED(JSProcessActorChild, JSActor)
21 NS_IMPL_RELEASE_INHERITED(JSProcessActorChild, JSActor)
23 JSObject* JSProcessActorChild::WrapObject(JSContext* aCx,
24 JS::Handle<JSObject*> aGivenProto) {
25 return JSProcessActorChild_Binding::Wrap(aCx, this, aGivenProto);
28 void JSProcessActorChild::SendRawMessage(
29 const JSActorMessageMeta& aMeta, Maybe<ipc::StructuredCloneData>&& aData,
30 Maybe<ipc::StructuredCloneData>&& aStack, ErrorResult& aRv) {
31 if (NS_WARN_IF(!CanSend() || !mManager || !mManager->GetCanSend())) {
32 aRv.ThrowInvalidStateError("JSProcessActorChild cannot send at the moment");
33 return;
36 // If the parent side is in the same process, we have a PInProcess manager,
37 // and can dispatch the message directly to the event loop.
38 ContentChild* contentChild = mManager->AsContentChild();
39 if (!contentChild) {
40 SendRawMessageInProcess(aMeta, std::move(aData), std::move(aStack), []() {
41 return do_AddRef(InProcessParent::Singleton());
42 });
43 return;
46 // Cross-process case - send data over ContentChild to other side.
47 Maybe<ClonedMessageData> msgData;
48 if (aData) {
49 msgData.emplace();
50 if (NS_WARN_IF(!aData->BuildClonedMessageData(*msgData))) {
51 aRv.ThrowDataCloneError(
52 nsPrintfCString("JSProcessActorChild serialization error: cannot "
53 "clone, in actor '%s'",
54 PromiseFlatCString(aMeta.actorName()).get()));
55 return;
59 Maybe<ClonedMessageData> stackData;
60 if (aStack) {
61 stackData.emplace();
62 if (!aStack->BuildClonedMessageData(*stackData)) {
63 stackData.reset();
67 if (NS_WARN_IF(!contentChild->SendRawMessage(aMeta, msgData, stackData))) {
68 aRv.ThrowOperationError(
69 nsPrintfCString("JSProcessActorChild send error in actor '%s'",
70 PromiseFlatCString(aMeta.actorName()).get()));
71 return;
75 void JSProcessActorChild::Init(const nsACString& aName,
76 nsIDOMProcessChild* aManager) {
77 MOZ_ASSERT(!mManager, "Cannot Init() a JSProcessActorChild twice!");
78 SetName(aName);
79 mManager = aManager;
81 InvokeCallback(CallbackFunction::ActorCreated);
84 void JSProcessActorChild::ClearManager() { mManager = nullptr; }
86 } // namespace mozilla::dom