diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-05 12:50:07 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-05 12:50:07 +0000 |
commit | dabb0d1ddd62548ad899caf16ea4ac9a0f68593f (patch) | |
tree | c848ab25304cd520c7dca09083d8872052d88adf /chrome/browser | |
parent | a22fa6825a1afeace5a9110ab4c732fd3c3ebe2c (diff) | |
download | chromium_src-dabb0d1ddd62548ad899caf16ea4ac9a0f68593f.zip chromium_src-dabb0d1ddd62548ad899caf16ea4ac9a0f68593f.tar.gz chromium_src-dabb0d1ddd62548ad899caf16ea4ac9a0f68593f.tar.bz2 |
Implement the frame id required for the web navigation api.
BUG=50943
TEST=*.WebNavigationEvents
Review URL: http://codereview.chromium.org/3561008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61503 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
9 files changed, 61 insertions, 27 deletions
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc index 589d5b6..6281a06 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.cc +++ b/chrome/browser/extensions/extension_webnavigation_api.cc @@ -21,6 +21,21 @@ namespace keys = extension_webnavigation_api_constants; +namespace { + +// Returns 0 if the navigation happens in the main frame, or the frame ID +// modulo 32 bits otherwise. +int GetFrameId(ProvisionalLoadDetails* details) { + return details->main_frame() ? 0 : static_cast<int>(details->frame_id()); +} + +// Returns |time| as milliseconds since the epoch. +double MilliSecondsFromTime(const base::Time& time) { + return 1000 * time.ToDoubleT(); +} + +} // namespace + // static ExtensionWebNavigationEventRouter* ExtensionWebNavigationEventRouter::GetInstance() { @@ -75,11 +90,9 @@ void ExtensionWebNavigationEventRouter::FrameProvisionalLoadStart( ExtensionTabUtil::GetTabId(controller->tab_contents())); dict->SetString(keys::kUrlKey, details->url().spec()); - dict->SetInteger(keys::kFrameIdKey, 0); + dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); dict->SetInteger(keys::kRequestIdKey, 0); - dict->SetReal(keys::kTimeStampKey, - static_cast<double>( - (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds())); + dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); args.Append(dict); std::string json_args; @@ -96,16 +109,14 @@ void ExtensionWebNavigationEventRouter::FrameProvisionalLoadCommitted( ExtensionTabUtil::GetTabId(controller->tab_contents())); dict->SetString(keys::kUrlKey, details->url().spec()); - dict->SetInteger(keys::kFrameIdKey, 0); + dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); dict->SetString(keys::kTransitionTypeKey, PageTransition::CoreTransitionString( details->transition_type())); dict->SetString(keys::kTransitionQualifiersKey, PageTransition::QualifierString( details->transition_type())); - dict->SetReal(keys::kTimeStampKey, - static_cast<double>( - (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds())); + dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); args.Append(dict); std::string json_args; @@ -122,12 +133,10 @@ void ExtensionWebNavigationEventRouter::FailProvisionalLoadWithError( ExtensionTabUtil::GetTabId(controller->tab_contents())); dict->SetString(keys::kUrlKey, details->url().spec()); - dict->SetInteger(keys::kFrameIdKey, 0); + dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); dict->SetString(keys::kErrorKey, std::string(net::ErrorToString(details->error_code()))); - dict->SetReal(keys::kTimeStampKey, - static_cast<double>( - (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds())); + dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); args.Append(dict); std::string json_args; diff --git a/chrome/browser/extensions/extension_webnavigation_api.h b/chrome/browser/extensions/extension_webnavigation_api.h index 95ba032..21cfb16 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.h +++ b/chrome/browser/extensions/extension_webnavigation_api.h @@ -10,6 +10,8 @@ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_WEBNAVIGATION_API_H_ #pragma once +#include <map> + #include "base/singleton.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/common/notification_observer.h" @@ -18,6 +20,7 @@ class NavigationController; class ProvisionalLoadDetails; +class TabContents; // Observes navigation notifications and routes them as events to the extension // system. diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index a702b08..143bc1a 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1166,7 +1166,8 @@ void RenderViewHost::OnMsgDidRunInsecureContent( resource_delegate->DidRunInsecureContent(security_origin); } -void RenderViewHost::OnMsgDidStartProvisionalLoadForFrame(bool is_main_frame, +void RenderViewHost::OnMsgDidStartProvisionalLoadForFrame(long long frame_id, + bool is_main_frame, const GURL& url) { GURL validated_url(url); FilterURL(ChildProcessSecurityPolicy::GetInstance(), @@ -1175,12 +1176,13 @@ void RenderViewHost::OnMsgDidStartProvisionalLoadForFrame(bool is_main_frame, RenderViewHostDelegate::Resource* resource_delegate = delegate_->GetResourceDelegate(); if (resource_delegate) { - resource_delegate->DidStartProvisionalLoadForFrame(this, is_main_frame, - validated_url); + resource_delegate->DidStartProvisionalLoadForFrame( + this, frame_id, is_main_frame, validated_url); } } void RenderViewHost::OnMsgDidFailProvisionalLoadWithError( + long long frame_id, bool is_main_frame, int error_code, const GURL& url, @@ -1188,7 +1190,8 @@ void RenderViewHost::OnMsgDidFailProvisionalLoadWithError( LOG(INFO) << "Failed Provisional Load: " << url.possibly_invalid_spec() << ", error_code: " << error_code << " is_main_frame: " << is_main_frame - << " showing_repost_interstitial: " << showing_repost_interstitial; + << " showing_repost_interstitial: " << showing_repost_interstitial + << " frame_id: " << frame_id; GURL validated_url(url); FilterURL(ChildProcessSecurityPolicy::GetInstance(), process()->id(), &validated_url); @@ -1197,7 +1200,7 @@ void RenderViewHost::OnMsgDidFailProvisionalLoadWithError( delegate_->GetResourceDelegate(); if (resource_delegate) { resource_delegate->DidFailProvisionalLoadWithError( - this, is_main_frame, error_code, validated_url, + this, frame_id, is_main_frame, error_code, validated_url, showing_repost_interstitial); } } diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index b9bf703..b83ccce 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -550,9 +550,11 @@ class RenderViewHost : public RenderWidgetHost { const std::string& security_info); void OnMsgDidDisplayInsecureContent(); void OnMsgDidRunInsecureContent(const std::string& security_origin); - void OnMsgDidStartProvisionalLoadForFrame(bool main_frame, + void OnMsgDidStartProvisionalLoadForFrame(long long frame_id, + bool main_frame, const GURL& url); - void OnMsgDidFailProvisionalLoadWithError(bool main_frame, + void OnMsgDidFailProvisionalLoadWithError(long long frame_id, + bool main_frame, int error_code, const GURL& url, bool showing_repost_interstitial); diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index 58c94ad..28a94de 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -302,6 +302,7 @@ class RenderViewHostDelegate { // The RenderView is starting a provisional load. virtual void DidStartProvisionalLoadForFrame( RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, const GURL& url) = 0; @@ -341,6 +342,7 @@ class RenderViewHostDelegate { // The RenderView failed a provisional load with an error. virtual void DidFailProvisionalLoadWithError( RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, int error_code, const GURL& url, diff --git a/chrome/browser/tab_contents/provisional_load_details.cc b/chrome/browser/tab_contents/provisional_load_details.cc index e1e85d2..dedf3e8 100644 --- a/chrome/browser/tab_contents/provisional_load_details.cc +++ b/chrome/browser/tab_contents/provisional_load_details.cc @@ -11,7 +11,8 @@ ProvisionalLoadDetails::ProvisionalLoadDetails(bool is_main_frame, bool is_in_page_navigation, const GURL& url, const std::string& security_info, - bool is_content_filtered) + bool is_content_filtered, + long long frame_id) : error_code_(net::OK), transition_type_(PageTransition::LINK), url_(url), @@ -21,7 +22,8 @@ ProvisionalLoadDetails::ProvisionalLoadDetails(bool is_main_frame, ssl_cert_status_(0), ssl_security_bits_(-1), ssl_connection_status_(0), - is_content_filtered_(is_content_filtered) { + is_content_filtered_(is_content_filtered), + frame_id_(frame_id) { SSLManager::DeserializeSecurityInfo(security_info, &ssl_cert_id_, &ssl_cert_status_, diff --git a/chrome/browser/tab_contents/provisional_load_details.h b/chrome/browser/tab_contents/provisional_load_details.h index 2073db0..a9b0baa 100644 --- a/chrome/browser/tab_contents/provisional_load_details.h +++ b/chrome/browser/tab_contents/provisional_load_details.h @@ -27,7 +27,8 @@ class ProvisionalLoadDetails { bool in_page_navigation, const GURL& url, const std::string& security_info, - bool is_filtered); + bool is_filtered, + long long frame_id); virtual ~ProvisionalLoadDetails() { } void set_error_code(int error_code) { error_code_ = error_code; } @@ -56,6 +57,8 @@ class ProvisionalLoadDetails { bool is_content_filtered() const { return is_content_filtered_; } + long long frame_id() const { return frame_id_; } + private: int error_code_; PageTransition::Type transition_type_; @@ -67,6 +70,7 @@ class ProvisionalLoadDetails { int ssl_security_bits_; int ssl_connection_status_; bool is_content_filtered_; + long long frame_id_; DISALLOW_COPY_AND_ASSIGN(ProvisionalLoadDetails); }; diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 486e52c..3c05931 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -2093,11 +2093,12 @@ void TabContents::OnSetSuggestResult(int32 page_id, const std::string& result) { void TabContents::DidStartProvisionalLoadForFrame( RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, const GURL& url) { ProvisionalLoadDetails details(is_main_frame, controller_.IsURLInPageNavigation(url), - url, std::string(), false); + url, std::string(), false, frame_id); NotificationService::current()->Notify( NotificationType::FRAME_PROVISIONAL_LOAD_START, Source<NavigationController>(&controller_), @@ -2156,6 +2157,7 @@ void TabContents::DidRunInsecureContent(const std::string& security_origin) { void TabContents::DidFailProvisionalLoadWithError( RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, int error_code, const GURL& url, @@ -2201,7 +2203,7 @@ void TabContents::DidFailProvisionalLoadWithError( // Send out a notification that we failed a provisional load with an error. ProvisionalLoadDetails details(is_main_frame, controller_.IsURLInPageNavigation(url), - url, std::string(), false); + url, std::string(), false, frame_id); details.set_error_code(error_code); NotificationService::current()->Notify( @@ -2429,9 +2431,14 @@ void TabContents::DidNavigate(RenderViewHost* rvh, // different from the NAV_ENTRY_COMMITTED notification which doesn't include // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations. if (details.type != NavigationType::NAV_IGNORE) { - ProvisionalLoadDetails load_details(details.is_main_frame, - details.is_in_page, - params.url, std::string(), false); + // For AUTO_SUBFRAME navigations, an event for the main frame is generated + // that is not recorded in the navigation history. For the purpose of + // tracking navigation events, we treat this event as a sub frame navigation + // event. + bool is_main_frame = did_navigate ? details.is_main_frame : false; + ProvisionalLoadDetails load_details( + is_main_frame, details.is_in_page, params.url, std::string(), false, + params.frame_id); load_details.set_transition_type(params.transition); // Whether or not a page transition was triggered by going backward or // forward in the history is only stored in the navigation controller's diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h index b8264fc..f770c42 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -869,6 +869,7 @@ class TabContents : public PageNavigator, // RenderViewHostDelegate::Resource implementation. virtual void DidStartProvisionalLoadForFrame(RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, const GURL& url); virtual void DidStartReceivingResourceResponse( @@ -887,6 +888,7 @@ class TabContents : public PageNavigator, virtual void DidRunInsecureContent(const std::string& security_origin); virtual void DidFailProvisionalLoadWithError( RenderViewHost* render_view_host, + long long frame_id, bool is_main_frame, int error_code, const GURL& url, |