[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

pfeldman at chromium.org pfeldman at chromium.org
Wed Dec 22 13:26:20 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 6142ab4c7517e24e629d28933885627fafc6754f
Author: pfeldman at chromium.org <pfeldman at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Sep 15 12:04:07 2010 +0000

    2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
    
            Reviewed by Yury Semikhatsky.
    
            Web Inspector: Provide network-based load timing.
            Before this change, inspector used timers taken from
            within WebCore notifications (that are by definition
            synchronous and serialized). As a result, timing was
            affected by the routines running on the main thread
            (JavaScript and such).
            https://bugs.webkit.org/show_bug.cgi?id=45664
    
            * inspector/InspectorController.cpp:
            (WebCore::InspectorController::willSendRequest):
            (WebCore::InspectorController::didFinishLoading):
            (WebCore::InspectorController::didFailLoading):
            * inspector/InspectorController.h:
            * inspector/InspectorResource.cpp:
            (WebCore::InspectorResource::endTiming):
            * inspector/InspectorResource.h:
            * loader/PingLoader.h:
            (WebCore::PingLoader::didFinishLoading):
            * loader/ResourceLoadNotifier.cpp:
            (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
            * loader/ResourceLoader.cpp:
            (WebCore::ResourceLoader::didFinishLoading):
            * loader/ResourceLoader.h:
            * loader/appcache/ApplicationCacheGroup.cpp:
            (WebCore::ApplicationCacheGroup::didFinishLoading):
            * loader/appcache/ApplicationCacheGroup.h:
            * loader/icon/IconFetcher.cpp:
            (WebCore::IconFetcher::didFinishLoading):
            * loader/icon/IconFetcher.h:
            * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
            (StreamingClient::didFinishLoading):
            * platform/network/BlobResourceHandle.cpp:
            (WebCore::BlobResourceHandle::notifyFinish):
            * platform/network/ResourceHandleClient.h:
            (WebCore::ResourceHandleClient::didFinishLoading):
            * platform/network/ResourceLoadTiming.h:
            (WebCore::ResourceLoadTiming::deepCopy):
            (WebCore::ResourceLoadTiming::operator==):
            (WebCore::ResourceLoadTiming::ResourceLoadTiming):
            * platform/network/cf/ResourceHandleCFNet.cpp:
            (WebCore::didFinishLoading):
            * platform/network/curl/ResourceHandleCurl.cpp:
            (WebCore::WebCoreSynchronousLoader::didFinishLoading):
            * platform/network/curl/ResourceHandleManager.cpp:
            (WebCore::ResourceHandleManager::downloadTimerCallback):
            (WebCore::parseDataUrl):
            * platform/network/mac/ResourceHandleMac.mm:
            (-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]):
            (WebCoreSynchronousLoaderClient::didFinishLoading):
            * platform/network/qt/QNetworkReplyHandler.cpp:
            (WebCore::QNetworkReplyHandler::finish):
            * platform/network/qt/ResourceHandleQt.cpp:
            (WebCore::WebCoreSynchronousLoader::didFinishLoading):
            * platform/network/soup/ResourceHandleSoup.cpp:
            (WebCore::WebCoreSynchronousLoader::didFinishLoading):
            (WebCore::WebCoreSynchronousLoader::didFail):
            * platform/network/win/ResourceHandleWin.cpp:
            (WebCore::WebCoreSynchronousLoader::didFinishLoading):
            (WebCore::ResourceHandle::onRequestComplete):
            (WebCore::ResourceHandle::fileLoadTimer):
            (WebCore::ResourceHandle::cancel):
    
    2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
    
            Reviewed by Yury Semikhatsky.
    
            Web Inspector: Provide network-based load timing.
            Before this change, inspector used timers taken from
            within WebCore notifications (that are by definition
            synchronous and serialized). As a result, timing was
            affected by the routines running on the main thread
            (JavaScript and such).
            https://bugs.webkit.org/show_bug.cgi?id=45664
    
            * public/WebURLLoadTiming.h:
            * public/WebURLLoaderClient.h:
            (WebKit::WebURLLoaderClient::didFinishLoading):
            * src/ResourceHandle.cpp:
            (WebCore::ResourceHandleInternal::didFinishLoading):
            * src/WebDevToolsAgentImpl.cpp:
            (WebKit::WebDevToolsAgentImpl::didFinishLoading):
            * src/WebURLLoadTiming.cpp:
            (WebKit::WebURLLoadTiming::receiveHeadersStart):
            (WebKit::WebURLLoadTiming::setReceiveHeadersStart):
    
    2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
    
            Reviewed by Yury Semikhatsky.
    
            Web Inspector: Provide network-based load timing.
            Before this change, inspector used timers taken from
            within WebCore notifications (that are by definition
            synchronous and serialized). As a result, timing was
            affected by the routines running on the main thread
            (JavaScript and such).
            https://bugs.webkit.org/show_bug.cgi?id=45664
    
            * webkit/webkitdownload.cpp:
            (DownloadClient::didFinishLoading):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@67551 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f9143fb..2ac21d8 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,69 @@
+2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: Provide network-based load timing.
+        Before this change, inspector used timers taken from
+        within WebCore notifications (that are by definition
+        synchronous and serialized). As a result, timing was
+        affected by the routines running on the main thread
+        (JavaScript and such).
+        https://bugs.webkit.org/show_bug.cgi?id=45664
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::willSendRequest):
+        (WebCore::InspectorController::didFinishLoading):
+        (WebCore::InspectorController::didFailLoading):
+        * inspector/InspectorController.h:
+        * inspector/InspectorResource.cpp:
+        (WebCore::InspectorResource::endTiming):
+        * inspector/InspectorResource.h:
+        * loader/PingLoader.h:
+        (WebCore::PingLoader::didFinishLoading):
+        * loader/ResourceLoadNotifier.cpp:
+        (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::didFinishLoading):
+        * loader/ResourceLoader.h:
+        * loader/appcache/ApplicationCacheGroup.cpp:
+        (WebCore::ApplicationCacheGroup::didFinishLoading):
+        * loader/appcache/ApplicationCacheGroup.h:
+        * loader/icon/IconFetcher.cpp:
+        (WebCore::IconFetcher::didFinishLoading):
+        * loader/icon/IconFetcher.h:
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        (StreamingClient::didFinishLoading):
+        * platform/network/BlobResourceHandle.cpp:
+        (WebCore::BlobResourceHandle::notifyFinish):
+        * platform/network/ResourceHandleClient.h:
+        (WebCore::ResourceHandleClient::didFinishLoading):
+        * platform/network/ResourceLoadTiming.h:
+        (WebCore::ResourceLoadTiming::deepCopy):
+        (WebCore::ResourceLoadTiming::operator==):
+        (WebCore::ResourceLoadTiming::ResourceLoadTiming):
+        * platform/network/cf/ResourceHandleCFNet.cpp:
+        (WebCore::didFinishLoading):
+        * platform/network/curl/ResourceHandleCurl.cpp:
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        * platform/network/curl/ResourceHandleManager.cpp:
+        (WebCore::ResourceHandleManager::downloadTimerCallback):
+        (WebCore::parseDataUrl):
+        * platform/network/mac/ResourceHandleMac.mm:
+        (-[WebCoreResourceHandleAsDelegate connectionDidFinishLoading:]):
+        (WebCoreSynchronousLoaderClient::didFinishLoading):
+        * platform/network/qt/QNetworkReplyHandler.cpp:
+        (WebCore::QNetworkReplyHandler::finish):
+        * platform/network/qt/ResourceHandleQt.cpp:
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        (WebCore::WebCoreSynchronousLoader::didFail):
+        * platform/network/win/ResourceHandleWin.cpp:
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        (WebCore::ResourceHandle::onRequestComplete):
+        (WebCore::ResourceHandle::fileLoadTimer):
+        (WebCore::ResourceHandle::cancel):
+
 2010-09-14  Ilya Tikhonovsky  <loislo at chromium.org>
 
         Reviewed by Yury Semikhatsky.
