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.h214
1 files changed, 214 insertions, 0 deletions
diff --git a/dom/base/DOMException.h b/dom/base/DOMException.h
new file mode 100644
index 000000000..0f0bf1dbd
--- /dev/null
+++ b/dom/base/DOMException.h
@@ -0,0 +1,214 @@
+/* -*- 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 "jspubtd.h"
+#include "js/GCAPI.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsID.h"
+#include "nsIDOMDOMException.h"
+#include "nsWrapperCache.h"
+#include "xpcexception.h"
+#include "nsString.h"
+#include "mozilla/dom/BindingDeclarations.h"
+
+class nsIStackFrame;
+class nsString;
+
+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 nsIXPCException,
+ public nsWrapperCache
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_EXCEPTION_IID)
+
+ NS_DEFINE_STATIC_CID_ACCESSOR(NS_XPCEXCEPTION_CID)
+
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Exception)
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_NSIEXCEPTION
+ NS_DECL_NSIXPCEXCEPTION
+
+ // 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(nsString& retval);
+
+ virtual void GetErrorMessage(nsAString& aRetVal)
+ {
+ // Since GetName and GetMessageMoz are non-virtual and they deal with
+ // different member variables in Exception vs. DOMException, have a
+ // virtual method to ensure the right error message creation.
+ nsAutoString name;
+ nsAutoString message;
+ GetName(name);
+ GetMessageMoz(message);
+ CreateErrorMessage(name, message, aRetVal);
+ }
+
+ // The XPCOM GetFilename does the right thing. It might throw, but we want to
+ // return an empty filename in that case anyway, instead of throwing.
+
+ uint32_t LineNumber(JSContext* aCx) const;
+
+ uint32_t ColumnNumber() const;
+
+ already_AddRefed<nsIStackFrame> GetLocation() const;
+
+ already_AddRefed<nsISupports> GetData() const;
+
+ void GetStack(JSContext* aCx, nsAString& aStack, ErrorResult& aRv) const;
+
+ void Stringify(JSContext* aCx, nsString& retval);
+
+ // XPCOM factory ctor.
+ Exception();
+
+ Exception(const nsACString& aMessage,
+ nsresult aResult,
+ const nsACString& aName,
+ nsIStackFrame *aLocation,
+ nsISupports *aData);
+
+protected:
+ virtual ~Exception();
+
+ void CreateErrorMessage(const nsAString& aName, const nsAString& aMessage,
+ nsAString& aRetVal)
+ {
+ // Create similar error message as what ErrorReport::init does in jsexn.cpp.
+ if (!aName.IsEmpty() && !aMessage.IsEmpty()) {
+ aRetVal.Assign(aName);
+ aRetVal.AppendLiteral(": ");
+ aRetVal.Append(aMessage);
+ } else if (!aName.IsEmpty()) {
+ aRetVal.Assign(aName);
+ } else if (!aMessage.IsEmpty()) {
+ aRetVal.Assign(aMessage);
+ } else {
+ aRetVal.Truncate();
+ }
+ }
+
+ nsCString mMessage;
+ nsresult mResult;
+ nsCString mName;
+ nsCOMPtr<nsIStackFrame> mLocation;
+ nsCOMPtr<nsISupports> mData;
+ bool mInitialized;
+
+ bool mHoldingJSVal;
+ JS::Heap<JS::Value> mThrownJSVal;
+
+private:
+ static bool sEverMadeOneFromFactory;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(Exception, MOZILLA_EXCEPTION_IID)
+
+class DOMException : public Exception,
+ public nsIDOMDOMException
+{
+public:
+ DOMException(nsresult aRv, const nsACString& aMessage,
+ const nsACString& aName, uint16_t aCode);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_NSIDOMDOMEXCEPTION
+
+ // nsIException overrides
+ NS_IMETHOD ToString(JSContext* aCx, nsACString& aReturn) override;
+
+ // 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,
+ ErrorResult& aError);
+
+ uint16_t Code() const {
+ return mCode;
+ }
+
+ // Intentionally shadow the nsXPCException version.
+ void GetMessageMoz(nsString& retval);
+ void GetName(nsString& retval);
+
+ virtual void GetErrorMessage(nsAString& aRetVal) override
+ {
+ // See the comment in Exception::GetErrorMessage.
+ nsAutoString name;
+ nsAutoString message;
+ GetName(name);
+ GetMessageMoz(message);
+ CreateErrorMessage(name, message, aRetVal);
+ }
+
+ static already_AddRefed<DOMException>
+ Create(nsresult aRv);
+
+ static already_AddRefed<DOMException>
+ Create(nsresult aRv, const nsACString& aMessage);
+
+protected:
+
+ virtual ~DOMException() {}
+
+ nsCString mName;
+ nsCString mMessage;
+
+ uint16_t mCode;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
+#endif