Index: Source/core/page/PerformanceTiming.cpp |
diff --git a/Source/core/page/PerformanceTiming.cpp b/Source/core/page/PerformanceTiming.cpp |
deleted file mode 100644 |
index 81214c3c008c66a716dad6eb74b8a18cd9d5b58f..0000000000000000000000000000000000000000 |
--- a/Source/core/page/PerformanceTiming.cpp |
+++ /dev/null |
@@ -1,356 +0,0 @@ |
-/* |
- * Copyright (C) 2010 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "core/page/PerformanceTiming.h" |
- |
-#include "core/dom/Document.h" |
-#include "core/dom/DocumentTiming.h" |
-#include "core/loader/DocumentLoadTiming.h" |
-#include "core/loader/DocumentLoader.h" |
-#include "core/loader/FrameLoader.h" |
-#include "core/page/Frame.h" |
-#include "core/platform/network/ResourceLoadTiming.h" |
-#include "core/platform/network/ResourceResponse.h" |
- |
-namespace WebCore { |
- |
-static unsigned long long toIntegerMilliseconds(double seconds) |
-{ |
- ASSERT(seconds >= 0); |
- return static_cast<unsigned long long>(seconds * 1000.0); |
-} |
- |
-PerformanceTiming::PerformanceTiming(Frame* frame) |
- : DOMWindowProperty(frame) |
-{ |
- ScriptWrappable::init(this); |
-} |
- |
-unsigned long long PerformanceTiming::navigationStart() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->navigationStart()); |
-} |
- |
-unsigned long long PerformanceTiming::unloadEventStart() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- if (timing->hasCrossOriginRedirect() || !timing->hasSameOriginAsPreviousDocument()) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->unloadEventStart()); |
-} |
- |
-unsigned long long PerformanceTiming::unloadEventEnd() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- if (timing->hasCrossOriginRedirect() || !timing->hasSameOriginAsPreviousDocument()) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->unloadEventEnd()); |
-} |
- |
-unsigned long long PerformanceTiming::redirectStart() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- if (timing->hasCrossOriginRedirect()) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->redirectStart()); |
-} |
- |
-unsigned long long PerformanceTiming::redirectEnd() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- if (timing->hasCrossOriginRedirect()) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->redirectEnd()); |
-} |
- |
-unsigned long long PerformanceTiming::fetchStart() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->fetchStart()); |
-} |
- |
-unsigned long long PerformanceTiming::domainLookupStart() const |
-{ |
- ResourceLoadTiming* timing = resourceLoadTiming(); |
- if (!timing) |
- return fetchStart(); |
- |
- // This will be zero when a DNS request is not performed. |
- // Rather than exposing a special value that indicates no DNS, we "backfill" with fetchStart. |
- double dnsStart = timing->dnsStart; |
- if (dnsStart == 0.0) |
- return fetchStart(); |
- |
- return monotonicTimeToIntegerMilliseconds(dnsStart); |
-} |
- |
-unsigned long long PerformanceTiming::domainLookupEnd() const |
-{ |
- ResourceLoadTiming* timing = resourceLoadTiming(); |
- if (!timing) |
- return domainLookupStart(); |
- |
- // This will be zero when a DNS request is not performed. |
- // Rather than exposing a special value that indicates no DNS, we "backfill" with domainLookupStart. |
- double dnsEnd = timing->dnsEnd; |
- if (dnsEnd == 0.0) |
- return domainLookupStart(); |
- |
- return monotonicTimeToIntegerMilliseconds(dnsEnd); |
-} |
- |
-unsigned long long PerformanceTiming::connectStart() const |
-{ |
- DocumentLoader* loader = documentLoader(); |
- if (!loader) |
- return domainLookupEnd(); |
- |
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); |
- if (!timing) |
- return domainLookupEnd(); |
- |
- // connectStart will be zero when a network request is not made. |
- // Rather than exposing a special value that indicates no new connection, we "backfill" with domainLookupEnd. |
- double connectStart = timing->connectStart; |
- if (connectStart == 0.0 || loader->response().connectionReused()) |
- return domainLookupEnd(); |
- |
- // ResourceLoadTiming's connect phase includes DNS, however Navigation Timing's |
- // connect phase should not. So if there is DNS time, trim it from the start. |
- if (timing->dnsEnd > 0.0 && timing->dnsEnd > connectStart) |
- connectStart = timing->dnsEnd; |
- |
- return monotonicTimeToIntegerMilliseconds(connectStart); |
-} |
- |
-unsigned long long PerformanceTiming::connectEnd() const |
-{ |
- DocumentLoader* loader = documentLoader(); |
- if (!loader) |
- return connectStart(); |
- |
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); |
- if (!timing) |
- return connectStart(); |
- |
- // connectEnd will be zero when a network request is not made. |
- // Rather than exposing a special value that indicates no new connection, we "backfill" with connectStart. |
- double connectEnd = timing->connectEnd; |
- if (connectEnd == 0.0 || loader->response().connectionReused()) |
- return connectStart(); |
- |
- return monotonicTimeToIntegerMilliseconds(connectEnd); |
-} |
- |
-unsigned long long PerformanceTiming::secureConnectionStart() const |
-{ |
- DocumentLoader* loader = documentLoader(); |
- if (!loader) |
- return 0; |
- |
- ResourceLoadTiming* timing = loader->response().resourceLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- double sslStart = timing->sslStart; |
- if (sslStart == 0.0) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(sslStart); |
-} |
- |
-unsigned long long PerformanceTiming::requestStart() const |
-{ |
- ResourceLoadTiming* timing = resourceLoadTiming(); |
- |
- if (!timing || timing->sendStart == 0.0) |
- return connectEnd(); |
- |
- return monotonicTimeToIntegerMilliseconds(timing->sendStart); |
-} |
- |
-unsigned long long PerformanceTiming::responseStart() const |
-{ |
- ResourceLoadTiming* timing = resourceLoadTiming(); |
- if (!timing || timing->receiveHeadersEnd == 0.0) |
- return requestStart(); |
- |
- // FIXME: Response start needs to be the time of the first received byte. |
- // However, the ResourceLoadTiming API currently only supports the time |
- // the last header byte was received. For many responses with reasonable |
- // sized cookies, the HTTP headers fit into a single packet so this time |
- // is basically equivalent. But for some responses, particularly those with |
- // headers larger than a single packet, this time will be too late. |
- return monotonicTimeToIntegerMilliseconds(timing->receiveHeadersEnd); |
-} |
- |
-unsigned long long PerformanceTiming::responseEnd() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->responseEnd()); |
-} |
- |
-unsigned long long PerformanceTiming::domLoading() const |
-{ |
- const DocumentTiming* timing = documentTiming(); |
- if (!timing) |
- return fetchStart(); |
- |
- return monotonicTimeToIntegerMilliseconds(timing->domLoading); |
-} |
- |
-unsigned long long PerformanceTiming::domInteractive() const |
-{ |
- const DocumentTiming* timing = documentTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->domInteractive); |
-} |
- |
-unsigned long long PerformanceTiming::domContentLoadedEventStart() const |
-{ |
- const DocumentTiming* timing = documentTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->domContentLoadedEventStart); |
-} |
- |
-unsigned long long PerformanceTiming::domContentLoadedEventEnd() const |
-{ |
- const DocumentTiming* timing = documentTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->domContentLoadedEventEnd); |
-} |
- |
-unsigned long long PerformanceTiming::domComplete() const |
-{ |
- const DocumentTiming* timing = documentTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->domComplete); |
-} |
- |
-unsigned long long PerformanceTiming::loadEventStart() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->loadEventStart()); |
-} |
- |
-unsigned long long PerformanceTiming::loadEventEnd() const |
-{ |
- DocumentLoadTiming* timing = documentLoadTiming(); |
- if (!timing) |
- return 0; |
- |
- return monotonicTimeToIntegerMilliseconds(timing->loadEventEnd()); |
-} |
- |
-DocumentLoader* PerformanceTiming::documentLoader() const |
-{ |
- if (!m_frame) |
- return 0; |
- |
- return m_frame->loader()->documentLoader(); |
-} |
- |
-const DocumentTiming* PerformanceTiming::documentTiming() const |
-{ |
- if (!m_frame) |
- return 0; |
- |
- Document* document = m_frame->document(); |
- if (!document) |
- return 0; |
- |
- return document->timing(); |
-} |
- |
-DocumentLoadTiming* PerformanceTiming::documentLoadTiming() const |
-{ |
- DocumentLoader* loader = documentLoader(); |
- if (!loader) |
- return 0; |
- |
- return loader->timing(); |
-} |
- |
-ResourceLoadTiming* PerformanceTiming::resourceLoadTiming() const |
-{ |
- DocumentLoader* loader = documentLoader(); |
- if (!loader) |
- return 0; |
- |
- return loader->response().resourceLoadTiming(); |
-} |
- |
-unsigned long long PerformanceTiming::monotonicTimeToIntegerMilliseconds(double monotonicSeconds) const |
-{ |
- ASSERT(monotonicSeconds >= 0); |
- const DocumentLoadTiming* timing = documentLoadTiming(); |
- ASSERT(timing); |
- return toIntegerMilliseconds(timing->monotonicTimeToPseudoWallTime(monotonicSeconds)); |
-} |
- |
-} // namespace WebCore |