Chromium Code Reviews| 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..c7f442f58a353dfe2a0b064196a2bc6236f83225 100644 |
| --- a/chrome/browser/instant/instant_controller.cc |
| +++ b/chrome/browser/instant/instant_controller.cc |
| @@ -180,7 +180,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() { |
| @@ -689,8 +690,15 @@ void InstantController::ActiveTabChanged() { |
| void InstantController::TabDeactivated(content::WebContents* contents) { |
| DVLOG(1) << "TabDeactivated"; |
| - if (extended_enabled_ && !contents->IsBeingDestroyed()) |
| - CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); |
| + if (extended_enabled_) { |
| + if (!contents->IsBeingDestroyed()) { |
| + CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); |
| + } else { |
| + // The tab is going away. Trying to restore its original transient entry |
| + // would affect the wrong tab. |
| + saved_transient_entry_.reset(); |
|
sreeram
2013/01/25 21:28:02
Doesn't this break tab-restore? Quoting myself fro
|
| + } |
| + } |
| } |
| void InstantController::SetInstantEnabled(bool instant_enabled) { |
| @@ -909,6 +917,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 +1098,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 +1157,51 @@ 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_) |
| + saved_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::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::ResetTransientHistoryEntry() { |
| + content::NavigationEntry* old_transient_entry = |
| + saved_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::SendPopupBoundsToPage() { |