mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-08 14:03:49 +00:00
a10a5b4139
MozReview-Commit-ID: 4BaYjfOdrUc
211 lines
5.5 KiB
C++
211 lines
5.5 KiB
C++
/* -*- 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;
|
|
|
|
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;
|
|
};
|
|
|
|
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
|