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

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

Issue 11824050: InstantExtended: Committed NTP (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup. Created 7 years, 11 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_ntp.cc
diff --git a/chrome/browser/instant/instant_ntp.cc b/chrome/browser/instant/instant_ntp.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e58a83beb3a4ee360c7190c026a84ce93bfd2c20
--- /dev/null
+++ b/chrome/browser/instant/instant_ntp.cc
@@ -0,0 +1,259 @@
+// Copyright 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/instant/instant_ntp.h"
+
+#include "chrome/browser/content_settings/tab_specific_content_settings.h"
+#include "chrome/browser/favicon/favicon_tab_helper.h"
+#include "chrome/browser/instant/instant_controller.h"
+#include "chrome/browser/profiles/profile.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/tab_contents/core_tab_helper.h"
+#include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_source.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/browser/web_contents_view.h"
+
+namespace {
+
+int kUserDataKey;
+
+class InstantNTPUserData : public base::SupportsUserData::Data {
+ public:
+ explicit InstantNTPUserData(InstantNTP* ntp) : ntp_(ntp) {}
+
+ InstantNTP* ntp() const { return ntp_; }
+
+ private:
+ ~InstantNTPUserData() {}
+
+ InstantNTP* const ntp_;
+
+ DISALLOW_COPY_AND_ASSIGN(InstantNTPUserData);
+};
+
+} // namespace
+
+// WebContentsDelegateImpl -----------------------------------------------------
+
+class InstantNTP::WebContentsDelegateImpl
+ : public CoreTabHelperDelegate,
+ public content::WebContentsDelegate {
+ public:
+ explicit WebContentsDelegateImpl(InstantNTP* ntp);
+
+ private:
+ // Overridden from CoreTabHelperDelegate:
+ virtual void SwapTabContents(content::WebContents* old_contents,
+ content::WebContents* new_contents) OVERRIDE;
+
+ // Overridden from content::WebContentsDelegate:
+ virtual bool ShouldSuppressDialogs() OVERRIDE;
+ virtual bool CanDownload(content::RenderViewHost* render_view_host,
+ int request_id,
+ const std::string& request_method) OVERRIDE;
+ virtual bool OnGoToEntryOffset(int offset) OVERRIDE;
+
+ InstantNTP* const ntp_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebContentsDelegateImpl);
+};
+
+InstantNTP::WebContentsDelegateImpl::WebContentsDelegateImpl(InstantNTP* ntp)
+ : ntp_(ntp) {
+}
+
+void InstantNTP::WebContentsDelegateImpl::SwapTabContents(
+ content::WebContents* old_contents,
+ content::WebContents* new_contents) {
+ // If this is being called, something is swapping in to ntp's |contents_|
+ // before we've added it to the tab strip.
+ ntp_->ReplacePreviewContents(old_contents, new_contents);
+}
+
+bool InstantNTP::WebContentsDelegateImpl::ShouldSuppressDialogs() {
+ // Any message shown during Instant cancels Instant, so we suppress them.
+ return true;
+}
+
+bool InstantNTP::WebContentsDelegateImpl::CanDownload(
+ content::RenderViewHost* /* render_view_host */,
+ int /* request_id */,
+ const std::string& /* request_method */) {
+ // Downloads are disabled.
+ return false;
+}
+
+bool InstantNTP::WebContentsDelegateImpl::OnGoToEntryOffset(int offset) {
+ return false;
+}
+
+// InstantNTP ------------------------------------------------------------------
+
+// static
+InstantNTP* InstantNTP::FromWebContents(
+ const content::WebContents* web_contents) {
+ InstantNTPUserData* data = static_cast<InstantNTPUserData*>(
+ web_contents->GetUserData(&kUserDataKey));
+ return data ? data->ntp() : NULL;
+}
+
+InstantNTP::InstantNTP(InstantController* controller,
+ const std::string& instant_url)
+ : client_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
+ controller_(controller),
+ delegate_(new WebContentsDelegateImpl(
+ ALLOW_THIS_IN_INITIALIZER_LIST(this))),
dhollowa 2013/01/10 18:50:29 nit: indent seems off here.
samarth 2013/01/11 19:43:05 Done.
+ instant_url_(instant_url),
+ supports_instant_(false) {
+}
+
+InstantNTP::~InstantNTP() {
+}
+
+void InstantNTP::InitContents(Profile* profile,
+ const content::WebContents* active_tab) {
+ content::WebContents::CreateParams create_params(
+ profile,
+ tab_util::GetSiteInstanceForNewTab(profile, GURL(instant_url_)));
+ if (active_tab)
+ create_params.initial_size = active_tab->GetView()->GetContainerSize();
+
+ contents_.reset(content::WebContents::Create(create_params));
+ SetupPreviewContents();
+
+ // This HTTP header and value are set on loads that originate from Instant.
+ const char kInstantHeader[] = "X-Purpose: Instant";
+ DVLOG(1) << "LoadNTP: " << instant_url_;
+ contents_->GetController().LoadURL(GURL(instant_url_), content::Referrer(),
+ content::PAGE_TRANSITION_GENERATED, kInstantHeader);
+ contents_->GetController().GetPendingEntry()->SetVirtualURL(
+ GURL(chrome::kChromeUINewTabURL));
+ contents_->WasHidden();
+}
+
+content::WebContents* InstantNTP::ReleaseContents() {
+ CleanupPreviewContents();
+ return contents_.release();
+}
+
+void InstantNTP::SetMarginSize(int start, int end) {
+ client_.SetMarginSize(start, end);
+}
+
+void InstantNTP::SendThemeBackgroundInfo(
+ const ThemeBackgroundInfo& theme_info) {
+ client_.SendThemeBackgroundInfo(theme_info);
+}
+
+void InstantNTP::SendThemeAreaHeight(int height) {
+ client_.SendThemeAreaHeight(height);
+}
+
+void InstantNTP::SetDisplayInstantResults(bool display_instant_results) {
+ client_.SetDisplayInstantResults(display_instant_results);
+}
+
+void InstantNTP::SetSuggestions(
+ const std::vector<InstantSuggestion>& suggestions) {
+ // Nothing to do in an uncommitted NTP.
+}
+
+void InstantNTP::InstantSupportDetermined(bool supports_instant) {
+ // If we had already determined that the page supports Instant, nothing to do.
+ if (supports_instant_)
+ return;
+
+ // If the page doesn't support Instant, stop communicating with it.
+ if (!supports_instant)
+ client_.SetContents(NULL);
+
+ supports_instant_ = supports_instant;
+ controller_->InstantSupportDetermined(contents(), supports_instant);
+}
+
+void InstantNTP::ShowInstantPreview(InstantShownReason reason,
+ int height,
+ InstantSizeUnits units) {
+ // Nothing to do in an uncommitted NTP.
+}
+
+void InstantNTP::StartCapturingKeyStrokes() {
+ // Nothing to do in an uncommitted NTP.
+}
+
+void InstantNTP::StopCapturingKeyStrokes() {
+ // Nothing to do in an uncommitted NTP.
+}
+
+void InstantNTP::RenderViewGone() {
+ controller_->InstantNTPRenderViewGone();
+}
+
+void InstantNTP::AboutToNavigateMainFrame(const GURL& url) {
+ // Nothing to do in an uncommitted NTP.
+}
+
+void InstantNTP::NavigateToURL(const GURL& url,
+ content::PageTransition transition) {
+ controller_->NavigateToURL(url, transition);
+}
+
+void InstantNTP::SetupPreviewContents() {
+ client_.SetContents(contents());
+ contents_->SetUserData(&kUserDataKey, new InstantNTPUserData(this));
+ contents_->SetDelegate(delegate_.get());
+
+ // 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);
+
+ // A tab helper to catch prerender content swapping shenanigans.
+ CoreTabHelper::CreateForWebContents(contents());
+ CoreTabHelper::FromWebContents(contents())->set_delegate(delegate_.get());
+
+ // Favicons, required by the Task Manager.
+ FaviconTabHelper::CreateForWebContents(contents());
+
+ // And some flat-out paranoia.
+ safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(contents());
+}
+
+void InstantNTP::CleanupPreviewContents() {
+ client_.SetContents(NULL);
+ contents_->RemoveUserData(&kUserDataKey);
+ contents_->SetDelegate(NULL);
+
+ // Undo tab helper work done in SetupPreviewContents().
+
+ BlockedContentTabHelper::FromWebContents(contents())->
+ SetAllContentsBlocked(false);
+ TabSpecificContentSettings::FromWebContents(contents())->
+ SetPopupsBlocked(false);
+
+ CoreTabHelper::FromWebContents(contents())->set_delegate(NULL);
+}
+
+void InstantNTP::ReplacePreviewContents(content::WebContents* old_contents,
+ content::WebContents* new_contents) {
+ DCHECK_EQ(old_contents, contents());
+ CleanupPreviewContents();
+ // We release here without deleting so that the caller still has the
+ // responsibility for deleting the WebContents.
+ ignore_result(contents_.release());
+ contents_.reset(new_contents);
+ SetupPreviewContents();
+}

Powered by Google App Engine
This is Rietveld 408576698