summaryrefslogtreecommitdiffstats
path: root/webkit/glue/webframeloaderclient_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/webframeloaderclient_impl.cc')
-rw-r--r--webkit/glue/webframeloaderclient_impl.cc51
1 files changed, 30 insertions, 21 deletions
diff --git a/webkit/glue/webframeloaderclient_impl.cc b/webkit/glue/webframeloaderclient_impl.cc
index 469fb02..e66157d 100644
--- a/webkit/glue/webframeloaderclient_impl.cc
+++ b/webkit/glue/webframeloaderclient_impl.cc
@@ -29,6 +29,7 @@ MSVC_PUSH_WARNING_LEVEL(0);
#include "PlatformString.h"
#include "PluginData.h"
#include "RefPtr.h"
+#include "StringExtras.h"
#include "WindowFeatures.h"
MSVC_POP_WARNING();
@@ -60,8 +61,11 @@ MSVC_POP_WARNING();
#include "webkit/glue/webview_delegate.h"
#include "webkit/glue/webview_impl.h"
#include "webkit/glue/weburlrequest.h"
+#include "webkit/glue/weburlrequest_impl.h"
using namespace WebCore;
+using base::Time;
+using base::TimeDelta;
// Domain for internal error codes.
static const char kInternalErrorDomain[] = "webkit_glue";
@@ -383,6 +387,10 @@ void WebFrameLoaderClient::dispatchDidFailLoading(DocumentLoader* loader,
void WebFrameLoaderClient::dispatchDidFinishDocumentLoad() {
WebViewImpl* webview = webframe_->webview_impl();
WebViewDelegate* d = webview->delegate();
+ DocumentLoader* documentLoader =
+ webframe_->frame()->loader()->activeDocumentLoader();
+ WebDataSourceImpl* data_source =
+ WebDataSourceImpl::FromLoader(documentLoader);
// A frame may be reused. This call ensures we don't hold on to our password
// listeners and their associated HTMLInputElements.
@@ -419,6 +427,7 @@ void WebFrameLoaderClient::dispatchDidFinishDocumentLoad() {
d->OnPasswordFormsSeen(webview, passwordForms);
if (d)
d->DidFinishDocumentLoadForFrame(webview, webframe_);
+ data_source->set_finish_document_load_time(base::Time::Now());
}
bool WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(
@@ -731,6 +740,21 @@ void WebFrameLoaderClient::dispatchDidStartProvisionalLoad() {
// about the client redirect the load is responsible for completing.
d->DidStartProvisionalLoadForFrame(webview, webframe_,
NavigationGestureForLastLoad());
+ DocumentLoader* documentLoader =
+ webframe_->frame()->loader()->activeDocumentLoader();
+ WebDataSourceImpl* dataSource =
+ WebDataSourceImpl::FromLoader(documentLoader);
+ if (dataSource->GetRequestTime().ToInternalValue() == 0) {
+ const Event *event = documentLoader->triggeringAction().event();
+ if (event) {
+ // If the request was generated by a click, we have to use the time
+ // from the event. Unfortunately this isn't tracked all the way from
+ // the platform event, but it will have to do
+ double eventTime = event->timeStamp() / 1000.0;
+ dataSource->set_request_time(Time::FromDoubleT(eventTime));
+ }
+ }
+ dataSource->set_start_load_time(base::Time::Now());
if (completing_client_redirect)
d->DidCompleteClientRedirect(webview, webframe_,
expected_client_redirect_src_);
@@ -803,8 +827,13 @@ void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError& error) {
}
void WebFrameLoaderClient::dispatchDidFinishLoad() {
+ DocumentLoader* documentLoader =
+ webframe_->frame()->loader()->activeDocumentLoader();
+ WebDataSourceImpl* dataSource =
+ WebDataSourceImpl::FromLoader(documentLoader);
WebViewImpl* webview = webframe_->webview_impl();
WebViewDelegate* d = webview->delegate();
+ dataSource->set_finish_load_time(base::Time::Now());
if (d)
d->DidFinishLoadForFrame(webview, webframe_);
WebPluginDelegate* plg_delegate = webframe_->plugin_delegate();
@@ -939,26 +968,6 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(
(webframe_->frame()->loader()->*function)(policy_action);
}
-// Conversion.
-static WebNavigationType NavigationTypeToWebNavigationType(
- WebCore::NavigationType t) {
- switch (t) {
- case WebCore::NavigationTypeLinkClicked:
- return WebNavigationTypeLinkClicked;
- case WebCore::NavigationTypeFormSubmitted:
- return WebNavigationTypeFormSubmitted;
- case WebCore::NavigationTypeBackForward:
- return WebNavigationTypeBackForward;
- case WebCore::NavigationTypeReload:
- return WebNavigationTypeReload;
- case WebCore::NavigationTypeFormResubmitted:
- return WebNavigationTypeFormResubmitted;
- default:
- case WebCore::NavigationTypeOther:
- return WebNavigationTypeOther;
- }
-}
-
void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(
WebCore::FramePolicyFunction function,
const WebCore::NavigationAction& action,
@@ -985,7 +994,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(
bool is_redirect = !ds->GetRedirectChain().empty();
WebNavigationType webnav_type =
- NavigationTypeToWebNavigationType(action.type());
+ WebDataSourceImpl::NavigationTypeToWebNavigationType(action.type());
disposition = d->DispositionForNavigationAction(
wv, webframe_, &ds->GetRequest(), webnav_type, disposition, is_redirect);