Skip to content

Commit 0fefabd

Browse files
committed
Bug 1633379 - Part 2: Add support for in-process JSWindowActors, r=kmag,Yoric
This switches the `nsIContent{Parent,Child}` interface to be `nsIDOMProcess{Parent,Child}`, and also implements it on `InProcess{Parent,Child}`, along with the `ProcessActor` interface. Differential Revision: https://phabricator.services.mozilla.com/D80582
1 parent 508260e commit 0fefabd

32 files changed

+437
-229
lines changed

dom/base/ChromeUtils.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "mozilla/dom/ContentChild.h"
2727
#include "mozilla/dom/ContentParent.h"
2828
#include "mozilla/dom/IdleDeadline.h"
29+
#include "mozilla/dom/InProcessChild.h"
2930
#include "mozilla/dom/JSActorService.h"
3031
#include "mozilla/dom/MediaControlUtils.h"
3132
#include "mozilla/dom/MediaControlService.h"
@@ -1303,7 +1304,10 @@ void ChromeUtils::GenerateMediaControlKey(const GlobalObject& aGlobal,
13031304
}
13041305

13051306
/* static */
1306-
nsIContentChild* ChromeUtils::GetContentChild(const GlobalObject&) {
1307+
nsIDOMProcessChild* ChromeUtils::GetDomProcessChild(const GlobalObject&) {
1308+
if (XRE_IsParentProcess()) {
1309+
return InProcessChild::Singleton();
1310+
}
13071311
return ContentChild::GetSingleton();
13081312
}
13091313

dom/base/ChromeUtils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "mozilla/dom/ChromeUtilsBinding.h"
1313
#include "mozilla/ErrorResult.h"
1414
#include "nsDOMNavigationTiming.h" // for DOMHighResTimeStamp
15-
#include "nsIContentChild.h"
15+
#include "nsIDOMProcessChild.h"
1616

1717
namespace mozilla {
1818

@@ -218,7 +218,7 @@ class ChromeUtils {
218218
static void GenerateMediaControlKey(const GlobalObject& aGlobal,
219219
MediaControlKey aKey);
220220

221-
static nsIContentChild* GetContentChild(const GlobalObject&);
221+
static nsIDOMProcessChild* GetDomProcessChild(const GlobalObject&);
222222

223223
// This function would only be used for testing.
224224
static void GetCurrentActiveMediaMetadata(const GlobalObject& aGlobal,

dom/bindings/Bindings.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,8 +1875,8 @@ addExternalIface('nsITreeSelection', nativeType='nsITreeSelection',
18751875
notflattened=True)
18761876
addExternalIface('nsISupports', nativeType='nsISupports')
18771877
addExternalIface('nsIDocShell', nativeType='nsIDocShell', notflattened=True)
1878-
addExternalIface('nsIContentChild', nativeType='nsIContentChild', notflattened=True)
1879-
addExternalIface('nsIContentParent', nativeType='nsIContentParent', notflattened=True)
1878+
addExternalIface('nsIDOMProcessChild', nativeType='nsIDOMProcessChild', notflattened=True)
1879+
addExternalIface('nsIDOMProcessParent', nativeType='nsIDOMProcessParent', notflattened=True)
18801880
addExternalIface('nsIReferrerInfo', nativeType='nsIReferrerInfo', notflattened=True)
18811881
addExternalIface('nsISecureBrowserUI', nativeType='nsISecureBrowserUI', notflattened=True)
18821882
addExternalIface('nsIWebProgress', nativeType='nsIWebProgress', notflattened=True)

dom/chrome-webidl/ChromeUtils.webidl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* You can obtain one at http://mozilla.org/MPL/2.0/.
55
*/
66

7-
interface nsIContentChild;
7+
interface nsIDOMProcessChild;
88

99
/**
1010
* An optimized QueryInterface method, generated by generateQI.
@@ -477,10 +477,10 @@ partial namespace ChromeUtils {
477477
void generateMediaControlKey(MediaControlKey aKey);
478478

479479
/**
480-
* ContentChild of the current process.
480+
* nsIDOMProcessChild for the current process.
481481
*/
482482
[ChromeOnly]
483-
readonly attribute nsIContentChild? contentChild;
483+
readonly attribute nsIDOMProcessChild? domProcessChild;
484484

485485
// This is used to get the media metadata from the current main controller in
486486
// testing.

dom/chrome-webidl/JSProcessActor.webidl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ interface JSProcessActorParent {
2020
[ChromeOnly]
2121
constructor();
2222

23-
readonly attribute nsIContentParent manager;
23+
readonly attribute nsIDOMProcessParent manager;
2424
};
2525
JSProcessActorParent includes JSActor;
2626

@@ -29,7 +29,7 @@ interface JSProcessActorChild {
2929
[ChromeOnly]
3030
constructor();
3131

32-
readonly attribute nsIContentChild manager;
32+
readonly attribute nsIDOMProcessChild manager;
3333
};
3434
JSProcessActorChild includes JSActor;
3535

dom/chrome-webidl/WindowGlobalActors.webidl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ interface URI;
88
interface nsIDocShell;
99
interface RemoteTab;
1010
interface nsITransportSecurityInfo;
11-
interface nsIContentParent;
11+
interface nsIDOMProcessParent;
1212

1313
[Exposed=Window, ChromeOnly]
1414
interface WindowContext {
@@ -62,9 +62,10 @@ interface WindowGlobalParent : WindowContext {
6262
// String containing serialized content blocking log.
6363
readonly attribute DOMString contentBlockingLog;
6464

65-
// ContentParent of the process this window is loaded in.
66-
// Will be `null` for windows loaded in the parent process.
67-
readonly attribute nsIContentParent? contentParent;
65+
// DOM Process which this window was loaded in. Will be either InProcessParent
66+
// for windows loaded in the parent process, or ContentParent for windows
67+
// loaded in the content process.
68+
readonly attribute nsIDOMProcessParent? domProcess;
6869

6970
static WindowGlobalParent? getByInnerWindowId(unsigned long long innerWindowId);
7071

dom/docs/Fission.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,11 @@ Get a JSProcessActor
583583
let parentActor = this.browser
584584
.browsingContext
585585
.currentWindowGlobal
586-
.contentParent
586+
.domProcess
587587
.getActor("TestProcess");
588588
589589
// get child side actor
590-
let childActor = ChromeUtils.contentChild
590+
let childActor = ChromeUtils.domProcessChild
591591
.getActor("TestProcess");
592592
593593
And more

dom/ipc/ContentChild.cpp

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,8 @@ ContentChild::~ContentChild() {
612612
#endif
613613

614614
NS_INTERFACE_MAP_BEGIN(ContentChild)
615-
NS_INTERFACE_MAP_ENTRY(nsIContentChild)
616-
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIContentChild)
615+
NS_INTERFACE_MAP_ENTRY(nsIDOMProcessChild)
616+
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMProcessChild)
617617
NS_INTERFACE_MAP_END
618618

619619
mozilla::ipc::IPCResult ContentChild::RecvSetXPCOMProcessAttributes(
@@ -4195,59 +4195,25 @@ NS_IMETHODIMP ContentChild::GetActor(const nsACString& aName,
41954195
IPCResult ContentChild::RecvRawMessage(const JSActorMessageMeta& aMeta,
41964196
const ClonedMessageData& aData,
41974197
const ClonedMessageData& aStack) {
4198-
StructuredCloneData data;
4199-
data.BorrowFromClonedMessageDataForChild(aData);
4200-
StructuredCloneData stack;
4201-
stack.BorrowFromClonedMessageDataForChild(aStack);
4202-
ReceiveRawMessage(aMeta, std::move(data), std::move(stack));
4203-
return IPC_OK();
4204-
}
4205-
4206-
void ContentChild::ReceiveRawMessage(const JSActorMessageMeta& aMeta,
4207-
StructuredCloneData&& aData,
4208-
StructuredCloneData&& aStack) {
4209-
RefPtr<JSProcessActorChild> actor =
4210-
GetActor(aMeta.actorName(), IgnoreErrors());
4198+
RefPtr<JSProcessActorChild> actor;
4199+
GetActor(aMeta.actorName(), getter_AddRefs(actor));
42114200
if (actor) {
4212-
actor->ReceiveRawMessage(aMeta, std::move(aData), std::move(aStack));
4201+
StructuredCloneData data;
4202+
data.BorrowFromClonedMessageDataForChild(aData);
4203+
StructuredCloneData stack;
4204+
stack.BorrowFromClonedMessageDataForChild(aStack);
4205+
actor->ReceiveRawMessage(aMeta, std::move(data), std::move(stack));
42134206
}
4207+
return IPC_OK();
42144208
}
42154209

4216-
already_AddRefed<mozilla::dom::JSProcessActorChild> ContentChild::GetActor(
4217-
const nsACString& aName, ErrorResult& aRv) {
4218-
if (!CanSend()) {
4219-
aRv.ThrowInvalidStateError(
4220-
"Cannot get JSProcessActor, process is shutting down");
4221-
return nullptr;
4222-
}
4223-
4224-
// Check if this actor has already been created, and return it if it has.
4225-
if (mProcessActors.Contains(aName)) {
4226-
return mProcessActors.Get(aName);
4227-
}
4228-
4229-
// Otherwise, we want to create a new instance of this actor.
4230-
JS::RootedObject obj(RootingCx());
4231-
ConstructActor(aName, &obj, aRv);
4232-
if (aRv.Failed()) {
4233-
return nullptr;
4234-
}
4235-
4236-
// Unwrap our actor to a JSProcessActorChild object.
4237-
RefPtr<JSProcessActorChild> actor;
4238-
if (NS_FAILED(UNWRAP_OBJECT(JSProcessActorChild, &obj, actor))) {
4239-
aRv.ThrowTypeMismatchError(
4240-
"Constructed actor does not inherit from JSProcessActorChild");
4241-
return nullptr;
4242-
}
4243-
4244-
MOZ_RELEASE_ASSERT(!actor->Manager(),
4245-
"mManager was already initialized once!");
4246-
actor->Init(aName, this);
4247-
mProcessActors.Put(aName, RefPtr{actor});
4248-
return actor.forget();
4210+
NS_IMETHODIMP ContentChild::GetCanSend(bool* aCanSend) {
4211+
*aCanSend = CanSend();
4212+
return NS_OK;
42494213
}
42504214

4215+
NS_IMETHODIMP_(ContentChild*) ContentChild::AsContentChild() { return this; }
4216+
42514217
IPCResult ContentChild::RecvFlushFOGData(FlushFOGDataResolver&& aResolver) {
42524218
#ifdef MOZ_GLEAN
42534219
glean::FlushFOGData(std::move(aResolver));

dom/ipc/ContentChild.h

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#include "mozilla/ipc/InputStreamUtils.h"
2222
#include "mozilla/ipc/Shmem.h"
2323
#include "nsHashKeys.h"
24-
#include "nsIContentChild.h"
24+
#include "nsIDOMProcessChild.h"
2525
#include "nsIObserver.h"
2626
#include "nsTHashtable.h"
2727
#include "nsStringFwd.h"
@@ -42,7 +42,6 @@ struct LookAndFeelInt;
4242
class nsDocShellLoadState;
4343
class nsFrameLoader;
4444
class nsIOpenWindowInfo;
45-
class JSProcessActorChild;
4645

4746
namespace mozilla {
4847
class RemoteSpellcheckEngineChild;
@@ -74,7 +73,7 @@ class GetFilesHelperChild;
7473
class TabContext;
7574

7675
class ContentChild final : public PContentChild,
77-
public nsIContentChild,
76+
public nsIDOMProcessChild,
7877
public mozilla::ipc::IShmemAllocator,
7978
public mozilla::ipc::ChildToParentStreamActorManager,
8079
public ProcessActor {
@@ -85,7 +84,7 @@ class ContentChild final : public PContentChild,
8584
friend class PContentChild;
8685

8786
public:
88-
NS_DECL_NSICONTENTCHILD
87+
NS_DECL_NSIDOMPROCESSCHILD
8988

9089
ContentChild();
9190
virtual ~ContentChild();
@@ -679,10 +678,6 @@ class ContentChild final : public PContentChild,
679678
PFileDescriptorSetChild* SendPFileDescriptorSetConstructor(
680679
const FileDescriptor& aFD) override;
681680

682-
// Get a JS actor object by name.
683-
already_AddRefed<mozilla::dom::JSProcessActorChild> GetActor(
684-
const nsACString& aName, ErrorResult& aRv);
685-
686681
private:
687682
static void ForceKillTimerCallback(nsITimer* aTimer, void* aClosure);
688683
void StartForceKillTimer();
@@ -782,10 +777,6 @@ class ContentChild final : public PContentChild,
782777
const ClonedMessageData& aData,
783778
const ClonedMessageData& aStack);
784779

785-
void ReceiveRawMessage(const JSActorMessageMeta& aMeta,
786-
ipc::StructuredCloneData&& aData,
787-
ipc::StructuredCloneData&& aStack);
788-
789780
JSActor::Type GetSide() override { return JSActor::Type::Child; }
790781

791782
mozilla::ipc::IPCResult RecvHistoryCommitLength(
@@ -892,7 +883,7 @@ class ContentChild final : public PContentChild,
892883
};
893884

894885
inline nsISupports* ToSupports(mozilla::dom::ContentChild* aContentChild) {
895-
return static_cast<nsIContentChild*>(aContentChild);
886+
return static_cast<nsIDOMProcessChild*>(aContentChild);
896887
}
897888

898889
} // namespace dom

dom/ipc/ContentParent.cpp

Lines changed: 17 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3184,13 +3184,13 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(ContentParent)
31843184

31853185
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ContentParent)
31863186
NS_INTERFACE_MAP_ENTRY_CONCRETE(ContentParent)
3187-
NS_INTERFACE_MAP_ENTRY(nsIContentParent)
3187+
NS_INTERFACE_MAP_ENTRY(nsIDOMProcessParent)
31883188
NS_INTERFACE_MAP_ENTRY(nsIObserver)
31893189
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCallback)
31903190
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionErrorCallback)
31913191
NS_INTERFACE_MAP_ENTRY(nsIAsyncShutdownBlocker)
31923192
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
3193-
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIContentParent)
3193+
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMProcessParent)
31943194
NS_INTERFACE_MAP_END
31953195

31963196
// Async shutdown blocker
@@ -6819,58 +6819,16 @@ NS_IMETHODIMP ContentParent::GetChildID(uint64_t* aOut) {
68196819
IPCResult ContentParent::RecvRawMessage(const JSActorMessageMeta& aMeta,
68206820
const ClonedMessageData& aData,
68216821
const ClonedMessageData& aStack) {
6822-
StructuredCloneData data;
6823-
data.BorrowFromClonedMessageDataForParent(aData);
6824-
StructuredCloneData stack;
6825-
stack.BorrowFromClonedMessageDataForParent(aStack);
6826-
ReceiveRawMessage(aMeta, std::move(data), std::move(stack));
6827-
return IPC_OK();
6828-
}
6829-
6830-
void ContentParent::ReceiveRawMessage(const JSActorMessageMeta& aMeta,
6831-
StructuredCloneData&& aData,
6832-
StructuredCloneData&& aStack) {
6833-
RefPtr<JSProcessActorParent> actor =
6834-
GetActor(aMeta.actorName(), IgnoreErrors());
6835-
if (actor) {
6836-
actor->ReceiveRawMessage(aMeta, std::move(aData), std::move(aStack));
6837-
}
6838-
}
6839-
6840-
already_AddRefed<JSProcessActorParent> ContentParent::GetActor(
6841-
const nsACString& aName, ErrorResult& aRv) {
6842-
if (!CanSend()) {
6843-
aRv.ThrowInvalidStateError(nsPrintfCString(
6844-
"Cannot get actor '%s': content parent is ready to communicate.",
6845-
PromiseFlatCString(aName).get()));
6846-
return nullptr;
6847-
}
6848-
6849-
// Check if this actor has already been created, and return it if it has.
6850-
if (mProcessActors.Contains(aName)) {
6851-
return do_AddRef(mProcessActors.GetWeak(aName));
6852-
}
6853-
6854-
// Otherwise, we want to create a new instance of this actor.
6855-
JS::RootedObject obj(RootingCx());
6856-
ConstructActor(aName, &obj, aRv);
6857-
if (aRv.Failed()) {
6858-
return nullptr;
6859-
}
6860-
6861-
// Unwrap our actor to a JSProcessActorParent object.
68626822
RefPtr<JSProcessActorParent> actor;
6863-
if (NS_FAILED(UNWRAP_OBJECT(JSProcessActorParent, &obj, actor))) {
6864-
aRv.ThrowTypeMismatchError(
6865-
"Constructed actor does not inherit from JSProcessActorParent");
6866-
return nullptr;
6823+
GetActor(aMeta.actorName(), getter_AddRefs(actor));
6824+
if (actor) {
6825+
StructuredCloneData data;
6826+
data.BorrowFromClonedMessageDataForParent(aData);
6827+
StructuredCloneData stack;
6828+
stack.BorrowFromClonedMessageDataForParent(aStack);
6829+
actor->ReceiveRawMessage(aMeta, std::move(data), std::move(stack));
68676830
}
6868-
6869-
MOZ_RELEASE_ASSERT(!actor->Manager(),
6870-
"mManager was already initialized once!");
6871-
actor->Init(aName, this);
6872-
mProcessActors.Put(aName, RefPtr{actor});
6873-
return actor.forget();
6831+
return IPC_OK();
68746832
}
68756833

68766834
NS_IMETHODIMP ContentParent::GetActor(const nsACString& aName,
@@ -6916,6 +6874,13 @@ IPCResult ContentParent::RecvFOGData(ByteBuf&& buf) {
69166874
return IPC_OK();
69176875
}
69186876

6877+
NS_IMETHODIMP ContentParent::GetCanSend(bool* aCanSend) {
6878+
*aCanSend = CanSend();
6879+
return NS_OK;
6880+
}
6881+
6882+
NS_IMETHODIMP_(ContentParent*) ContentParent::AsContentParent() { return this; }
6883+
69196884
} // namespace dom
69206885
} // namespace mozilla
69216886

0 commit comments

Comments
 (0)