OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |