| Index: trunk/src/chrome/browser/ui/browser_instant_controller.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/ui/browser_instant_controller.cc (revision 244428)
|
| +++ trunk/src/chrome/browser/ui/browser_instant_controller.cc (working copy)
|
| @@ -16,6 +16,7 @@
|
| #include "chrome/browser/ui/omnibox/location_bar.h"
|
| #include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
|
| #include "chrome/browser/ui/omnibox/omnibox_view.h"
|
| +#include "chrome/browser/ui/search/instant_ntp.h"
|
| #include "chrome/browser/ui/search/instant_search_prerenderer.h"
|
| #include "chrome/browser/ui/search/search_model.h"
|
| #include "chrome/browser/ui/search/search_tab_helper.h"
|
| @@ -45,11 +46,13 @@
|
|
|
| BrowserInstantController::BrowserInstantController(Browser* browser)
|
| : browser_(browser),
|
| - instant_(this) {
|
| + instant_(this),
|
| + instant_unload_handler_(browser) {
|
| browser_->search_model()->AddObserver(this);
|
|
|
| InstantService* instant_service =
|
| InstantServiceFactory::GetForProfile(profile());
|
| + instant_service->OnBrowserInstantControllerCreated();
|
| instant_service->AddObserver(this);
|
| }
|
|
|
| @@ -59,8 +62,64 @@
|
| InstantService* instant_service =
|
| InstantServiceFactory::GetForProfile(profile());
|
| instant_service->RemoveObserver(this);
|
| + instant_service->OnBrowserInstantControllerDestroyed();
|
| }
|
|
|
| +bool BrowserInstantController::MaybeSwapInInstantNTPContents(
|
| + const GURL& url,
|
| + content::WebContents* source_contents,
|
| + content::WebContents** target_contents) {
|
| + if (url != GURL(chrome::kChromeUINewTabURL))
|
| + return false;
|
| +
|
| + GURL extension_url(url);
|
| + if (ExtensionWebUI::HandleChromeURLOverride(&extension_url, profile())) {
|
| + // If there is an extension overriding the NTP do not use the Instant NTP.
|
| + return false;
|
| + }
|
| +
|
| + InstantService* instant_service =
|
| + InstantServiceFactory::GetForProfile(profile());
|
| + scoped_ptr<content::WebContents> instant_ntp =
|
| + instant_service->ReleaseNTPContents();
|
| + if (!instant_ntp)
|
| + return false;
|
| +
|
| + *target_contents = instant_ntp.get();
|
| + if (source_contents) {
|
| + // If the Instant NTP hasn't yet committed an entry, we can't call
|
| + // CopyStateFromAndPrune. Instead, load the Local NTP URL directly in the
|
| + // source contents.
|
| + // TODO(sreeram): Always using the local URL is wrong in the case of the
|
| + // first tab in a window where we might want to use the remote URL. Fix.
|
| + if (!instant_ntp->GetController().CanPruneAllButLastCommitted()) {
|
| + source_contents->GetController().LoadURL(chrome::GetLocalInstantURL(
|
| + profile()), content::Referrer(), content::PAGE_TRANSITION_GENERATED,
|
| + std::string());
|
| + *target_contents = source_contents;
|
| + } else {
|
| + instant_ntp->GetController().CopyStateFromAndPrune(
|
| + &source_contents->GetController(), false);
|
| + ReplaceWebContentsAt(
|
| + browser_->tab_strip_model()->GetIndexOfWebContents(source_contents),
|
| + instant_ntp.Pass());
|
| + }
|
| + } else {
|
| + // If the Instant NTP hasn't yet committed an entry, we can't call
|
| + // PruneAllButLastCommitted. In that case, there shouldn't be any entries
|
| + // to prune anyway.
|
| + if (instant_ntp->GetController().CanPruneAllButLastCommitted())
|
| + instant_ntp->GetController().PruneAllButLastCommitted();
|
| + else
|
| + CHECK(!instant_ntp->GetController().GetLastCommittedEntry());
|
| +
|
| + // If |source_contents| is NULL, then the caller is responsible for
|
| + // inserting instant_ntp into the tabstrip and will take ownership.
|
| + ignore_result(instant_ntp.release());
|
| + }
|
| + return true;
|
| +}
|
| +
|
| bool BrowserInstantController::OpenInstant(WindowOpenDisposition disposition,
|
| const GURL& url) {
|
| // Unsupported dispositions.
|
| @@ -97,6 +156,16 @@
|
| return browser_->profile();
|
| }
|
|
|
| +void BrowserInstantController::ReplaceWebContentsAt(
|
| + int index,
|
| + scoped_ptr<content::WebContents> new_contents) {
|
| + DCHECK_NE(TabStripModel::kNoTab, index);
|
| + scoped_ptr<content::WebContents> old_contents(browser_->tab_strip_model()->
|
| + ReplaceWebContentsAt(index, new_contents.release()));
|
| + instant_unload_handler_.RunUnloadListenersOrDestroy(old_contents.Pass(),
|
| + index);
|
| +}
|
| +
|
| content::WebContents* BrowserInstantController::GetActiveWebContents() const {
|
| return browser_->tab_strip_model()->GetActiveWebContents();
|
| }
|
|
|