Chromium Code Reviews| Index: chrome/browser/instant/instant_loader.cc |
| diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc |
| index 2d2ea420d0afb049c77ae58f5b3a456d0c0561f6..2fc2a67d8ddf1107d7ad9498afd110bbfd8d1891 100644 |
| --- a/chrome/browser/instant/instant_loader.cc |
| +++ b/chrome/browser/instant/instant_loader.cc |
| @@ -8,365 +8,176 @@ |
| #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/web_contents_delegate.h" |
| #include "content/public/browser/web_contents_view.h" |
| -#include "ipc/ipc_message.h" |
| - |
| -namespace { |
| - |
| -int kUserDataKey; |
| - |
| -class InstantLoaderUserData : public base::SupportsUserData::Data { |
| - public: |
| - explicit InstantLoaderUserData(InstantLoader* loader) : loader_(loader) {} |
| - |
| - InstantLoader* loader() const { return loader_; } |
| - |
| - private: |
| - ~InstantLoaderUserData() {} |
| - |
| - InstantLoader* const loader_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(InstantLoaderUserData); |
| -}; |
| +InstantLoader::Delegate::~Delegate() { |
| } |
| -// WebContentsDelegateImpl ----------------------------------------------------- |
| - |
| class InstantLoader::WebContentsDelegateImpl |
| : public CoreTabHelperDelegate, |
| public content::WebContentsDelegate { |
| public: |
| - explicit WebContentsDelegateImpl(InstantLoader* loader); |
| + WebContentsDelegateImpl(InstantLoader* loader, |
| + Delegate* delegate) |
|
dhollowa
2013/01/22 22:34:58
nit: looks like this will fit on previous line, no
samarth
2013/01/25 21:08:40
Done.
|
| + : loader_(loader), |
| + delegate_(delegate) { |
| + } |
| private: |
| // Overridden from CoreTabHelperDelegate: |
| virtual void SwapTabContents(content::WebContents* old_contents, |
| - content::WebContents* new_contents) OVERRIDE; |
| + content::WebContents* new_contents) OVERRIDE { |
| + DCHECK_EQ(old_contents, loader_->contents()); |
| + // We release here without deleting since the caller has the responsibility |
| + // for deleting the WebContents. |
| + ignore_result(delegate_->ReplaceAndReleaseContents(new_contents)); |
| + } |
| // 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; |
| -} |
| + virtual bool ShouldSuppressDialogs() OVERRIDE { |
| + // Any message shown during Instant cancels Instant, so we suppress them. |
| + return true; |
| + } |
| -void InstantLoader::WebContentsDelegateImpl::LostCapture() { |
| - MaybeCommitFromPointerRelease(); |
| -} |
| + virtual bool ShouldFocusPageAfterCrash() OVERRIDE { |
| + return false; |
| + } |
| -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; |
| -} |
| + virtual void LostCapture() OVERRIDE { |
| + delegate_->OnPointerRelease(); |
| + } |
| -bool InstantLoader::WebContentsDelegateImpl::CanDownload( |
| - content::RenderViewHost* /* render_view_host */, |
| - int /* request_id */, |
| - const std::string& /* request_method */) { |
| - // Downloads are disabled. |
| - return false; |
| -} |
| + virtual void WebContentsFocused(content::WebContents* contents) OVERRIDE { |
| + delegate_->OnFocus(); |
| + } |
| -void InstantLoader::WebContentsDelegateImpl::HandleMouseDown() { |
| - loader_->is_pointer_down_from_activate_ = true; |
| -} |
| + virtual bool CanDownload(content::RenderViewHost* /* render_view_host */, |
| + int /* request_id */, |
| + const std::string& /* request_method */) OVERRIDE { |
| + // Downloads are disabled. |
| + return false; |
| + } |
| -void InstantLoader::WebContentsDelegateImpl::HandleMouseUp() { |
| - MaybeCommitFromPointerRelease(); |
| -} |
| + virtual void HandleMouseDown() OVERRIDE { |
| + delegate_->OnPointerDown(); |
| + } |
| -void InstantLoader::WebContentsDelegateImpl::HandlePointerActivate() { |
| - loader_->is_pointer_down_from_activate_ = true; |
| -} |
| + virtual void HandleMouseUp() OVERRIDE { |
| + delegate_->OnPointerRelease(); |
| + } |
| -void InstantLoader::WebContentsDelegateImpl::HandleGestureEnd() { |
| - MaybeCommitFromPointerRelease(); |
| -} |
| + virtual void HandlePointerActivate() OVERRIDE { |
| + delegate_->OnPointerDown(); |
| + } |
| -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(); |
| -} |
| + virtual void HandleGestureEnd() OVERRIDE { |
| + delegate_->OnPointerRelease(); |
| + } |
| -bool InstantLoader::WebContentsDelegateImpl::OnGoToEntryOffset(int offset) { |
| - return false; |
| -} |
| + virtual void DragEnded() OVERRIDE { |
| + // 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_->OnPointerRelease(); |
| + } |
| -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; |
| -} |
| + virtual bool OnGoToEntryOffset(int offset) OVERRIDE { |
| + return false; |
| + } |
| -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); |
| + virtual content::WebContents* OpenURLFromTab( |
| + content::WebContents* source, |
| + const content::OpenURLParams& params) OVERRIDE { |
| + if (delegate_->OnOpenURL()) { |
| + return loader_->contents()->GetDelegate()->OpenURLFromTab(source, params); |
| + } |
| + return NULL; |
| } |
| -} |
| -// InstantLoader --------------------------------------------------------------- |
| + InstantLoader* loader_; |
|
dhollowa
2013/01/22 22:34:58
const ptr?
samarth
2013/01/25 21:08:40
Not relevant anymore.
|
| + Delegate* delegate_; |
|
dhollowa
2013/01/22 22:34:58
const ptr?
samarth
2013/01/25 21:08:40
Not relevant anymore.
|
| +}; |
| -// 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::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(Delegate* delegate) |
| + : delegate_(delegate), |
| + contents_(NULL), |
| + contents_delegate_(new WebContentsDelegateImpl( |
| + ALLOW_THIS_IN_INITIALIZER_LIST(this), delegate)) { |
| } |
| InstantLoader::~InstantLoader() { |
| } |
| -void InstantLoader::InitContents(const content::WebContents* active_tab) { |
| +void InstantLoader::Load(const GURL& instant_url, |
| + Profile* profile, |
| + const content::WebContents* active_tab, |
| + int expirationDurationMS) { |
| content::WebContents::CreateParams create_params( |
| - active_tab->GetBrowserContext()); |
| + profile, tab_util::GetSiteInstanceForNewTab(profile, 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(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(); |
| + 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); |
| -} |
| - |
| -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 |
| + stale_page_timer_.Start( |
| + FROM_HERE, |
| + base::TimeDelta::FromMilliseconds(expirationDurationMS), delegate_, |
| + &InstantLoader::Delegate::OnStalePage); |
| } |
| -void InstantLoader::SetupPreviewContents() { |
| - client_.SetContents(contents()); |
| - contents_->SetUserData(&kUserDataKey, new InstantLoaderUserData(this)); |
| - contents_->SetDelegate(delegate_.get()); |
| +void InstantLoader::SetContents(content::WebContents* contents) { |
| + contents_.reset(contents); |
| + contents_->SetDelegate(contents_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())-> |
| + BlockedContentTabHelper::CreateForWebContents(contents); |
| + BlockedContentTabHelper::FromWebContents(contents)-> |
| SetAllContentsBlocked(true); |
| - TabSpecificContentSettings::CreateForWebContents(contents()); |
| - TabSpecificContentSettings::FromWebContents(contents())-> |
| + 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()); |
| + CoreTabHelper::CreateForWebContents(contents); |
| + CoreTabHelper::FromWebContents(contents)-> |
| + set_delegate(contents_delegate_.get()); |
| // Tab helpers used when committing a preview. |
| - chrome::search::SearchTabHelper::CreateForWebContents(contents()); |
| - HistoryTabHelper::CreateForWebContents(contents()); |
| + chrome::search::SearchTabHelper::CreateForWebContents(contents); |
| + HistoryTabHelper::CreateForWebContents(contents); |
| // Observers. |
| - extensions::WebNavigationTabObserver::CreateForWebContents(contents()); |
| + extensions::WebNavigationTabObserver::CreateForWebContents(contents); |
| // Favicons, required by the Task Manager. |
| - FaviconTabHelper::CreateForWebContents(contents()); |
| + FaviconTabHelper::CreateForWebContents(contents); |
| // And some flat-out paranoia. |
| - safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(contents()); |
| + safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(contents); |
| #if defined(OS_MACOSX) |
| // If |contents_| doesn't yet have a RWHV, SetTakesFocusOnlyOnMouseDown() will |
| @@ -380,9 +191,7 @@ void InstantLoader::SetupPreviewContents() { |
| #endif |
| } |
| -void InstantLoader::CleanupPreviewContents() { |
| - client_.SetContents(NULL); |
| - contents_->RemoveUserData(&kUserDataKey); |
| +content::WebContents* InstantLoader::ReleaseContents() { |
| contents_->SetDelegate(NULL); |
| // Undo tab helper work done in SetupPreviewContents(). |
| @@ -402,16 +211,20 @@ void InstantLoader::CleanupPreviewContents() { |
| content::Source<content::NavigationController>( |
| &contents_->GetController())); |
| #endif |
| + |
| + return contents_.release(); |
| } |
| -void InstantLoader::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(); |
| - controller_->SwappedWebContents(); |
| +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 |
| } |