summaryrefslogtreecommitdiffstats
path: root/dom/base/DOMException.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/DOMException.h')
-rw-r--r--dom/base/DOMException.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/dom/base/DOMException.h b/dom/base/DOMException.h
new file mode 100644
index 0000000000..c44cf904a0
--- /dev/null
+++ b/dom/base/DOMException.h
@@ -0,0 +1,197 @@
+/* -*- 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_DOMException_h__
+#define mozilla_dom_DOMException_h__
+
+// We intentionally shadow non-virtual methods, but gcc gets confused.
+#ifdef __GNUC__
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Woverloaded-virtual"
+#endif
+
+#include <stdint.h>
+#include "js/Value.h"
+#include "jspubtd.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsID.h"
+#include "nsWrapperCache.h"
+#include "nsIException.h"
+#include "nsString.h"
+#include "mozilla/dom/BindingDeclarations.h"
+
+class nsIGlobalObject;
+class nsIStackFrame;
+
+nsresult NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult,
+ nsACString& aName,
+ nsACString& aMessage,
+ uint16_t* aCode = nullptr);
+
+namespace mozilla {
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+
+#define MOZILLA_EXCEPTION_IID \
+ { \
+ 0x55eda557, 0xeba0, 0x4fe3, { \
+ 0xae, 0x2e, 0xf3, 0x94, 0x49, 0x23, 0x62, 0xd6 \
+ } \
+ }
+
+class Exception : public nsIException, public nsWrapperCache {
+ public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_EXCEPTION_IID)
+
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Exception)
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_NSIEXCEPTION
+
+ const nsCString& GetMessageMoz() const { return mMessage; }
+ nsresult GetResult() const { return mResult; }
+ // DOMException wants different ToString behavior, so allow it to override.
+ virtual void ToString(JSContext* aCx, nsACString& aReturn);
+
+ // Cruft used by XPConnect for exceptions originating in JS implemented
+ // components.
+ bool StealJSVal(JS::Value* aVp);
+ void StowJSVal(JS::Value& aVp);
+
+ // WebIDL API
+ virtual JSObject* WrapObject(JSContext* cx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ nsISupports* GetParentObject() const { return nullptr; }
+
+ void GetMessageMoz(nsString& retval);
+
+ uint32_t Result() const;
+
+ void GetName(nsAString& retval);
+
+ virtual void GetErrorMessage(nsAString& aRetVal) {
+ // Since GetName is non non-virtual and deals with different
+ // member variables in Exception vs. DOMException, have a virtual
+ // method to ensure the right error message creation.
+ nsAutoString name;
+ GetName(name);
+ CreateErrorMessage(name, aRetVal);
+ }
+
+ void GetFilename(JSContext* aCx, nsAString& aFilename);
+
+ uint32_t SourceId(JSContext* aCx) const;
+
+ uint32_t LineNumber(JSContext* aCx) const;
+
+ uint32_t ColumnNumber() const;
+
+ already_AddRefed<nsIStackFrame> GetLocation() const;
+
+ nsISupports* GetData() const;
+
+ void GetStack(JSContext* aCx, nsAString& aStack) const;
+
+ void Stringify(JSContext* aCx, nsString& retval);
+
+ Exception(const nsACString& aMessage, nsresult aResult,
+ const nsACString& aName, nsIStackFrame* aLocation,
+ nsISupports* aData);
+ Exception(nsCString&& aMessage, nsresult aResult, nsCString&& aName);
+
+ protected:
+ virtual ~Exception();
+
+ void CreateErrorMessage(const nsAString& aName, nsAString& aRetVal) {
+ // Create similar error message as what ErrorReport::init does in jsexn.cpp.
+ if (!aName.IsEmpty() && !mMessage.IsEmpty()) {
+ aRetVal.Assign(aName);
+ aRetVal.AppendLiteral(": ");
+ AppendUTF8toUTF16(mMessage, aRetVal);
+ } else if (!aName.IsEmpty()) {
+ aRetVal.Assign(aName);
+ } else if (!mMessage.IsEmpty()) {
+ CopyUTF8toUTF16(mMessage, aRetVal);
+ } else {
+ aRetVal.Truncate();
+ }
+ }
+
+ nsCString mMessage;
+ nsresult mResult;
+ nsCString mName;
+ nsCOMPtr<nsIStackFrame> mLocation;
+ nsCOMPtr<nsISupports> mData;
+
+ bool mHoldingJSVal;
+ JS::Heap<JS::Value> mThrownJSVal;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(Exception, MOZILLA_EXCEPTION_IID)
+
+class DOMException : public Exception {
+ public:
+ DOMException(nsresult aRv, const nsACString& aMessage,
+ const nsACString& aName, uint16_t aCode,
+ nsIStackFrame* aLocation = nullptr);
+ DOMException(nsresult aRv, nsCString&& aMessage, nsCString&& aName,
+ uint16_t aCode);
+
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(DOMException, Exception)
+
+ // nsWrapperCache overrides
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<DOMException> Constructor(
+ GlobalObject& /* unused */, const nsAString& aMessage,
+ const Optional<nsAString>& aName);
+
+ uint16_t Code() const { return mCode; }
+
+ // Intentionally shadow the Exception version.
+ void GetName(nsString& retval);
+
+ // Exception overrides
+ void ToString(JSContext* aCx, nsACString& aReturn) override;
+
+ virtual void GetErrorMessage(nsAString& aRetVal) override {
+ // See the comment in Exception::GetErrorMessage.
+ nsAutoString name;
+ GetName(name);
+ CreateErrorMessage(name, aRetVal);
+ }
+
+ static already_AddRefed<DOMException> Create(nsresult aRv);
+
+ static already_AddRefed<DOMException> Create(nsresult aRv,
+ const nsACString& aMessage);
+
+ static already_AddRefed<DOMException> ReadStructuredClone(
+ JSContext* aCx, nsIGlobalObject* aGlobal,
+ JSStructuredCloneReader* aReader);
+ bool WriteStructuredClone(JSContext* aCx,
+ JSStructuredCloneWriter* aWriter) const;
+
+ protected:
+ virtual ~DOMException() = default;
+
+ uint16_t mCode;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#ifdef __GNUC__
+# pragma GCC diagnostic pop
+#endif
+
+#endif