| Index: Source/core/timing/PerformanceUserTiming.cpp
|
| diff --git a/Source/core/timing/PerformanceUserTiming.cpp b/Source/core/timing/PerformanceUserTiming.cpp
|
| index ecaf7ebf9ec770d659eca9088ec5a2b4b66bb572..94121ab0bc87d5577e47c42c2a6e9690b5f44497 100644
|
| --- a/Source/core/timing/PerformanceUserTiming.cpp
|
| +++ b/Source/core/timing/PerformanceUserTiming.cpp
|
| @@ -28,7 +28,7 @@
|
|
|
| #include "bindings/core/v8/ExceptionState.h"
|
| #include "core/dom/ExceptionCode.h"
|
| -#include "core/timing/Performance.h"
|
| +#include "core/timing/PerformanceBase.h"
|
| #include "core/timing/PerformanceMark.h"
|
| #include "core/timing/PerformanceMeasure.h"
|
| #include "platform/TraceEvent.h"
|
| @@ -40,38 +40,43 @@ namespace blink {
|
| namespace {
|
|
|
| using RestrictedKeyMap = HashMap<String, NavigationTimingFunction>;
|
| -static RestrictedKeyMap restrictedKeyMap()
|
| -{
|
| - DEFINE_STATIC_LOCAL(RestrictedKeyMap, map, ());
|
| - if (map.isEmpty()) {
|
| - map.add("navigationStart", &PerformanceTiming::navigationStart);
|
| - map.add("unloadEventStart", &PerformanceTiming::unloadEventStart);
|
| - map.add("unloadEventEnd", &PerformanceTiming::unloadEventEnd);
|
| - map.add("redirectStart", &PerformanceTiming::redirectStart);
|
| - map.add("redirectEnd", &PerformanceTiming::redirectEnd);
|
| - map.add("fetchStart", &PerformanceTiming::fetchStart);
|
| - map.add("domainLookupStart", &PerformanceTiming::domainLookupStart);
|
| - map.add("domainLookupEnd", &PerformanceTiming::domainLookupEnd);
|
| - map.add("connectStart", &PerformanceTiming::connectStart);
|
| - map.add("connectEnd", &PerformanceTiming::connectEnd);
|
| - map.add("secureConnectionStart", &PerformanceTiming::secureConnectionStart);
|
| - map.add("requestStart", &PerformanceTiming::requestStart);
|
| - map.add("responseStart", &PerformanceTiming::responseStart);
|
| - map.add("responseEnd", &PerformanceTiming::responseEnd);
|
| - map.add("domLoading", &PerformanceTiming::domLoading);
|
| - map.add("domInteractive", &PerformanceTiming::domInteractive);
|
| - map.add("domContentLoadedEventStart", &PerformanceTiming::domContentLoadedEventStart);
|
| - map.add("domContentLoadedEventEnd", &PerformanceTiming::domContentLoadedEventEnd);
|
| - map.add("domComplete", &PerformanceTiming::domComplete);
|
| - map.add("loadEventStart", &PerformanceTiming::loadEventStart);
|
| - map.add("loadEventEnd", &PerformanceTiming::loadEventEnd);
|
| - }
|
| +
|
| +RestrictedKeyMap* createRestrictedKeyMap()
|
| +{
|
| + RestrictedKeyMap* map = new RestrictedKeyMap();
|
| + map->add("navigationStart", &PerformanceTiming::navigationStart);
|
| + map->add("unloadEventStart", &PerformanceTiming::unloadEventStart);
|
| + map->add("unloadEventEnd", &PerformanceTiming::unloadEventEnd);
|
| + map->add("redirectStart", &PerformanceTiming::redirectStart);
|
| + map->add("redirectEnd", &PerformanceTiming::redirectEnd);
|
| + map->add("fetchStart", &PerformanceTiming::fetchStart);
|
| + map->add("domainLookupStart", &PerformanceTiming::domainLookupStart);
|
| + map->add("domainLookupEnd", &PerformanceTiming::domainLookupEnd);
|
| + map->add("connectStart", &PerformanceTiming::connectStart);
|
| + map->add("connectEnd", &PerformanceTiming::connectEnd);
|
| + map->add("secureConnectionStart", &PerformanceTiming::secureConnectionStart);
|
| + map->add("requestStart", &PerformanceTiming::requestStart);
|
| + map->add("responseStart", &PerformanceTiming::responseStart);
|
| + map->add("responseEnd", &PerformanceTiming::responseEnd);
|
| + map->add("domLoading", &PerformanceTiming::domLoading);
|
| + map->add("domInteractive", &PerformanceTiming::domInteractive);
|
| + map->add("domContentLoadedEventStart", &PerformanceTiming::domContentLoadedEventStart);
|
| + map->add("domContentLoadedEventEnd", &PerformanceTiming::domContentLoadedEventEnd);
|
| + map->add("domComplete", &PerformanceTiming::domComplete);
|
| + map->add("loadEventStart", &PerformanceTiming::loadEventStart);
|
| + map->add("loadEventEnd", &PerformanceTiming::loadEventEnd);
|
| + return map;
|
| +}
|
| +
|
| +const RestrictedKeyMap& restrictedKeyMap()
|
| +{
|
| + AtomicallyInitializedStaticReference(RestrictedKeyMap, map, createRestrictedKeyMap());
|
| return map;
|
| }
|
|
|
| } // namespace anonymous
|
|
|
| -UserTiming::UserTiming(Performance* performance)
|
| +UserTiming::UserTiming(PerformanceBase* performance)
|
| : m_performance(performance)
|
| {
|
| }
|
| @@ -122,7 +127,7 @@ double UserTiming::findExistingMarkStartTime(const String& markName, ExceptionSt
|
| if (m_marksMap.contains(markName))
|
| return m_marksMap.get(markName).last()->startTime();
|
|
|
| - if (restrictedKeyMap().contains(markName)) {
|
| + if (restrictedKeyMap().contains(markName) && m_performance->timing()) {
|
| double value = static_cast<double>((m_performance->timing()->*(restrictedKeyMap().get(markName)))());
|
| if (!value) {
|
| exceptionState.throwDOMException(InvalidAccessError, "'" + markName + "' is empty: either the event hasn't happened yet, or it would provide cross-origin timing information.");
|
| @@ -159,8 +164,8 @@ void UserTiming::measure(const String& measureName, const String& startMark, con
|
| // User timing events are stored as integer milliseconds from the start of
|
| // navigation, whereas trace events accept double seconds based off of
|
| // CurrentTime::monotonicallyIncreasingTime().
|
| - double startTimeMonotonic = m_performance->timing()->integerMillisecondsToMonotonicTime(startTime + m_performance->timing()->navigationStart());
|
| - double endTimeMonotonic = m_performance->timing()->integerMillisecondsToMonotonicTime(endTime + m_performance->timing()->navigationStart());
|
| + double startTimeMonotonic = m_performance->timeOrigin() + startTime / 1000.0;
|
| + double endTimeMonotonic = m_performance->timeOrigin() + endTime / 1000.0;
|
|
|
| TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0("blink.user_timing", measureName.utf8().data(), WTF::StringHash::hash(measureName), startTimeMonotonic);
|
| TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0("blink.user_timing", measureName.utf8().data(), WTF::StringHash::hash(measureName), endTimeMonotonic);
|
|
|