Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef mozilla_dom_DOMException_h__
8 : #define mozilla_dom_DOMException_h__
9 :
10 : // We intentionally shadow non-virtual methods, but gcc gets confused.
11 : #ifdef __GNUC__
12 : #pragma GCC diagnostic push
13 : #pragma GCC diagnostic ignored "-Woverloaded-virtual"
14 : #endif
15 :
16 : #include <stdint.h>
17 : #include "jspubtd.h"
18 : #include "js/GCAPI.h"
19 : #include "nsCOMPtr.h"
20 : #include "nsCycleCollectionParticipant.h"
21 : #include "nsID.h"
22 : #include "nsIDOMDOMException.h"
23 : #include "nsWrapperCache.h"
24 : #include "xpcexception.h"
25 : #include "nsString.h"
26 : #include "mozilla/dom/BindingDeclarations.h"
27 :
28 : class nsIStackFrame;
29 : class nsString;
30 :
31 : nsresult
32 : NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, nsACString& aName,
33 : nsACString& aMessage,
34 : uint16_t* aCode = nullptr);
35 :
36 : namespace mozilla {
37 : class ErrorResult;
38 :
39 : namespace dom {
40 :
41 : class GlobalObject;
42 :
43 : #define MOZILLA_EXCEPTION_IID \
44 : { 0x55eda557, 0xeba0, 0x4fe3, \
45 : { 0xae, 0x2e, 0xf3, 0x94, 0x49, 0x23, 0x62, 0xd6 } }
46 :
47 : class Exception : public nsIXPCException,
48 : public nsWrapperCache
49 : {
50 : public:
51 : NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_EXCEPTION_IID)
52 :
53 0 : NS_DEFINE_STATIC_CID_ACCESSOR(NS_XPCEXCEPTION_CID)
54 :
55 37722 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Exception)
56 :
57 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
58 : NS_DECL_NSIEXCEPTION
59 : NS_DECL_NSIXPCEXCEPTION
60 :
61 : // Cruft used by XPConnect for exceptions originating in JS implemented
62 : // components.
63 : bool StealJSVal(JS::Value* aVp);
64 : void StowJSVal(JS::Value& aVp);
65 :
66 : // WebIDL API
67 : virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto)
68 : override;
69 :
70 1979 : nsISupports* GetParentObject() const { return nullptr; }
71 :
72 : void GetMessageMoz(nsString& retval);
73 :
74 : uint32_t Result() const;
75 :
76 : void GetName(nsString& retval);
77 :
78 0 : virtual void GetErrorMessage(nsAString& aRetVal)
79 : {
80 : // Since GetName and GetMessageMoz are non-virtual and they deal with
81 : // different member variables in Exception vs. DOMException, have a
82 : // virtual method to ensure the right error message creation.
83 0 : nsAutoString name;
84 0 : nsAutoString message;
85 0 : GetName(name);
86 0 : GetMessageMoz(message);
87 0 : CreateErrorMessage(name, message, aRetVal);
88 0 : }
89 :
90 : // The XPCOM GetFilename does the right thing. It might throw, but we want to
91 : // return an empty filename in that case anyway, instead of throwing.
92 :
93 : uint32_t LineNumber(JSContext* aCx) const;
94 :
95 : uint32_t ColumnNumber() const;
96 :
97 : already_AddRefed<nsIStackFrame> GetLocation() const;
98 :
99 : already_AddRefed<nsISupports> GetData() const;
100 :
101 : void GetStack(JSContext* aCx, nsAString& aStack, ErrorResult& aRv) const;
102 :
103 : void Stringify(JSContext* aCx, nsString& retval);
104 :
105 : // XPCOM factory ctor.
106 : Exception();
107 :
108 : Exception(const nsACString& aMessage,
109 : nsresult aResult,
110 : const nsACString& aName,
111 : nsIStackFrame *aLocation,
112 : nsISupports *aData);
113 :
114 : protected:
115 : virtual ~Exception();
116 :
117 0 : void CreateErrorMessage(const nsAString& aName, const nsAString& aMessage,
118 : nsAString& aRetVal)
119 : {
120 : // Create similar error message as what ErrorReport::init does in jsexn.cpp.
121 0 : if (!aName.IsEmpty() && !aMessage.IsEmpty()) {
122 0 : aRetVal.Assign(aName);
123 0 : aRetVal.AppendLiteral(": ");
124 0 : aRetVal.Append(aMessage);
125 0 : } else if (!aName.IsEmpty()) {
126 0 : aRetVal.Assign(aName);
127 0 : } else if (!aMessage.IsEmpty()) {
128 0 : aRetVal.Assign(aMessage);
129 : } else {
130 0 : aRetVal.Truncate();
131 : }
132 0 : }
133 :
134 : nsCString mMessage;
135 : nsresult mResult;
136 : nsCString mName;
137 : nsCOMPtr<nsIStackFrame> mLocation;
138 : nsCOMPtr<nsISupports> mData;
139 : bool mInitialized;
140 :
141 : bool mHoldingJSVal;
142 : JS::Heap<JS::Value> mThrownJSVal;
143 :
144 : private:
145 : static bool sEverMadeOneFromFactory;
146 : };
147 :
148 : NS_DEFINE_STATIC_IID_ACCESSOR(Exception, MOZILLA_EXCEPTION_IID)
149 :
150 : class DOMException : public Exception,
151 : public nsIDOMDOMException
152 : {
153 : public:
154 : DOMException(nsresult aRv, const nsACString& aMessage,
155 : const nsACString& aName, uint16_t aCode);
156 :
157 : NS_DECL_ISUPPORTS_INHERITED
158 : NS_DECL_NSIDOMDOMEXCEPTION
159 :
160 : // nsIException overrides
161 : NS_IMETHOD ToString(JSContext* aCx, nsACString& aReturn) override;
162 :
163 : // nsWrapperCache overrides
164 : virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
165 : override;
166 :
167 : static already_AddRefed<DOMException>
168 : Constructor(GlobalObject& /* unused */,
169 : const nsAString& aMessage,
170 : const Optional<nsAString>& aName,
171 : ErrorResult& aError);
172 :
173 0 : uint16_t Code() const {
174 0 : return mCode;
175 : }
176 :
177 : // Intentionally shadow the nsXPCException version.
178 : void GetMessageMoz(nsString& retval);
179 : void GetName(nsString& retval);
180 :
181 0 : virtual void GetErrorMessage(nsAString& aRetVal) override
182 : {
183 : // See the comment in Exception::GetErrorMessage.
184 0 : nsAutoString name;
185 0 : nsAutoString message;
186 0 : GetName(name);
187 0 : GetMessageMoz(message);
188 0 : CreateErrorMessage(name, message, aRetVal);
189 0 : }
190 :
191 : static already_AddRefed<DOMException>
192 : Create(nsresult aRv);
193 :
194 : static already_AddRefed<DOMException>
195 : Create(nsresult aRv, const nsACString& aMessage);
196 :
197 : protected:
198 :
199 0 : virtual ~DOMException() {}
200 :
201 : nsCString mName;
202 : nsCString mMessage;
203 :
204 : uint16_t mCode;
205 : };
206 :
207 : } // namespace dom
208 : } // namespace mozilla
209 :
210 : #ifdef __GNUC__
211 : #pragma GCC diagnostic pop
212 : #endif
213 :
214 : #endif
|