Index: chrome/browser/ui/search/instant_controller.cc |
diff --git a/chrome/browser/ui/search/instant_controller.cc b/chrome/browser/ui/search/instant_controller.cc |
index f63aeab6c07470428821cdb5c2a6fbee6c264dc8..a3d6b91fdb1d85bc40e6861dd08b5e9e4bfe8c26 100644 |
--- a/chrome/browser/ui/search/instant_controller.cc |
+++ b/chrome/browser/ui/search/instant_controller.cc |
@@ -933,6 +933,16 @@ void InstantController::ActiveTabChanged() { |
} |
void InstantController::TabDeactivated(content::WebContents* contents) { |
+ std::string instant_url; |
+ if ((!instant_tab_ || !instant_tab_->supports_instant()) && |
+ GetInstantURL(browser_->profile(), false, &instant_url) && |
+ chrome::MatchesOriginAndPath(contents->GetURL(), |
+ GURL(instant_url))) { |
+ // TODO(dcblack): verify this won't nuke loading SRPs and the like. |
samarth
2013/04/30 17:10:33
This definitely will. In general, I don't think we
David Black
2013/04/30 23:09:08
As I mentioned in person, this is also necessary t
|
+ // (It probably will - likely need to check the mode or something.) |
+ RedirectToLocalNTP(contents); |
+ } |
+ |
LOG_INSTANT_DEBUG_EVENT(this, "TabDeactivated"); |
if (extended_enabled_ && !contents->IsBeingDestroyed()) |
CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); |
@@ -1074,6 +1084,29 @@ void InstantController::UndoAllMostVisitedDeletions() { |
top_sites->ClearBlacklistedURLs(); |
} |
+void InstantController::InstantPageLoadFailed(content::WebContents* contents) { |
+ GURL local_fallback_url = chrome::GetLocalInstantURL(browser_->profile()); |
+ |
+ if (instant_tab_ && IsContentsFrom(instant_tab(), contents)) { |
+ if (instant_tab_->IsLocal()) |
+ return; |
+ SearchTabHelper::FromWebContents(contents)->RedirectingToLocal(); |
+ RedirectToLocalNTP(contents); |
+ } |
+ |
+ if (ntp_ && IsContentsFrom(ntp(), contents)) { |
samarth
2013/04/30 17:10:33
Shouldn't this get handled normally via InstantSup
David Black
2013/04/30 23:09:08
Whether it *should* or not is not something I'm su
|
+ if (ntp_->IsLocal()) |
+ return; |
+ ResetNTP(false, true); |
+ } |
+ |
+ if (overlay_ && IsContentsFrom(overlay(), contents)) { |
+ if (overlay_->IsLocal()) |
+ return; |
+ CreateOverlay(local_fallback_url.spec(), contents); |
+ } |
+} |
+ |
void InstantController::Observe(int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
@@ -1706,12 +1739,6 @@ bool InstantController::ShouldSwitchToLocalNTP() const { |
if (ntp_->supports_instant()) |
return false; |
- // If this is not window startup, switch. |
- // TODO(shishir): This is not completely reliable. Find a better way to detect |
- // startup time. |
- if (browser_->GetActiveWebContents()) |
- return true; |
- |
return chrome::IsAggressiveLocalNTPFallbackEnabled(); |
} |
@@ -1719,3 +1746,13 @@ bool InstantController::UsingLocalPage() const { |
return (instant_tab_ && instant_tab_->IsLocal()) || |
(!instant_tab_ && overlay_ && overlay_->IsLocal()); |
} |
+ |
+void InstantController::RedirectToLocalNTP(content::WebContents* contents) { |
+ contents->GetController().LoadURL( |
+ chrome::GetLocalInstantURL(browser_->profile()), |
+ content::Referrer(), |
+ content::PAGE_TRANSITION_SERVER_REDIRECT, |
+ std::string()); // No extra headers. |
+ // Remove extraneous history entry. |
+ contents->GetController().PruneAllButActive(); |
samarth
2013/04/30 17:10:33
This isn't right in the general case. For example
David Black
2013/04/30 23:09:08
Yes, I know. However, I was unable to find a way
|
+} |