Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
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/. */
7 #include "nsContentUtils.h"
8 #include "BackstagePass.h"
9 #include "nsIProgrammingLanguage.h"
10 #include "nsDOMClassInfo.h"
11 #include "nsIPrincipal.h"
13 #include "mozilla/dom/workers/Workers.h"
15 using mozilla::dom::workers::ResolveWorkerClasses;
17 NS_INTERFACE_MAP_BEGIN(BackstagePass)
18 NS_INTERFACE_MAP_ENTRY(nsIGlobalObject)
19 NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
20 NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
21 NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal)
22 NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
23 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCScriptable)
24 NS_INTERFACE_MAP_END
26 NS_IMPL_ADDREF(BackstagePass)
27 NS_IMPL_RELEASE(BackstagePass)
29 // The nsIXPCScriptable map declaration that will generate stubs for us...
30 #define XPC_MAP_CLASSNAME BackstagePass
31 #define XPC_MAP_QUOTED_CLASSNAME "BackstagePass"
32 #define XPC_MAP_WANT_NEWRESOLVE
33 #define XPC_MAP_WANT_FINALIZE
34 #define XPC_MAP_WANT_PRECREATE
36 #define XPC_MAP_FLAGS nsIXPCScriptable::USE_JSSTUB_FOR_ADDPROPERTY | \
37 nsIXPCScriptable::USE_JSSTUB_FOR_DELPROPERTY | \
38 nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY | \
39 nsIXPCScriptable::DONT_ENUM_STATIC_PROPS | \
40 nsIXPCScriptable::DONT_ENUM_QUERY_INTERFACE | \
41 nsIXPCScriptable::IS_GLOBAL_OBJECT | \
42 nsIXPCScriptable::DONT_REFLECT_INTERFACE_NAMES
43 #include "xpc_map_end.h" /* This will #undef the above */
45 /* bool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsval id, out JSObjectPtr objp); */
46 NS_IMETHODIMP
47 BackstagePass::NewResolve(nsIXPConnectWrappedNative *wrapper,
48 JSContext * cx, JSObject * objArg,
49 jsid idArg, JSObject * *objpArg,
50 bool *_retval)
51 {
52 JS::RootedObject obj(cx, objArg);
53 JS::RootedId id(cx, idArg);
55 bool resolved;
56 *objpArg = nullptr;
58 *_retval = !!JS_ResolveStandardClass(cx, obj, id, &resolved);
59 NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE);
61 if (resolved) {
62 *objpArg = obj;
63 return NS_OK;
64 }
66 JS::RootedObject objp(cx, *objpArg);
68 *_retval = ResolveWorkerClasses(cx, obj, id, &objp);
69 NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE);
71 if (objp) {
72 *objpArg = objp;
73 return NS_OK;
74 }
76 return NS_OK;
77 }
79 /***************************************************************************/
80 /* void getInterfaces (out uint32_t count, [array, size_is (count), retval]
81 out nsIIDPtr array); */
82 NS_IMETHODIMP
83 BackstagePass::GetInterfaces(uint32_t *aCount, nsIID * **aArray)
84 {
85 const uint32_t count = 2;
86 *aCount = count;
87 nsIID **array;
88 *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*)));
89 if (!array)
90 return NS_ERROR_OUT_OF_MEMORY;
92 uint32_t index = 0;
93 nsIID* clone;
94 #define PUSH_IID(id) \
95 clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \
96 sizeof(nsIID))); \
97 if (!clone) \
98 goto oom; \
99 array[index++] = clone;
101 PUSH_IID(nsIXPCScriptable)
102 PUSH_IID(nsIScriptObjectPrincipal)
103 #undef PUSH_IID
105 return NS_OK;
106 oom:
107 while (index)
108 nsMemory::Free(array[--index]);
109 nsMemory::Free(array);
110 *aArray = nullptr;
111 return NS_ERROR_OUT_OF_MEMORY;
112 }
114 /* nsISupports getHelperForLanguage (in uint32_t language); */
115 NS_IMETHODIMP
116 BackstagePass::GetHelperForLanguage(uint32_t language,
117 nsISupports **retval)
118 {
119 nsCOMPtr<nsISupports> supports =
120 do_QueryInterface(static_cast<nsIGlobalObject *>(this));
121 supports.forget(retval);
122 return NS_OK;
123 }
125 /* readonly attribute string contractID; */
126 NS_IMETHODIMP
127 BackstagePass::GetContractID(char * *aContractID)
128 {
129 *aContractID = nullptr;
130 return NS_ERROR_NOT_AVAILABLE;
131 }
133 /* readonly attribute string classDescription; */
134 NS_IMETHODIMP
135 BackstagePass::GetClassDescription(char * *aClassDescription)
136 {
137 static const char classDescription[] = "BackstagePass";
138 *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription));
139 return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
140 }
142 /* readonly attribute nsCIDPtr classID; */
143 NS_IMETHODIMP
144 BackstagePass::GetClassID(nsCID * *aClassID)
145 {
146 *aClassID = nullptr;
147 return NS_OK;
148 }
150 /* readonly attribute uint32_t implementationLanguage; */
151 NS_IMETHODIMP
152 BackstagePass::GetImplementationLanguage(uint32_t *aImplementationLanguage)
153 {
154 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
155 return NS_OK;
156 }
158 /* readonly attribute uint32_t flags; */
159 NS_IMETHODIMP
160 BackstagePass::GetFlags(uint32_t *aFlags)
161 {
162 *aFlags = nsIClassInfo::MAIN_THREAD_ONLY;
163 return NS_OK;
164 }
166 /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
167 NS_IMETHODIMP
168 BackstagePass::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
169 {
170 return NS_ERROR_NOT_AVAILABLE;
171 }
173 NS_IMETHODIMP
174 BackstagePass::Finalize(nsIXPConnectWrappedNative *wrapper, JSFreeOp * fop, JSObject * obj)
175 {
176 nsCOMPtr<nsIGlobalObject> bsp(do_QueryWrappedNative(wrapper));
177 MOZ_ASSERT(bsp);
178 static_cast<BackstagePass*>(bsp.get())->ForgetGlobalObject();
179 return NS_OK;
180 }
182 NS_IMETHODIMP
183 BackstagePass::PreCreate(nsISupports *nativeObj, JSContext *cx,
184 JSObject *globalObj, JSObject **parentObj)
185 {
186 // We do the same trick here as for WindowSH. Return the js global
187 // as parent, so XPConenct can find the right scope and the wrapper
188 // that already exists.
189 nsCOMPtr<nsIGlobalObject> global(do_QueryInterface(nativeObj));
190 MOZ_ASSERT(global, "nativeObj not a global object!");
192 JSObject *jsglobal = global->GetGlobalJSObject();
193 if (jsglobal)
194 *parentObj = jsglobal;
195 return NS_OK;
196 }
198 nsresult
199 NS_NewBackstagePass(BackstagePass** ret)
200 {
201 nsRefPtr<BackstagePass> bsp = new BackstagePass(
202 nsContentUtils::GetSystemPrincipal());
203 bsp.forget(ret);
204 return NS_OK;
205 }