1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
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 "xpcprivate.h"
8 #include "xpc_make_class.h"
10 #include "nsContentUtils.h"
11 #include "BackstagePass.h"
12 #include "mozilla/Result.h"
13 #include "mozilla/dom/BindingUtils.h"
14 #include "mozilla/dom/WebIDLGlobalNameHash.h"
15 #include "mozilla/dom/IndexedDatabaseManager.h"
16 #include "mozilla/ipc/BackgroundUtils.h"
17 #include "mozilla/ipc/PBackgroundSharedTypes.h"
19 using namespace mozilla::dom
;
21 NS_IMPL_ISUPPORTS(BackstagePass
, nsIXPCScriptable
, nsIGlobalObject
,
22 nsIClassInfo
, nsIScriptObjectPrincipal
,
23 nsISupportsWeakReference
)
25 BackstagePass::BackstagePass()
26 : mPrincipal(nsContentUtils::GetSystemPrincipal()), mWrapper(nullptr) {}
28 // XXX(nika): It appears we don't have support for mayresolve hooks in
29 // nsIXPCScriptable, and I don't really want to add it because I'd rather just
30 // kill nsIXPCScriptable alltogether, so we don't use it here.
32 // The nsIXPCScriptable map declaration that will generate stubs for us...
33 #define XPC_MAP_CLASSNAME BackstagePass
34 #define XPC_MAP_QUOTED_CLASSNAME "BackstagePass"
35 #define XPC_MAP_FLAGS \
36 (XPC_SCRIPTABLE_WANT_RESOLVE | XPC_SCRIPTABLE_WANT_NEWENUMERATE | \
37 XPC_SCRIPTABLE_WANT_FINALIZE | XPC_SCRIPTABLE_WANT_PRECREATE | \
38 XPC_SCRIPTABLE_USE_JSSTUB_FOR_ADDPROPERTY | \
39 XPC_SCRIPTABLE_USE_JSSTUB_FOR_DELPROPERTY | \
40 XPC_SCRIPTABLE_DONT_ENUM_QUERY_INTERFACE | \
41 XPC_SCRIPTABLE_IS_GLOBAL_OBJECT | \
42 XPC_SCRIPTABLE_DONT_REFLECT_INTERFACE_NAMES)
43 #include "xpc_map_end.h" /* This will #undef the above */
45 JSObject
* BackstagePass::GetGlobalJSObject() {
47 return mWrapper
->GetFlatJSObject();
52 JSObject
* BackstagePass::GetGlobalJSObjectPreserveColor() const {
54 return mWrapper
->GetFlatJSObjectPreserveColor();
59 void BackstagePass::SetGlobalObject(JSObject
* global
) {
60 nsISupports
* p
= XPCWrappedNative::Get(global
);
62 mWrapper
= static_cast<XPCWrappedNative
*>(p
);
66 BackstagePass::Resolve(nsIXPConnectWrappedNative
* wrapper
, JSContext
* cx
,
67 JSObject
* objArg
, jsid idArg
, bool* resolvedp
,
69 JS::RootedObject
obj(cx
, objArg
);
70 JS::RootedId
id(cx
, idArg
);
72 WebIDLGlobalNameHash::ResolveForSystemGlobal(cx
, obj
, id
, resolvedp
);
74 return NS_ERROR_FAILURE
;
81 XPCJSContext
* xpccx
= XPCJSContext::Get();
82 if (id
== xpccx
->GetStringID(XPCJSContext::IDX_FETCH
)) {
83 *_retval
= xpc::SandboxCreateFetch(cx
, obj
);
85 return NS_ERROR_FAILURE
;
88 } else if (id
== xpccx
->GetStringID(XPCJSContext::IDX_CRYPTO
)) {
89 *_retval
= xpc::SandboxCreateCrypto(cx
, obj
);
91 return NS_ERROR_FAILURE
;
94 } else if (id
== xpccx
->GetStringID(XPCJSContext::IDX_INDEXEDDB
)) {
95 *_retval
= IndexedDatabaseManager::DefineIndexedDB(cx
, obj
);
97 return NS_ERROR_FAILURE
;
100 } else if (id
== xpccx
->GetStringID(XPCJSContext::IDX_STRUCTUREDCLONE
)) {
101 *_retval
= xpc::SandboxCreateStructuredClone(cx
, obj
);
103 return NS_ERROR_FAILURE
;
112 BackstagePass::NewEnumerate(nsIXPConnectWrappedNative
* wrapper
, JSContext
* cx
,
114 JS::MutableHandleIdVector properties
,
115 bool enumerableOnly
, bool* _retval
) {
116 JS::RootedObject
obj(cx
, objArg
);
118 XPCJSContext
* xpccx
= XPCJSContext::Get();
119 if (!properties
.append(xpccx
->GetStringID(XPCJSContext::IDX_FETCH
)) ||
120 !properties
.append(xpccx
->GetStringID(XPCJSContext::IDX_CRYPTO
)) ||
121 !properties
.append(xpccx
->GetStringID(XPCJSContext::IDX_INDEXEDDB
)) ||
123 xpccx
->GetStringID(XPCJSContext::IDX_STRUCTUREDCLONE
))) {
124 return NS_ERROR_FAILURE
;
127 *_retval
= WebIDLGlobalNameHash::NewEnumerateSystemGlobal(cx
, obj
, properties
,
129 return *_retval
? NS_OK
: NS_ERROR_FAILURE
;
132 /***************************************************************************/
134 BackstagePass::GetInterfaces(nsTArray
<nsIID
>& aArray
) {
135 aArray
= nsTArray
<nsIID
>{NS_GET_IID(nsIXPCScriptable
),
136 NS_GET_IID(nsIScriptObjectPrincipal
)};
141 BackstagePass::GetScriptableHelper(nsIXPCScriptable
** retval
) {
142 nsCOMPtr
<nsIXPCScriptable
> scriptable
= this;
143 scriptable
.forget(retval
);
148 BackstagePass::GetContractID(nsACString
& aContractID
) {
149 aContractID
.SetIsVoid(true);
150 return NS_ERROR_NOT_AVAILABLE
;
154 BackstagePass::GetClassDescription(nsACString
& aClassDescription
) {
155 aClassDescription
.AssignLiteral("BackstagePass");
160 BackstagePass::GetClassID(nsCID
** aClassID
) {
166 BackstagePass::GetFlags(uint32_t* aFlags
) {
172 BackstagePass::GetClassIDNoAlloc(nsCID
* aClassIDNoAlloc
) {
173 return NS_ERROR_NOT_AVAILABLE
;
177 BackstagePass::Finalize(nsIXPConnectWrappedNative
* wrapper
, JS::GCContext
* gcx
,
179 nsCOMPtr
<nsIGlobalObject
> bsp(do_QueryInterface(wrapper
->Native()));
181 static_cast<BackstagePass
*>(bsp
.get())->ForgetGlobalObject();
186 BackstagePass::PreCreate(nsISupports
* nativeObj
, JSContext
* cx
,
187 JSObject
* globalObj
, JSObject
** parentObj
) {
188 // We do the same trick here as for WindowSH. Return the js global
189 // as parent, so XPConenct can find the right scope and the wrapper
190 // that already exists.
191 nsCOMPtr
<nsIGlobalObject
> global(do_QueryInterface(nativeObj
));
192 MOZ_ASSERT(global
, "nativeObj not a global object!");
194 JSObject
* jsglobal
= global
->GetGlobalJSObject();
196 *parentObj
= jsglobal
;
201 mozilla::Result
<mozilla::ipc::PrincipalInfo
, nsresult
>
202 BackstagePass::GetStorageKey() {
203 MOZ_ASSERT(NS_IsMainThread());
205 mozilla::ipc::PrincipalInfo principalInfo
;
206 nsresult rv
= PrincipalToPrincipalInfo(mPrincipal
, &principalInfo
);
208 return mozilla::Err(rv
);
211 MOZ_ASSERT(principalInfo
.type() ==
212 mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo
);
214 return std::move(principalInfo
);