Index: chrome/browser/instant/instant_controller.cc |
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc |
index 6314a47f70ccc5f00ee9621f207d5c4be214c077..9ae8c0aa12e98e93bb45e700ba4184d5bfcb4c05 100644 |
--- a/chrome/browser/instant/instant_controller.cc |
+++ b/chrome/browser/instant/instant_controller.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/instant/instant_controller.h" |
#include "base/command_line.h" |
+#include "base/debug/stack_trace.h" |
sreeram
2013/01/25 18:17:29
Remove this before submitting.
Jered
2013/01/25 19:27:18
Done.
|
#include "base/metrics/histogram.h" |
#include "base/string_util.h" |
#include "base/utf_string_conversions.h" |
@@ -180,7 +181,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() { |
@@ -909,6 +911,8 @@ void InstantController::InstantLoaderAboutToNavigateMainFrame(const GURL& url) { |
if (model_.mode().is_ntp() || |
(url.host() != instant_url.host() || url.path() != instant_url.path())) { |
CommitIfPossible(INSTANT_COMMIT_NAVIGATED); |
+ } else { |
+ UpdateTransientHistoryEntry(url); |
} |
} |
@@ -1088,6 +1092,8 @@ void InstantController::HideInternal() { |
loader_->Update(string16(), 0, 0, true); |
} |
+ ResetTransientHistoryEntry(); |
+ |
// Clear the first interaction timestamp for later use. |
first_interaction_time_ = base::Time(); |
} |
@@ -1145,6 +1151,50 @@ void InstantController::ShowLoader(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(); |
+ // Save any transient entry already associated with the active tab. |
+ content::NavigationEntry* old_transient_entry = |
+ active_tab->GetController().GetTransientEntry(); |
+ if (old_transient_entry && !instant_set_transient_entry_) |
+ transient_entry_.reset( |
+ content::NavigationEntry::Create(*old_transient_entry)); |
+ // 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 = loader_->base_navigation_entry(); |
+ DCHECK(base_entry != NULL); |
+ content::NavigationEntry* new_transient_entry = |
+ content::NavigationEntry::Create(*base_entry); |
+ active_tab->GetController().AddTransientEntry(new_transient_entry); |
+ instant_set_transient_entry_ = true; |
+} |
+ |
+void InstantController::ResetTransientHistoryEntry() { |
+ content::NavigationEntry* old_transient_entry = transient_entry_.release(); |
+ if (old_transient_entry) { |
+ content::WebContents* active_tab = browser_->GetActiveWebContents(); |
+ active_tab->GetController().AddTransientEntry(old_transient_entry); |
+ chrome::search::SearchTabHelper::FromWebContents(active_tab)-> |
+ NavigationEntryUpdated(); |
+ } |
+ instant_set_transient_entry_ = false; |
+} |
+ |
+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(); |
+ transient_entry->SetURL(url); |
+ transient_entry->SetVirtualURL(url); |
+ } |
} |
void InstantController::SendPopupBoundsToPage() { |