1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/xpconnect/src/XPCRuntimeService.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,205 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* vim: set ts=8 sts=4 et sw=4 tw=99: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "nsContentUtils.h" 1.11 +#include "BackstagePass.h" 1.12 +#include "nsIProgrammingLanguage.h" 1.13 +#include "nsDOMClassInfo.h" 1.14 +#include "nsIPrincipal.h" 1.15 + 1.16 +#include "mozilla/dom/workers/Workers.h" 1.17 + 1.18 +using mozilla::dom::workers::ResolveWorkerClasses; 1.19 + 1.20 +NS_INTERFACE_MAP_BEGIN(BackstagePass) 1.21 + NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) 1.22 + NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable) 1.23 + NS_INTERFACE_MAP_ENTRY(nsIClassInfo) 1.24 + NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal) 1.25 + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) 1.26 + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCScriptable) 1.27 +NS_INTERFACE_MAP_END 1.28 + 1.29 +NS_IMPL_ADDREF(BackstagePass) 1.30 +NS_IMPL_RELEASE(BackstagePass) 1.31 + 1.32 +// The nsIXPCScriptable map declaration that will generate stubs for us... 1.33 +#define XPC_MAP_CLASSNAME BackstagePass 1.34 +#define XPC_MAP_QUOTED_CLASSNAME "BackstagePass" 1.35 +#define XPC_MAP_WANT_NEWRESOLVE 1.36 +#define XPC_MAP_WANT_FINALIZE 1.37 +#define XPC_MAP_WANT_PRECREATE 1.38 + 1.39 +#define XPC_MAP_FLAGS nsIXPCScriptable::USE_JSSTUB_FOR_ADDPROPERTY | \ 1.40 + nsIXPCScriptable::USE_JSSTUB_FOR_DELPROPERTY | \ 1.41 + nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY | \ 1.42 + nsIXPCScriptable::DONT_ENUM_STATIC_PROPS | \ 1.43 + nsIXPCScriptable::DONT_ENUM_QUERY_INTERFACE | \ 1.44 + nsIXPCScriptable::IS_GLOBAL_OBJECT | \ 1.45 + nsIXPCScriptable::DONT_REFLECT_INTERFACE_NAMES 1.46 +#include "xpc_map_end.h" /* This will #undef the above */ 1.47 + 1.48 +/* bool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsval id, out JSObjectPtr objp); */ 1.49 +NS_IMETHODIMP 1.50 +BackstagePass::NewResolve(nsIXPConnectWrappedNative *wrapper, 1.51 + JSContext * cx, JSObject * objArg, 1.52 + jsid idArg, JSObject * *objpArg, 1.53 + bool *_retval) 1.54 +{ 1.55 + JS::RootedObject obj(cx, objArg); 1.56 + JS::RootedId id(cx, idArg); 1.57 + 1.58 + bool resolved; 1.59 + *objpArg = nullptr; 1.60 + 1.61 + *_retval = !!JS_ResolveStandardClass(cx, obj, id, &resolved); 1.62 + NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE); 1.63 + 1.64 + if (resolved) { 1.65 + *objpArg = obj; 1.66 + return NS_OK; 1.67 + } 1.68 + 1.69 + JS::RootedObject objp(cx, *objpArg); 1.70 + 1.71 + *_retval = ResolveWorkerClasses(cx, obj, id, &objp); 1.72 + NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE); 1.73 + 1.74 + if (objp) { 1.75 + *objpArg = objp; 1.76 + return NS_OK; 1.77 + } 1.78 + 1.79 + return NS_OK; 1.80 +} 1.81 + 1.82 +/***************************************************************************/ 1.83 +/* void getInterfaces (out uint32_t count, [array, size_is (count), retval] 1.84 + out nsIIDPtr array); */ 1.85 +NS_IMETHODIMP 1.86 +BackstagePass::GetInterfaces(uint32_t *aCount, nsIID * **aArray) 1.87 +{ 1.88 + const uint32_t count = 2; 1.89 + *aCount = count; 1.90 + nsIID **array; 1.91 + *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*))); 1.92 + if (!array) 1.93 + return NS_ERROR_OUT_OF_MEMORY; 1.94 + 1.95 + uint32_t index = 0; 1.96 + nsIID* clone; 1.97 +#define PUSH_IID(id) \ 1.98 + clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \ 1.99 + sizeof(nsIID))); \ 1.100 + if (!clone) \ 1.101 + goto oom; \ 1.102 + array[index++] = clone; 1.103 + 1.104 + PUSH_IID(nsIXPCScriptable) 1.105 + PUSH_IID(nsIScriptObjectPrincipal) 1.106 +#undef PUSH_IID 1.107 + 1.108 + return NS_OK; 1.109 +oom: 1.110 + while (index) 1.111 + nsMemory::Free(array[--index]); 1.112 + nsMemory::Free(array); 1.113 + *aArray = nullptr; 1.114 + return NS_ERROR_OUT_OF_MEMORY; 1.115 +} 1.116 + 1.117 +/* nsISupports getHelperForLanguage (in uint32_t language); */ 1.118 +NS_IMETHODIMP 1.119 +BackstagePass::GetHelperForLanguage(uint32_t language, 1.120 + nsISupports **retval) 1.121 +{ 1.122 + nsCOMPtr<nsISupports> supports = 1.123 + do_QueryInterface(static_cast<nsIGlobalObject *>(this)); 1.124 + supports.forget(retval); 1.125 + return NS_OK; 1.126 +} 1.127 + 1.128 +/* readonly attribute string contractID; */ 1.129 +NS_IMETHODIMP 1.130 +BackstagePass::GetContractID(char * *aContractID) 1.131 +{ 1.132 + *aContractID = nullptr; 1.133 + return NS_ERROR_NOT_AVAILABLE; 1.134 +} 1.135 + 1.136 +/* readonly attribute string classDescription; */ 1.137 +NS_IMETHODIMP 1.138 +BackstagePass::GetClassDescription(char * *aClassDescription) 1.139 +{ 1.140 + static const char classDescription[] = "BackstagePass"; 1.141 + *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription)); 1.142 + return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY; 1.143 +} 1.144 + 1.145 +/* readonly attribute nsCIDPtr classID; */ 1.146 +NS_IMETHODIMP 1.147 +BackstagePass::GetClassID(nsCID * *aClassID) 1.148 +{ 1.149 + *aClassID = nullptr; 1.150 + return NS_OK; 1.151 +} 1.152 + 1.153 +/* readonly attribute uint32_t implementationLanguage; */ 1.154 +NS_IMETHODIMP 1.155 +BackstagePass::GetImplementationLanguage(uint32_t *aImplementationLanguage) 1.156 +{ 1.157 + *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; 1.158 + return NS_OK; 1.159 +} 1.160 + 1.161 +/* readonly attribute uint32_t flags; */ 1.162 +NS_IMETHODIMP 1.163 +BackstagePass::GetFlags(uint32_t *aFlags) 1.164 +{ 1.165 + *aFlags = nsIClassInfo::MAIN_THREAD_ONLY; 1.166 + return NS_OK; 1.167 +} 1.168 + 1.169 +/* [notxpcom] readonly attribute nsCID classIDNoAlloc; */ 1.170 +NS_IMETHODIMP 1.171 +BackstagePass::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) 1.172 +{ 1.173 + return NS_ERROR_NOT_AVAILABLE; 1.174 +} 1.175 + 1.176 +NS_IMETHODIMP 1.177 +BackstagePass::Finalize(nsIXPConnectWrappedNative *wrapper, JSFreeOp * fop, JSObject * obj) 1.178 +{ 1.179 + nsCOMPtr<nsIGlobalObject> bsp(do_QueryWrappedNative(wrapper)); 1.180 + MOZ_ASSERT(bsp); 1.181 + static_cast<BackstagePass*>(bsp.get())->ForgetGlobalObject(); 1.182 + return NS_OK; 1.183 +} 1.184 + 1.185 +NS_IMETHODIMP 1.186 +BackstagePass::PreCreate(nsISupports *nativeObj, JSContext *cx, 1.187 + JSObject *globalObj, JSObject **parentObj) 1.188 +{ 1.189 + // We do the same trick here as for WindowSH. Return the js global 1.190 + // as parent, so XPConenct can find the right scope and the wrapper 1.191 + // that already exists. 1.192 + nsCOMPtr<nsIGlobalObject> global(do_QueryInterface(nativeObj)); 1.193 + MOZ_ASSERT(global, "nativeObj not a global object!"); 1.194 + 1.195 + JSObject *jsglobal = global->GetGlobalJSObject(); 1.196 + if (jsglobal) 1.197 + *parentObj = jsglobal; 1.198 + return NS_OK; 1.199 +} 1.200 + 1.201 +nsresult 1.202 +NS_NewBackstagePass(BackstagePass** ret) 1.203 +{ 1.204 + nsRefPtr<BackstagePass> bsp = new BackstagePass( 1.205 + nsContentUtils::GetSystemPrincipal()); 1.206 + bsp.forget(ret); 1.207 + return NS_OK; 1.208 +}