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

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

Issue 11824050: InstantExtended: Committed NTP (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments. 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_loader.cc
diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc
index b28fdc654de9ea38a96070194de439a5c1b83de5..7944c40bf90cf5386dfc61e2c05fca80e8394f8e 100644
--- a/chrome/browser/instant/instant_loader.cc
+++ b/chrome/browser/instant/instant_loader.cc
@@ -8,340 +8,71 @@
#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/instant/instant_controller.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 "chrome/browser/ui/tab_contents/core_tab_helper_delegate.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 "content/public/browser/site_instance.h"
-#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_view.h"
-#include "ipc/ipc_message.h"
namespace {
-int kUserDataKey;
+const int kStalePageTimeoutMS = 3 * 3600 * 1000; // 3 hours
-class InstantLoaderUserData : public base::SupportsUserData::Data {
- public:
- explicit InstantLoaderUserData(InstantLoader* loader) : loader_(loader) {}
+} // namespace
- InstantLoader* loader() const { return loader_; }
-
- private:
- ~InstantLoaderUserData() {}
-
- InstantLoader* const loader_;
-
- DISALLOW_COPY_AND_ASSIGN(InstantLoaderUserData);
-};
-
-}
-
-// WebContentsDelegateImpl -----------------------------------------------------
-
-class InstantLoader::WebContentsDelegateImpl
- : public CoreTabHelperDelegate,
- public content::WebContentsDelegate {
- public:
- explicit WebContentsDelegateImpl(InstantLoader* loader);
-
- 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 ShouldFocusPageAfterCrash() OVERRIDE;
- virtual void LostCapture() OVERRIDE;
- virtual void WebContentsFocused(content::WebContents* contents) OVERRIDE;
- virtual bool CanDownload(content::RenderViewHost* render_view_host,
- int request_id,
- const std::string& request_method) OVERRIDE;
- virtual void HandleMouseDown() OVERRIDE;
- virtual void HandleMouseUp() OVERRIDE;
- virtual void HandlePointerActivate() OVERRIDE;
- virtual void HandleGestureEnd() OVERRIDE;
- virtual void DragEnded() OVERRIDE;
- virtual bool OnGoToEntryOffset(int offset) OVERRIDE;
- virtual content::WebContents* OpenURLFromTab(
- content::WebContents* source,
- const content::OpenURLParams& params) OVERRIDE;
-
- void MaybeCommitFromPointerRelease();
-
- InstantLoader* const loader_;
-
- DISALLOW_COPY_AND_ASSIGN(WebContentsDelegateImpl);
-};
-
-InstantLoader::WebContentsDelegateImpl::WebContentsDelegateImpl(
- InstantLoader* loader)
- : loader_(loader) {
-}
-
-void InstantLoader::WebContentsDelegateImpl::SwapTabContents(
- content::WebContents* old_contents,
- content::WebContents* new_contents) {
- // If this is being called, something is swapping in to loader's |contents_|
- // before we've added it to the tab strip.
- loader_->ReplacePreviewContents(old_contents, new_contents);
-}
-
-bool InstantLoader::WebContentsDelegateImpl::ShouldSuppressDialogs() {
- // Any message shown during Instant cancels Instant, so we suppress them.
- return true;
-}
-
-bool InstantLoader::WebContentsDelegateImpl::ShouldFocusPageAfterCrash() {
- return false;
-}
-
-void InstantLoader::WebContentsDelegateImpl::LostCapture() {
- MaybeCommitFromPointerRelease();
-}
-
-void InstantLoader::WebContentsDelegateImpl::WebContentsFocused(
- content::WebContents* /* contents */) {
- // The preview is getting focus. Equivalent to it being clicked.
- bool tmp = loader_->is_pointer_down_from_activate_;
- loader_->is_pointer_down_from_activate_ = true;
- loader_->controller_->InstantLoaderContentsFocused();
- loader_->is_pointer_down_from_activate_ = tmp;
-}
-
-bool InstantLoader::WebContentsDelegateImpl::CanDownload(
- content::RenderViewHost* /* render_view_host */,
- int /* request_id */,
- const std::string& /* request_method */) {
- // Downloads are disabled.
- return false;
-}
-
-void InstantLoader::WebContentsDelegateImpl::HandleMouseDown() {
- loader_->is_pointer_down_from_activate_ = true;
-}
-
-void InstantLoader::WebContentsDelegateImpl::HandleMouseUp() {
- MaybeCommitFromPointerRelease();
-}
-
-void InstantLoader::WebContentsDelegateImpl::HandlePointerActivate() {
- loader_->is_pointer_down_from_activate_ = true;
-}
-
-void InstantLoader::WebContentsDelegateImpl::HandleGestureEnd() {
- MaybeCommitFromPointerRelease();
+InstantLoader::Delegate::~Delegate() {
}
-void InstantLoader::WebContentsDelegateImpl::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.
- MaybeCommitFromPointerRelease();
+InstantLoader::InstantLoader(Delegate* delegate)
+ : delegate_(delegate),
+ contents_(NULL),
+ stale_page_timer_(false, false) {
}
-bool InstantLoader::WebContentsDelegateImpl::OnGoToEntryOffset(int offset) {
- return false;
+InstantLoader::~InstantLoader() {
}
-content::WebContents* InstantLoader::WebContentsDelegateImpl::OpenURLFromTab(
- content::WebContents* source,
- const content::OpenURLParams& params) {
- content::WebContents* preview = loader_->contents_.get();
- if (loader_->controller_->CommitIfPossible(INSTANT_COMMIT_NAVIGATED))
- return preview->GetDelegate()->OpenURLFromTab(source, params);
- return NULL;
-}
+void InstantLoader::Load(const GURL& instant_url,
+ Profile* profile,
+ const content::WebContents* active_tab,
+ const base::Closure& on_stale_callback) {
+ content::WebContents::CreateParams create_params(profile);
-void InstantLoader::WebContentsDelegateImpl::MaybeCommitFromPointerRelease() {
- if (loader_->is_pointer_down_from_activate_) {
- loader_->is_pointer_down_from_activate_ = false;
- loader_->controller_->CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST);
+ if (active_tab) {
+ create_params.initial_size = active_tab->GetView()->GetContainerSize();
+ create_params.site_instance = active_tab->GetSiteInstance()->
+ GetRelatedSiteInstance(instant_url);
+ } else {
+ create_params.site_instance = content::SiteInstance::CreateForURL(
+ profile, instant_url);
}
-}
-// InstantLoader ---------------------------------------------------------------
-
-// static
-InstantLoader* InstantLoader::FromWebContents(
- const content::WebContents* web_contents) {
- InstantLoaderUserData* data = static_cast<InstantLoaderUserData*>(
- web_contents->GetUserData(&kUserDataKey));
- return data ? data->loader() : NULL;
-}
-
-InstantLoader::InstantLoader(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))),
- instant_url_(instant_url),
- supports_instant_(false),
- is_pointer_down_from_activate_(false) {
-}
-
-InstantLoader::~InstantLoader() {
-}
-
-void InstantLoader::InitContents(const content::WebContents* active_tab) {
- content::WebContents::CreateParams create_params(
- active_tab->GetBrowserContext(),
- active_tab->GetSiteInstance()->GetRelatedSiteInstance(
- GURL(instant_url_)));
- if (active_tab)
- create_params.initial_size = active_tab->GetView()->GetContainerSize();
- contents_.reset(content::WebContents::CreateWithSessionStorage(
- create_params,
- active_tab->GetController().GetSessionStorageNamespaceMap()));
- SetupPreviewContents();
+ SetContents(scoped_ptr<content::WebContents>(
+ content::WebContents::Create(create_params)));
// This HTTP header and value are set on loads that originate from Instant.
const char kInstantHeader[] = "X-Purpose: Instant";
- DVLOG(1) << "LoadURL: " << instant_url_;
- contents_->GetController().LoadURL(GURL(instant_url_), content::Referrer(),
+ DVLOG(1) << "LoadURL: " << instant_url.spec();
sreeram 2013/01/29 13:35:42 No need for the ".spec()". GURL provides an overlo
samarth 2013/01/31 16:24:57 Done.
+ contents_->GetController().LoadURL(
+ instant_url, content::Referrer(),
content::PAGE_TRANSITION_GENERATED, kInstantHeader);
contents_->WasHidden();
-}
-
-content::WebContents* InstantLoader::ReleaseContents() {
- CleanupPreviewContents();
- return contents_.release();
-}
-
-void InstantLoader::DidNavigate(
- const history::HistoryAddPageArgs& add_page_args) {
- last_navigation_ = add_page_args;
-}
-
-bool InstantLoader::IsUsingLocalPreview() const {
- return instant_url_ == InstantController::kLocalOmniboxPopupURL;
-}
-void InstantLoader::Update(const string16& text,
- size_t selection_start,
- size_t selection_end,
- bool verbatim) {
- last_navigation_ = history::HistoryAddPageArgs();
- client_.Update(text, selection_start, selection_end, verbatim);
+ stale_page_timer_.Start(
+ FROM_HERE,
+ base::TimeDelta::FromMilliseconds(kStalePageTimeoutMS),
+ on_stale_callback);
}
-void InstantLoader::Submit(const string16& text) {
- client_.Submit(text);
-}
-
-void InstantLoader::Cancel(const string16& text) {
- client_.Cancel(text);
-}
-
-void InstantLoader::SetPopupBounds(const gfx::Rect& bounds) {
- client_.SetPopupBounds(bounds);
-}
-
-void InstantLoader::SetMarginSize(int start, int end) {
- client_.SetMarginSize(start, end);
-}
-
-void InstantLoader::SendAutocompleteResults(
- const std::vector<InstantAutocompleteResult>& results) {
- client_.SendAutocompleteResults(results);
-}
-
-void InstantLoader::UpOrDownKeyPressed(int count) {
- client_.UpOrDownKeyPressed(count);
-}
-
-void InstantLoader::SearchModeChanged(const chrome::search::Mode& mode) {
- client_.SearchModeChanged(mode);
-}
-
-void InstantLoader::SendThemeBackgroundInfo(
- const ThemeBackgroundInfo& theme_info) {
- client_.SendThemeBackgroundInfo(theme_info);
-}
-
-void InstantLoader::SendThemeAreaHeight(int height) {
- client_.SendThemeAreaHeight(height);
-}
-
-void InstantLoader::SetDisplayInstantResults(bool display_instant_results) {
- client_.SetDisplayInstantResults(display_instant_results);
-}
-
-void InstantLoader::KeyCaptureChanged(bool is_key_capture_enabled) {
- client_.KeyCaptureChanged(is_key_capture_enabled);
-}
-
-void InstantLoader::SetSuggestions(
- const std::vector<InstantSuggestion>& suggestions) {
- InstantSupportDetermined(true);
- controller_->SetSuggestions(contents(), suggestions);
-}
-
-void InstantLoader::InstantSupportDetermined(bool supports_instant) {
- // If we had already determined that the page supports Instant, nothing to do.
- if (supports_instant_)
- return;
-
- supports_instant_ = supports_instant;
- controller_->InstantSupportDetermined(contents(), supports_instant);
-}
-
-void InstantLoader::ShowInstantPreview(InstantShownReason reason,
- int height,
- InstantSizeUnits units) {
- InstantSupportDetermined(true);
- controller_->ShowInstantPreview(reason, height, units);
-}
-
-void InstantLoader::StartCapturingKeyStrokes() {
- InstantSupportDetermined(true);
- controller_->StartCapturingKeyStrokes();
-}
-
-void InstantLoader::StopCapturingKeyStrokes() {
- InstantSupportDetermined(true);
- controller_->StopCapturingKeyStrokes();
-}
-
-void InstantLoader::RenderViewGone() {
- controller_->InstantLoaderRenderViewGone();
-}
-
-void InstantLoader::AboutToNavigateMainFrame(const GURL& url) {
- controller_->InstantLoaderAboutToNavigateMainFrame(url);
-}
-
-void InstantLoader::NavigateToURL(const GURL& url,
- content::PageTransition transition) {
- InstantSupportDetermined(true);
- controller_->NavigateToURL(url, transition);
-}
-
-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::SetupPreviewContents() {
- client_.SetContents(contents());
- contents_->SetUserData(&kUserDataKey, new InstantLoaderUserData(this));
- contents_->SetDelegate(delegate_.get());
+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.
@@ -356,7 +87,7 @@ void InstantLoader::SetupPreviewContents() {
// A tab helper to catch prerender content swapping shenanigans.
CoreTabHelper::CreateForWebContents(contents());
- CoreTabHelper::FromWebContents(contents())->set_delegate(delegate_.get());
+ CoreTabHelper::FromWebContents(contents())->set_delegate(this);
// Tab helpers used when committing a preview.
chrome::search::SearchTabHelper::CreateForWebContents(contents());
@@ -383,9 +114,7 @@ void InstantLoader::SetupPreviewContents() {
#endif
}
-void InstantLoader::CleanupPreviewContents() {
- client_.SetContents(NULL);
- contents_->RemoveUserData(&kUserDataKey);
+scoped_ptr<content::WebContents> InstantLoader::ReleaseContents() {
contents_->SetDelegate(NULL);
// Undo tab helper work done in SetupPreviewContents().
sreeram 2013/01/29 13:35:42 SetupPreviewContents() -> SetContents().
samarth 2013/01/31 16:24:57 Done.
@@ -405,16 +134,90 @@ void InstantLoader::CleanupPreviewContents() {
content::Source<content::NavigationController>(
&contents_->GetController()));
#endif
+
+ return contents_.Pass();
+}
+
+void InstantLoader::Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
sreeram 2013/01/29 13:35:42 Comment out source and details.
samarth 2013/01/31 16:24:57 Done.
+#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::ReplacePreviewContents(content::WebContents* old_contents,
- content::WebContents* new_contents) {
+void InstantLoader::SwapTabContents(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();
- controller_->SwappedWebContents();
+ // We release here without deleting since the caller has the responsibility
+ // for deleting the old WebContents.
+ scoped_ptr<content::WebContents> released_contents =
+ delegate_->SwapContents(scoped_ptr<content::WebContents>(new_contents));
+ ignore_result(released_contents.release());
+}
+
+// Overridden from content::WebContentsDelegate:
sreeram 2013/01/29 13:35:42 No need for this comment.
samarth 2013/01/31 16:24:57 Done.
+bool InstantLoader::ShouldSuppressDialogs() {
+ // Any message shown during Instant cancels Instant, so we suppress them.
sreeram 2013/01/29 13:35:42 Any message -> Messages (to match the "them" and .
samarth 2013/01/31 16:24:57 Done.
+ return true;
+}
+
+bool InstantLoader::ShouldFocusPageAfterCrash() {
+ return false;
+}
+
+void InstantLoader::LostCapture() {
+ delegate_->OnMouseUp();
+}
+
+void InstantLoader::WebContentsFocused(content::WebContents* contents) {
sreeram 2013/01/29 13:35:42 /* contents */
samarth 2013/01/31 16:24:57 Done.
jam 2013/02/01 17:44:34 btw i just saw this. this isn't chrome style. plea
sreeram 2013/02/01 17:50:02 This style is in fact explicitly mentioned in the
+ delegate_->OnFocus();
+}
+
+bool InstantLoader::CanDownload(content::RenderViewHost*,
+ int,
+ const std::string&) {
sreeram 2013/01/29 13:35:42 Provide the names of the parameters, but comment t
samarth 2013/01/31 16:24:57 Done.
+ // Downloads are disabled.
+ return false;
+}
+
+void InstantLoader::HandleMouseDown() {
+ delegate_->OnMouseDown();
+}
+
+void InstantLoader::HandleMouseUp() {
+ delegate_->OnMouseUp();
+}
+
+void InstantLoader::HandlePointerActivate() {
+ delegate_->OnMouseDown();
+}
+
+void InstantLoader::HandleGestureEnd() {
+ delegate_->OnMouseUp();
+}
+
+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();
+}
+
+bool InstantLoader::OnGoToEntryOffset(int offset) {
sreeram 2013/01/29 13:35:42 /* offset */
samarth 2013/01/31 16:24:57 Done.
+ return false;
+}
+
+content::WebContents* InstantLoader::OpenURLFromTab(
+ content::WebContents* source,
+ const content::OpenURLParams& params) {
+ if (delegate_->OnOpenURL())
+ return contents_->GetDelegate()->OpenURLFromTab(source, params);
sreeram 2013/01/29 13:35:42 Isn't this an infinite recursion? contents_->GetDe
samarth 2013/01/31 16:24:57 See my comments in the header about this. (There
+ return NULL;
}

Powered by Google App Engine
This is Rietveld 408576698