diff --git a/WebCore/inspector/InspectorController.cpp b/WebCore/inspector/InspectorController.cpp
index 6e48fd0..3e8815e 100644
--- a/WebCore/inspector/InspectorController.cpp
+++ b/WebCore/inspector/InspectorController.cpp
@@ -964,7 +964,7 @@ void InspectorController::willSendRequest(unsigned long identifier, ResourceRequ
         // Redirect may have empty URL and we'd like to not crash with invalid HashMap entry.
         // See http/tests/misc/will-send-request-returns-null-on-redirect.html
         if (!request.url().isEmpty()) {
-            resource->endTiming();
+            resource->endTiming(0);
             resource->updateResponse(redirectResponse);
 
             // We always store last redirect by the original id key. Rest of the redirects are stored within the last one.
@@ -1021,7 +1021,7 @@ void InspectorController::didReceiveContentLength(unsigned long identifier, int
         resource->updateScriptObject(m_frontend.get());
 }
 
-void InspectorController::didFinishLoading(unsigned long identifier)
+void InspectorController::didFinishLoading(unsigned long identifier, double finishTime)
 {
     if (!enabled())
         return;
@@ -1033,7 +1033,7 @@ void InspectorController::didFinishLoading(unsigned long identifier)
     if (!resource)
         return;
 
-    resource->endTiming();
+    resource->endTiming(finishTime);
 
     // No need to mute this event for main resource since it happens after did commit load.
     if (m_frontend)
@@ -1058,7 +1058,7 @@ void InspectorController::didFailLoading(unsigned long identifier, const Resourc
         return;
 
     resource->markFailed();
-    resource->endTiming();
+    resource->endTiming(0);
 
     // No need to mute this event for main resource since it happens after did commit load.
     if (m_frontend)
@@ -1493,7 +1493,7 @@ void InspectorController::didCloseWebSocket(unsigned long identifier)
     if (!resource)
         return;
 
-    resource->endTiming();
+    resource->endTiming(0);
     if (m_frontend)
         resource->updateScriptObject(m_frontend.get());
 }
diff --git a/WebCore/inspector/InspectorController.h b/WebCore/inspector/InspectorController.h
index 13b6b4e..8801847 100644
--- a/WebCore/inspector/InspectorController.h
+++ b/WebCore/inspector/InspectorController.h
@@ -165,7 +165,7 @@ public:
     void willSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
     void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
     void didReceiveContentLength(unsigned long identifier, int lengthReceived);
-    void didFinishLoading(unsigned long identifier);
+    void didFinishLoading(unsigned long identifier, double finishTime);
     void didFailLoading(unsigned long identifier, const ResourceError&);
     void resourceRetrievedByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString, const String& url, const String& sendURL, unsigned sendLineNumber);
     void scriptImported(unsigned long identifier, const String& sourceString);
diff --git a/WebCore/inspector/InspectorResource.cpp b/WebCore/inspector/InspectorResource.cpp
index 9bc01c8..2d24c4e 100644
--- a/WebCore/inspector/InspectorResource.cpp
+++ b/WebCore/inspector/InspectorResource.cpp
@@ -455,9 +455,9 @@ void InspectorResource::startTiming()
     m_changes.set(TimingChange);
 }
 
-void InspectorResource::endTiming()
+void InspectorResource::endTiming(double actualEndTime)
 {
-    m_endTime = currentTime();
+    m_endTime = actualEndTime ? actualEndTime : currentTime();
     m_finished = true;
     m_changes.set(TimingChange);
     m_changes.set(CompletionChange);
diff --git a/WebCore/inspector/InspectorResource.h b/WebCore/inspector/InspectorResource.h
index 3fd5a69..8a207b0 100644
--- a/WebCore/inspector/InspectorResource.h
+++ b/WebCore/inspector/InspectorResource.h
@@ -117,7 +117,7 @@ namespace WebCore {
         void startTiming();
         void markLoadEventTime();
         void markDOMContentEventTime();
-        void endTiming();
+        void endTiming(double actualEndTime);
 
         void markFailed();
         void addLength(int lengthReceived);
diff --git a/WebCore/loader/DocumentLoader.cpp b/WebCore/loader/DocumentLoader.cpp
index b88c89e..cf9541a 100644
--- a/WebCore/loader/DocumentLoader.cpp
+++ b/WebCore/loader/DocumentLoader.cpp
@@ -559,7 +559,7 @@ void DocumentLoader::substituteResourceDeliveryTimerFired(Timer<DocumentLoader>*
         
             loader->didReceiveResponse(resource->response());
             loader->didReceiveData(data->data(), data->size(), data->size(), true);
-            loader->didFinishLoading();
+            loader->didFinishLoading(0);
         } else {
             // A null resource means that we should fail the load.
             // FIXME: Maybe we should use another error here - something like "not in cache".
diff --git a/WebCore/loader/MainResourceLoader.cpp b/WebCore/loader/MainResourceLoader.cpp
index 6a821ca..d976841 100644
--- a/WebCore/loader/MainResourceLoader.cpp
+++ b/WebCore/loader/MainResourceLoader.cpp
@@ -275,9 +275,9 @@ void MainResourceLoader::continueAfterContentPolicy(PolicyAction contentPolicy,
             if (m_substituteData.content()->size())
                 didReceiveData(m_substituteData.content()->data(), m_substituteData.content()->size(), m_substituteData.content()->size(), true);
             if (frameLoader() && !frameLoader()->isStopping()) 
-                didFinishLoading();
+                didFinishLoading(0);
         } else if (shouldLoadAsEmptyDocument(url) || frameLoader()->representationExistsForURLScheme(url.protocol()))
-            didFinishLoading();
+            didFinishLoading(0);
     }
 }
 
@@ -420,7 +420,7 @@ void MainResourceLoader::didReceiveData(const char* data, int length, long long
     ResourceLoader::didReceiveData(data, length, lengthReceived, allAtOnce);
 }
 
-void MainResourceLoader::didFinishLoading()
+void MainResourceLoader::didFinishLoading(double finishTime)
 {
     // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred.
     // See <rdar://problem/6304600> for more details.
@@ -439,7 +439,7 @@ void MainResourceLoader::didFinishLoading()
     ASSERT(!documentLoader()->timing()->responseEnd);
     documentLoader()->timing()->responseEnd = m_timeOfLastDataReceived;
     frameLoader()->finishedLoading();
-    ResourceLoader::didFinishLoading();
+    ResourceLoader::didFinishLoading(finishTime);
     
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
     dl->applicationCacheHost()->finishedLoadingMainResource();
diff --git a/WebCore/loader/MainResourceLoader.h b/WebCore/loader/MainResourceLoader.h
index e2d075c..35eab2f 100644
--- a/WebCore/loader/MainResourceLoader.h
+++ b/WebCore/loader/MainResourceLoader.h
@@ -58,7 +58,7 @@ namespace WebCore {
         virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse);
         virtual void didReceiveResponse(const ResourceResponse&);
         virtual void didReceiveData(const char*, int, long long lengthReceived, bool allAtOnce);
-        virtual void didFinishLoading();
+        virtual void didFinishLoading(double finishTime);
         virtual void didFail(const ResourceError&);
 
 #if HAVE(RUNLOOP_TIMER)
diff --git a/WebCore/loader/NetscapePlugInStreamLoader.cpp b/WebCore/loader/NetscapePlugInStreamLoader.cpp
index 9d0e81b..61a1342 100644
--- a/WebCore/loader/NetscapePlugInStreamLoader.cpp
+++ b/WebCore/loader/NetscapePlugInStreamLoader.cpp
@@ -101,7 +101,7 @@ void NetscapePlugInStreamLoader::didFinishLoading()
 
     m_documentLoader->removePlugInStreamLoader(this);
     m_client->didFinishLoading(this);
-    ResourceLoader::didFinishLoading();
+    ResourceLoader::didFinishLoading(0);
 }
 
 void NetscapePlugInStreamLoader::didFail(const ResourceError& error)
diff --git a/WebCore/loader/PingLoader.h b/WebCore/loader/PingLoader.h
index 1d8a2d8..e26a9c9 100644
--- a/WebCore/loader/PingLoader.h
+++ b/WebCore/loader/PingLoader.h
@@ -60,7 +60,7 @@ private:
 
     void didReceiveResponse(ResourceHandle*, const ResourceResponse&) { delete this; }
     void didReceiveData(ResourceHandle*, const char*, int) { delete this; }
-    void didFinishLoading(ResourceHandle*) { delete this; }
+    void didFinishLoading(ResourceHandle*, double) { delete this; }
     void didFail(ResourceHandle*, const ResourceError&) { delete this; }
 
     RefPtr<ResourceHandle> m_handle;
diff --git a/WebCore/loader/ResourceLoadNotifier.cpp b/WebCore/loader/ResourceLoadNotifier.cpp
index d225cb8..c43a1da 100644
--- a/WebCore/loader/ResourceLoadNotifier.cpp
+++ b/WebCore/loader/ResourceLoadNotifier.cpp
@@ -82,11 +82,11 @@ void ResourceLoadNotifier::didReceiveData(ResourceLoader* loader, const char* da
     dispatchDidReceiveContentLength(loader->documentLoader(), loader->identifier(), lengthReceived);
 }
 
-void ResourceLoadNotifier::didFinishLoad(ResourceLoader* loader)
+void ResourceLoadNotifier::didFinishLoad(ResourceLoader* loader, double finishTime)
 {    
     if (Page* page = m_frame->page())
         page->progress()->completeProgress(loader->identifier());
-    dispatchDidFinishLoading(loader->documentLoader(), loader->identifier());
+    dispatchDidFinishLoading(loader->documentLoader(), loader->identifier(), finishTime);
 }
 
 void ResourceLoadNotifier::didFailToLoad(ResourceLoader* loader, const ResourceError& error)
@@ -150,13 +150,13 @@ void ResourceLoadNotifier::dispatchDidReceiveContentLength(DocumentLoader* loade
 #endif
 }
 
-void ResourceLoadNotifier::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier)
+void ResourceLoadNotifier::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier, double finishTime)
 {
     m_frame->loader()->client()->dispatchDidFinishLoading(loader, identifier);
 
 #if ENABLE(INSPECTOR)
     if (Page* page = m_frame->page())
-        page->inspectorController()->didFinishLoading(identifier);
+        page->inspectorController()->didFinishLoading(identifier, finishTime);
 #endif
 }
 
