[Navigation Timing] Use monotonicallyIncreasingTime() instead of currentTime()
https://bugs.webkit.org/show_bug.cgi?id=58354

Reviewed by Pavel Feldman.

Source/WebCore:

No new tests. Relies on existing webtiming-* tests.

* CMakeLists.txt:
* GNUmakefile.list.am:
* WebCore.gypi:
* WebCore.pro:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* dom/Document.cpp: Use monotonic times.
(WebCore::Document::setReadyState):
(WebCore::Document::finishedParsing):
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::didFinishLoadingImpl): Convert monotonicFinishTime to wall time if needed.
* inspector/InspectorResourceAgent.cpp:
(WebCore::buildObjectForTiming): Convert monotonic requestTime to wall time.
(WebCore::buildObjectForResourceResponse): Plumbing for above.
(WebCore::buildObjectForCachedResource): Ditto.
(WebCore::InspectorResourceAgent::willSendRequest): Ditto.
(WebCore::InspectorResourceAgent::didReceiveResponse): Ditto.
(WebCore::InspectorResourceAgent::didLoadResourceFromMemoryCache): Ditto.
* loader/DocumentLoadTiming.cpp: Added.
(WebCore::DocumentLoadTiming::DocumentLoadTiming):
(WebCore::DocumentLoadTiming::setNavigationStart): Determine reference time and root reference time.
(WebCore::DocumentLoadTiming::addRedirect): Moved logic from MainResourceLoader.
(WebCore::DocumentLoadTiming::convertMonotonicTimeToDocumentTime): Helper to compute wall time from monotonic time.
* loader/DocumentLoadTiming.h: Turned into class. Made times monotonic.
(WebCore::DocumentLoadTiming::setUnloadEventStart):
(WebCore::DocumentLoadTiming::setUnloadEventEnd):
(WebCore::DocumentLoadTiming::setRedirectStart):
(WebCore::DocumentLoadTiming::setRedirectEnd):
(WebCore::DocumentLoadTiming::setFetchStart):
(WebCore::DocumentLoadTiming::setResponseEnd):
(WebCore::DocumentLoadTiming::setLoadEventStart):
(WebCore::DocumentLoadTiming::setLoadEventEnd):
(WebCore::DocumentLoadTiming::setHasSameOriginAsPreviousDocument):
(WebCore::DocumentLoadTiming::navigationStart):
(WebCore::DocumentLoadTiming::unloadEventStart):
(WebCore::DocumentLoadTiming::unloadEventEnd):
(WebCore::DocumentLoadTiming::redirectStart):
(WebCore::DocumentLoadTiming::redirectEnd):
(WebCore::DocumentLoadTiming::redirectCount):
(WebCore::DocumentLoadTiming::fetchStart):
(WebCore::DocumentLoadTiming::responseEnd):
(WebCore::DocumentLoadTiming::loadEventStart):
(WebCore::DocumentLoadTiming::loadEventEnd):
(WebCore::DocumentLoadTiming::hasCrossOriginRedirect):
(WebCore::DocumentLoadTiming::hasSameOriginAsPreviousDocument):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::stopLoading):
(WebCore::FrameLoader::commitProvisionalLoad):
(WebCore::FrameLoader::continueLoadAfterWillSubmitForm):
(WebCore::FrameLoader::loadProvisionalItemFromCachedPage):
* loader/MainResourceLoader.cpp:
(WebCore::MainResourceLoader::continueAfterNavigationPolicy):
(WebCore::MainResourceLoader::willSendRequest): Moved logic to DocumentLoadTiming.
(WebCore::MainResourceLoader::didReceiveData): Use monotonic time.
(WebCore::MainResourceLoader::didFinishLoading): Ditto.
(WebCore::MainResourceLoader::load):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::dispatchLoadEvent):
* page/DOMWindow.h: Removed dispatchTimedEvent. It doesn't really help in the new model.
* page/PerformanceNavigation.cpp:
(WebCore::PerformanceNavigation::redirectCount):
* page/PerformanceTiming.cpp: Removed skew correction code. This should never happen now.
(WebCore::PerformanceTiming::navigationStart):
(WebCore::PerformanceTiming::unloadEventStart):
(WebCore::PerformanceTiming::unloadEventEnd):
(WebCore::PerformanceTiming::redirectStart):
(WebCore::PerformanceTiming::redirectEnd):
(WebCore::PerformanceTiming::fetchStart):
(WebCore::PerformanceTiming::responseEnd):
(WebCore::PerformanceTiming::domLoading):
(WebCore::PerformanceTiming::domInteractive):
(WebCore::PerformanceTiming::domContentLoadedEventStart):
(WebCore::PerformanceTiming::domContentLoadedEventEnd):
(WebCore::PerformanceTiming::domComplete):
(WebCore::PerformanceTiming::loadEventStart):
(WebCore::PerformanceTiming::loadEventEnd):
(WebCore::PerformanceTiming::resourceLoadTimeRelativeToAbsolute): Used for ResourceLoadTiming.
(WebCore::PerformanceTiming::monotonicTimeToIntegerMilliseconds): Used for DocumentTiming and DocumentLoadTiming.
* page/PerformanceTiming.h:
* platform/network/ResourceLoadTiming.cpp:
(WebCore::ResourceLoadTiming::convertResourceLoadTimeToDocumentTime):
* platform/network/ResourceLoadTiming.h: Added helper function to convert to wall times. Added instructions for use.

