summaryrefslogtreecommitdiffstats
path: root/dom/bindings/nsScriptError.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/bindings/nsScriptError.h')
-rw-r--r--dom/bindings/nsScriptError.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/dom/bindings/nsScriptError.h b/dom/bindings/nsScriptError.h
new file mode 100644
index 0000000000..f00a859a59
--- /dev/null
+++ b/dom/bindings/nsScriptError.h
@@ -0,0 +1,143 @@
+/* -*- 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,
+ * 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 "js/RootingAPI.h"
+
+#include "nsCOMArray.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsIScriptError.h"
+#include "nsString.h"
+
+class nsGlobalWindowInner;
+
+class nsScriptErrorNote final : public nsIScriptErrorNote {
+ public:
+ nsScriptErrorNote();
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSISCRIPTERRORNOTE
+
+ 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;
+ 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:
+ virtual ~nsScriptErrorBase();
+
+ void InitializeOnMainThread();
+
+ 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;
+ // mOuterWindowID is set on the main thread from InitializeOnMainThread().
+ uint64_t mOuterWindowID;
+ uint64_t mInnerWindowID;
+ int64_t mMicroSecondTimeStamp;
+ // mInitializedOnMainThread, mIsFromPrivateWindow and mIsFromChromeContext are
+ // set on the main thread from InitializeOnMainThread().
+ mozilla::Atomic<bool> mInitializedOnMainThread;
+ bool mIsFromPrivateWindow;
+ bool mIsFromChromeContext;
+ bool mIsPromiseRejection;
+ bool mIsForwardedFromContentProcess;
+};
+
+class nsScriptError final : public nsScriptErrorBase {
+ public:
+ nsScriptError() = default;
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ private:
+ virtual ~nsScriptError() = default;
+};
+
+class nsScriptErrorWithStack : public nsScriptErrorBase {
+ public:
+ nsScriptErrorWithStack(JS::Handle<mozilla::Maybe<JS::Value>> aException,
+ JS::Handle<JSObject*> aStack,
+ JS::Handle<JSObject*> aStackGlobal);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsScriptErrorWithStack)
+
+ NS_IMETHOD GetHasException(bool*) override;
+ NS_IMETHOD GetException(JS::MutableHandle<JS::Value>) override;
+
+ NS_IMETHOD GetStack(JS::MutableHandle<JS::Value>) override;
+ NS_IMETHOD GetStackGlobal(JS::MutableHandle<JS::Value>) 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.
+ // Must be a (possibly wrapped) SavedFrame object.
+ JS::Heap<JSObject*> mStack;
+ // Global object that must be same-compartment with mStack.
+ 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
+// 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::Handle<JSObject*> aStack, JS::Handle<JSObject*> aStackGlobal);
+
+#endif /* mozilla_dom_nsScriptError_h */