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/. */
7 #ifndef mozilla_dom_Headers_h
8 #define mozilla_dom_Headers_h
10 #include "mozilla/dom/HeadersBinding.h"
12 #include "nsClassHashtable.h"
13 #include "nsWrapperCache.h"
15 #include "InternalHeaders.h"
23 template<typename K
, typename V
> class Record
;
24 class HeadersOrByteStringSequenceSequenceOrByteStringByteStringRecord
;
25 class OwningHeadersOrByteStringSequenceSequenceOrByteStringByteStringRecord
;
28 * This Headers class is only used to represent the content facing Headers
29 * object. It is actually backed by an InternalHeaders implementation. Gecko
30 * code should NEVER use this, except in the Request and Response
31 * implementations, where they must always be created from the backing
32 * InternalHeaders object.
34 class Headers final
: public nsISupports
35 , public nsWrapperCache
37 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
38 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Headers
)
41 friend class Response
;
44 nsCOMPtr
<nsISupports
> mOwner
;
45 RefPtr
<InternalHeaders
> mInternalHeaders
;
48 explicit Headers(nsISupports
* aOwner
, InternalHeaders
* aInternalHeaders
)
50 , mInternalHeaders(aInternalHeaders
)
54 explicit Headers(const Headers
& aOther
) = delete;
56 static bool PrefEnabled(JSContext
* cx
, JSObject
* obj
);
58 static already_AddRefed
<Headers
>
59 Constructor(const GlobalObject
& aGlobal
,
60 const Optional
<HeadersOrByteStringSequenceSequenceOrByteStringByteStringRecord
>& aInit
,
63 static already_AddRefed
<Headers
>
64 Constructor(const GlobalObject
& aGlobal
,
65 const OwningHeadersOrByteStringSequenceSequenceOrByteStringByteStringRecord
& aInit
,
68 static already_AddRefed
<Headers
>
69 Create(nsIGlobalObject
* aGlobalObject
,
70 const OwningHeadersOrByteStringSequenceSequenceOrByteStringByteStringRecord
& aInit
,
73 void Append(const nsACString
& aName
, const nsACString
& aValue
,
76 mInternalHeaders
->Append(aName
, aValue
, aRv
);
79 void Delete(const nsACString
& aName
, ErrorResult
& aRv
)
81 mInternalHeaders
->Delete(aName
, aRv
);
84 void Get(const nsACString
& aName
, nsACString
& aValue
, ErrorResult
& aRv
) const
86 mInternalHeaders
->Get(aName
, aValue
, aRv
);
89 void GetFirst(const nsACString
& aName
, nsACString
& aValue
, ErrorResult
& aRv
) const
91 mInternalHeaders
->GetFirst(aName
, aValue
, aRv
);
94 bool Has(const nsACString
& aName
, ErrorResult
& aRv
) const
96 return mInternalHeaders
->Has(aName
, aRv
);
99 void Set(const nsACString
& aName
, const nsACString
& aValue
, ErrorResult
& aRv
)
101 mInternalHeaders
->Set(aName
, aValue
, aRv
);
104 uint32_t GetIterableLength() const
106 return mInternalHeaders
->GetIterableLength();
108 const nsString
GetKeyAtIndex(unsigned aIndex
) const
110 return mInternalHeaders
->GetKeyAtIndex(aIndex
);
112 const nsString
GetValueAtIndex(unsigned aIndex
) const
114 return mInternalHeaders
->GetValueAtIndex(aIndex
);
118 HeadersGuardEnum
Guard() const
120 return mInternalHeaders
->Guard();
123 void SetGuard(HeadersGuardEnum aGuard
, ErrorResult
& aRv
)
125 mInternalHeaders
->SetGuard(aGuard
, aRv
);
128 virtual JSObject
* WrapObject(JSContext
* aCx
, JS::Handle
<JSObject
*> aGivenProto
) override
;
129 nsISupports
* GetParentObject() const { return mOwner
; }
135 GetInternalHeaders() const
137 return mInternalHeaders
;
142 } // namespace mozilla
144 #endif // mozilla_dom_Headers_h