LayoutTests:

* fast/dom/script-tests/webtiming.js: Current monotonic time is unknown until performance.now() is available. Use 0 until then.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@102961 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp
index c4b07e6..446646b 100644
--- a/Source/WebCore/loader/FrameLoader.cpp
+++ b/Source/WebCore/loader/FrameLoader.cpp
@@ -376,10 +376,12 @@
                         // time into freed memory.
                         RefPtr<DocumentLoader> documentLoader = m_provisionalDocumentLoader;
                         m_pageDismissalEventBeingDispatched = UnloadDismissal;
-                        if (documentLoader && !documentLoader->timing()->unloadEventStart && !documentLoader->timing()->unloadEventEnd) {
+                        if (documentLoader && !documentLoader->timing()->unloadEventStart() && !documentLoader->timing()->unloadEventEnd()) {
                             DocumentLoadTiming* timing = documentLoader->timing();
-                            ASSERT(timing->navigationStart);
-                            m_frame->domWindow()->dispatchTimedEvent(unloadEvent, m_frame->domWindow()->document(), &timing->unloadEventStart, &timing->unloadEventEnd);
+                            ASSERT(timing->navigationStart());
+                            timing->markUnloadEventStart();
+                            m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->domWindow()->document());
+                            timing->markUnloadEventEnd();
                         } else
                             m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->domWindow()->document());
                     }
@@ -1771,7 +1773,7 @@
     if (pdl) {
         // Check if the destination page is allowed to access the previous page's timing information.
         RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->request().url());
-        m_documentLoader->timing()->hasSameOriginAsPreviousDocument = securityOrigin->canRequest(m_previousUrl);
+        m_documentLoader->timing()->setHasSameOriginAsPreviousDocument(securityOrigin->canRequest(m_previousUrl));
     }
 
     // Call clientRedirectCancelledOrFinished() here so that the frame load delegate is notified that the redirect's
@@ -2327,8 +2329,7 @@
         notifier()->assignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest());
     }
 
-    ASSERT(!m_provisionalDocumentLoader->timing()->navigationStart);
-    m_provisionalDocumentLoader->timing()->navigationStart = currentTime();
+    m_provisionalDocumentLoader->timing()->markNavigationStart(frame());
 
     if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier))
         m_provisionalDocumentLoader->updateLoading();
@@ -3028,11 +3029,11 @@
     provisionalLoader->prepareForLoadStart();
 
     m_loadingFromCachedPage = true;
-    
+
     // Should have timing data from previous time(s) the page was shown.
-    ASSERT(provisionalLoader->timing()->navigationStart);
+    ASSERT(provisionalLoader->timing()->navigationStart());
     provisionalLoader->resetTiming();
-    provisionalLoader->timing()->navigationStart = currentTime();    
+    provisionalLoader->timing()->markNavigationStart(frame());
 
     provisionalLoader->setCommitted(true);
     commitProvisionalLoad();