15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Intel Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/Performance.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h" 381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/ResourceTimingInfo.h" 391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/PerformanceResourceTiming.h" 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/PerformanceUserTiming.h" 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h" 420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/CurrentTime.h" 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const size_t defaultResourceTimingBufferSize = 150; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Performance::Performance(LocalFrame* frame) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : DOMWindowProperty(frame) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_resourceTimingBufferSize(defaultResourceTimingBufferSize) 5143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) , m_referenceTime(frame && frame->host() ? frame->document()->loader()->timing()->referenceMonotonicTime() : 0.0) 52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_userTiming(nullptr) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Performance::~Performance() 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& Performance::interfaceName() const 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return EventTargetNames::Performance; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext* Performance::executionContext() const 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame()) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frame()->document(); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<MemoryInfo> Performance::memory() const 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return MemoryInfo::create(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PerformanceNavigation* Performance::navigation() const 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_navigation) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_navigation = PerformanceNavigation::create(m_frame); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_navigation.get(); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PerformanceTiming* Performance::timing() const 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_timing) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timing = PerformanceTiming::create(m_frame); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_timing.get(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PerformanceEntryVector Performance::getEntries() const 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PerformanceEntryVector entries; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_resourceTimingBuffer); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_userTiming) { 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMarks()); 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMeasures()); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return entries; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PerformanceEntryVector Performance::getEntriesByType(const String& entryType) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PerformanceEntryVector entries; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (equalIgnoringCase(entryType, "resource")) 113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (PerformanceEntryVector::const_iterator resource = m_resourceTimingBuffer.begin(); resource != m_resourceTimingBuffer.end(); ++resource) 11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) entries.append(*resource); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_userTiming) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (equalIgnoringCase(entryType, "mark")) 118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMarks()); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (equalIgnoringCase(entryType, "measure")) 120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMeasures()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return entries; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PerformanceEntryVector Performance::getEntriesByName(const String& name, const String& entryType) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PerformanceEntryVector entries; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (entryType.isNull() || equalIgnoringCase(entryType, "resource")) 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (PerformanceEntryVector::const_iterator resource = m_resourceTimingBuffer.begin(); resource != m_resourceTimingBuffer.end(); ++resource) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((*resource)->name() == name) 13453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) entries.append(*resource); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_userTiming) { 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (entryType.isNull() || equalIgnoringCase(entryType, "mark")) 138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMarks(name)); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (entryType.isNull() || equalIgnoringCase(entryType, "measure")) 140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) entries.appendVector(m_userTiming->getMeasures(name)); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return entries; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Performance::webkitClearResourceTimings() 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resourceTimingBuffer.clear(); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Performance::webkitSetResourceTimingBufferSize(unsigned size) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resourceTimingBufferSize = size; 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isResourceTimingBufferFull()) 1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfull)); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 159d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static bool passesTimingAllowCheck(const ResourceResponse& response, Document* requestingDocument, const AtomicString& originalTimingAllowOrigin) 16083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 16183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch AtomicallyInitializedStatic(AtomicString&, timingAllowOrigin = *new AtomicString("timing-allow-origin")); 16283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 16383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch RefPtr<SecurityOrigin> resourceOrigin = SecurityOrigin::create(response.url()); 16483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch if (resourceOrigin->isSameSchemeHostPort(requestingDocument->securityOrigin())) 16583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return true; 16683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) const AtomicString& timingAllowOriginString = originalTimingAllowOrigin.isEmpty() ? response.httpHeaderField(timingAllowOrigin) : originalTimingAllowOrigin; 16883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch if (timingAllowOriginString.isEmpty() || equalIgnoringCase(timingAllowOriginString, "null")) 16983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return false; 17083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 171a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (timingAllowOriginString == starAtom) 17283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return true; 17383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 17483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch const String& securityOrigin = requestingDocument->securityOrigin()->toString(); 17583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch Vector<String> timingAllowOrigins; 176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch timingAllowOriginString.string().split(' ', timingAllowOrigins); 17783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch for (size_t i = 0; i < timingAllowOrigins.size(); ++i) { 17883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch if (timingAllowOrigins[i] == securityOrigin) 17983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return true; 18083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch } 18183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 18283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return false; 18383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 18483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 18583750176c3ee2cea66c8a9751271026a5901be3aBen Murdochstatic bool allowsTimingRedirect(const Vector<ResourceResponse>& redirectChain, const ResourceResponse& finalResponse, Document* initiatorDocument) 18683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!passesTimingAllowCheck(finalResponse, initiatorDocument, emptyAtom)) 18883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return false; 18983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 19083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch for (size_t i = 0; i < redirectChain.size(); i++) { 191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!passesTimingAllowCheck(redirectChain[i], initiatorDocument, emptyAtom)) 19283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return false; 19383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch } 19483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 19583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return true; 19683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 19783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 19883750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid Performance::addResourceTiming(const ResourceTimingInfo& info, Document* initiatorDocument) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isResourceTimingBufferFull()) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch const ResourceResponse& finalResponse = info.finalResponse(); 204d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool allowTimingDetails = passesTimingAllowCheck(finalResponse, initiatorDocument, info.originalTimingAllowOrigin()); 20583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch double startTime = info.initialTime(); 20683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 20783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch if (info.redirectChain().isEmpty()) { 208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, allowTimingDetails); 20983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch addResourceTimingBuffer(entry); 21083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return; 21183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch } 21283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 21383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch const Vector<ResourceResponse>& redirectChain = info.redirectChain(); 21483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch bool allowRedirectDetails = allowsTimingRedirect(redirectChain, finalResponse, initiatorDocument); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!allowRedirectDetails) { 21783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ResourceLoadTiming* finalTiming = finalResponse.resourceLoadTiming(); 21883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(finalTiming); 21902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (finalTiming) 22002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch startTime = finalTiming->requestTime; 22183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch } 22283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 22383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ResourceLoadTiming* lastRedirectTiming = redirectChain.last().resourceLoadTiming(); 22483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(lastRedirectTiming); 22583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch double lastRedirectEndTime = lastRedirectTiming->receiveHeadersEnd; 22683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(info, initiatorDocument, startTime, lastRedirectEndTime, allowTimingDetails, allowRedirectDetails); 22883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch addResourceTimingBuffer(entry); 22983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 23083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void Performance::addResourceTimingBuffer(PassRefPtrWillBeRawPtr<PerformanceEntry> entry) 23283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resourceTimingBuffer.append(entry); 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isResourceTimingBufferFull()) 2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) dispatchEvent(Event::create(EventTypeNames::webkitresourcetimingbufferfull)); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Performance::isResourceTimingBufferFull() 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_resourceTimingBuffer.size() >= m_resourceTimingBufferSize; 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Performance::mark(const String& markName, ExceptionState& exceptionState) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_userTiming) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming = UserTiming::create(this); 24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_userTiming->mark(markName, exceptionState); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void Performance::clearMarks(const String& markName) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_userTiming) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming = UserTiming::create(this); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming->clearMarks(markName); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Performance::measure(const String& measureName, const String& startMark, const String& endMark, ExceptionState& exceptionState) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_userTiming) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming = UserTiming::create(this); 26251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_userTiming->measure(measureName, startMark, endMark, exceptionState); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void Performance::clearMeasures(const String& measureName) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_userTiming) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming = UserTiming::create(this); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_userTiming->clearMeasures(measureName); 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double Performance::now() const 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 274c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return 1000.0 * (monotonicallyIncreasingTime() - m_referenceTime); 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void Performance::trace(Visitor* visitor) 278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_navigation); 280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_timing); 281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_resourceTimingBuffer); 282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_userTiming); 283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) EventTargetWithInlineData::trace(visitor); 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DOMWindowProperty::trace(visitor); 285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 288