js/xpconnect/src/XPCRuntimeService.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

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 }

mercurial