@@ -169,7 +169,7 @@ void ResourceLoadNotifier::sendRemainingDelegateMessages(DocumentLoader* loader,
         dispatchDidReceiveContentLength(loader, identifier, length);
 
     if (error.isNull())
-        dispatchDidFinishLoading(loader, identifier);
+        dispatchDidFinishLoading(loader, identifier, 0);
     else
         m_frame->loader()->client()->dispatchDidFailLoading(loader, identifier, error);
 }
diff --git a/WebCore/loader/ResourceLoadNotifier.h b/WebCore/loader/ResourceLoadNotifier.h
index b0a5cbf..758e414 100644
--- a/WebCore/loader/ResourceLoadNotifier.h
+++ b/WebCore/loader/ResourceLoadNotifier.h
@@ -53,14 +53,14 @@ public:
     void willSendRequest(ResourceLoader*, ResourceRequest&, const ResourceResponse& redirectResponse);
     void didReceiveResponse(ResourceLoader*, const ResourceResponse&);
     void didReceiveData(ResourceLoader*, const char*, int, int lengthReceived);
-    void didFinishLoad(ResourceLoader*);
+    void didFinishLoad(ResourceLoader*, double finishTime);
     void didFailToLoad(ResourceLoader*, const ResourceError&);
 
     void assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&);
     void dispatchWillSendRequest(DocumentLoader*, unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
     void dispatchDidReceiveResponse(DocumentLoader*, unsigned long identifier, const ResourceResponse&);
     void dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int length);
