Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* vim: set ts=8 sts=4 et sw=4 tw=99: */
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 "xpcprivate.h"
8 :
9 : #include "nsContentUtils.h"
10 : #include "BackstagePass.h"
11 : #include "nsDOMClassInfo.h"
12 : #include "nsIPrincipal.h"
13 : #include "mozilla/dom/BindingUtils.h"
14 :
15 46201 : NS_INTERFACE_MAP_BEGIN(BackstagePass)
16 46201 : NS_INTERFACE_MAP_ENTRY(nsIGlobalObject)
17 37108 : NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
18 4951 : NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
19 1803 : NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal)
20 1803 : NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
21 1803 : NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCScriptable)
22 1290 : NS_INTERFACE_MAP_END
23 :
24 82276 : NS_IMPL_ADDREF(BackstagePass)
25 80949 : NS_IMPL_RELEASE(BackstagePass)
26 :
27 : // The nsIXPCScriptable map declaration that will generate stubs for us...
28 : #define XPC_MAP_CLASSNAME BackstagePass
29 : #define XPC_MAP_QUOTED_CLASSNAME "BackstagePass"
30 : #define XPC_MAP_FLAGS (XPC_SCRIPTABLE_WANT_RESOLVE | \
31 : XPC_SCRIPTABLE_WANT_ENUMERATE | \
32 : XPC_SCRIPTABLE_WANT_FINALIZE | \
33 : XPC_SCRIPTABLE_WANT_PRECREATE | \
34 : XPC_SCRIPTABLE_USE_JSSTUB_FOR_ADDPROPERTY | \
35 : XPC_SCRIPTABLE_USE_JSSTUB_FOR_DELPROPERTY | \
36 : XPC_SCRIPTABLE_USE_JSSTUB_FOR_SETPROPERTY | \
37 : XPC_SCRIPTABLE_DONT_ENUM_QUERY_INTERFACE | \
38 : XPC_SCRIPTABLE_IS_GLOBAL_OBJECT | \
39 : XPC_SCRIPTABLE_DONT_REFLECT_INTERFACE_NAMES)
40 : #include "xpc_map_end.h" /* This will #undef the above */
41 :
42 :
43 : JSObject*
44 19179 : BackstagePass::GetGlobalJSObject()
45 : {
46 19179 : if (mWrapper)
47 19179 : return mWrapper->GetFlatJSObject();
48 0 : return nullptr;
49 : }
50 :
51 : void
52 255 : BackstagePass::SetGlobalObject(JSObject* global)
53 : {
54 255 : nsISupports* p = XPCWrappedNative::Get(global);
55 255 : MOZ_ASSERT(p);
56 255 : mWrapper = static_cast<XPCWrappedNative*>(p);
57 255 : }
58 :
59 : NS_IMETHODIMP
60 13610 : BackstagePass::Resolve(nsIXPConnectWrappedNative* wrapper,
61 : JSContext * cx, JSObject * objArg,
62 : jsid idArg, bool* resolvedp,
63 : bool* _retval)
64 : {
65 27220 : JS::RootedObject obj(cx, objArg);
66 27220 : JS::RootedId id(cx, idArg);
67 13610 : *_retval = mozilla::dom::SystemGlobalResolve(cx, obj, id, resolvedp);
68 27220 : return *_retval ? NS_OK : NS_ERROR_FAILURE;
69 : }
70 :
71 : NS_IMETHODIMP
72 0 : BackstagePass::Enumerate(nsIXPConnectWrappedNative* wrapper, JSContext* cx,
73 : JSObject* objArg, bool* _retval)
74 : {
75 0 : JS::RootedObject obj(cx, objArg);
76 0 : *_retval = mozilla::dom::SystemGlobalEnumerate(cx, obj);
77 0 : return *_retval ? NS_OK : NS_ERROR_FAILURE;
78 : }
79 :
80 : /***************************************************************************/
81 : NS_IMETHODIMP
82 255 : BackstagePass::GetInterfaces(uint32_t* aCount, nsIID * **aArray)
83 : {
84 255 : const uint32_t count = 2;
85 255 : *aCount = count;
86 : nsIID** array;
87 255 : *aArray = array = static_cast<nsIID**>(moz_xmalloc(count * sizeof(nsIID*)));
88 255 : if (!array)
89 0 : return NS_ERROR_OUT_OF_MEMORY;
90 :
91 255 : uint32_t index = 0;
92 : nsIID* clone;
93 : #define PUSH_IID(id) \
94 : clone = static_cast<nsIID*>(nsMemory::Clone(&NS_GET_IID( id ), \
95 : sizeof(nsIID))); \
96 : if (!clone) \
97 : goto oom; \
98 : array[index++] = clone;
99 :
100 255 : PUSH_IID(nsIXPCScriptable)
101 255 : PUSH_IID(nsIScriptObjectPrincipal)
102 : #undef PUSH_IID
103 :
104 255 : return NS_OK;
105 : oom:
106 0 : while (index)
107 0 : free(array[--index]);
108 0 : free(array);
109 0 : *aArray = nullptr;
110 0 : return NS_ERROR_OUT_OF_MEMORY;
111 : }
112 :
113 : NS_IMETHODIMP
114 255 : BackstagePass::GetScriptableHelper(nsIXPCScriptable** retval)
115 : {
116 510 : nsCOMPtr<nsIXPCScriptable> scriptable = this;
117 255 : scriptable.forget(retval);
118 510 : return NS_OK;
119 : }
120 :
121 : NS_IMETHODIMP
122 0 : BackstagePass::GetContractID(char * *aContractID)
123 : {
124 0 : *aContractID = nullptr;
125 0 : return NS_ERROR_NOT_AVAILABLE;
126 : }
127 :
128 : NS_IMETHODIMP
129 0 : BackstagePass::GetClassDescription(char * *aClassDescription)
130 : {
131 : static const char classDescription[] = "BackstagePass";
132 0 : *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
133 0 : return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
134 : }
135 :
136 : NS_IMETHODIMP
137 0 : BackstagePass::GetClassID(nsCID * *aClassID)
138 : {
139 0 : *aClassID = nullptr;
140 0 : return NS_OK;
141 : }
142 :
143 : NS_IMETHODIMP
144 2893 : BackstagePass::GetFlags(uint32_t* aFlags)
145 : {
146 2893 : *aFlags = nsIClassInfo::MAIN_THREAD_ONLY;
147 2893 : return NS_OK;
148 : }
149 :
150 : NS_IMETHODIMP
151 0 : BackstagePass::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
152 : {
153 0 : return NS_ERROR_NOT_AVAILABLE;
154 : }
155 :
156 : NS_IMETHODIMP
157 0 : BackstagePass::Finalize(nsIXPConnectWrappedNative* wrapper, JSFreeOp * fop, JSObject * obj)
158 : {
159 0 : nsCOMPtr<nsIGlobalObject> bsp(do_QueryWrappedNative(wrapper));
160 0 : MOZ_ASSERT(bsp);
161 0 : static_cast<BackstagePass*>(bsp.get())->ForgetGlobalObject();
162 0 : return NS_OK;
163 : }
164 :
165 : NS_IMETHODIMP
166 0 : BackstagePass::PreCreate(nsISupports* nativeObj, JSContext* cx,
167 : JSObject* globalObj, JSObject** parentObj)
168 : {
169 : // We do the same trick here as for WindowSH. Return the js global
170 : // as parent, so XPConenct can find the right scope and the wrapper
171 : // that already exists.
172 0 : nsCOMPtr<nsIGlobalObject> global(do_QueryInterface(nativeObj));
173 0 : MOZ_ASSERT(global, "nativeObj not a global object!");
174 :
175 0 : JSObject* jsglobal = global->GetGlobalJSObject();
176 0 : if (jsglobal)
177 0 : *parentObj = jsglobal;
178 0 : return NS_OK;
179 : }
180 :
181 : nsresult
182 255 : NS_NewBackstagePass(BackstagePass** ret)
183 : {
184 : RefPtr<BackstagePass> bsp = new BackstagePass(
185 765 : nsContentUtils::GetSystemPrincipal());
186 255 : bsp.forget(ret);
187 510 : return NS_OK;
188 9 : }
|