1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef nsAboutProtocolHandler_h___
7 #define nsAboutProtocolHandler_h___
9 #include "nsIProtocolHandler.h"
10 #include "nsSimpleNestedURI.h"
11 #include "nsWeakReference.h"
12 #include "mozilla/Attributes.h"
13 #include "nsIURIMutator.h"
20 class nsAboutProtocolHandler
: public nsIProtocolHandlerWithDynamicFlags
,
21 public nsIProtocolHandler
,
22 public nsSupportsWeakReference
{
26 // nsIProtocolHandler methods:
27 NS_DECL_NSIPROTOCOLHANDLER
28 NS_DECL_NSIPROTOCOLHANDLERWITHDYNAMICFLAGS
30 // nsAboutProtocolHandler methods:
31 nsAboutProtocolHandler() = default;
33 static nsresult
CreateNewURI(const nsACString
& aSpec
, const char* aCharset
,
34 nsIURI
* aBaseURI
, nsIURI
** result
);
37 virtual ~nsAboutProtocolHandler() = default;
40 class nsSafeAboutProtocolHandler final
: public nsIProtocolHandler
,
41 public nsSupportsWeakReference
{
45 // nsIProtocolHandler methods:
46 NS_DECL_NSIPROTOCOLHANDLER
48 // nsSafeAboutProtocolHandler methods:
49 nsSafeAboutProtocolHandler() = default;
52 ~nsSafeAboutProtocolHandler() = default;
55 // Class to allow us to propagate the base URI to about:blank correctly
56 class nsNestedAboutURI final
: public nsSimpleNestedURI
{
58 nsNestedAboutURI(nsIURI
* aInnerURI
, nsIURI
* aBaseURI
)
59 : nsSimpleNestedURI(aInnerURI
), mBaseURI(aBaseURI
) {}
61 virtual ~nsNestedAboutURI() = default;
64 // Override QI so we can QI to our CID as needed
65 NS_IMETHOD
QueryInterface(REFNSIID aIID
, void** aInstancePtr
) override
;
67 // Override StartClone(), the nsISerializable methods, and
68 virtual nsSimpleURI
* StartClone(RefHandlingEnum aRefHandlingMode
,
69 const nsACString
& newRef
) override
;
70 NS_IMETHOD
Mutate(nsIURIMutator
** _retval
) override
;
71 NS_IMETHOD_(void) Serialize(ipc::URIParams
& aParams
) override
;
74 NS_IMETHOD
Read(nsIObjectInputStream
* aStream
) override
;
75 NS_IMETHOD
Write(nsIObjectOutputStream
* aStream
) override
;
77 nsIURI
* GetBaseURI() const { return mBaseURI
; }
80 nsCOMPtr
<nsIURI
> mBaseURI
;
81 bool Deserialize(const mozilla::ipc::URIParams
&);
82 nsresult
ReadPrivate(nsIObjectInputStream
* stream
);
85 class Mutator final
: public nsIURIMutator
,
86 public BaseURIMutator
<nsNestedAboutURI
>,
87 public nsISerializable
,
88 public nsINestedAboutURIMutator
{
90 NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI
)
92 explicit Mutator() = default;
95 virtual ~Mutator() = default;
97 [[nodiscard
]] NS_IMETHOD
Deserialize(
98 const mozilla::ipc::URIParams
& aParams
) override
{
99 return InitFromIPCParams(aParams
);
103 Write(nsIObjectOutputStream
* aOutputStream
) override
{
104 return NS_ERROR_NOT_IMPLEMENTED
;
107 [[nodiscard
]] NS_IMETHOD
Read(nsIObjectInputStream
* aStream
) override
{
108 return InitFromInputStream(aStream
);
111 [[nodiscard
]] NS_IMETHOD
Finalize(nsIURI
** aURI
) override
{
116 [[nodiscard
]] NS_IMETHOD
SetSpec(const nsACString
& aSpec
,
117 nsIURIMutator
** aMutator
) override
{
119 NS_ADDREF(*aMutator
= this);
121 return InitFromSpec(aSpec
);
124 [[nodiscard
]] NS_IMETHOD
InitWithBase(nsIURI
* aInnerURI
,
125 nsIURI
* aBaseURI
) override
{
126 mURI
= new nsNestedAboutURI(aInnerURI
, aBaseURI
);
130 friend class nsNestedAboutURI
;
133 friend BaseURIMutator
<nsNestedAboutURI
>;
137 } // namespace mozilla
139 #endif /* nsAboutProtocolHandler_h___ */