-    void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier);
+    void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier, double finishTime);
 
     void sendRemainingDelegateMessages(DocumentLoader*, unsigned long identifier, const ResourceResponse&, int length, const ResourceError&);
 
diff --git a/WebCore/loader/ResourceLoader.cpp b/WebCore/loader/ResourceLoader.cpp
index e1d331e..490bc30 100644
--- a/WebCore/loader/ResourceLoader.cpp
+++ b/WebCore/loader/ResourceLoader.cpp
@@ -36,6 +36,7 @@
 #include "Frame.h"
 #include "FrameLoader.h"
 #include "FrameLoaderClient.h"
+#include "InspectorController.h"
 #include "InspectorTimelineAgent.h"
 #include "Page.h"
 #include "ProgressTracker.h"
@@ -276,7 +277,7 @@ void ResourceLoader::willStopBufferingData(const char* data, int length)
     m_resourceData = SharedBuffer::create(data, length);
 }
 
-void ResourceLoader::didFinishLoading()
+void ResourceLoader::didFinishLoading(double finishTime)
 {
     // If load has been cancelled after finishing (which could happen with a 
     // JavaScript that changes the window location), do nothing.
@@ -284,11 +285,11 @@ void ResourceLoader::didFinishLoading()
         return;
     ASSERT(!m_reachedTerminalState);
 
-    didFinishLoadingOnePart();
+    didFinishLoadingOnePart(finishTime);
     releaseResources();
 }
 
-void ResourceLoader::didFinishLoadingOnePart()
+void ResourceLoader::didFinishLoadingOnePart(double finishTime)
 {
     if (m_cancelled)
         return;
@@ -298,7 +299,7 @@ void ResourceLoader::didFinishLoadingOnePart()
         return;
     m_calledDidFinishLoad = true;
     if (m_sendResourceLoadCallbacks)
-        frameLoader()->notifier()->didFinishLoad(this);
+        frameLoader()->notifier()->didFinishLoad(this, finishTime);
 }
 
 void ResourceLoader::didFail(const ResourceError& error)
@@ -440,9 +441,9 @@ void ResourceLoader::didReceiveData(ResourceHandle*, const char* data, int lengt
 #endif
 }
 
-void ResourceLoader::didFinishLoading(ResourceHandle*)
+void ResourceLoader::didFinishLoading(ResourceHandle*, double finishTime)
 {
-    didFinishLoading();
+    didFinishLoading(finishTime);
 }
 
 void ResourceLoader::didFail(ResourceHandle*, const ResourceError& error)
diff --git a/WebCore/loader/ResourceLoader.h b/WebCore/loader/ResourceLoader.h
index 9513fdb..920e3c2 100644
--- a/WebCore/loader/ResourceLoader.h
+++ b/WebCore/loader/ResourceLoader.h
@@ -82,7 +82,7 @@ namespace WebCore {
         virtual void didReceiveData(const char*, int, long long lengthReceived, bool allAtOnce);
         virtual void didReceiveCachedMetadata(const char*, int) { }
         void willStopBufferingData(const char*, int);
-        virtual void didFinishLoading();
+        virtual void didFinishLoading(double finishTime);
         virtual void didFail(const ResourceError&);
 
         virtual bool shouldUseCredentialStorage();
@@ -99,7 +99,7 @@ namespace WebCore {
         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
         virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
         virtual void didReceiveCachedMetadata(ResourceHandle*, const char* data, int length) { didReceiveCachedMetadata(data, length); }
-        virtual void didFinishLoading(ResourceHandle*);
+        virtual void didFinishLoading(ResourceHandle*, double finishTime);
         virtual void didFail(ResourceHandle*, const ResourceError&);
         virtual void wasBlocked(ResourceHandle*);
         virtual void cannotShowURL(ResourceHandle*);
@@ -135,7 +135,7 @@ namespace WebCore {
 #endif
 
         virtual void didCancel(const ResourceError&);
-        void didFinishLoadingOnePart();
+        void didFinishLoadingOnePart(double finishTime);
 
         const ResourceRequest& request() const { return m_request; }
         bool reachedTerminalState() const { return m_reachedTerminalState; }
diff --git a/WebCore/loader/SubresourceLoader.cpp b/WebCore/loader/SubresourceLoader.cpp
index e5cec88..7e1ea8b 100644
--- a/WebCore/loader/SubresourceLoader.cpp
+++ b/WebCore/loader/SubresourceLoader.cpp
@@ -140,7 +140,7 @@ void SubresourceLoader::didReceiveResponse(const ResourceResponse& r)
         
         // After the first multipart section is complete, signal to delegates that this load is "finished" 
         m_documentLoader->subresourceLoaderFinishedLoadingOnePart(this);
-        didFinishLoadingOnePart();
+        didFinishLoadingOnePart(0);
     }
 }
 
@@ -168,7 +168,7 @@ void SubresourceLoader::didReceiveCachedMetadata(const char* data, int length)
         m_client->didReceiveCachedMetadata(this, data, length);
 }
 
