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

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

Issue 2550883003: nav timing 2 redirect allow opt-in (Closed)
Patch Set: addressed comments and added unit tests Created 4 years 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 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 void PerformanceBase::clearFrameTimings() { 218 void PerformanceBase::clearFrameTimings() {
219 m_frameTimingBuffer.clear(); 219 m_frameTimingBuffer.clear();
220 } 220 }
221 221
222 void PerformanceBase::setFrameTimingBufferSize(unsigned size) { 222 void PerformanceBase::setFrameTimingBufferSize(unsigned size) {
223 m_frameTimingBufferSize = size; 223 m_frameTimingBufferSize = size;
224 if (isFrameTimingBufferFull()) 224 if (isFrameTimingBufferFull())
225 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull)); 225 dispatchEvent(Event::create(EventTypeNames::frametimingbufferfull));
226 } 226 }
227 227
228 static bool passesTimingAllowCheck( 228 bool PerformanceBase::passesTimingAllowCheck(
229 const ResourceResponse& response, 229 const ResourceResponse& response,
230 const SecurityOrigin& initiatorSecurityOrigin, 230 const SecurityOrigin& initiatorSecurityOrigin,
231 const AtomicString& originalTimingAllowOrigin, 231 const AtomicString& originalTimingAllowOrigin,
232 ExecutionContext* context) { 232 ExecutionContext* context) {
233 RefPtr<SecurityOrigin> resourceOrigin = 233 RefPtr<SecurityOrigin> resourceOrigin =
234 SecurityOrigin::create(response.url()); 234 SecurityOrigin::create(response.url());
235 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin)) 235 if (resourceOrigin->isSameSchemeHostPort(&initiatorSecurityOrigin))
236 return true; 236 return true;
237 237
238 const AtomicString& timingAllowOriginString = 238 const AtomicString& timingAllowOriginString =
(...skipping 17 matching lines...) Expand all
256 else if (timingAllowOrigins.size() == 1) 256 else if (timingAllowOrigins.size() == 1)
257 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin); 257 UseCounter::count(context, UseCounter::SingleOriginInTimingAllowOrigin);
258 for (const String& allowOrigin : timingAllowOrigins) { 258 for (const String& allowOrigin : timingAllowOrigins) {
259 if (allowOrigin == securityOrigin) 259 if (allowOrigin == securityOrigin)
260 return true; 260 return true;
261 } 261 }
262 262
263 return false; 263 return false;
264 } 264 }
265 265
266 static bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, 266 bool PerformanceBase::allowsTimingRedirect(
267 const ResourceResponse& finalResponse, 267 const Vector<ResourceResponse>& redirectChain,
268 const SecurityOrigin& initiatorSecurityOrigin, 268 const ResourceResponse& finalResponse,
269 ExecutionContext* context) { 269 const SecurityOrigin& initiatorSecurityOrigin,
270 ExecutionContext* context) {
270 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin, 271 if (!passesTimingAllowCheck(finalResponse, initiatorSecurityOrigin,
271 AtomicString(), context)) 272 AtomicString(), context))
272 return false; 273 return false;
273 274
274 for (const ResourceResponse& response : redirectChain) { 275 for (const ResourceResponse& response : redirectChain) {
275 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin, 276 if (!passesTimingAllowCheck(response, initiatorSecurityOrigin,
276 AtomicString(), context)) 277 AtomicString(), context))
277 return false; 278 return false;
278 } 279 }
279 280
280 return true; 281 return true;
281 } 282 }
282 283
284 SecurityOrigin* PerformanceBase::getSecurityOrigin() const {
panicker 2016/12/07 00:40:52 Nit: prefer moving to anonymous namespace here as
sunjian 2016/12/07 20:10:32 Done.
285 ExecutionContext* context = getExecutionContext();
286 if (context)
287 return context->getSecurityOrigin();
288 return nullptr;
289 }
290
283 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) { 291 void PerformanceBase::addResourceTiming(const ResourceTimingInfo& info) {
284 if (isResourceTimingBufferFull() && 292 if (isResourceTimingBufferFull() &&
285 !hasObserverFor(PerformanceEntry::Resource)) 293 !hasObserverFor(PerformanceEntry::Resource))
286 return; 294 return;
287 SecurityOrigin* securityOrigin = nullptr;
288 ExecutionContext* context = getExecutionContext(); 295 ExecutionContext* context = getExecutionContext();
289 if (context) 296 SecurityOrigin* securityOrigin = getSecurityOrigin();
290 securityOrigin = context->getSecurityOrigin();
291 if (!securityOrigin) 297 if (!securityOrigin)
292 return; 298 return;
293 299
294 const ResourceResponse& finalResponse = info.finalResponse(); 300 const ResourceResponse& finalResponse = info.finalResponse();
295 bool allowTimingDetails = 301 bool allowTimingDetails =
296 passesTimingAllowCheck(finalResponse, *securityOrigin, 302 passesTimingAllowCheck(finalResponse, *securityOrigin,
297 info.originalTimingAllowOrigin(), context); 303 info.originalTimingAllowOrigin(), context);
298 double startTime = info.initialTime(); 304 double startTime = info.initialTime();
299 305
300 if (info.redirectChain().isEmpty()) { 306 if (info.redirectChain().isEmpty()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 DCHECK(documentLoader); 344 DCHECK(documentLoader);
339 345
340 const DocumentLoadTiming& documentLoadTiming = documentLoader->timing(); 346 const DocumentLoadTiming& documentLoadTiming = documentLoader->timing();
341 347
342 const DocumentTiming* documentTiming = 348 const DocumentTiming* documentTiming =
343 frame->document() ? &(frame->document()->timing()) : nullptr; 349 frame->document() ? &(frame->document()->timing()) : nullptr;
344 350
345 const ResourceResponse& finalResponse = documentLoader->response(); 351 const ResourceResponse& finalResponse = documentLoader->response();
346 ResourceTimingInfo* resourceTimingInfo = 352 ResourceTimingInfo* resourceTimingInfo =
347 documentLoader->getMainResourceTimingInfo(); 353 documentLoader->getMainResourceTimingInfo();
354
348 // Don't create navigation timing instance when resourceTimingInfo 355 // Don't create navigation timing instance when resourceTimingInfo
349 // is null, which could happen when it is an iframe navigation restored 356 // is null, which could happen when it is an iframe navigation restored
350 // from history, since its location may have been changed after initial 357 // from history, since its location may have been changed after initial
351 // navigation. 358 // navigation.
352 if (!resourceTimingInfo) 359 if (!resourceTimingInfo)
353 return; 360 return;
354 361
355 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming(); 362 ResourceLoadTiming* resourceLoadTiming = finalResponse.resourceLoadTiming();
356 // Don't create a navigation timing instance when 363 // Don't create a navigation timing instance when
357 // resourceLoadTiming is null, which could happen when visiting non-http sites 364 // resourceLoadTiming is null, which could happen when visiting non-http sites
358 // such as about:blank or in some error cases. 365 // such as about:blank or in some error cases.
359 if (!resourceLoadTiming) 366 if (!resourceLoadTiming)
360 return; 367 return;
361 double lastRedirectEndTime = documentLoadTiming.redirectEnd(); 368 double lastRedirectEndTime = documentLoadTiming.redirectEnd();
362 double finishTime = documentLoadTiming.loadEventEnd(); 369 double finishTime = documentLoadTiming.loadEventEnd();
363 370
371 SecurityOrigin* securityOrigin = getSecurityOrigin();
372 if (!securityOrigin)
373 return;
374
375 bool allowRedirectDetails =
376 allowsTimingRedirect(resourceTimingInfo->redirectChain(), finalResponse,
377 *securityOrigin, getExecutionContext());
378
364 unsigned long long transferSize = resourceTimingInfo->transferSize(); 379 unsigned long long transferSize = resourceTimingInfo->transferSize();
365 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength(); 380 unsigned long long encodedBodyLength = finalResponse.encodedBodyLength();
366 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength(); 381 unsigned long long decodedBodyLength = finalResponse.decodedBodyLength();
367 bool didReuseConnection = finalResponse.connectionReused(); 382 bool didReuseConnection = finalResponse.connectionReused();
368 PerformanceNavigationTiming::NavigationType type = 383 PerformanceNavigationTiming::NavigationType type =
369 getNavigationType(documentLoader->getNavigationType(), frame->document()); 384 getNavigationType(documentLoader->getNavigationType(), frame->document());
370 385
371 m_navigationTiming = new PerformanceNavigationTiming( 386 m_navigationTiming = new PerformanceNavigationTiming(
372 timeOrigin(), documentLoadTiming.unloadEventStart(), 387 timeOrigin(), documentLoadTiming.unloadEventStart(),
373 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(), 388 documentLoadTiming.unloadEventEnd(), documentLoadTiming.loadEventStart(),
374 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(), 389 documentLoadTiming.loadEventEnd(), documentLoadTiming.redirectCount(),
375 documentTiming ? documentTiming->domInteractive() : 0, 390 documentTiming ? documentTiming->domInteractive() : 0,
376 documentTiming ? documentTiming->domContentLoadedEventStart() : 0, 391 documentTiming ? documentTiming->domContentLoadedEventStart() : 0,
377 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0, 392 documentTiming ? documentTiming->domContentLoadedEventEnd() : 0,
378 documentTiming ? documentTiming->domComplete() : 0, type, 393 documentTiming ? documentTiming->domComplete() : 0, type,
379 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(), 394 documentLoadTiming.redirectStart(), documentLoadTiming.redirectEnd(),
380 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(), 395 documentLoadTiming.fetchStart(), documentLoadTiming.responseEnd(),
381 documentLoadTiming.hasCrossOriginRedirect(), 396 allowRedirectDetails,
382 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming, 397 documentLoadTiming.hasSameOriginAsPreviousDocument(), resourceLoadTiming,
383 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength, 398 lastRedirectEndTime, finishTime, transferSize, encodedBodyLength,
384 decodedBodyLength, didReuseConnection); 399 decodedBodyLength, didReuseConnection);
385 notifyObserversOfEntry(*m_navigationTiming); 400 notifyObserversOfEntry(*m_navigationTiming);
386 } 401 }
387 402
388 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) { 403 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) {
389 m_resourceTimingBuffer.append(&entry); 404 m_resourceTimingBuffer.append(&entry);
390 405
391 if (isResourceTimingBufferFull()) { 406 if (isResourceTimingBufferFull()) {
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 visitor->trace(m_resourceTimingBuffer); 577 visitor->trace(m_resourceTimingBuffer);
563 visitor->trace(m_navigationTiming); 578 visitor->trace(m_navigationTiming);
564 visitor->trace(m_userTiming); 579 visitor->trace(m_userTiming);
565 visitor->trace(m_observers); 580 visitor->trace(m_observers);
566 visitor->trace(m_activeObservers); 581 visitor->trace(m_activeObservers);
567 visitor->trace(m_suspendedObservers); 582 visitor->trace(m_suspendedObservers);
568 EventTargetWithInlineData::trace(visitor); 583 EventTargetWithInlineData::trace(visitor);
569 } 584 }
570 585
571 } // namespace blink 586 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698