summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 21:26:05 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 21:26:05 +0000
commit5f5b9e4cfc0d97ec15bf49273bd35245b7e4fab3 (patch)
tree001f7c9b649a23d81a56a6f884c145f3db9c5122
parent829245b1c00a35df64fd0acd6f90518b2880731c (diff)
downloadchromium_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
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc4
-rw-r--r--chrome/browser/prerender/prerender_contents.cc70
-rw-r--r--chrome/browser/prerender/prerender_contents.h19
-rw-r--r--chrome/browser/prerender/prerender_render_view_host_observer.cc51
-rw-r--r--chrome/browser/prerender/prerender_render_view_host_observer.h12
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();