js/src/vm/SavedStacks.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.

     2 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     3  * vim: set ts=8 sts=4 et sw=4 tw=99:
     4  * This Source Code Form is subject to the terms of the Mozilla Public
     5  * License, v. 2.0. If a copy of the MPL was not distributed with this
     6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     8 #ifndef vm_SavedStacks_h
     9 #define vm_SavedStacks_h
    11 #include "jscntxt.h"
    12 #include "js/HashTable.h"
    13 #include "vm/Stack.h"
    15 namespace js {
    17 class SavedFrame : public JSObject {
    18     friend class SavedStacks;
    20   public:
    21     static const Class          class_;
    22     static void finalize(FreeOp *fop, JSObject *obj);
    24     // Prototype methods and properties to be exposed to JS.
    25     static const JSPropertySpec properties[];
    26     static const JSFunctionSpec methods[];
    27     static bool construct(JSContext *cx, unsigned argc, Value *vp);
    28     static bool sourceProperty(JSContext *cx, unsigned argc, Value *vp);
    29     static bool lineProperty(JSContext *cx, unsigned argc, Value *vp);
    30     static bool columnProperty(JSContext *cx, unsigned argc, Value *vp);
    31     static bool functionDisplayNameProperty(JSContext *cx, unsigned argc, Value *vp);
    32     static bool parentProperty(JSContext *cx, unsigned argc, Value *vp);
    33     static bool toStringMethod(JSContext *cx, unsigned argc, Value *vp);
    35     // Convenient getters for SavedFrame's reserved slots for use from C++.
    36     JSAtom       *getSource();
    37     size_t       getLine();
    38     size_t       getColumn();
    39     JSAtom       *getFunctionDisplayName();
    40     SavedFrame   *getParent();
    41     JSPrincipals *getPrincipals();
    43     bool         isSelfHosted();
    45     struct Lookup;
    46     struct HashPolicy;
    48     typedef HashSet<SavedFrame *,
    49                     HashPolicy,
    50                     SystemAllocPolicy> Set;
    52   private:
    53     void initFromLookup(Lookup &lookup);
    55     enum {
    56         // The reserved slots in the SavedFrame class.
    57         JSSLOT_SOURCE,
    58         JSSLOT_LINE,
    59         JSSLOT_COLUMN,
    60         JSSLOT_FUNCTIONDISPLAYNAME,
    61         JSSLOT_PARENT,
    62         JSSLOT_PRINCIPALS,
    63         JSSLOT_PRIVATE_PARENT,
    65         // The total number of reserved slots in the SavedFrame class.
    66         JSSLOT_COUNT
    67     };
    69     // Because we hash the parent pointer, we need to rekey a saved frame
    70     // whenever its parent was relocated by the GC. However, the GC doesn't
    71     // notify us when this occurs. As a work around, we keep a duplicate copy of
    72     // the parent pointer as a private value in a reserved slot. Whenever the
    73     // private value parent pointer doesn't match the regular parent pointer, we
    74     // know that GC moved the parent and we need to update our private value and
    75     // rekey the saved frame in its hash set. These two methods are helpers for
    76     // this process.
    77     bool         parentMoved();
    78     void         updatePrivateParent();
    80     static SavedFrame *checkThis(JSContext *cx, CallArgs &args, const char *fnName);
    81 };
    83 struct SavedFrame::Lookup {
    84     Lookup(JSAtom *source, size_t line, size_t column, JSAtom *functionDisplayName,
    85            Handle<SavedFrame*> parent, JSPrincipals *principals)
    86         : source(source),
    87           line(line),
    88           column(column),
    89           functionDisplayName(functionDisplayName),
    90           parent(parent),
    91           principals(principals)
    92     {
    93         JS_ASSERT(source);
    94     }
    96     JSAtom              *source;
    97     size_t              line;
    98     size_t              column;
    99     JSAtom              *functionDisplayName;
   100     Handle<SavedFrame*> parent;
   101     JSPrincipals        *principals;
   102 };
   104 struct SavedFrame::HashPolicy
   105 {
   106     typedef SavedFrame::Lookup               Lookup;
   107     typedef PointerHasher<SavedFrame *, 3>   SavedFramePtrHasher;
   108     typedef PointerHasher<JSPrincipals *, 3> JSPrincipalsPtrHasher;
   110     static HashNumber hash(const Lookup &lookup);
   111     static bool       match(SavedFrame *existing, const Lookup &lookup);
   113     typedef SavedFrame* Key;
   114     static void rekey(Key &key, const Key &newKey);
   115 };
   117 class SavedStacks {
   118   public:
   119     SavedStacks() : frames(), savedFrameProto(nullptr) { }
   121     bool     init();
   122     bool     initialized() const { return frames.initialized(); }
   123     bool     saveCurrentStack(JSContext *cx, MutableHandle<SavedFrame*> frame);
   124     void     sweep(JSRuntime *rt);
   125     uint32_t count();
   126     void     clear();
   128     size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf);
   130   private:
   131     SavedFrame::Set          frames;
   132     JSObject                 *savedFrameProto;
   134     bool       insertFrames(JSContext *cx, ScriptFrameIter &iter, MutableHandle<SavedFrame*> frame);
   135     SavedFrame *getOrCreateSavedFrame(JSContext *cx, SavedFrame::Lookup &lookup);
   136     // |SavedFrame.prototype| is created lazily and held weakly. It should only
   137     // be accessed through this method.
   138     JSObject   *getOrCreateSavedFramePrototype(JSContext *cx);
   139     SavedFrame *createFrameFromLookup(JSContext *cx, SavedFrame::Lookup &lookup);
   140 };
   142 } /* namespace js */
   144 #endif /* vm_SavedStacks_h */

mercurial