dom/base/nsJSUtils.h

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: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsJSUtils_h__
     7 #define nsJSUtils_h__
     9 /**
    10  * This is not a generated file. It contains common utility functions 
    11  * invoked from the JavaScript code generated from IDL interfaces.
    12  * The goal of the utility functions is to cut down on the size of
    13  * the generated code itself.
    14  */
    16 #include "mozilla/Assertions.h"
    18 #include "jsapi.h"
    19 #include "nsString.h"
    21 class nsIScriptContext;
    22 class nsIScriptGlobalObject;
    24 class nsJSUtils
    25 {
    26 public:
    27   static bool GetCallingLocation(JSContext* aContext, const char* *aFilename,
    28                                  uint32_t* aLineno);
    30   static nsIScriptGlobalObject *GetStaticScriptGlobal(JSObject* aObj);
    32   static nsIScriptContext *GetStaticScriptContext(JSObject* aObj);
    34   static nsIScriptGlobalObject *GetDynamicScriptGlobal(JSContext *aContext);
    36   static nsIScriptContext *GetDynamicScriptContext(JSContext *aContext);
    38   /**
    39    * Retrieve the inner window ID based on the given JSContext.
    40    *
    41    * @param JSContext aContext
    42    *        The JSContext from which you want to find the inner window ID.
    43    *
    44    * @returns uint64_t the inner window ID.
    45    */
    46   static uint64_t GetCurrentlyRunningCodeInnerWindowID(JSContext *aContext);
    48   /**
    49    * Report a pending exception on aContext, if any.  Note that this
    50    * can be called when the context has a JS stack.  If that's the
    51    * case, the stack will be set aside before reporting the exception.
    52    */
    53   static void ReportPendingException(JSContext *aContext);
    55   static nsresult CompileFunction(JSContext* aCx,
    56                                   JS::Handle<JSObject*> aTarget,
    57                                   JS::CompileOptions& aOptions,
    58                                   const nsACString& aName,
    59                                   uint32_t aArgCount,
    60                                   const char** aArgArray,
    61                                   const nsAString& aBody,
    62                                   JSObject** aFunctionObject);
    64   struct EvaluateOptions {
    65     bool coerceToString;
    66     bool reportUncaught;
    67     bool needResult;
    69     explicit EvaluateOptions() : coerceToString(false)
    70                                , reportUncaught(true)
    71                                , needResult(true)
    72     {}
    74     EvaluateOptions& setCoerceToString(bool aCoerce) {
    75       coerceToString = aCoerce;
    76       return *this;
    77     }
    79     EvaluateOptions& setReportUncaught(bool aReport) {
    80       reportUncaught = aReport;
    81       return *this;
    82     }
    84     EvaluateOptions& setNeedResult(bool aNeedResult) {
    85       needResult = aNeedResult;
    86       return *this;
    87     }
    88   };
    90   static nsresult EvaluateString(JSContext* aCx,
    91                                  const nsAString& aScript,
    92                                  JS::Handle<JSObject*> aScopeObject,
    93                                  JS::CompileOptions &aCompileOptions,
    94                                  const EvaluateOptions& aEvaluateOptions,
    95                                  JS::MutableHandle<JS::Value> aRetValue,
    96                                  void **aOffThreadToken = nullptr);
    98   static nsresult EvaluateString(JSContext* aCx,
    99                                  JS::SourceBufferHolder& aSrcBuf,
   100                                  JS::Handle<JSObject*> aScopeObject,
   101                                  JS::CompileOptions &aCompileOptions,
   102                                  const EvaluateOptions& aEvaluateOptions,
   103                                  JS::MutableHandle<JS::Value> aRetValue,
   104                                  void **aOffThreadToken = nullptr);
   107   static nsresult EvaluateString(JSContext* aCx,
   108                                  const nsAString& aScript,
   109                                  JS::Handle<JSObject*> aScopeObject,
   110                                  JS::CompileOptions &aCompileOptions,
   111                                  void **aOffThreadToken = nullptr);
   113   static nsresult EvaluateString(JSContext* aCx,
   114                                  JS::SourceBufferHolder& aSrcBuf,
   115                                  JS::Handle<JSObject*> aScopeObject,
   116                                  JS::CompileOptions &aCompileOptions,
   117                                  void **aOffThreadToken = nullptr);
   119 };
   121 class MOZ_STACK_CLASS AutoDontReportUncaught {
   122   JSContext* mContext;
   123   bool mWasSet;
   125 public:
   126   AutoDontReportUncaught(JSContext* aContext) : mContext(aContext) {
   127     MOZ_ASSERT(aContext);
   128     mWasSet = JS::ContextOptionsRef(mContext).dontReportUncaught();
   129     if (!mWasSet) {
   130       JS::ContextOptionsRef(mContext).setDontReportUncaught(true);
   131     }
   132   }
   133   ~AutoDontReportUncaught() {
   134     if (!mWasSet) {
   135       JS::ContextOptionsRef(mContext).setDontReportUncaught(false);
   136     }
   137   }
   138 };
   141 class nsDependentJSString : public nsDependentString
   142 {
   143 public:
   144   /**
   145    * In the case of string ids, getting the string's chars is infallible, so
   146    * the dependent string can be constructed directly.
   147    */
   148   explicit nsDependentJSString(JS::Handle<jsid> id)
   149     : nsDependentString(JS_GetInternedStringChars(JSID_TO_STRING(id)),
   150                         JS_GetStringLength(JSID_TO_STRING(id)))
   151   {
   152   }
   154   /**
   155    * Ditto for flat strings.
   156    */
   157   explicit nsDependentJSString(JSFlatString* fstr)
   158     : nsDependentString(JS_GetFlatStringChars(fstr),
   159                         JS_GetStringLength(JS_FORGET_STRING_FLATNESS(fstr)))
   160   {
   161   }
   163   /**
   164    * For all other strings, the nsDependentJSString object should be default
   165    * constructed, which leaves it empty (this->IsEmpty()), and initialized with
   166    * one of the init() methods below.
   167    */
   169   nsDependentJSString()
   170   {
   171   }
   173   bool init(JSContext* aContext, JSString* str)
   174   {
   175       size_t length;
   176       const jschar* chars = JS_GetStringCharsZAndLength(aContext, str, &length);
   177       if (!chars)
   178           return false;
   180       NS_ASSERTION(IsEmpty(), "init() on initialized string");
   181       nsDependentString* base = this;
   182       new(base) nsDependentString(chars, length);
   183       return true;
   184   }
   186   bool init(JSContext* aContext, const JS::Value &v)
   187   {
   188       return init(aContext, JSVAL_TO_STRING(v));
   189   }
   191   void init(JSFlatString* fstr)
   192   {
   193       MOZ_ASSERT(IsEmpty(), "init() on initialized string");
   194       new(this) nsDependentJSString(fstr);
   195   }
   197   ~nsDependentJSString()
   198   {
   199   }
   200 };
   202 #endif /* nsJSUtils_h__ */

mercurial