summaryrefslogtreecommitdiffstats
path: root/uriloader/preload/PreloadHashKey.h
blob: 8db49c1b185c0239296d8a352ef10bfe0cfd3087 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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 PreloadHashKey_h__
#define PreloadHashKey_h__

#include "mozilla/CORSMode.h"
#include "mozilla/css/SheetParsingMode.h"
#include "js/loader/ScriptKind.h"
#include "nsURIHashKey.h"

class nsIPrincipal;

namespace JS::loader {
enum class ScriptKind;
}

namespace mozilla {

namespace css {
class SheetLoadData;
}

/**
 * This key is used for coalescing and lookup of preloading or regular
 * speculative loads.  It consists of:
 * - the resource type, which is the value of the 'as' attribute
 * - the URI of the resource
 * - set of attributes that is common to all resource types
 * - resource-type-specific attributes that we use to distinguish loads that has
 *   to be treated separately, some of these attributes may remain at their
 *   default values
 */
class PreloadHashKey : public nsURIHashKey {
 public:
  enum class ResourceType : uint8_t { NONE, SCRIPT, STYLE, IMAGE, FONT, FETCH };

  using KeyType = const PreloadHashKey&;
  using KeyTypePointer = const PreloadHashKey*;

  PreloadHashKey() = default;
  PreloadHashKey(const nsIURI* aKey, ResourceType aAs);
  explicit PreloadHashKey(const PreloadHashKey* aKey);
  PreloadHashKey(PreloadHashKey&& aToMove);

  PreloadHashKey& operator=(const PreloadHashKey& aOther);

  // Construct key for "script"
  static PreloadHashKey CreateAsScript(nsIURI* aURI, CORSMode aCORSMode,
                                       JS::loader::ScriptKind aScriptKind);
  static PreloadHashKey CreateAsScript(nsIURI* aURI,
                                       const nsAString& aCrossOrigin,
                                       const nsAString& aType);

  // Construct key for "style"
  static PreloadHashKey CreateAsStyle(nsIURI* aURI, nsIPrincipal* aPrincipal,
                                      CORSMode aCORSMode,
                                      css::SheetParsingMode aParsingMode);
  static PreloadHashKey CreateAsStyle(css::SheetLoadData&);

  // Construct key for "image"
  static PreloadHashKey CreateAsImage(nsIURI* aURI, nsIPrincipal* aPrincipal,
                                      CORSMode aCORSMode);

  // Construct key for "fetch"
  static PreloadHashKey CreateAsFetch(nsIURI* aURI, CORSMode aCORSMode);
  static PreloadHashKey CreateAsFetch(nsIURI* aURI,
                                      const nsAString& aCrossOrigin);

  // Construct key for "font"
  static PreloadHashKey CreateAsFont(nsIURI* aURI, CORSMode aCORSMode);

  KeyType GetKey() const { return *this; }
  KeyTypePointer GetKeyPointer() const { return this; }
  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }

  bool KeyEquals(KeyTypePointer aOther) const;
  static PLDHashNumber HashKey(KeyTypePointer aKey);
  ResourceType As() const { return mAs; }

#ifdef MOZILLA_INTERNAL_API
  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
    // Bug 1627752
    return 0;
  }
#endif

  enum { ALLOW_MEMMOVE = true };

 private:
  // Attributes common to all resource types
  ResourceType mAs = ResourceType::NONE;

  CORSMode mCORSMode = CORS_NONE;
  nsCOMPtr<nsIPrincipal> mPrincipal;

  struct {
    JS::loader::ScriptKind mScriptKind = JS::loader::ScriptKind::eClassic;
  } mScript;

  struct {
    css::SheetParsingMode mParsingMode = css::eAuthorSheetFeatures;
  } mStyle;
};

}  // namespace mozilla

#endif