diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/Performance.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/page/Performance.cpp')
-rw-r--r-- | Source/WebCore/page/Performance.cpp | 229 |
1 files changed, 132 insertions, 97 deletions
diff --git a/Source/WebCore/page/Performance.cpp b/Source/WebCore/page/Performance.cpp index b4372f618..c35b0efa0 100644 --- a/Source/WebCore/page/Performance.cpp +++ b/Source/WebCore/page/Performance.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2010 Google Inc. All rights reserved. * Copyright (C) 2012 Intel Inc. All rights reserved. + * Copyright (C) 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -32,203 +33,237 @@ #include "config.h" #include "Performance.h" +#if ENABLE(WEB_TIMING) + #include "Document.h" #include "DocumentLoader.h" +#include "EventNames.h" +#include "Frame.h" #include "PerformanceEntry.h" #include "PerformanceNavigation.h" +#include "PerformanceObserver.h" #include "PerformanceResourceTiming.h" #include "PerformanceTiming.h" #include "PerformanceUserTiming.h" #include "ResourceResponse.h" +#include "ScriptExecutionContext.h" #include <wtf/CurrentTime.h> -#if ENABLE(WEB_TIMING) - -#include "Frame.h" - namespace WebCore { -#if ENABLE(RESOURCE_TIMING) -static const size_t defaultResourceTimingBufferSize = 150; -#endif - -Performance::Performance(Frame* frame) - : DOMWindowProperty(frame) -#if ENABLE(RESOURCE_TIMING) - , m_resourceTimingBufferSize(defaultResourceTimingBufferSize) -#endif // ENABLE(RESOURCE_TIMING) -#if ENABLE(USER_TIMING) - , m_userTiming(0) -#endif // ENABLE(USER_TIMING) +Performance::Performance(ScriptExecutionContext& context, MonotonicTime timeOrigin) + : ContextDestructionObserver(&context) + , m_timeOrigin(timeOrigin) + , m_performanceTimelineTaskQueue(context) { + ASSERT(m_timeOrigin); } Performance::~Performance() { } -ScriptExecutionContext* Performance::scriptExecutionContext() const +void Performance::contextDestroyed() { - if (!frame()) - return 0; - return frame()->document(); + m_performanceTimelineTaskQueue.close(); + + ContextDestructionObserver::contextDestroyed(); } -PerformanceNavigation* Performance::navigation() const +double Performance::now() const { - if (!m_navigation) - m_navigation = PerformanceNavigation::create(m_frame); + Seconds now = MonotonicTime::now() - m_timeOrigin; + return reduceTimeResolution(now).milliseconds(); +} +Seconds Performance::reduceTimeResolution(Seconds seconds) +{ + double resolution = (100_us).seconds(); + double reduced = std::floor(seconds.seconds() / resolution) * resolution; + return Seconds(reduced); +} + +PerformanceNavigation* Performance::navigation() +{ + if (!is<Document>(scriptExecutionContext())) + return nullptr; + + ASSERT(isMainThread()); + if (!m_navigation) + m_navigation = PerformanceNavigation::create(downcast<Document>(*scriptExecutionContext()).frame()); return m_navigation.get(); } -PerformanceTiming* Performance::timing() const +PerformanceTiming* Performance::timing() { - if (!m_timing) - m_timing = PerformanceTiming::create(m_frame); + if (!is<Document>(scriptExecutionContext())) + return nullptr; + ASSERT(isMainThread()); + if (!m_timing) + m_timing = PerformanceTiming::create(downcast<Document>(*scriptExecutionContext()).frame()); return m_timing.get(); } -#if ENABLE(PERFORMANCE_TIMELINE) -PassRefPtr<PerformanceEntryList> Performance::webkitGetEntries() const +Vector<RefPtr<PerformanceEntry>> Performance::getEntries() const { - RefPtr<PerformanceEntryList> entries = PerformanceEntryList::create(); + Vector<RefPtr<PerformanceEntry>> entries; -#if ENABLE(RESOURCE_TIMING) - entries->appendAll(m_resourceTimingBuffer); -#endif // ENABLE(RESOURCE_TIMING) + entries.appendVector(m_resourceTimingBuffer); -#if ENABLE(USER_TIMING) if (m_userTiming) { - entries->appendAll(m_userTiming->getMarks()); - entries->appendAll(m_userTiming->getMeasures()); + entries.appendVector(m_userTiming->getMarks()); + entries.appendVector(m_userTiming->getMeasures()); } -#endif // ENABLE(USER_TIMING) - entries->sort(); + std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); return entries; } -PassRefPtr<PerformanceEntryList> Performance::webkitGetEntriesByType(const String& entryType) +Vector<RefPtr<PerformanceEntry>> Performance::getEntriesByType(const String& entryType) const { - RefPtr<PerformanceEntryList> entries = PerformanceEntryList::create(); + Vector<RefPtr<PerformanceEntry>> entries; -#if ENABLE(RESOURCE_TIMING) - if (equalIgnoringCase(entryType, "resource")) - for (Vector<RefPtr<PerformanceEntry>>::const_iterator resource = m_resourceTimingBuffer.begin(); resource != m_resourceTimingBuffer.end(); ++resource) - entries->append(*resource); -#endif // ENABLE(RESOURCE_TIMING) + if (equalLettersIgnoringASCIICase(entryType, "resource")) + entries.appendVector(m_resourceTimingBuffer); -#if ENABLE(USER_TIMING) if (m_userTiming) { - if (equalIgnoringCase(entryType, "mark")) - entries->appendAll(m_userTiming->getMarks()); - else if (equalIgnoringCase(entryType, "measure")) - entries->appendAll(m_userTiming->getMeasures()); + if (equalLettersIgnoringASCIICase(entryType, "mark")) + entries.appendVector(m_userTiming->getMarks()); + else if (equalLettersIgnoringASCIICase(entryType, "measure")) + entries.appendVector(m_userTiming->getMeasures()); } -#endif // ENABLE(USER_TIMING) - entries->sort(); + std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); return entries; } -PassRefPtr<PerformanceEntryList> Performance::webkitGetEntriesByName(const String& name, const String& entryType) +Vector<RefPtr<PerformanceEntry>> Performance::getEntriesByName(const String& name, const String& entryType) const { - RefPtr<PerformanceEntryList> entries = PerformanceEntryList::create(); + Vector<RefPtr<PerformanceEntry>> entries; -#if ENABLE(RESOURCE_TIMING) - if (entryType.isNull() || equalIgnoringCase(entryType, "resource")) - for (Vector<RefPtr<PerformanceEntry>>::const_iterator resource = m_resourceTimingBuffer.begin(); resource != m_resourceTimingBuffer.end(); ++resource) - if ((*resource)->name() == name) - entries->append(*resource); -#endif // ENABLE(RESOURCE_TIMING) + if (entryType.isNull() || equalLettersIgnoringASCIICase(entryType, "resource")) { + for (auto& resource : m_resourceTimingBuffer) { + if (resource->name() == name) + entries.append(resource); + } + } -#if ENABLE(USER_TIMING) if (m_userTiming) { - if (entryType.isNull() || equalIgnoringCase(entryType, "mark")) - entries->appendAll(m_userTiming->getMarks(name)); - if (entryType.isNull() || equalIgnoringCase(entryType, "measure")) - entries->appendAll(m_userTiming->getMeasures(name)); + if (entryType.isNull() || equalLettersIgnoringASCIICase(entryType, "mark")) + entries.appendVector(m_userTiming->getMarks(name)); + if (entryType.isNull() || equalLettersIgnoringASCIICase(entryType, "measure")) + entries.appendVector(m_userTiming->getMeasures(name)); } -#endif // ENABLE(USER_TIMING) - entries->sort(); + std::sort(entries.begin(), entries.end(), PerformanceEntry::startTimeCompareLessThan); return entries; } -#endif // ENABLE(PERFORMANCE_TIMELINE) - -#if ENABLE(RESOURCE_TIMING) - -void Performance::webkitClearResourceTimings() +void Performance::clearResourceTimings() { m_resourceTimingBuffer.clear(); } -void Performance::webkitSetResourceTimingBufferSize(unsigned size) +void Performance::setResourceTimingBufferSize(unsigned size) { m_resourceTimingBufferSize = size; - if (isResourceTimingBufferFull()) - dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullEvent, false, false)); } -void Performance::addResourceTiming(const String& initiatorName, Document* initiatorDocument, const ResourceRequest& request, const ResourceResponse& response, double initiationTime, double finishTime) +void Performance::addResourceTiming(ResourceTiming&& resourceTiming) { + RefPtr<PerformanceResourceTiming> entry = PerformanceResourceTiming::create(m_timeOrigin, WTFMove(resourceTiming)); + + queueEntry(*entry); + if (isResourceTimingBufferFull()) return; - RefPtr<PerformanceEntry> entry = PerformanceResourceTiming::create(initiatorName, request, response, initiationTime, finishTime, initiatorDocument); - m_resourceTimingBuffer.append(entry); if (isResourceTimingBufferFull()) - dispatchEvent(Event::create(eventNames().webkitresourcetimingbufferfullEvent, false, false)); + dispatchEvent(Event::create(eventNames().resourcetimingbufferfullEvent, true, false)); } -bool Performance::isResourceTimingBufferFull() +bool Performance::isResourceTimingBufferFull() const { return m_resourceTimingBuffer.size() >= m_resourceTimingBufferSize; } -#endif // ENABLE(RESOURCE_TIMING) - -#if ENABLE(USER_TIMING) -void Performance::webkitMark(const String& markName, ExceptionCode& ec) +ExceptionOr<void> Performance::mark(const String& markName) { - ec = 0; if (!m_userTiming) - m_userTiming = UserTiming::create(this); - m_userTiming->mark(markName, ec); + m_userTiming = std::make_unique<UserTiming>(*this); + + auto result = m_userTiming->mark(markName); + if (result.hasException()) + return result.releaseException(); + + queueEntry(result.releaseReturnValue()); + + return { }; } -void Performance::webkitClearMarks(const String& markName) +void Performance::clearMarks(const String& markName) { if (!m_userTiming) - m_userTiming = UserTiming::create(this); + m_userTiming = std::make_unique<UserTiming>(*this); m_userTiming->clearMarks(markName); } -void Performance::webkitMeasure(const String& measureName, const String& startMark, const String& endMark, ExceptionCode& ec) +ExceptionOr<void> Performance::measure(const String& measureName, const String& startMark, const String& endMark) { - ec = 0; if (!m_userTiming) - m_userTiming = UserTiming::create(this); - m_userTiming->measure(measureName, startMark, endMark, ec); + m_userTiming = std::make_unique<UserTiming>(*this); + + auto result = m_userTiming->measure(measureName, startMark, endMark); + if (result.hasException()) + return result.releaseException(); + + queueEntry(result.releaseReturnValue()); + + return { }; } -void Performance::webkitClearMeasures(const String& measureName) +void Performance::clearMeasures(const String& measureName) { if (!m_userTiming) - m_userTiming = UserTiming::create(this); + m_userTiming = std::make_unique<UserTiming>(*this); m_userTiming->clearMeasures(measureName); } -#endif // ENABLE(USER_TIMING) +void Performance::registerPerformanceObserver(PerformanceObserver& observer) +{ + m_observers.add(&observer); +} -double Performance::now() const +void Performance::unregisterPerformanceObserver(PerformanceObserver& observer) +{ + m_observers.remove(&observer); +} + +void Performance::queueEntry(PerformanceEntry& entry) { - return 1000.0 * m_frame->document()->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(monotonicallyIncreasingTime()); + bool shouldScheduleTask = false; + for (auto& observer : m_observers) { + if (observer->typeFilter().contains(entry.type())) { + observer->queueEntry(entry); + shouldScheduleTask = true; + } + } + + if (!shouldScheduleTask) + return; + + if (m_performanceTimelineTaskQueue.hasPendingTasks()) + return; + + m_performanceTimelineTaskQueue.enqueueTask([this] () { + Vector<RefPtr<PerformanceObserver>> observers; + copyToVector(m_observers, observers); + for (auto& observer : observers) + observer->deliver(); + }); } } // namespace WebCore |