-void SubresourceLoader::didFinishLoading()
+void SubresourceLoader::didFinishLoading(double finishTime)
 {
     if (cancelled())
         return;
@@ -185,7 +185,7 @@ void SubresourceLoader::didFinishLoading()
     if (cancelled())
         return;
     m_documentLoader->removeSubresourceLoader(this);
-    ResourceLoader::didFinishLoading();
+    ResourceLoader::didFinishLoading(finishTime);
 }
 
 void SubresourceLoader::didFail(const ResourceError& error)
diff --git a/WebCore/loader/SubresourceLoader.h b/WebCore/loader/SubresourceLoader.h
index 4a58345..cb7ed81 100644
--- a/WebCore/loader/SubresourceLoader.h
+++ b/WebCore/loader/SubresourceLoader.h
@@ -52,7 +52,7 @@ namespace WebCore {
         virtual void didReceiveResponse(const ResourceResponse&);
         virtual void didReceiveData(const char*, int, long long lengthReceived, bool allAtOnce);
         virtual void didReceiveCachedMetadata(const char*, int);
-        virtual void didFinishLoading();
+        virtual void didFinishLoading(double finishTime);
         virtual void didFail(const ResourceError&);
         virtual bool shouldUseCredentialStorage();
         virtual void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
diff --git a/WebCore/loader/appcache/ApplicationCacheGroup.cpp b/WebCore/loader/appcache/ApplicationCacheGroup.cpp
index 92723c4..d89f819 100644
--- a/WebCore/loader/appcache/ApplicationCacheGroup.cpp
+++ b/WebCore/loader/appcache/ApplicationCacheGroup.cpp
@@ -602,11 +602,11 @@ void ApplicationCacheGroup::didReceiveData(ResourceHandle* handle, const char* d
     m_loadedSize += length;
 }
 
-void ApplicationCacheGroup::didFinishLoading(ResourceHandle* handle)
+void ApplicationCacheGroup::didFinishLoading(ResourceHandle* handle, double finishTime)
 {
 #if ENABLE(INSPECTOR)
     if (Page* page = m_frame->page())
-        page->inspectorController()->didFinishLoading(m_currentResourceIdentifier);
+        page->inspectorController()->didFinishLoading(m_currentResourceIdentifier, finishTime);
 #endif
 
     if (handle == m_manifestHandle) {
diff --git a/WebCore/loader/appcache/ApplicationCacheGroup.h b/WebCore/loader/appcache/ApplicationCacheGroup.h
index b5cdf7b..99ab71a 100644
--- a/WebCore/loader/appcache/ApplicationCacheGroup.h
+++ b/WebCore/loader/appcache/ApplicationCacheGroup.h
@@ -113,7 +113,7 @@ private:
 #endif
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int length, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double finishTime);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
     void didReceiveManifestResponse(const ResourceResponse&);
diff --git a/WebCore/loader/icon/IconFetcher.cpp b/WebCore/loader/icon/IconFetcher.cpp
index b33122a..f6b80fa 100644
--- a/WebCore/loader/icon/IconFetcher.cpp
+++ b/WebCore/loader/icon/IconFetcher.cpp
@@ -202,7 +202,7 @@ void IconFetcher::didReceiveData(ResourceHandle* handle, const char* data, int l
     m_entries[m_currentEntry].buffer()->append(data, length);
 }
 
-void IconFetcher::didFinishLoading(ResourceHandle* handle)
+void IconFetcher::didFinishLoading(ResourceHandle* handle, double)
 {
     ASSERT_UNUSED(handle, m_handle == handle);
     
diff --git a/WebCore/loader/icon/IconFetcher.h b/WebCore/loader/icon/IconFetcher.h
index 5327693..387e1c3 100644
--- a/WebCore/loader/icon/IconFetcher.h
+++ b/WebCore/loader/icon/IconFetcher.h
@@ -62,12 +62,12 @@ private:
     
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
-    
+
     Frame* m_frame;
     IconFetcherClient* m_client;
-    
+
     unsigned m_currentEntry;
     RefPtr<ResourceHandle> m_handle;
     Vector<IconLinkEntry> m_entries;
diff --git a/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp b/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
index 061fa85..4e57193 100644
--- a/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
+++ b/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
@@ -44,7 +44,7 @@ class StreamingClient : public Noncopyable, public ResourceHandleClient {
         virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&);
         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
         virtual void didReceiveData(ResourceHandle*, const char*, int, int);
-        virtual void didFinishLoading(ResourceHandle*);
+        virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
         virtual void didFail(ResourceHandle*, const ResourceError&);
         virtual void wasBlocked(ResourceHandle*);
         virtual void cannotShowURL(ResourceHandle*);
@@ -766,7 +766,7 @@ void StreamingClient::didReceiveData(ResourceHandle* handle, const char* data, i
         GST_ELEMENT_ERROR(m_src, CORE, FAILED, (0), (0));
 }
 
-void StreamingClient::didFinishLoading(ResourceHandle*)
+void StreamingClient::didFinishLoading(ResourceHandle*, double)
 {
     WebKitWebSrcPrivate* priv = m_src->priv;
 
diff --git a/WebCore/platform/network/BlobResourceHandle.cpp b/WebCore/platform/network/BlobResourceHandle.cpp
index 8767b55..48ac2c0 100644
--- a/WebCore/platform/network/BlobResourceHandle.cpp
+++ b/WebCore/platform/network/BlobResourceHandle.cpp
@@ -80,7 +80,7 @@ public:
 
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int /*lengthReceived*/);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
 private:
@@ -116,7 +116,7 @@ void BlobResourceSynchronousLoader::didReceiveData(ResourceHandle*, const char*,
 {
 }
 
-void BlobResourceSynchronousLoader::didFinishLoading(ResourceHandle*)
+void BlobResourceSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
 }
 
@@ -581,7 +581,7 @@ void BlobResourceHandle::notifyFail(int errorCode)
 void BlobResourceHandle::notifyFinish()
 {
     if (client())
-        client()->didFinishLoading(this);
+        client()->didFinishLoading(this, 0);
 }
 
 } // namespace WebCore
diff --git a/WebCore/platform/network/ResourceHandleClient.h b/WebCore/platform/network/ResourceHandleClient.h
index 97c0f54..d9350ee 100644
--- a/WebCore/platform/network/ResourceHandleClient.h
+++ b/WebCore/platform/network/ResourceHandleClient.h
@@ -26,6 +26,7 @@
 #ifndef ResourceHandleClient_h
 #define ResourceHandleClient_h
 
+#include <wtf/CurrentTime.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 
@@ -72,7 +73,7 @@ namespace WebCore {
         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&) { }
         virtual void didReceiveData(ResourceHandle*, const char*, int, int /*lengthReceived*/) { }
         virtual void didReceiveCachedMetadata(ResourceHandle*, const char*, int) { }
-        virtual void didFinishLoading(ResourceHandle*) { }
+        virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/) { }
         virtual void didFail(ResourceHandle*, const ResourceError&) { }
         virtual void wasBlocked(ResourceHandle*) { }
         virtual void cannotShowURL(ResourceHandle*) { }
diff --git a/WebCore/platform/network/cf/ResourceHandleCFNet.cpp b/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
index 763551f..13412c1 100644
--- a/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
+++ b/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
@@ -92,7 +92,7 @@ private:
     virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge&);
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int /*lengthReceived*/);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
     bool m_allowStoredCredentials;
