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