diff options
author | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 21:26:05 +0000 |
---|---|---|
committer | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 21:26:05 +0000 |
commit | 5f5b9e4cfc0d97ec15bf49273bd35245b7e4fab3 (patch) | |
tree | 001f7c9b649a23d81a56a6f884c145f3db9c5122 | |
parent | 829245b1c00a35df64fd0acd6f90518b2880731c (diff) | |
download | chromium_src-5f5b9e4cfc0d97ec15bf49273bd35245b7e4fab3.zip chromium_src-5f5b9e4cfc0d97ec15bf49273bd35245b7e4fab3.tar.gz chromium_src-5f5b9e4cfc0d97ec15bf49273bd35245b7e4fab3.tar.bz2 |
Fix the chrome prerendering code to handle the following IPC messages via the TabContentsDelegate/TabContentsObserver
interface. We eventually want to get rid of the pattern of sending IPC messages from content and handling them in
chrome and vice versa.
1. ViewHostMsg_DidStartProvisionalLoadForFrame
2. ViewHostMsg_JSOutOfMemory
3. ViewHostMsg_RunJavaScriptMessage
4. ViewHostMsg_RenderViewGone.
BUG=87335
TEST=No change in functionality.
Review URL: http://codereview.chromium.org/7839017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100022 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 47 insertions, 109 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 69aab72..7ec44ec 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -147,7 +147,7 @@ class TestPrerenderContents : public PrerenderContents { MessageLoopForUI::current()->Quit(); } - virtual void OnRenderViewGone(int status, int exit_code) OVERRIDE { + virtual void RenderViewGone() OVERRIDE { // On quit, it's possible to end up here when render processes are closed // before the PrerenderManager is destroyed. As a result, it's possible to // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED @@ -155,7 +155,7 @@ class TestPrerenderContents : public PrerenderContents { if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; - PrerenderContents::OnRenderViewGone(status, exit_code); + PrerenderContents::RenderViewGone(); } virtual bool AddAliasURL(const GURL& url) OVERRIDE { diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index 6056ef0..feea485 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -109,6 +109,14 @@ class PrerenderContents::TabContentsDelegateImpl return false; } + virtual void JSOutOfMemory(TabContents* tab) OVERRIDE { + prerender_contents_->OnJSOutOfMemory(); + } + + virtual bool ShouldSuppressDialogs() OVERRIDE { + return prerender_contents_->ShouldSuppressDialogs(); + } + // Commits the History of Pages to the given TabContents. void CommitHistory(TabContentsWrapper* tab) { for (size_t i = 0; i < add_page_vector_.size(); ++i) @@ -409,23 +417,6 @@ void PrerenderContents::OnRenderViewHostCreated( RenderViewHost* new_render_view_host) { } -void PrerenderContents::OnDidStartProvisionalLoadForFrame(int64 frame_id, - bool is_main_frame, - bool has_opener_set, - const GURL& url) { - if (is_main_frame) { - if (!AddAliasURL(url)) - return; - - // Usually, this event fires if the user clicks or enters a new URL. - // Neither of these can happen in the case of an invisible prerender. - // So the cause is: Some JavaScript caused a new URL to be loaded. In that - // case, the spinner would start again in the browser, so we must reset - // has_stopped_loading_ so that the spinner won't be stopped. - has_stopped_loading_ = false; - } -} - void PrerenderContents::OnUpdateFaviconURL( int32 page_id, const std::vector<FaviconURL>& urls) { @@ -478,22 +469,7 @@ void PrerenderContents::OnJSOutOfMemory() { Destroy(FINAL_STATUS_JS_OUT_OF_MEMORY); } -void PrerenderContents::OnRunJavaScriptMessage( - const string16& message, - const string16& default_prompt, - const GURL& frame_url, - const int flags, - bool* did_suppress_message, - string16* prompt_field) { - // Always suppress JavaScript messages if they're triggered by a page being - // prerendered. - *did_suppress_message = true; - // We still want to show the user the message when they navigate to this - // page, so cancel this prerender. - Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); -} - -void PrerenderContents::OnRenderViewGone(int status, int exit_code) { +void PrerenderContents::RenderViewGone() { Destroy(FINAL_STATUS_RENDERER_CRASHED); } @@ -501,6 +477,34 @@ void PrerenderContents::DidStopLoading() { has_stopped_loading_ = true; } +void PrerenderContents::DidStartProvisionalLoadForFrame( + int64 frame_id, + bool is_main_frame, + const GURL& validated_url, + bool is_error_page, + RenderViewHost* render_view_host) { + if (is_main_frame) { + if (!AddAliasURL(validated_url)) + return; + + // Usually, this event fires if the user clicks or enters a new URL. + // Neither of these can happen in the case of an invisible prerender. + // So the cause is: Some JavaScript caused a new URL to be loaded. In that + // case, the spinner would start again in the browser, so we must reset + // has_stopped_loading_ so that the spinner won't be stopped. + has_stopped_loading_ = false; + } +} + +bool PrerenderContents::ShouldSuppressDialogs() { + // Always suppress JavaScript messages if they're triggered by a page being + // prerendered. + // We still want to show the user the message when they navigate to this + // page, so cancel this prerender. + Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); + return true; +} + void PrerenderContents::Destroy(FinalStatus final_status) { if (prerendering_has_been_cancelled_) return; diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h index 9a6d4df..a0c2d17 100644 --- a/chrome/browser/prerender/prerender_contents.h +++ b/chrome/browser/prerender/prerender_contents.h @@ -120,16 +120,17 @@ class PrerenderContents : public NotificationObserver, bool MatchesURL(const GURL& url, GURL* matching_url) const; void OnJSOutOfMemory(); - void OnRunJavaScriptMessage(const string16& message, - const string16& default_prompt, - const GURL& frame_url, - const int flags, - bool* did_suppress_message, - string16* prompt_field); - virtual void OnRenderViewGone(int status, int exit_code); + bool ShouldSuppressDialogs(); // TabContentsObserver implementation. virtual void DidStopLoading() OVERRIDE; + virtual void DidStartProvisionalLoadForFrame( + int64 frame_id, + bool is_main_frame, + const GURL& validated_url, + bool is_error_page, + RenderViewHost* render_view_host) OVERRIDE; + virtual void RenderViewGone() OVERRIDE; // NotificationObserver virtual void Observe(int type, @@ -192,10 +193,6 @@ class PrerenderContents : public NotificationObserver, friend class PrerenderRenderViewHostObserver; // Message handlers. - void OnDidStartProvisionalLoadForFrame(int64 frame_id, - bool main_frame, - bool has_opener_set, - const GURL& url); void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls); // Returns the RenderViewHost Delegate for this prerender. diff --git a/chrome/browser/prerender/prerender_render_view_host_observer.cc b/chrome/browser/prerender/prerender_render_view_host_observer.cc index 42756b0..475b143 100644 --- a/chrome/browser/prerender/prerender_render_view_host_observer.cc +++ b/chrome/browser/prerender/prerender_render_view_host_observer.cc @@ -31,27 +31,11 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived( return RenderViewHostObserver::OnMessageReceived(message); bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message) - IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame, - OnDidStartProvisionalLoadForFrame) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - - // If this was a DidStartProvisionalLoadForFrame message, we don't want to - // to consume it, so return false; - if (handled) - return false; - // The following messages we do want to consume. - handled = true; IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message) IPC_MESSAGE_HANDLER(IconHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_MaybeCancelPrerenderForHTML5Media, OnMaybeCancelPrerenderForHTML5Media) - IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory) - IPC_MESSAGE_HANDLER(ViewHostMsg_RunJavaScriptMessage, - OnRunJavaScriptMessage) - IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewGone, OnRenderViewGone) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CancelPrerenderForPrinting, OnCancelPrerenderForPrinting) IPC_MESSAGE_UNHANDLED(handled = false) @@ -70,41 +54,6 @@ bool PrerenderRenderViewHostObserver::Send(IPC::Message* message) { return RenderViewHostObserver::Send(message); } -void PrerenderRenderViewHostObserver::OnJSOutOfMemory() { - prerender_contents_->OnJSOutOfMemory(); -} - -void PrerenderRenderViewHostObserver::OnRunJavaScriptMessage( - const string16& message, - const string16& default_prompt, - const GURL& frame_url, - const int flags, - bool* did_suppress_message, - string16* prompt_field) { - prerender_contents_->OnRunJavaScriptMessage(message, - default_prompt, - frame_url, - flags, - did_suppress_message, - prompt_field); -} - -void PrerenderRenderViewHostObserver::OnRenderViewGone(int status, - int exit_code) { - prerender_contents_->OnRenderViewGone(status, exit_code); -} - -void PrerenderRenderViewHostObserver::OnDidStartProvisionalLoadForFrame( - int64 frame_id, - bool is_main_frame, - bool has_opener_set, - const GURL& url) { - prerender_contents_->OnDidStartProvisionalLoadForFrame(frame_id, - is_main_frame, - has_opener_set, - url); -} - void PrerenderRenderViewHostObserver::OnUpdateFaviconURL( int32 page_id, const std::vector<FaviconURL>& urls) { diff --git a/chrome/browser/prerender/prerender_render_view_host_observer.h b/chrome/browser/prerender/prerender_render_view_host_observer.h index 74a9308..ff526cb 100644 --- a/chrome/browser/prerender/prerender_render_view_host_observer.h +++ b/chrome/browser/prerender/prerender_render_view_host_observer.h @@ -39,18 +39,6 @@ class PrerenderRenderViewHostObserver : public RenderViewHostObserver { private: // Message handlers. - void OnJSOutOfMemory(); - void OnRunJavaScriptMessage(const string16& message, - const string16& default_prompt, - const GURL& frame_url, - const int flags, - bool* did_suppress_message, - string16* prompt_field); - void OnRenderViewGone(int status, int exit_code); - void OnDidStartProvisionalLoadForFrame(int64 frame_id, - bool is_main_frame, - bool has_opener_set, - const GURL& url); void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls); void OnMaybeCancelPrerenderForHTML5Media(); void OnCancelPrerenderForPrinting(); |