@@ -241,7 +241,7 @@ void didFinishLoading(CFURLConnectionRef conn, const void* clientInfo)
     LOG(Network, "CFNet - didFinishLoading(conn=%p, handle=%p) (%s)", conn, handle, handle->firstRequest().url().string().utf8().data());
 
     if (handle->client())
-        handle->client()->didFinishLoading(handle);
+        handle->client()->didFinishLoading(handle, 0);
 }
 
 void didFail(CFURLConnectionRef conn, CFErrorRef error, const void* clientInfo) 
@@ -741,7 +741,7 @@ void WebCoreSynchronousLoaderClient::didReceiveData(ResourceHandle*, const char*
     CFDataAppendBytes(m_data.get(), reinterpret_cast<const UInt8*>(data), length);
 }
 
-void WebCoreSynchronousLoaderClient::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoaderClient::didFinishLoading(ResourceHandle*, double)
 {
     m_isDone = true;
 }
diff --git a/WebCore/platform/network/curl/ResourceHandleCurl.cpp b/WebCore/platform/network/curl/ResourceHandleCurl.cpp
index 8a322b4..052ac56 100644
--- a/WebCore/platform/network/curl/ResourceHandleCurl.cpp
+++ b/WebCore/platform/network/curl/ResourceHandleCurl.cpp
@@ -47,7 +47,7 @@ public:
 
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
     ResourceResponse resourceResponse() const { return m_response; }
@@ -74,7 +74,7 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
     m_data.append(data, length);
 }
 
-void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
 }
 
diff --git a/WebCore/platform/network/curl/ResourceHandleManager.cpp b/WebCore/platform/network/curl/ResourceHandleManager.cpp
index 8d2a1bf..a4d71e0 100644
--- a/WebCore/platform/network/curl/ResourceHandleManager.cpp
+++ b/WebCore/platform/network/curl/ResourceHandleManager.cpp
@@ -397,7 +397,7 @@ void ResourceHandleManager::downloadTimerCallback(Timer<ResourceHandleManager>*
             }
 
             if (d->client())
-                d->client()->didFinishLoading(job);
+                d->client()->didFinishLoading(job, 0);
         } else {
             char* url = 0;
             curl_easy_getinfo(d->m_handle, CURLINFO_EFFECTIVE_URL, &url);
@@ -624,7 +624,7 @@ static void parseDataUrl(ResourceHandle* handle)
             client->didReceiveData(handle, reinterpret_cast<const char*>(data.characters()), data.length() * sizeof(UChar), 0);
     }
 
-    client->didFinishLoading(handle);
+    client->didFinishLoading(handle, 0);
 }
 
 void ResourceHandleManager::dispatchSynchronousJob(ResourceHandle* job)
diff --git a/WebCore/platform/network/mac/ResourceHandleMac.mm b/WebCore/platform/network/mac/ResourceHandleMac.mm
index 6db9350..daec366 100644
--- a/WebCore/platform/network/mac/ResourceHandleMac.mm
+++ b/WebCore/platform/network/mac/ResourceHandleMac.mm
@@ -115,7 +115,7 @@ private:
     virtual void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge&);
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int /*lengthReceived*/);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
     virtual bool canAuthenticateAgainstProtectionSpace(ResourceHandle*, const ProtectionSpace&);
