LCOV - code coverage report
Current view: top level - dom/fetch - InternalHeaders.h (source / functions) Hit Total Coverage
Test: output.info Lines: 26 35 74.3 %
Date: 2017-07-14 16:53:18 Functions: 10 15 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       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_InternalHeaders_h
       8             : #define mozilla_dom_InternalHeaders_h
       9             : 
      10             : // needed for HeadersGuardEnum.
      11             : #include "mozilla/dom/HeadersBinding.h"
      12             : #include "mozilla/dom/UnionTypes.h"
      13             : 
      14             : #include "nsClassHashtable.h"
      15             : #include "nsWrapperCache.h"
      16             : 
      17             : namespace mozilla {
      18             : 
      19             : class ErrorResult;
      20             : 
      21             : namespace dom {
      22             : 
      23             : template<typename K, typename V> class Record;
      24             : class HeadersEntry;
      25             : 
      26             : class InternalHeaders final
      27             : {
      28          14 :   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(InternalHeaders)
      29             : 
      30             : public:
      31           8 :   struct Entry
      32             :   {
      33           4 :     Entry(const nsACString& aName, const nsACString& aValue)
      34           4 :       : mName(aName)
      35           4 :       , mValue(aValue)
      36           4 :     { }
      37             : 
      38           0 :     Entry() { }
      39             : 
      40             :     nsCString mName;
      41             :     nsCString mValue;
      42             :   };
      43             : 
      44             : private:
      45             :   HeadersGuardEnum mGuard;
      46             :   nsTArray<Entry> mList;
      47             : 
      48             : public:
      49           4 :   explicit InternalHeaders(HeadersGuardEnum aGuard = HeadersGuardEnum::None)
      50           4 :     : mGuard(aGuard)
      51             :   {
      52           4 :   }
      53             : 
      54           3 :   explicit InternalHeaders(const InternalHeaders& aOther)
      55           3 :     : mGuard(HeadersGuardEnum::None)
      56             :   {
      57           6 :     ErrorResult result;
      58           3 :     Fill(aOther, result);
      59           3 :     MOZ_ASSERT(!result.Failed());
      60             :     // Note that it's important to set the guard after Fill(), to make sure
      61             :     // that Fill() doesn't fail if aOther is immutable.
      62           3 :     mGuard = aOther.mGuard;
      63           3 :   }
      64             : 
      65             :   explicit InternalHeaders(const nsTArray<Entry>&& aHeaders,
      66             :                            HeadersGuardEnum aGuard = HeadersGuardEnum::None);
      67             : 
      68             :   InternalHeaders(const nsTArray<HeadersEntry>& aHeadersEntryList,
      69             :                   HeadersGuardEnum aGuard);
      70             : 
      71             :   void ToIPC(nsTArray<HeadersEntry>& aIPCHeaders,
      72             :              HeadersGuardEnum& aGuard);
      73             : 
      74             :   void Append(const nsACString& aName, const nsACString& aValue,
      75             :               ErrorResult& aRv);
      76             :   void Delete(const nsACString& aName, ErrorResult& aRv);
      77             :   void Get(const nsACString& aName, nsACString& aValue, ErrorResult& aRv) const;
      78             :   void GetFirst(const nsACString& aName, nsACString& aValue, ErrorResult& aRv) const;
      79             :   bool Has(const nsACString& aName, ErrorResult& aRv) const;
      80             :   void Set(const nsACString& aName, const nsACString& aValue, ErrorResult& aRv);
      81             : 
      82           0 :   uint32_t GetIterableLength() const
      83             :   {
      84           0 :     return mList.Length();
      85             :   }
      86           0 :   const NS_ConvertASCIItoUTF16 GetKeyAtIndex(unsigned aIndex) const
      87             :   {
      88           0 :     MOZ_ASSERT(aIndex < mList.Length());
      89           0 :     return NS_ConvertASCIItoUTF16(mList[aIndex].mName);
      90             :   }
      91           0 :   const NS_ConvertASCIItoUTF16 GetValueAtIndex(unsigned aIndex) const
      92             :   {
      93           0 :     MOZ_ASSERT(aIndex < mList.Length());
      94           0 :     return NS_ConvertASCIItoUTF16(mList[aIndex].mValue);
      95             :   }
      96             : 
      97             :   void Clear();
      98             : 
      99           4 :   HeadersGuardEnum Guard() const { return mGuard; }
     100             :   void SetGuard(HeadersGuardEnum aGuard, ErrorResult& aRv);
     101             : 
     102             :   void Fill(const InternalHeaders& aInit, ErrorResult& aRv);
     103             :   void Fill(const Sequence<Sequence<nsCString>>& aInit, ErrorResult& aRv);
     104             :   void Fill(const Record<nsCString, nsCString>& aInit, ErrorResult& aRv);
     105             :   void FillResponseHeaders(nsIRequest* aRequest);
     106             : 
     107             :   bool HasOnlySimpleHeaders() const;
     108             : 
     109             :   bool HasRevalidationHeaders() const;
     110             : 
     111             :   static already_AddRefed<InternalHeaders>
     112             :   BasicHeaders(InternalHeaders* aHeaders);
     113             : 
     114             :   static already_AddRefed<InternalHeaders>
     115             :   CORSHeaders(InternalHeaders* aHeaders);
     116             : 
     117             :   void
     118             :   GetEntries(nsTArray<InternalHeaders::Entry>& aEntries) const;
     119             : 
     120             :   void
     121             :   GetUnsafeHeaders(nsTArray<nsCString>& aNames) const;
     122             : private:
     123             :   virtual ~InternalHeaders();
     124             : 
     125             :   static bool IsInvalidName(const nsACString& aName, ErrorResult& aRv);
     126             :   static bool IsInvalidValue(const nsACString& aValue, ErrorResult& aRv);
     127             :   bool IsImmutable(ErrorResult& aRv) const;
     128             :   bool IsForbiddenRequestHeader(const nsACString& aName) const;
     129             :   bool IsForbiddenRequestNoCorsHeader(const nsACString& aName) const;
     130             :   bool IsForbiddenRequestNoCorsHeader(const nsACString& aName,
     131             :                                       const nsACString& aValue) const;
     132             :   bool IsForbiddenResponseHeader(const nsACString& aName) const;
     133             : 
     134           2 :   bool IsInvalidMutableHeader(const nsACString& aName,
     135             :                               ErrorResult& aRv) const
     136             :   {
     137           2 :     return IsInvalidMutableHeader(aName, EmptyCString(), aRv);
     138             :   }
     139             : 
     140           6 :   bool IsInvalidMutableHeader(const nsACString& aName,
     141             :                               const nsACString& aValue,
     142             :                               ErrorResult& aRv) const
     143             :   {
     144          12 :     return IsInvalidName(aName, aRv) ||
     145          12 :            IsInvalidValue(aValue, aRv) ||
     146          12 :            IsImmutable(aRv) ||
     147          12 :            IsForbiddenRequestHeader(aName) ||
     148          18 :            IsForbiddenRequestNoCorsHeader(aName, aValue) ||
     149          12 :            IsForbiddenResponseHeader(aName);
     150             :   }
     151             : 
     152             :   static bool IsSimpleHeader(const nsACString& aName,
     153             :                              const nsACString& aValue);
     154             : 
     155             :   static bool IsRevalidationHeader(const nsACString& aName);
     156             : };
     157             : 
     158             : } // namespace dom
     159             : } // namespace mozilla
     160             : 
     161             : #endif // mozilla_dom_InternalHeaders_h

Generated by: LCOV version 1.13