File: PreloadRequest.h

package info (click to toggle)
chromium-browser 57.0.2987.98-1~deb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,637,852 kB
  • ctags: 2,544,394
  • sloc: cpp: 12,815,961; ansic: 3,676,222; python: 1,147,112; asm: 526,608; java: 523,212; xml: 286,794; perl: 92,654; sh: 86,408; objc: 73,271; makefile: 27,698; cs: 18,487; yacc: 13,031; tcl: 12,957; pascal: 4,875; ml: 4,716; lex: 3,904; sql: 3,862; ruby: 1,982; lisp: 1,508; php: 1,368; exp: 404; awk: 325; csh: 117; jsp: 39; sed: 37
file content (143 lines) | stat: -rw-r--r-- 5,131 bytes parent folder | download
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PreloadRequest_h
#define PreloadRequest_h

#include "core/fetch/ClientHintsPreferences.h"
#include "core/fetch/FetchRequest.h"
#include "core/fetch/IntegrityMetadata.h"
#include "core/fetch/Resource.h"
#include "platform/CrossOriginAttributeValue.h"
#include "platform/weborigin/SecurityPolicy.h"
#include "wtf/Allocator.h"
#include "wtf/PtrUtil.h"
#include "wtf/text/TextPosition.h"
#include <memory>

namespace blink {

class Document;

class PreloadRequest {
  USING_FAST_MALLOC(PreloadRequest);

 public:
  enum RequestType {
    RequestTypePreload,
    RequestTypePreconnect,
    RequestTypeLinkRelPreload
  };

  // TODO(csharrison): Move the implementation to the cpp file when core/html
  // gets its own testing source set in html/BUILD.gn.
  static std::unique_ptr<PreloadRequest> createIfNeeded(
      const String& initiatorName,
      const TextPosition& initiatorPosition,
      const String& resourceURL,
      const KURL& baseURL,
      Resource::Type resourceType,
      const ReferrerPolicy referrerPolicy,
      const FetchRequest::ResourceWidth& resourceWidth =
          FetchRequest::ResourceWidth(),
      const ClientHintsPreferences& clientHintsPreferences =
          ClientHintsPreferences(),
      RequestType requestType = RequestTypePreload) {
    // Never preload data URLs. We also disallow relative ref URLs which become
    // data URLs if the document's URL is a data URL. We don't want to create
    // extra resource requests with data URLs to avoid copy / initialization
    // overhead, which can be significant for large URLs.
    if (resourceURL.isEmpty() || resourceURL.startsWith("#") ||
        protocolIs(resourceURL, "data")) {
      return nullptr;
    }
    return WTF::wrapUnique(new PreloadRequest(
        initiatorName, initiatorPosition, resourceURL, baseURL, resourceType,
        resourceWidth, clientHintsPreferences, requestType, referrerPolicy));
  }

  bool isSafeToSendToAnotherThread() const;

  Resource* start(Document*);

  double discoveryTime() const { return m_discoveryTime; }
  void setDefer(FetchRequest::DeferOption defer) { m_defer = defer; }
  void setCharset(const String& charset) { m_charset = charset.isolatedCopy(); }
  void setCrossOrigin(CrossOriginAttributeValue crossOrigin) {
    m_crossOrigin = crossOrigin;
  }
  CrossOriginAttributeValue crossOrigin() const { return m_crossOrigin; }

  void setNonce(const String& nonce) { m_nonce = nonce.isolatedCopy(); }
  const String& nonce() const { return m_nonce; }

  Resource::Type resourceType() const { return m_resourceType; }

  const String& resourceURL() const { return m_resourceURL; }
  float resourceWidth() const {
    return m_resourceWidth.isSet ? m_resourceWidth.width : 0;
  }
  const KURL& baseURL() const { return m_baseURL; }
  bool isPreconnect() const { return m_requestType == RequestTypePreconnect; }
  bool isLinkRelPreload() const {
    return m_requestType == RequestTypeLinkRelPreload;
  }
  const ClientHintsPreferences& preferences() const {
    return m_clientHintsPreferences;
  }
  ReferrerPolicy getReferrerPolicy() const { return m_referrerPolicy; }
  void setIntegrityMetadata(const IntegrityMetadataSet& metadataSet) {
    m_integrityMetadata = metadataSet;
  }
  const IntegrityMetadataSet& integrityMetadata() const {
    return m_integrityMetadata;
  }

 private:
  PreloadRequest(const String& initiatorName,
                 const TextPosition& initiatorPosition,
                 const String& resourceURL,
                 const KURL& baseURL,
                 Resource::Type resourceType,
                 const FetchRequest::ResourceWidth& resourceWidth,
                 const ClientHintsPreferences& clientHintsPreferences,
                 RequestType requestType,
                 const ReferrerPolicy referrerPolicy)
      : m_initiatorName(initiatorName),
        m_initiatorPosition(initiatorPosition),
        m_resourceURL(resourceURL.isolatedCopy()),
        m_baseURL(baseURL.copy()),
        m_resourceType(resourceType),
        m_crossOrigin(CrossOriginAttributeNotSet),
        m_discoveryTime(monotonicallyIncreasingTime()),
        m_defer(FetchRequest::NoDefer),
        m_resourceWidth(resourceWidth),
        m_clientHintsPreferences(clientHintsPreferences),
        m_requestType(requestType),
        m_referrerPolicy(referrerPolicy) {}

  KURL completeURL(Document*);

  String m_initiatorName;
  TextPosition m_initiatorPosition;
  String m_resourceURL;
  KURL m_baseURL;
  String m_charset;
  Resource::Type m_resourceType;
  CrossOriginAttributeValue m_crossOrigin;
  String m_nonce;
  double m_discoveryTime;
  FetchRequest::DeferOption m_defer;
  FetchRequest::ResourceWidth m_resourceWidth;
  ClientHintsPreferences m_clientHintsPreferences;
  RequestType m_requestType;
  ReferrerPolicy m_referrerPolicy;
  IntegrityMetadataSet m_integrityMetadata;
};

typedef Vector<std::unique_ptr<PreloadRequest>> PreloadRequestStream;

}  // namespace blink

#endif