Bug 1842773 - Part 19: Add guard instruction for fixed-length typed arrays. r=sfink...
[gecko.git] / js / xpconnect / src / XPCRuntimeService.cpp
blob2c283ea2bce988267390d8a104ce5bc6c90cf16b
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() {
46 if (mWrapper) {
47 return mWrapper->GetFlatJSObject();
49 return nullptr;
52 JSObject* BackstagePass::GetGlobalJSObjectPreserveColor() const {
53 if (mWrapper) {
54 return mWrapper->GetFlatJSObjectPreserveColor();
56 return nullptr;
59 void BackstagePass::SetGlobalObject(JSObject* global) {
60 nsISupports* p = XPCWrappedNative::Get(global);
61 MOZ_ASSERT(p);
62 mWrapper = static_cast<XPCWrappedNative*>(p);
65 NS_IMETHODIMP
66 BackstagePass::Resolve(nsIXPConnectWrappedNative* wrapper, JSContext* cx,
67 JSObject* objArg, jsid idArg, bool* resolvedp,
68 bool* _retval) {
69 JS::RootedObject obj(cx, objArg);
70 JS::RootedId id(cx, idArg);
71 *_retval =
72 WebIDLGlobalNameHash::ResolveForSystemGlobal(cx, obj, id, resolvedp);
73 if (!*_retval) {
74 return NS_ERROR_FAILURE;
77 if (*resolvedp) {
78 return NS_OK;
81 XPCJSContext* xpccx = XPCJSContext::Get();
82 if (id == xpccx->GetStringID(XPCJSContext::IDX_FETCH)) {
83 *_retval = xpc::SandboxCreateFetch(cx, obj);
84 if (!*_retval) {
85 return NS_ERROR_FAILURE;
87 *resolvedp = true;
88 } else if (id == xpccx->GetStringID(XPCJSContext::IDX_CRYPTO)) {
89 *_retval = xpc::SandboxCreateCrypto(cx, obj);
90 if (!*_retval) {
91 return NS_ERROR_FAILURE;
93 *resolvedp = true;
94 } else if (id == xpccx->GetStringID(XPCJSContext::IDX_INDEXEDDB)) {
95 *_retval = IndexedDatabaseManager::DefineIndexedDB(cx, obj);
96 if (!*_retval) {
97 return NS_ERROR_FAILURE;
99 *resolvedp = true;
100 } else if (id == xpccx->GetStringID(XPCJSContext::IDX_STRUCTUREDCLONE)) {
101 *_retval = xpc::SandboxCreateStructuredClone(cx, obj);
102 if (!*_retval) {
103 return NS_ERROR_FAILURE;
105 *resolvedp = true;
108 return NS_OK;
111 NS_IMETHODIMP
112 BackstagePass::NewEnumerate(nsIXPConnectWrappedNative* wrapper, JSContext* cx,
113 JSObject* objArg,
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)) ||
122 !properties.append(
123 xpccx->GetStringID(XPCJSContext::IDX_STRUCTUREDCLONE))) {
124 return NS_ERROR_FAILURE;
127 *_retval = WebIDLGlobalNameHash::NewEnumerateSystemGlobal(cx, obj, properties,
128 enumerableOnly);
129 return *_retval ? NS_OK : NS_ERROR_FAILURE;
132 /***************************************************************************/
133 NS_IMETHODIMP
134 BackstagePass::GetInterfaces(nsTArray<nsIID>& aArray) {
135 aArray = nsTArray<nsIID>{NS_GET_IID(nsIXPCScriptable),
136 NS_GET_IID(nsIScriptObjectPrincipal)};
137 return NS_OK;
140 NS_IMETHODIMP
141 BackstagePass::GetScriptableHelper(nsIXPCScriptable** retval) {
142 nsCOMPtr<nsIXPCScriptable> scriptable = this;
143 scriptable.forget(retval);
144 return NS_OK;
147 NS_IMETHODIMP
148 BackstagePass::GetContractID(nsACString& aContractID) {
149 aContractID.SetIsVoid(true);
150 return NS_ERROR_NOT_AVAILABLE;
153 NS_IMETHODIMP
154 BackstagePass::GetClassDescription(nsACString& aClassDescription) {
155 aClassDescription.AssignLiteral("BackstagePass");
156 return NS_OK;
159 NS_IMETHODIMP
160 BackstagePass::GetClassID(nsCID** aClassID) {
161 *aClassID = nullptr;
162 return NS_OK;
165 NS_IMETHODIMP
166 BackstagePass::GetFlags(uint32_t* aFlags) {
167 *aFlags = 0;
168 return NS_OK;
171 NS_IMETHODIMP
172 BackstagePass::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc) {
173 return NS_ERROR_NOT_AVAILABLE;
176 NS_IMETHODIMP
177 BackstagePass::Finalize(nsIXPConnectWrappedNative* wrapper, JS::GCContext* gcx,
178 JSObject* obj) {
179 nsCOMPtr<nsIGlobalObject> bsp(do_QueryInterface(wrapper->Native()));
180 MOZ_ASSERT(bsp);
181 static_cast<BackstagePass*>(bsp.get())->ForgetGlobalObject();
182 return NS_OK;
185 NS_IMETHODIMP
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();
195 if (jsglobal) {
196 *parentObj = jsglobal;
198 return NS_OK;
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);
207 if (NS_FAILED(rv)) {
208 return mozilla::Err(rv);
211 MOZ_ASSERT(principalInfo.type() ==
212 mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo);
214 return std::move(principalInfo);