summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/Performance.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/Performance.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/page/Performance.cpp')
-rw-r--r--Source/WebCore/page/Performance.cpp229
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