Index: chrome/browser/instant/instant_controller.cc |
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc |
index 6133e45715c52918198fc2d6094e374107683ec0..af356fc6054fb1c47634526524af3ebeccee522c 100644 |
--- a/chrome/browser/instant/instant_controller.cc |
+++ b/chrome/browser/instant/instant_controller.cc |
@@ -52,6 +52,10 @@ const int kUpdateBoundsDelayMS = 1000; |
// before we give up and blacklist it for the rest of the browsing session. |
const int kMaxInstantSupportFailures = 10; |
+// If an instant page has not been used in this much time, it is reloaded so |
+// that the page does not become stale. |
sreeram
2012/08/22 17:39:35
// If an Instant page has not been used in these m
Shishir
2012/08/23 18:26:33
Done.
|
+const int kInstantRefreshIntervalMS = 3 * 3600 * 1000; |
sreeram
2012/08/22 17:39:35
Perhaps call this kStaleLoaderTimeoutMS?
Shishir
2012/08/23 18:26:33
Done.
|
+ |
std::string ModeToString(InstantController::Mode mode) { |
switch (mode) { |
case InstantController::INSTANT: return "_Instant"; |
@@ -168,6 +172,9 @@ bool InstantController::Update(const AutocompleteMatch& match, |
return false; |
} |
+ // Rechedule the instant loader refresh. |
+ ScheduleLoaderRefresh(); |
+ |
// The presence of any suggested_text implies verbatim. |
DCHECK(suggested_text->empty() || verbatim) |
<< user_text << "|" << *suggested_text; |
@@ -264,6 +271,11 @@ TabContents* InstantController::CommitCurrentPreview(InstantCommitType type) { |
preview->web_contents()->GetController().CopyStateFromAndPrune( |
&active_tab->web_contents()->GetController()); |
delegate_->CommitInstant(preview); |
+ |
+ // Try to create another loader immediately so that it is ready for the next |
+ // user interaction. |
+ ResetLoaderWithDefaultUrlAndCurrentTab(); |
+ |
return preview; |
} |
@@ -398,23 +410,7 @@ void InstantController::OnAutocompleteLostFocus( |
} |
void InstantController::OnAutocompleteGotFocus() { |
- const TabContents* active_tab = delegate_->GetActiveTabContents(); |
- |
- // We could get here with no active tab if the Browser is closing. |
- if (!active_tab) |
- return; |
- |
- // Since we don't have any autocomplete match to work with, we'll just use |
- // the default search provider's Instant URL. |
- const TemplateURL* template_url = |
- TemplateURLServiceFactory::GetForProfile(active_tab->profile())-> |
- GetDefaultSearchProvider(); |
- |
- std::string instant_url; |
- if (!GetInstantURL(template_url, &instant_url)) |
- return; |
- |
- ResetLoader(instant_url, active_tab); |
+ ResetLoaderWithDefaultUrlAndCurrentTab(); |
} |
bool InstantController::commit_on_pointer_release() const { |
@@ -506,18 +502,63 @@ void InstantController::InstantLoaderContentsFocused(InstantLoader* loader) { |
#endif |
} |
+void InstantController::CreateLoader(const std::string& instant_url, |
+ const TabContents* active_tab) { |
+ DCHECK(!loader_.get()); |
+ loader_.reset(new InstantLoader(this, instant_url, active_tab)); |
+ loader_->Init(); |
+ ScheduleLoaderRefresh(); |
+ AddPreviewUsageForHistogram(mode_, PREVIEW_CREATED); |
+} |
sreeram
2012/08/22 17:39:35
We don't need this method (CreateLoader) at all. W
Shishir
2012/08/23 18:26:33
Done.
|
+ |
void InstantController::ResetLoader(const std::string& instant_url, |
const TabContents* active_tab) { |
if (GetPreviewContents() && loader_->instant_url() != instant_url) |
DeleteLoader(); |
- if (!GetPreviewContents()) { |
- loader_.reset(new InstantLoader(this, instant_url, active_tab)); |
- loader_->Init(); |
- AddPreviewUsageForHistogram(mode_, PREVIEW_CREATED); |
+ if (!GetPreviewContents()) |
+ CreateLoader(instant_url, active_tab); |
+} |
+ |
+void InstantController::ResetLoaderWithDefaultUrlAndCurrentTab() { |
+ const TabContents* active_tab = delegate_->GetActiveTabContents(); |
+ |
+ // We could get here with no active tab if the Browser is closing. |
+ if (!active_tab) |
+ return; |
+ |
+ const TemplateURL* template_url = |
+ TemplateURLServiceFactory::GetForProfile(active_tab->profile())-> |
+ GetDefaultSearchProvider(); |
+ std::string instant_url; |
+ if (!GetInstantURL(template_url, &instant_url)) |
+ return; |
+ |
+ ResetLoader(instant_url, active_tab); |
+} |
+ |
+void InstantController::ScheduleLoaderRefresh() { |
+ if (loader_refresh_timer_.IsRunning()) { |
+ loader_refresh_timer_.Reset(); |
+ } else { |
+ loader_refresh_timer_.Start( |
+ FROM_HERE, |
+ base::TimeDelta::FromMilliseconds(kInstantRefreshIntervalMS), this, |
+ &InstantController::RefreshLoader); |
} |
} |
+void InstantController::RefreshLoader() { |
+ // If the loader is showing, do not delete it, but reschedule a refresh. |
+ if (is_showing_) { |
+ ScheduleLoaderRefresh(); |
+ return; |
+ } |
+ |
+ DeleteLoader(); |
+ ResetLoaderWithDefaultUrlAndCurrentTab(); |
+} |
+ |
void InstantController::DeleteLoader() { |
Hide(); |
last_full_text_.clear(); |
@@ -529,6 +570,7 @@ void InstantController::DeleteLoader() { |
url_for_history_ = GURL(); |
if (GetPreviewContents()) |
AddPreviewUsageForHistogram(mode_, PREVIEW_DELETED); |
+ loader_refresh_timer_.Stop(); |
loader_.reset(); |
} |