Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1640)

Unified Diff: chrome/browser/instant/instant_loader.cc

Issue 12386019: Instant: Use only one hidden WebContents per profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/instant/instant_loader.cc
diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc
index 629a7a66342921c46adeaa099a43fad56af383b7..d95f11927284e70574e1033a50922229736acc5e 100644
--- a/chrome/browser/instant/instant_loader.cc
+++ b/chrome/browser/instant/instant_loader.cc
@@ -4,21 +4,12 @@
#include "chrome/browser/instant/instant_loader.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
-#include "chrome/browser/favicon/favicon_tab_helper.h"
-#include "chrome/browser/history/history_tab_helper.h"
-#include "chrome/browser/safe_browsing/safe_browsing_tab_observer.h"
-#include "chrome/browser/tab_contents/tab_util.h"
-#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h"
-#include "chrome/browser/ui/search/search_tab_helper.h"
-#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/notification_types.h"
-#include "content/public/browser/render_widget_host_view.h"
+#include "base/stringprintf.h"
+#include "chrome/browser/instant/instant_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/search/search.h"
#include "content/public/browser/site_instance.h"
-#include "content/public/browser/web_contents_view.h"
+#include "content/public/browser/web_contents.h"
namespace {
@@ -29,188 +20,137 @@ const char kInstantHeader[] = "X-Purpose: Instant";
} // namespace
-InstantLoader::Delegate::~Delegate() {
-}
-
-InstantLoader::InstantLoader(Delegate* delegate)
- : delegate_(delegate),
- contents_(NULL),
- stale_page_timer_(false, false) {
+InstantLoader::InstantLoader(InstantService* service)
+ : InstantWebContentsContainer(
+ ALLOW_THIS_IN_INITIALIZER_LIST(this), service),
+ service_(service) {
+ service_->AddObserver(this);
}
InstantLoader::~InstantLoader() {
+ service_->RemoveObserver(this);
}
-void InstantLoader::Init(const GURL& instant_url,
- Profile* profile,
- const content::WebContents* active_tab,
- const base::Closure& on_stale_callback) {
- content::WebContents::CreateParams create_params(profile);
- create_params.site_instance = content::SiteInstance::CreateForURL(
- profile, instant_url);
- SetContents(scoped_ptr<content::WebContents>(
- content::WebContents::Create(create_params)));
- instant_url_ = instant_url;
- on_stale_callback_ = on_stale_callback;
-}
-
-void InstantLoader::Load() {
- DVLOG(1) << "LoadURL: " << instant_url_;
- contents_->GetController().LoadURL(
- instant_url_, content::Referrer(),
- content::PAGE_TRANSITION_GENERATED, kInstantHeader);
- contents_->WasHidden();
- stale_page_timer_.Start(
- FROM_HERE,
- base::TimeDelta::FromMilliseconds(kStalePageTimeoutMS),
- on_stale_callback_);
-}
-
-void InstantLoader::SetContents(scoped_ptr<content::WebContents> new_contents) {
- contents_.reset(new_contents.release());
- contents_->SetDelegate(this);
-
- // Set up various tab helpers. The rest will get attached when (if) the
- // contents is added to the tab strip.
-
- // Tab helpers to control popups.
- BlockedContentTabHelper::CreateForWebContents(contents());
- BlockedContentTabHelper::FromWebContents(contents())->
- SetAllContentsBlocked(true);
- TabSpecificContentSettings::CreateForWebContents(contents());
- TabSpecificContentSettings::FromWebContents(contents())->
- SetPopupsBlocked(true);
+void InstantLoader::InitContents() {
+ if (contents_ && (supports_instant() || contents_->IsLoading()))
+ return;
- // A tab helper to catch prerender content swapping shenanigans.
- CoreTabHelper::CreateForWebContents(contents());
- CoreTabHelper::FromWebContents(contents())->set_delegate(this);
+ GURL instant_url = chrome::search::GetInstantURL(service_->profile());
+ if (!instant_url.is_valid())
+ return;
- // Tab helpers used when committing a preview.
- chrome::search::SearchTabHelper::CreateForWebContents(contents());
- HistoryTabHelper::CreateForWebContents(contents());
+ content::WebContents::CreateParams create_params(service_->profile(),
+ content::SiteInstance::CreateForURL(service_->profile(), instant_url));
+ contents_.reset(content::WebContents::Create(create_params));
- // Observers.
- extensions::WebNavigationTabObserver::CreateForWebContents(contents());
+ SetUpContents();
- // Favicons, required by the Task Manager.
- FaviconTabHelper::CreateForWebContents(contents());
+ service_->LogDebugEvent(base::StringPrintf("%p LoadURL '%s'",
+ this,
+ instant_url.spec().c_str()));
- // And some flat-out paranoia.
- safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(contents());
+ contents_->GetController().LoadURL(instant_url, content::Referrer(),
+ content::PAGE_TRANSITION_GENERATED, kInstantHeader);
+ contents_->WasHidden();
-#if defined(OS_MACOSX)
- // If |contents_| doesn't yet have a RWHV, SetTakesFocusOnlyOnMouseDown() will
- // be called later, when NOTIFICATION_RENDER_VIEW_HOST_CHANGED is received.
- if (content::RenderWidgetHostView* rwhv =
- contents_->GetRenderWidgetHostView())
- rwhv->SetTakesFocusOnlyOnMouseDown(true);
- registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED,
- content::Source<content::NavigationController>(
- &contents_->GetController()));
-#endif
+ stale_page_timer_.Start(FROM_HERE,
+ base::TimeDelta::FromMilliseconds(kStalePageTimeoutMS),
+ this, &InstantLoader::ReloadContents);
}
scoped_ptr<content::WebContents> InstantLoader::ReleaseContents() {
- contents_->SetDelegate(NULL);
+ TearDownContents();
+ scoped_ptr<content::WebContents> old_contents(contents_.Pass());
+ InitContents();
+ return old_contents.Pass();
+}
- // Undo tab helper work done in SetContents().
+void InstantLoader::RenderViewGone(const content::WebContents* /* contents */) {
+ DeleteContents();
+}
- BlockedContentTabHelper::FromWebContents(contents())->
- SetAllContentsBlocked(false);
- TabSpecificContentSettings::FromWebContents(contents())->
- SetPopupsBlocked(false);
+void InstantLoader::InitSearchBox(const content::WebContents* /* contents */) {
+ page_.DisplayInstantResults(
+ chrome::search::IsInstantPrefEnabled(service_->profile()));
+ page_.ThemeChanged(service_->theme_info());
+ page_.FontChanged(service_->omnibox_font_name(),
+ service_->omnibox_font_size());
+}
- CoreTabHelper::FromWebContents(contents())->set_delegate(NULL);
+void InstantLoader::InstantSupportDetermined(
+ const content::WebContents* /* contents */) {
+ if (!supports_instant())
+ DeleteContents();
+ service_->InstantSupportDecided();
+}
-#if defined(OS_MACOSX)
- if (content::RenderWidgetHostView* rwhv =
- contents_->GetRenderWidgetHostView())
- rwhv->SetTakesFocusOnlyOnMouseDown(false);
- registrar_.Remove(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED,
- content::Source<content::NavigationController>(
- &contents_->GetController()));
-#endif
+void InstantLoader::SetSuggestion(const content::WebContents* /* contents */,
+ const InstantSuggestion& /* suggestion */) {
+}
- return contents_.Pass();
+void InstantLoader::NavigateToURL(const content::WebContents* /* contents */,
+ const GURL& /* url */,
+ content::PageTransition /* transition */,
+ WindowOpenDisposition /* disposition */) {
}
-void InstantLoader::Observe(int type,
- const content::NotificationSource& /* source */,
- const content::NotificationDetails& /* details */) {
-#if defined(OS_MACOSX)
- if (type == content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED) {
- if (content::RenderWidgetHostView* rwhv =
- contents_->GetRenderWidgetHostView())
- rwhv->SetTakesFocusOnlyOnMouseDown(true);
- return;
- }
- NOTREACHED();
-#endif
+void InstantLoader::ShowOverlay(const content::WebContents* /* contents */,
+ int /* height */,
+ bool /* is_height_in_pixels */) {
}
-void InstantLoader::SwapTabContents(content::WebContents* old_contents,
- content::WebContents* new_contents) {
- DCHECK_EQ(old_contents, contents());
- // We release here without deleting since the caller has the responsibility
- // for deleting the old WebContents.
- ignore_result(ReleaseContents().release());
- SetContents(scoped_ptr<content::WebContents>(new_contents));
- delegate_->OnSwappedContents();
+void InstantLoader::StartKeyCapture(
+ const content::WebContents* /* contents */) {
}
-bool InstantLoader::ShouldSuppressDialogs() {
- // Messages shown during Instant cancel Instant, so we suppress them.
- return true;
+void InstantLoader::StopKeyCapture(const content::WebContents* /* contents */) {
}
-bool InstantLoader::ShouldFocusPageAfterCrash() {
- return false;
+void InstantLoader::DeleteMostVisitedItem(
+ const content::WebContents* /* contents */,
+ const GURL& /* url */) {
}
-void InstantLoader::LostCapture() {
- delegate_->OnMouseUp();
+void InstantLoader::UndoMostVisitedItemDeletion(
+ const content::WebContents* /* contents */,
+ const GURL& /* url */) {
}
-void InstantLoader::WebContentsFocused(content::WebContents* /* contents */) {
- delegate_->OnFocus();
+void InstantLoader::UndoAllMostVisitedItemDeletions(
+ const content::WebContents* /* contents */) {
}
-bool InstantLoader::CanDownload(content::RenderViewHost* /* render_view_host */,
- int /* request_id */,
- const std::string& /* request_method */) {
- // Downloads are disabled.
- return false;
+void InstantLoader::InstantStatusChanged() {
+ if (contents_)
+ ReloadContents();
}
-void InstantLoader::HandleMouseDown() {
- delegate_->OnMouseDown();
+void InstantLoader::ThemeInfoChanged() {
+ page_.ThemeChanged(service_->theme_info());
}
-void InstantLoader::HandleMouseUp() {
- delegate_->OnMouseUp();
+void InstantLoader::MostVisitedItemsChanged() {
+ page_.MostVisitedItems(service_->most_visited_items());
}
-void InstantLoader::HandlePointerActivate() {
- delegate_->OnMouseDown();
+void InstantLoader::InstantSupportDecided() {
}
-void InstantLoader::HandleGestureEnd() {
- delegate_->OnMouseUp();
+void InstantLoader::CloseContents(content::WebContents* /* source */) {
+ DeleteContents();
}
-void InstantLoader::DragEnded() {
- // If the user drags, we won't get a mouse up (at least on Linux). Commit
- // the Instant result when the drag ends, so that during the drag the page
- // won't move around.
- delegate_->OnMouseUp();
+void InstantLoader::TearDownContents() {
+ InstantWebContentsContainer::TearDownContents();
+ stale_page_timer_.Stop();
}
-bool InstantLoader::OnGoToEntryOffset(int /* offset */) {
- return false;
+void InstantLoader::DeleteContents() {
+ TearDownContents();
+ contents_.reset();
}
-content::WebContents* InstantLoader::OpenURLFromTab(
- content::WebContents* source,
- const content::OpenURLParams& params) {
- return delegate_->OpenURLFromTab(source, params);
+void InstantLoader::ReloadContents() {
+ DeleteContents();
+ InitContents();
}

Powered by Google App Engine
This is Rietveld 408576698