@@ -917,7 +917,7 @@ void ResourceHandle::receivedCancellation(const AuthenticationChallenge& challen
     if (!ResourceHandle::didSendBodyDataDelegateExists())
         disassociateStreamWithResourceHandle([m_handle->firstRequest().nsURLRequest() HTTPBodyStream]);
 
-    m_handle->client()->didFinishLoading(m_handle);
+    m_handle->client()->didFinishLoading(m_handle, 0);
 }
 
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
@@ -1059,7 +1059,7 @@ void WebCoreSynchronousLoaderClient::didReceiveData(ResourceHandle*, const char*
     [m_data appendBytes:data length:length];
 }
 
-void WebCoreSynchronousLoaderClient::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoaderClient::didFinishLoading(ResourceHandle*, double)
 {
     m_isDone = true;
 }
diff --git a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
index 2898303..30f7011 100644
--- a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
+++ b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
@@ -34,6 +34,7 @@
 #include <QNetworkCookie>
 #include <qwebframe.h>
 #include <qwebpage.h>
+
 #include <wtf/text/CString.h>
 
 #include <QDebug>
@@ -262,7 +263,7 @@ void QNetworkReplyHandler::finish()
         resetState();
         start();
     } else if (!m_reply->error() || ignoreHttpError(m_reply, m_responseDataSent)) {
-        client->didFinishLoading(m_resourceHandle);
+        client->didFinishLoading(m_resourceHandle, 0);
     } else {
         QUrl url = m_reply->url();
         int httpStatusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
diff --git a/WebCore/platform/network/qt/ResourceHandleQt.cpp b/WebCore/platform/network/qt/ResourceHandleQt.cpp
index 8a24d0f..a5ac4c3 100644
--- a/WebCore/platform/network/qt/ResourceHandleQt.cpp
+++ b/WebCore/platform/network/qt/ResourceHandleQt.cpp
@@ -62,7 +62,7 @@ public:
 
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
     ResourceResponse resourceResponse() const { return m_response; }
@@ -90,7 +90,7 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
     m_data.append(data, length);
 }
 
-void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
     m_eventLoop.exit();
 }
diff --git a/WebCore/platform/network/soup/ResourceHandleSoup.cpp b/WebCore/platform/network/soup/ResourceHandleSoup.cpp
index 1246c22..0009e36 100644
--- a/WebCore/platform/network/soup/ResourceHandleSoup.cpp
+++ b/WebCore/platform/network/soup/ResourceHandleSoup.cpp
@@ -65,7 +65,7 @@ public:
 
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
     void run();
@@ -102,7 +102,7 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
     m_data.append(data, length);
 }
 
-void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
     g_main_loop_quit(m_mainLoop);
     m_finished = true;
@@ -111,7 +111,7 @@ void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
 void WebCoreSynchronousLoader::didFail(ResourceHandle* handle, const ResourceError& error)
 {
     m_error = error;
-    didFinishLoading(handle);
+    didFinishLoading(handle, 0);
 }
 
 void WebCoreSynchronousLoader::run()
@@ -336,7 +336,7 @@ static void finishedCallback(SoupSession *session, SoupMessage* msg, gpointer da
             client->didReceiveData(handle.get(), msg->response_body->data, msg->response_body->length, true);
     }
 
-    client->didFinishLoading(handle.get());
+    client->didFinishLoading(handle.get(), 0);
 }
 
 // parseDataUrl() is taken from the CURL http backend.
@@ -415,7 +415,7 @@ static gboolean parseDataUrl(gpointer callbackData)
     if (d->m_cancelled || !handle->client())
         return false;
 
-    client->didFinishLoading(handle);
+    client->didFinishLoading(handle, 0);
 
     return false;
 }
@@ -717,7 +717,7 @@ static void closeCallback(GObject* source, GAsyncResult* res, gpointer)
     if (d->m_cancelled || !client)
         return;
 
-    client->didFinishLoading(handle.get());
+    client->didFinishLoading(handle.get(), 0);
 }
 
 static void readCallback(GObject* source, GAsyncResult* res, gpointer)
diff --git a/WebCore/platform/network/win/ResourceHandleWin.cpp b/WebCore/platform/network/win/ResourceHandleWin.cpp
index 600f8ca..832a8e2 100644
--- a/WebCore/platform/network/win/ResourceHandleWin.cpp
+++ b/WebCore/platform/network/win/ResourceHandleWin.cpp
@@ -38,6 +38,7 @@
 #include "ResourceHandleWin.h"
 #include "Timer.h"
 #include "WebCoreInstanceHandle.h"
+
 #include <wtf/text/CString.h>
 #include <windows.h>
 #include <wininet.h>
@@ -144,7 +145,7 @@ public:
 
     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
     virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
-    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
     virtual void didFail(ResourceHandle*, const ResourceError&);
 
 private:
@@ -170,7 +171,7 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
     m_data.append(data, length);
 }
 
-void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
 }
 
@@ -349,7 +350,7 @@ void ResourceHandle::onRequestComplete(LPARAM lParam)
         InternetCloseHandle(d->m_secondaryHandle);
     InternetCloseHandle(d->m_resourceHandle);
 
-    client()->didFinishLoading(this);
+    client()->didFinishLoading(this, 0);
     delete this;
 }
 
@@ -511,7 +512,7 @@ void ResourceHandle::fileLoadTimer(Timer<ResourceHandle>*)
 
     CloseHandle(fileHandle);
 
-    client()->didFinishLoading(this);
+    client()->didFinishLoading(this, 0);
 }
 
 void ResourceHandle::cancel()
@@ -521,7 +522,7 @@ void ResourceHandle::cancel()
     else
         d->m_fileLoadTimer.stop();
 
