Index: chrome/browser/instant/instant_controller.cc |
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc |
index 80f9b796a4cf181a57ac371c9af2bab3abe1c1df..fad04d677073215b45861868a1dedb4472c2fba4 100644 |
--- a/chrome/browser/instant/instant_controller.cc |
+++ b/chrome/browser/instant/instant_controller.cc |
@@ -183,7 +183,8 @@ InstantController::InstantController(chrome::BrowserInstantController* browser, |
omnibox_focus_state_(OMNIBOX_FOCUS_NONE), |
start_margin_(0), |
end_margin_(0), |
- allow_preview_to_show_search_suggestions_(false) { |
+ allow_preview_to_show_search_suggestions_(false), |
+ instant_set_transient_entry_(false) { |
} |
InstantController::~InstantController() { |
@@ -933,6 +934,8 @@ void InstantController::InstantPageAboutToNavigateMainFrame( |
if (model_.mode().is_ntp() || |
(url.host() != instant_url.host() || url.path() != instant_url.path())) { |
CommitIfPossible(INSTANT_COMMIT_NAVIGATED); |
+ } else { |
+ UpdateTransientHistoryEntry(url); |
} |
} |
@@ -1202,6 +1205,8 @@ void InstantController::HideInternal() { |
overlay_->Update(string16(), 0, 0, true); |
} |
+ ResetTransientHistoryEntry(); |
+ |
// Clear the first interaction timestamp for later use. |
first_interaction_time_ = base::Time(); |
} |
@@ -1260,6 +1265,43 @@ void InstantController::ShowOverlay(InstantShownReason reason, |
// overlay (because we're not full height). |
if (reason == INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION) |
CommitIfPossible(INSTANT_COMMIT_CLICKED_QUERY_SUGGESTION); |
+ else if (extended_enabled_ && IsFullHeight(model_)) |
+ SetTransientHistoryEntry(); |
+} |
+ |
+void InstantController::SetTransientHistoryEntry() { |
+ content::WebContents* active_tab = browser_->GetActiveWebContents(); |
+ // If the active tab already has a transient entry, leave it alone. |
+ if (active_tab->GetController().GetTransientEntry()) |
+ return; |
+ // The loader's base navigation entry should describe the search provider |
+ // without reference to a specific query. The alternative, updating the query |
+ // in the tab title as the user types, would be distracting. |
+ const content::NavigationEntry* base_entry = |
+ overlay_->base_navigation_entry(); |
+ DCHECK(base_entry != NULL); |
+ content::NavigationEntry* transient_entry = |
+ content::NavigationEntry::Create(*base_entry); |
+ active_tab->GetController().AddTransientEntry(transient_entry); |
+ instant_set_transient_entry_ = true; |
+} |
+ |
+void InstantController::UpdateTransientHistoryEntry(const GURL& url) { |
+ // URL should update so that if the user presses reload, we reload the page |
+ // for the current query, but title remains unchanged so it doesn't flicker. |
+ if (instant_set_transient_entry_) { |
+ content::WebContents* active_tab = browser_->GetActiveWebContents(); |
+ content::NavigationEntry* transient_entry = |
+ active_tab->GetController().GetTransientEntry(); |
+ DCHECK(transient_entry != NULL); |
+ transient_entry->SetURL(url); |
+ transient_entry->SetVirtualURL(url); |
+ } |
+} |
+ |
+void InstantController::ResetTransientHistoryEntry() { |
+ // NavigationController will discard the entry. |
+ instant_set_transient_entry_ = false; |
} |
void InstantController::SendPopupBoundsToPage() { |