DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_nsScriptError_h
#define mozilla_dom_nsScriptError_h


#include "mozilla/Atomics.h"

#include <stdint.h>

#include "jsapi.h"
#include "jsapi.h"
#include "js/RootingAPI.h"

#include "nsCOMArray.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIScriptError.h"
#include "nsString.h"


class nsGlobalWindowInner;

class nsScriptErrorNote final : public nsIScriptErrorNote {
 public:
  nsScriptErrorNote();
  nsScriptErrorNote();

  NS_DECL_THREADSAFE_ISUPPORTS
  NS_DECL_NSISCRIPTERRORNOTE

  void Init(const nsAString& message, const nsAString& sourceName,
  void Init(const nsAString& message, const nsAString& sourceName,
            uint32_t sourceId, uint32_t lineNumber, uint32_t columnNumber);

 private:
  virtual ~nsScriptErrorNote();


  nsString mMessage;
  nsString mSourceName;
  nsString mCssSelectors;
  nsString mSourceLine;
  nsString mSourceLine;
  uint32_t mSourceId;
  uint32_t mLineNumber;
  uint32_t mColumnNumber;
};


// Definition of nsScriptError..
class nsScriptErrorBase : public nsIScriptError {
 public:
  nsScriptErrorBase();


  NS_DECL_NSICONSOLEMESSAGE
  NS_DECL_NSISCRIPTERROR

  void AddNote(nsIScriptErrorNote* note);


  static bool ComputeIsFromPrivateWindow(nsGlobalWindowInner* aWindow);

  static bool ComputeIsFromChromeContext(nsGlobalWindowInner* aWindow);

 protected:
 protected:
  virtual ~nsScriptErrorBase();

  void InitializeOnMainThread();

  void InitializationHelper(const nsAString& message,
  void InitializationHelper(const nsAString& message,
                            const nsAString& sourceLine, uint32_t lineNumber,
                            uint32_t columnNumber, uint32_t flags,
                            const nsACString& category, uint64_t aInnerWindowID,
                            bool aFromChromeContext);


  nsCOMArray<nsIScriptErrorNote> mNotes;
  nsString mMessage;
  nsString mMessageName;
  nsString mSourceName;
  nsString mCssSelectors;
  uint32_t mSourceId;
  uint32_t mLineNumber;
  nsString mSourceLine;
  uint32_t mColumnNumber;
  uint32_t mFlags;
  nsCString mCategory;
  nsCString mCategory;
  // mOuterWindowID is set on the main thread from InitializeOnMainThread().
  uint64_t mOuterWindowID;
  uint64_t mInnerWindowID;
  int64_t mTimeStamp;
  // mInitializedOnMainThread, mIsFromPrivateWindow and mIsFromChromeContext are
  // mInitializedOnMainThread, mIsFromPrivateWindow and mIsFromChromeContext are
  // set on the main thread from InitializeOnMainThread().
  mozilla::Atomic<bool> mInitializedOnMainThread;
  bool mIsFromPrivateWindow;
  bool mIsFromChromeContext;
  bool mIsPromiseRejection;
  bool mIsPromiseRejection;
  bool mIsForwardedFromContentProcess;
};

class nsScriptError final : public nsScriptErrorBase {
  nsScriptError() = default;
 public:
  nsScriptError() = default;
  NS_DECL_THREADSAFE_ISUPPORTS

 private:
};
  virtual ~nsScriptError() = default;
};

class nsScriptErrorWithStack : public nsScriptErrorBase {
  nsScriptErrorWithStack(JS::Handle<mozilla::Maybe<JS::Value>> aException,
 public:
  nsScriptErrorWithStack(JS::Handle<mozilla::Maybe<JS::Value>> aException,
                         JS::HandleObject aStack,
                         JS::HandleObject aStackGlobal);

  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsScriptErrorWithStack)
  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsScriptErrorWithStack)

  NS_IMETHOD GetHasException(bool*) override;
  NS_IMETHOD GetException(JS::MutableHandleValue) override;

  NS_IMETHOD GetStackGlobal(JS::MutableHandleValue) override;
  NS_IMETHOD GetStack(JS::MutableHandleValue) override;
  NS_IMETHOD GetStackGlobal(JS::MutableHandleValue) override;
  NS_IMETHOD ToString(nsACString& aResult) override;

 private:

  virtual ~nsScriptErrorWithStack();

  // The "exception" value.
  JS::Heap<JS::Value> mException;
  bool mHasException;
  // Complete stackframe where the error happened.

  // Complete stackframe where the error happened.
  // Must be a (possibly wrapped) SavedFrame object.
  JS::Heap<JSObject*> mStack;
  // Global object that must be same-compartment with mStack.
  JS::Heap<JSObject*> mStackGlobal;
  JS::Heap<JSObject*> mStackGlobal;
};

// Creates either nsScriptErrorWithStack or nsScriptError,
// depending on whether |aStack| or |aException| is passed.
// Additionally when the first (optional) |win| argument is
// Additionally when the first (optional) |win| argument is
// provided this function makes sure that the GlobalWindow
// isn't already dying to prevent leaks.
already_AddRefed<nsScriptErrorBase> CreateScriptError(
    nsGlobalWindowInner* win, JS::Handle<mozilla::Maybe<JS::Value>> aException,
    JS::HandleObject aStack, JS::HandleObject aStackGlobal);
    JS::HandleObject aStack, JS::HandleObject aStackGlobal);

#endif /* mozilla_dom_nsScriptError_h */