-    client()->didFinishLoading(this); 
+    client()->didFinishLoading(this, 0); 
 
     if (!d->m_resourceHandle)
         // Async load canceled before we have a handle -- mark ourselves as in error, to be deleted later.
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index b2b9214..d0f5ec3 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,26 @@
+2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: Provide network-based load timing.
+        Before this change, inspector used timers taken from
+        within WebCore notifications (that are by definition
+        synchronous and serialized). As a result, timing was
+        affected by the routines running on the main thread
+        (JavaScript and such).
+        https://bugs.webkit.org/show_bug.cgi?id=45664
+
+        * public/WebURLLoadTiming.h:
+        * public/WebURLLoaderClient.h:
+        (WebKit::WebURLLoaderClient::didFinishLoading):
+        * src/ResourceHandle.cpp:
+        (WebCore::ResourceHandleInternal::didFinishLoading):
+        * src/WebDevToolsAgentImpl.cpp:
+        (WebKit::WebDevToolsAgentImpl::didFinishLoading):
+        * src/WebURLLoadTiming.cpp:
+        (WebKit::WebURLLoadTiming::receiveHeadersStart):
+        (WebKit::WebURLLoadTiming::setReceiveHeadersStart):
+
 2010-09-14  Sheriff Bot  <webkit.review.bot at gmail.com>
 
         Unreviewed, rolling out r67503.
diff --git a/WebKit/chromium/public/WebURLLoaderClient.h b/WebKit/chromium/public/WebURLLoaderClient.h
index c716e5d..7614ea3 100644
--- a/WebKit/chromium/public/WebURLLoaderClient.h
+++ b/WebKit/chromium/public/WebURLLoaderClient.h
@@ -64,7 +64,10 @@ public:
     virtual void didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength) { }
 
     // Called when the load completes successfully.
-    virtual void didFinishLoading(WebURLLoader*) { }
+    virtual void didFinishLoading(WebURLLoader*, double finishTime) { }
+
+    // FIXME: remove this once clients are updated.
+    virtual void didFinishLoading(WebURLLoader* loader) { didFinishLoading(loader, 0); }
 
     // Called when the load completes with an error.
     virtual void didFail(WebURLLoader*, const WebURLError&) { }
diff --git a/WebKit/chromium/src/ResourceHandle.cpp b/WebKit/chromium/src/ResourceHandle.cpp
index 27bfe7f..83e0017 100644
--- a/WebKit/chromium/src/ResourceHandle.cpp
+++ b/WebKit/chromium/src/ResourceHandle.cpp
@@ -74,7 +74,7 @@ public:
     virtual void didReceiveResponse(WebURLLoader*, const WebURLResponse&);
     virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength);
     virtual void didReceiveCachedMetadata(WebURLLoader*, const char* data, int dataLength);
-    virtual void didFinishLoading(WebURLLoader*);
+    virtual void didFinishLoading(WebURLLoader*, double finishTime);
     virtual void didFail(WebURLLoader*, const WebURLError&);
 
     enum ConnectionState {
@@ -182,13 +182,13 @@ void ResourceHandleInternal::didReceiveCachedMetadata(WebURLLoader*, const char*
     m_client->didReceiveCachedMetadata(m_owner, data, dataLength);
 }
 
-void ResourceHandleInternal::didFinishLoading(WebURLLoader*)
+void ResourceHandleInternal::didFinishLoading(WebURLLoader*, double finishTime)
 {
     ASSERT(m_client);
     if (m_state != ConnectionStateReceivedResponse && m_state != ConnectionStateReceivingData)
         CRASH();
     m_state = ConnectionStateFinishedLoading;
-    m_client->didFinishLoading(m_owner);
+    m_client->didFinishLoading(m_owner, finishTime);
 }
 
 void ResourceHandleInternal::didFail(WebURLLoader*, const WebURLError& error)
diff --git a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
index 971c290..834d352 100644
--- a/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
+++ b/WebKit/chromium/src/WebDevToolsAgentImpl.cpp
@@ -58,6 +58,7 @@
 #include "WebURLResponse.h"
 #include "WebViewClient.h"
 #include "WebViewImpl.h"
+#include <wtf/CurrentTime.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/OwnPtr.h>
 
@@ -336,7 +337,7 @@ void WebDevToolsAgentImpl::didReceiveResponse(unsigned long resourceId, const We
 void WebDevToolsAgentImpl::didFinishLoading(unsigned long resourceId)
 {
     if (InspectorController* ic = inspectorController())
-        ic->didFinishLoading(resourceId);
+        ic->didFinishLoading(resourceId, 0);
 }
 
 void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURLError& error)
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index 9371523..35f43de 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,18 @@
+2010-09-14  Pavel Feldman  <pfeldman at chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: Provide network-based load timing.
+        Before this change, inspector used timers taken from
+        within WebCore notifications (that are by definition
+        synchronous and serialized). As a result, timing was
+        affected by the routines running on the main thread
+        (JavaScript and such).
+        https://bugs.webkit.org/show_bug.cgi?id=45664
+
+        * webkit/webkitdownload.cpp:
+        (DownloadClient::didFinishLoading):
+
 2010-09-13  Enrica Casucci  <enrica at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebKit/gtk/webkit/webkitdownload.cpp b/WebKit/gtk/webkit/webkitdownload.cpp
index 20cac2b..1e45250 100644
--- a/WebKit/gtk/webkit/webkitdownload.cpp
+++ b/WebKit/gtk/webkit/webkitdownload.cpp
@@ -60,7 +60,7 @@ class DownloadClient : public Noncopyable, public ResourceHandleClient {
 
         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
         virtual void didReceiveData(ResourceHandle*, const char*, int, int);
-        virtual void didFinishLoading(ResourceHandle*);
+        virtual void didFinishLoading(ResourceHandle*, double);
         virtual void didFail(ResourceHandle*, const ResourceError&);
         virtual void wasBlocked(ResourceHandle*);
         virtual void cannotShowURL(ResourceHandle*);
@@ -930,7 +930,7 @@ void DownloadClient::didReceiveData(ResourceHandle*, const char* data, int lengt
     webkit_download_received_data(m_download, data, length);
 }
 
-void DownloadClient::didFinishLoading(ResourceHandle*)
+void DownloadClient::didFinishLoading(ResourceHandle*, double)
 {
     webkit_download_finished_loading(m_download);
 }

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list