mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	Skipping stack serialization here as * it's optional per the spec * no WPT test exists * Chrome doesn't support it either * not sure how it's usable when transferred to other domain. Differential Revision: https://phabricator.services.mozilla.com/D143625
		
			
				
	
	
		
			197 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
	
		
			5.8 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 "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
 |