Index: content/browser/frame_host/navigation_controller_impl.cc |
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc |
index 4b1ba60e089679a1a873c195644e4dc35bdfdf7c..8ed3ece31beadd32b3809b05a7ca8b1b0de8a149 100644 |
--- a/content/browser/frame_host/navigation_controller_impl.cc |
+++ b/content/browser/frame_host/navigation_controller_impl.cc |
@@ -226,7 +226,8 @@ NavigationControllerImpl::NavigationControllerImpl( |
in_navigate_to_pending_entry_(false), |
pending_reload_(ReloadType::NONE), |
get_timestamp_callback_(base::Bind(&base::Time::Now)), |
- screenshot_manager_(new NavigationEntryScreenshotManager(this)) { |
+ screenshot_manager_(new NavigationEntryScreenshotManager(this)), |
+ last_committed_reload_type_(ReloadType::NONE) { |
DCHECK(browser_context_); |
} |
@@ -329,6 +330,22 @@ void NavigationControllerImpl::ReloadInternal(bool check_for_repost, |
if (!entry) |
return; |
+ // Check if previous navigation was reload to track reload operations. |
Charlie Reis
2016/09/19 22:23:51
nit: was a reload, to track consecutive reload ope
Takashi Toyoshima
2016/09/26 12:23:34
Done.
|
+ if (last_committed_reload_type_ != ReloadType::NONE) { |
+ base::Time now = |
+ time_smoother_.GetSmoothedTime(get_timestamp_callback_.Run()); |
Charlie Reis
2016/09/19 22:23:51
nit: Wrong indent. git cl format can take care of
Takashi Toyoshima
2016/09/26 12:23:34
Oops. Sorry, I forgot to run it for this patch set
|
+ base::TimeDelta delta = now - last_committed_reload_time_; |
Charlie Reis
2016/09/19 22:23:51
Maybe include a sanity check that last_committed_r
Takashi Toyoshima
2016/09/26 12:23:34
Done.
|
+ UMA_HISTOGRAM_MEDIUM_TIMES("Navigation.Reload.ReloadToReloadDuration", |
+ delta); |
+ if (last_committed_reload_type_ == ReloadType::MAIN_RESOURCE) { |
+ UMA_HISTOGRAM_MEDIUM_TIMES( |
+ "Navigation.Reload.ReloadMainResourceToReloadDuration", delta); |
+ } |
+ } |
+ |
+ // Set ReloadType for |entry| in order to check it at commit time. |
+ entry->set_reload_type(reload_type); |
Charlie Reis
2016/09/19 22:23:51
Side note: While debugging I discovered (much to m
Takashi Toyoshima
2016/09/26 12:23:34
Yeah, I noticed this problem too. I think it's fin
|
+ |
if (g_check_for_repost && check_for_repost && |
entry->GetHasPostData()) { |
// The user is asking to reload a page with POST data. Prompt to make sure |
@@ -802,6 +819,27 @@ bool NavigationControllerImpl::RendererDidNavigate( |
details->is_in_page = IsURLInPageNavigation(params.url, params.origin, |
params.was_within_same_page, rfh); |
+ // Update reload information to track user initiated reload operations for the |
+ // same content. |
+ if (pending_entry_ && pending_entry_->GetUniqueID() == params.nav_entry_id) { |
Charlie Reis
2016/09/19 22:23:51
I would suggest using PendingEntryMatchesHandle in
Takashi Toyoshima
2016/09/26 12:23:34
Done. Is my fix correct? I use rfh->navigation_han
Charlie Reis
2016/09/26 23:34:39
Yes, that looks right to me, thanks.
|
+ // If navigation was initiated by |pending_entry_|, save reload type and |
+ // timestamp to check when the next reload is requested. |
+ last_committed_reload_type_ = pending_entry_->reload_type(); |
+ last_committed_reload_time_ = pending_entry_->GetTimestamp(); |
Charlie Reis
2016/09/19 22:23:51
This won't be the right timestamp, because it does
Takashi Toyoshima
2016/09/26 12:23:34
Done.
|
+ } else if ((details->type == NAVIGATION_TYPE_EXISTING_PAGE && |
+ params.gesture == NavigationGestureUser) || |
+ (details->type != NAVIGATION_TYPE_EXISTING_PAGE && |
+ details->type != NAVIGATION_TYPE_AUTO_SUBFRAME)) { |
Charlie Reis
2016/09/19 22:23:51
This doesn't look like the right condition.
We wa
Takashi Toyoshima
2016/09/26 12:23:34
Done.
|
+ // Same page navigation initiated by user action, e.g. clicking an anchor to |
+ // the same URL, should reset the reload information as we do for other |
+ // user initiated navigation to a different page. |
+ // But we do not reset if the same page navigation was initiated without any |
+ // user action. For instance, location.reload() should not reset it. |
+ // We also ignore subframe navigations automatically performed inside the |
+ // page. |
+ last_committed_reload_type_ = ReloadType::NONE; |
Charlie Reis
2016/09/19 22:23:51
Also clear the timestamp, to avoid having old data
Takashi Toyoshima
2016/09/26 12:23:33
Done.
|
+ } |
+ |
switch (details->type) { |
case NAVIGATION_TYPE_NEW_PAGE: |
RendererDidNavigateToNewPage(rfh, params, details->is_in_page, |