Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: third_party/WebKit/Source/core/dom/PendingScript.cpp

Issue 2693423002: Do not re-initialize PendingScript in HTMLParserScriptRunner (Closed)
Patch Set: Reflect comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 17 matching lines...) Expand all
28 #include "bindings/core/v8/ScriptSourceCode.h" 28 #include "bindings/core/v8/ScriptSourceCode.h"
29 #include "core/dom/Element.h" 29 #include "core/dom/Element.h"
30 #include "core/frame/SubresourceIntegrity.h" 30 #include "core/frame/SubresourceIntegrity.h"
31 #include "platform/SharedBuffer.h" 31 #include "platform/SharedBuffer.h"
32 #include "wtf/CurrentTime.h" 32 #include "wtf/CurrentTime.h"
33 33
34 namespace blink { 34 namespace blink {
35 35
36 PendingScript* PendingScript::create(Element* element, 36 PendingScript* PendingScript::create(Element* element,
37 ScriptResource* resource) { 37 ScriptResource* resource) {
38 return new PendingScript(element, resource); 38 return new PendingScript(element, resource, TextPosition());
39 } 39 }
40 40
41 PendingScript::PendingScript(Element* element, ScriptResource* resource) 41 PendingScript* PendingScript::create(Element* element,
42 const TextPosition& startingPosition) {
43 return new PendingScript(element, nullptr, startingPosition);
44 }
45
46 PendingScript* PendingScript::createForTesting(ScriptResource* resource) {
47 return new PendingScript(nullptr, resource, TextPosition(), true);
48 }
49
50 PendingScript::PendingScript(Element* element,
51 ScriptResource* resource,
52 const TextPosition& startingPosition,
53 bool isForTesting)
42 : m_watchingForLoad(false), 54 : m_watchingForLoad(false),
43 m_element(element), 55 m_element(element),
56 m_startingPosition(startingPosition),
44 m_integrityFailure(false), 57 m_integrityFailure(false),
45 m_parserBlockingLoadStartTime(0), 58 m_parserBlockingLoadStartTime(0),
46 m_client(nullptr) { 59 m_client(nullptr),
47 setScriptResource(resource); 60 m_isForTesting(isForTesting) {
61 CHECK(m_isForTesting || m_element);
62 setResource(resource);
48 MemoryCoordinator::instance().registerClient(this); 63 MemoryCoordinator::instance().registerClient(this);
49 } 64 }
50 65
51 PendingScript::~PendingScript() {} 66 PendingScript::~PendingScript() {}
52 67
53 void PendingScript::dispose() { 68 void PendingScript::dispose() {
54 stopWatchingForLoad(); 69 stopWatchingForLoad();
55 DCHECK(!m_client); 70 DCHECK(!m_client);
56 DCHECK(!m_watchingForLoad); 71 DCHECK(!m_watchingForLoad);
57 72
58 setScriptResource(nullptr); 73 setResource(nullptr);
59 m_startingPosition = TextPosition::belowRangePosition(); 74 m_startingPosition = TextPosition::belowRangePosition();
60 m_integrityFailure = false; 75 m_integrityFailure = false;
61 m_parserBlockingLoadStartTime = 0; 76 m_parserBlockingLoadStartTime = 0;
62 if (m_streamer) 77 if (m_streamer)
63 m_streamer->cancel(); 78 m_streamer->cancel();
64 m_streamer = nullptr; 79 m_streamer = nullptr;
65 m_element = nullptr; 80 m_element = nullptr;
66 } 81 }
67 82
68 void PendingScript::watchForLoad(PendingScriptClient* client) { 83 void PendingScript::watchForLoad(PendingScriptClient* client) {
(...skipping 10 matching lines...) Expand all
79 } 94 }
80 95
81 void PendingScript::stopWatchingForLoad() { 96 void PendingScript::stopWatchingForLoad() {
82 if (!m_watchingForLoad) 97 if (!m_watchingForLoad)
83 return; 98 return;
84 DCHECK(resource()); 99 DCHECK(resource());
85 m_client = nullptr; 100 m_client = nullptr;
86 m_watchingForLoad = false; 101 m_watchingForLoad = false;
87 } 102 }
88 103
104 Element* PendingScript::element() const {
105 // As mentioned in the comment at |m_element| declaration, |m_element|
106 // must points to the corresponding ScriptLoader's element.
107 CHECK(m_element);
108 return m_element.get();
109 }
110
89 void PendingScript::streamingFinished() { 111 void PendingScript::streamingFinished() {
90 DCHECK(resource()); 112 DCHECK(resource());
91 if (m_client) 113 if (m_client)
92 m_client->pendingScriptFinished(this); 114 m_client->pendingScriptFinished(this);
93 } 115 }
94 116
95 void PendingScript::setElement(Element* element) {
96 m_element = element;
97 }
98
99 void PendingScript::setScriptResource(ScriptResource* resource) {
100 setResource(resource);
101 }
102
103 void PendingScript::markParserBlockingLoadStartTime() { 117 void PendingScript::markParserBlockingLoadStartTime() {
104 DCHECK_EQ(m_parserBlockingLoadStartTime, 0.0); 118 DCHECK_EQ(m_parserBlockingLoadStartTime, 0.0);
105 m_parserBlockingLoadStartTime = monotonicallyIncreasingTime(); 119 m_parserBlockingLoadStartTime = monotonicallyIncreasingTime();
106 } 120 }
107 121
108 void PendingScript::notifyFinished(Resource* resource) { 122 void PendingScript::notifyFinished(Resource* resource) {
109 // The following SRI checks need to be here because, unfortunately, fetches 123 // The following SRI checks need to be here because, unfortunately, fetches
110 // are not done purely according to the Fetch spec. In particular, 124 // are not done purely according to the Fetch spec. In particular,
111 // different requests for the same resource do not have different 125 // different requests for the same resource do not have different
112 // responses; the memory cache can (and will) return the exact same 126 // responses; the memory cache can (and will) return the exact same
113 // Resource object. 127 // Resource object.
114 // 128 //
115 // For different requests, the same Resource object will be returned and 129 // For different requests, the same Resource object will be returned and
116 // will not be associated with the particular request. Therefore, when the 130 // will not be associated with the particular request. Therefore, when the
117 // body of the response comes in, there's no way to validate the integrity 131 // body of the response comes in, there's no way to validate the integrity
118 // of the Resource object against a particular request (since there may be 132 // of the Resource object against a particular request (since there may be
119 // several pending requests all tied to the identical object, and the 133 // several pending requests all tied to the identical object, and the
120 // actual requests are not stored). 134 // actual requests are not stored).
121 // 135 //
122 // In order to simulate the correct behavior, Blink explicitly does the SRI 136 // In order to simulate the correct behavior, Blink explicitly does the SRI
123 // checks here, when a PendingScript tied to a particular request is 137 // checks here, when a PendingScript tied to a particular request is
124 // finished (and in the case of a StyleSheet, at the point of execution), 138 // finished (and in the case of a StyleSheet, at the point of execution),
125 // while having proper Fetch checks in the fetch module for use in the 139 // while having proper Fetch checks in the fetch module for use in the
126 // fetch JavaScript API. In a future world where the ResourceFetcher uses 140 // fetch JavaScript API. In a future world where the ResourceFetcher uses
127 // the Fetch algorithm, this should be fixed by having separate Response 141 // the Fetch algorithm, this should be fixed by having separate Response
128 // objects (perhaps attached to identical Resource objects) per request. 142 // objects (perhaps attached to identical Resource objects) per request.
129 // 143 //
130 // See https://crbug.com/500701 for more information. 144 // See https://crbug.com/500701 for more information.
145 CHECK(m_isForTesting || m_element);
131 if (m_element) { 146 if (m_element) {
132 DCHECK_EQ(resource->getType(), Resource::Script); 147 DCHECK_EQ(resource->getType(), Resource::Script);
133 ScriptResource* scriptResource = toScriptResource(resource); 148 ScriptResource* scriptResource = toScriptResource(resource);
134 String integrityAttr = 149 String integrityAttr =
135 m_element->fastGetAttribute(HTMLNames::integrityAttr); 150 m_element->fastGetAttribute(HTMLNames::integrityAttr);
136 151
137 // It is possible to get back a script resource with integrity metadata 152 // It is possible to get back a script resource with integrity metadata
138 // for a request with an empty integrity attribute. In that case, the 153 // for a request with an empty integrity attribute. In that case, the
139 // integrity check should be skipped, so this check ensures that the 154 // integrity check should be skipped, so this check ensures that the
140 // integrity attribute isn't empty in addition to checking if the 155 // integrity attribute isn't empty in addition to checking if the
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 } 234 }
220 235
221 void PendingScript::onPurgeMemory() { 236 void PendingScript::onPurgeMemory() {
222 if (!m_streamer) 237 if (!m_streamer)
223 return; 238 return;
224 m_streamer->cancel(); 239 m_streamer->cancel();
225 m_streamer = nullptr; 240 m_streamer = nullptr;
226 } 241 }
227 242
228 } // namespace blink 243 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698