JSWindowActorChild.cpp (4489B)
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/. */ 6 7 #include "mozilla/dom/JSWindowActorChild.h" 8 9 #include "JSIPCValueUtils.h" 10 #include "mozilla/dom/BrowsingContext.h" 11 #include "mozilla/dom/ContentChild.h" 12 #include "mozilla/dom/JSIPCValue.h" 13 #include "mozilla/dom/JSIPCValueUtils.h" 14 #include "mozilla/dom/JSWindowActorBinding.h" 15 #include "mozilla/dom/MessageManagerBinding.h" 16 #include "mozilla/dom/WindowGlobalChild.h" 17 #include "mozilla/dom/WindowGlobalParent.h" 18 #include "mozilla/dom/WindowProxyHolder.h" 19 #include "nsGlobalWindowInner.h" 20 21 namespace mozilla::dom { 22 23 JSWindowActorChild::~JSWindowActorChild() { MOZ_ASSERT(!mManager); } 24 25 JSObject* JSWindowActorChild::WrapObject(JSContext* aCx, 26 JS::Handle<JSObject*> aGivenProto) { 27 return JSWindowActorChild_Binding::Wrap(aCx, this, aGivenProto); 28 } 29 30 WindowGlobalChild* JSWindowActorChild::GetManager() const { return mManager; } 31 32 WindowContext* JSWindowActorChild::GetWindowContext() const { 33 return mManager ? mManager->WindowContext() : nullptr; 34 } 35 36 void JSWindowActorChild::Init(const nsACString& aName, 37 WindowGlobalChild* aManager) { 38 MOZ_ASSERT(!mManager, "Cannot Init() a JSWindowActorChild twice!"); 39 mManager = aManager; 40 bool sendTyped = !mManager->IsInProcess() && JSActorSupportsTypedSend(aName); 41 JSActor::Init(aName, sendTyped); 42 } 43 44 void JSWindowActorChild::SendRawMessage( 45 const JSActorMessageMeta& aMeta, JSIPCValue&& aData, 46 UniquePtr<ipc::StructuredCloneData> aStack, ErrorResult& aRv) { 47 if (!CanSend() || !mManager || !mManager->CanSend()) { 48 aRv.ThrowInvalidStateError("JSWindowActorChild cannot send at the moment"); 49 return; 50 } 51 52 if (mManager->IsInProcess()) { 53 SendRawMessageInProcess( 54 aMeta, std::move(aData), std::move(aStack), 55 [manager{mManager}]() { return manager->GetParentActor(); }); 56 return; 57 } 58 59 // Cross-process case - send data over WindowGlobalChild to other side. 60 JSIPCValueUtils::SCDHolder holder; 61 if (!JSIPCValueUtils::PrepareForSending(holder, aData)) { 62 aRv.ThrowDataCloneError( 63 nsPrintfCString("JSWindowActorChild serialization error: cannot " 64 "clone, in actor '%s'", 65 PromiseFlatCString(aMeta.actorName()).get())); 66 return; 67 } 68 69 UniquePtr<ClonedMessageData> stackData; 70 if (aStack) { 71 stackData = MakeUnique<ClonedMessageData>(); 72 if (!aStack->BuildClonedMessageData(*stackData)) { 73 stackData.reset(); 74 } 75 } 76 77 if (!mManager->SendRawMessage(aMeta, aData, stackData)) { 78 aRv.ThrowOperationError( 79 nsPrintfCString("JSWindowActorChild send error in actor '%s'", 80 PromiseFlatCString(aMeta.actorName()).get())); 81 return; 82 } 83 } 84 85 Document* JSWindowActorChild::GetDocument(ErrorResult& aRv) { 86 if (!mManager) { 87 ThrowStateErrorForGetter("document", aRv); 88 return nullptr; 89 } 90 91 nsGlobalWindowInner* window = mManager->GetWindowGlobal(); 92 return window ? window->GetDocument() : nullptr; 93 } 94 95 BrowsingContext* JSWindowActorChild::GetBrowsingContext(ErrorResult& aRv) { 96 if (!mManager) { 97 ThrowStateErrorForGetter("browsingContext", aRv); 98 return nullptr; 99 } 100 101 return mManager->BrowsingContext(); 102 } 103 104 nsIDocShell* JSWindowActorChild::GetDocShell(ErrorResult& aRv) { 105 if (!mManager) { 106 ThrowStateErrorForGetter("docShell", aRv); 107 return nullptr; 108 } 109 110 return mManager->BrowsingContext()->GetDocShell(); 111 } 112 113 Nullable<WindowProxyHolder> JSWindowActorChild::GetContentWindow( 114 ErrorResult& aRv) { 115 if (!mManager) { 116 ThrowStateErrorForGetter("contentWindow", aRv); 117 return nullptr; 118 } 119 120 if (nsGlobalWindowInner* window = mManager->GetWindowGlobal()) { 121 if (window->IsCurrentInnerWindow()) { 122 return WindowProxyHolder(window->GetBrowsingContext()); 123 } 124 } 125 126 return nullptr; 127 } 128 129 void JSWindowActorChild::ClearManager() { mManager = nullptr; } 130 131 NS_IMPL_CYCLE_COLLECTION_INHERITED(JSWindowActorChild, JSActor, mManager) 132 133 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(JSWindowActorChild) 134 NS_INTERFACE_MAP_END_INHERITING(JSActor) 135 136 NS_IMPL_ADDREF_INHERITED(JSWindowActorChild, JSActor) 137 NS_IMPL_RELEASE_INHERITED(JSWindowActorChild, JSActor) 138 139 } // namespace mozilla::dom