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_Headers_h
8 #define mozilla_dom_Headers_h
9 
10 #include "mozilla/dom/HeadersBinding.h"
11 
12 #include "nsClassHashtable.h"
13 #include "nsWrapperCache.h"
14 
15 #include "InternalHeaders.h"
16 
17 namespace mozilla {
18 
19 class ErrorResult;
20 
21 namespace dom {
22 
23 template <typename K, typename V>
24 class Record;
25 class ByteStringSequenceSequenceOrByteStringByteStringRecord;
26 class OwningByteStringSequenceSequenceOrByteStringByteStringRecord;
27 
28 /**
29  * This Headers class is only used to represent the content facing Headers
30  * object. It is actually backed by an InternalHeaders implementation. Gecko
31  * code should NEVER use this, except in the Request and Response
32  * implementations, where they must always be created from the backing
33  * InternalHeaders object.
34  */
35 class Headers final : public nsISupports, public nsWrapperCache {
36   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
37   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Headers)
38 
39   friend class Request;
40   friend class Response;
41 
42  private:
43   nsCOMPtr<nsISupports> mOwner;
44   RefPtr<InternalHeaders> mInternalHeaders;
45 
46  public:
Headers(nsISupports * aOwner,InternalHeaders * aInternalHeaders)47   explicit Headers(nsISupports* aOwner, InternalHeaders* aInternalHeaders)
48       : mOwner(aOwner), mInternalHeaders(aInternalHeaders) {}
49 
50   explicit Headers(const Headers& aOther) = delete;
51 
52   static bool PrefEnabled(JSContext* cx, JSObject* obj);
53 
54   static already_AddRefed<Headers> Constructor(
55       const GlobalObject& aGlobal,
56       const Optional<ByteStringSequenceSequenceOrByteStringByteStringRecord>&
57           aInit,
58       ErrorResult& aRv);
59 
60   static already_AddRefed<Headers> Constructor(
61       const GlobalObject& aGlobal,
62       const OwningByteStringSequenceSequenceOrByteStringByteStringRecord& aInit,
63       ErrorResult& aRv);
64 
65   static already_AddRefed<Headers> Create(
66       nsIGlobalObject* aGlobalObject,
67       const OwningByteStringSequenceSequenceOrByteStringByteStringRecord& aInit,
68       ErrorResult& aRv);
69 
Append(const nsACString & aName,const nsACString & aValue,ErrorResult & aRv)70   void Append(const nsACString& aName, const nsACString& aValue,
71               ErrorResult& aRv) {
72     mInternalHeaders->Append(aName, aValue, aRv);
73   }
74 
Delete(const nsACString & aName,ErrorResult & aRv)75   void Delete(const nsACString& aName, ErrorResult& aRv) {
76     mInternalHeaders->Delete(aName, aRv);
77   }
78 
Get(const nsACString & aName,nsACString & aValue,ErrorResult & aRv)79   void Get(const nsACString& aName, nsACString& aValue,
80            ErrorResult& aRv) const {
81     mInternalHeaders->Get(aName, aValue, aRv);
82   }
83 
GetFirst(const nsACString & aName,nsACString & aValue,ErrorResult & aRv)84   void GetFirst(const nsACString& aName, nsACString& aValue,
85                 ErrorResult& aRv) const {
86     mInternalHeaders->GetFirst(aName, aValue, aRv);
87   }
88 
Has(const nsACString & aName,ErrorResult & aRv)89   bool Has(const nsACString& aName, ErrorResult& aRv) const {
90     return mInternalHeaders->Has(aName, aRv);
91   }
92 
Set(const nsACString & aName,const nsACString & aValue,ErrorResult & aRv)93   void Set(const nsACString& aName, const nsACString& aValue,
94            ErrorResult& aRv) {
95     mInternalHeaders->Set(aName, aValue, aRv);
96   }
97 
GetIterableLength()98   uint32_t GetIterableLength() const {
99     return mInternalHeaders->GetIterableLength();
100   }
GetKeyAtIndex(unsigned aIndex)101   const nsString GetKeyAtIndex(unsigned aIndex) const {
102     return mInternalHeaders->GetKeyAtIndex(aIndex);
103   }
GetValueAtIndex(unsigned aIndex)104   const nsString GetValueAtIndex(unsigned aIndex) const {
105     return mInternalHeaders->GetValueAtIndex(aIndex);
106   }
107 
108   // ChromeOnly
Guard()109   HeadersGuardEnum Guard() const { return mInternalHeaders->Guard(); }
110 
SetGuard(HeadersGuardEnum aGuard,ErrorResult & aRv)111   void SetGuard(HeadersGuardEnum aGuard, ErrorResult& aRv) {
112     mInternalHeaders->SetGuard(aGuard, aRv);
113   }
114 
115   virtual JSObject* WrapObject(JSContext* aCx,
116                                JS::Handle<JSObject*> aGivenProto) override;
GetParentObject()117   nsISupports* GetParentObject() const { return mOwner; }
118 
119  private:
120   virtual ~Headers();
121 
GetInternalHeaders()122   InternalHeaders* GetInternalHeaders() const { return mInternalHeaders; }
123 };
124 
125 }  // namespace dom
126 }  // namespace mozilla
127 
128 #endif  // mozilla_dom_Headers_h
129