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

Side by Side Diff: Source/core/timing/PerformanceBase.cpp

Issue 1185553002: ResourceTiming should not depend on Document (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 6 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 * Copyright (C) 2012 Intel Inc. All rights reserved. 3 * Copyright (C) 2012 Intel Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 m_frameTimingBuffer.clear(); 163 m_frameTimingBuffer.clear();
164 } 164 }
165 165
166 void PerformanceBase::setFrameTimingBufferSize(unsigned size) 166 void PerformanceBase::setFrameTimingBufferSize(unsigned size)
167 { 167 {
168 m_frameTimingBufferSize = size; 168 m_frameTimingBufferSize = size;
169 if (isFrameTimingBufferFull()) 169 if (isFrameTimingBufferFull())
170 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); 170 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull));
171 } 171 }
172 172
173 static bool passesTimingAllowCheck(const ResourceResponse& response, Document* r equestingDocument, const AtomicString& originalTimingAllowOrigin) 173 static bool passesTimingAllowCheck(const ResourceResponse& response, const Secur ityOrigin* initiatorSecurityOrigin, const AtomicString& originalTimingAllowOrigi n)
174 { 174 {
175 AtomicallyInitializedStaticReference(AtomicString, timingAllowOrigin, new At omicString("timing-allow-origin")); 175 AtomicallyInitializedStaticReference(AtomicString, timingAllowOrigin, new At omicString("timing-allow-origin"));
176 176
177 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( )); 177 RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url( ));
178 if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin( ))) 178 if (resourceOrigin->isSameSchemeHostPort(initiatorSecurityOrigin))
179 return true; 179 return true;
180 180
181 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm pty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; 181 const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEm pty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin;
182 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null")) 182 if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOrigin String, "null"))
183 return false; 183 return false;
184 184
185 if (timingAllowOriginString == starAtom) 185 if (timingAllowOriginString == starAtom)
186 return true; 186 return true;
187 187
188 const String& securityOrigin = requestingDocument->securityOrigin()->toStrin g(); 188 const String& securityOrigin = initiatorSecurityOrigin->toString();
189 Vector<String> timingAllowOrigins; 189 Vector<String> timingAllowOrigins;
190 timingAllowOriginString.string().split(' ', timingAllowOrigins); 190 timingAllowOriginString.string().split(' ', timingAllowOrigins);
191 for (const String& allowOrigin : timingAllowOrigins) { 191 for (const String& allowOrigin : timingAllowOrigins) {
192 if (allowOrigin == securityOrigin) 192 if (allowOrigin == securityOrigin)
193 return true; 193 return true;
194 } 194 }
195 195
196 return false; 196 return false;
197 } 197 }
198 198
199 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, Document* initiatorDocument) 199 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, const SecurityOrigin* initiatorSecurityOr igin)
200 { 200 {
201 if (!passesTimingAllowCheck(finalResponse, initiatorDocument, emptyAtom)) 201 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, emptyAto m))
202 return false; 202 return false;
203 203
204 for (const ResourceResponse& response : redirectChain) { 204 for (const ResourceResponse& response : redirectChain) {
205 if (!passesTimingAllowCheck(response, initiatorDocument, emptyAtom)) 205 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, emptyAtom ))
206 return false; 206 return false;
207 } 207 }
208 208
209 return true; 209 return true;
210 } 210 }
211 211
212 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info, Document * initiatorDocument) 212 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info, const Se curityOrigin* initiatorSecurityOrigin)
213 { 213 {
214 if (isResourceTimingBufferFull()) 214 if (isResourceTimingBufferFull())
215 return; 215 return;
216 216
217 const ResourceResponse& finalResponse = info.finalResponse(); 217 const ResourceResponse& finalResponse = info.finalResponse();
218 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDoc ument, info.originalTimingAllowOrigin()); 218 bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorSec urityOrigin, info.originalTimingAllowOrigin());
219 double startTime = info.initialTime(); 219 double startTime = info.initialTime();
220 220
221 if (info.redirectChain().isEmpty()) { 221 if (info.redirectChain().isEmpty()) {
222 PerformanceEntry* entry = PerformanceResourceTiming::create(info, initia torDocument, startTime, allowTimingDetails); 222 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOr igin(), startTime, allowTimingDetails);
223 addResourceTimingBuffer(entry); 223 addResourceTimingBuffer(entry);
224 return; 224 return;
225 } 225 }
226 226
227 const Vector<ResourceResponse>& redirectChain = info.redirectChain(); 227 const Vector<ResourceResponse>& redirectChain = info.redirectChain();
228 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons e, initiatorDocument); 228 bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalRespons e, initiatorSecurityOrigin);
229 229
230 if (!allowRedirectDetails) { 230 if (!allowRedirectDetails) {
231 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); 231 ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming();
232 ASSERT(finalTiming); 232 ASSERT(finalTiming);
233 if (finalTiming) 233 if (finalTiming)
234 startTime = finalTiming->requestTime(); 234 startTime = finalTiming->requestTime();
235 } 235 }
236 236
237 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi ming(); 237 ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTi ming();
238 ASSERT(lastRedirectTiming); 238 ASSERT(lastRedirectTiming);
239 double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd(); 239 double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd();
240 240
241 PerformanceEntry* entry = PerformanceResourceTiming::create(info, initiatorD ocument, startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetail s); 241 PerformanceEntry* entry = PerformanceResourceTiming::create(info, timeOrigin (), startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetails);
242 addResourceTimingBuffer(entry); 242 addResourceTimingBuffer(entry);
243 } 243 }
244 244
245 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry* entry) 245 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry* entry)
246 { 246 {
247 m_resourceTimingBuffer.append(entry); 247 m_resourceTimingBuffer.append(entry);
248 248
249 if (isResourceTimingBufferFull()) 249 if (isResourceTimingBufferFull())
250 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu ll)); 250 dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfu ll));
251 } 251 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 321
322 DEFINE_TRACE(PerformanceBase) 322 DEFINE_TRACE(PerformanceBase)
323 { 323 {
324 visitor->trace(m_frameTimingBuffer); 324 visitor->trace(m_frameTimingBuffer);
325 visitor->trace(m_resourceTimingBuffer); 325 visitor->trace(m_resourceTimingBuffer);
326 visitor->trace(m_userTiming); 326 visitor->trace(m_userTiming);
327 EventTargetWithInlineData::trace(visitor); 327 EventTargetWithInlineData::trace(visitor);
328 } 328 }
329 329
330 } // namespace blink 330 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698