diff options
author | dominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-17 16:17:45 +0000 |
---|---|---|
committer | dominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-17 16:17:45 +0000 |
commit | 4c94b8cd2d717d744473f59e69c1055cc5357321 (patch) | |
tree | a8005ce6636340a96e3675e5db8176d350192d83 | |
parent | a784ce1c1bb7d274fee0320fb72e24037ebc5978 (diff) | |
download | chromium_src-4c94b8cd2d717d744473f59e69c1055cc5357321.zip chromium_src-4c94b8cd2d717d744473f59e69c1055cc5357321.tar.gz chromium_src-4c94b8cd2d717d744473f59e69c1055cc5357321.tar.bz2 |
Cancel prerenders for pages that call window.print()
BUG=82206
TEST=PrerenderBrowserTest.PrerenderPopup
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=85545
Review URL: http://codereview.chromium.org/7015026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85639 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 4 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.h | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_observer.h | 11 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_render_view_host_observer.cc | 8 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_render_view_host_observer.h | 1 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 5 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 8 | ||||
-rw-r--r-- | chrome/test/data/prerender/prerender_print.html | 10 |
10 files changed, 42 insertions, 14 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 407429f..004b627 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -1074,4 +1074,11 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { NavigateToDestURL(); } +// Checks that we cancel correctly when window.print() is called. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { + PrerenderTestURL("files/prerender/prerender_print.html", + FINAL_STATUS_WINDOW_PRINT, + 1); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index 7977352..5ea1c5c 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -632,10 +632,6 @@ void PrerenderContents::OnUpdateFaviconURL( } } -void PrerenderContents::OnMaybeCancelPrerenderForHTML5Media() { - Destroy(FINAL_STATUS_HTML5_MEDIA); -} - bool PrerenderContents::AddAliasURL(const GURL& url) { if (!url.SchemeIs("http")) { if (url.SchemeIs("https")) diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h index 34909fd..8b585ea 100644 --- a/chrome/browser/prerender/prerender_contents.h +++ b/chrome/browser/prerender/prerender_contents.h @@ -270,7 +270,6 @@ class PrerenderContents : public RenderViewHostDelegate, bool main_frame, const GURL& url); void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls); - void OnMaybeCancelPrerenderForHTML5Media(); // Returns the RenderViewHost Delegate for this prerender. RenderViewHostDelegate* GetRenderViewHostDelegate(); diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h index 342dc1f..101e751 100644 --- a/chrome/browser/prerender/prerender_final_status.h +++ b/chrome/browser/prerender/prerender_final_status.h @@ -34,6 +34,7 @@ enum FinalStatus { FINAL_STATUS_RENDERER_CRASHED, FINAL_STATUS_UNSUPPORTED_SCHEME, FINAL_STATUS_INVALID_HTTP_METHOD, + FINAL_STATUS_WINDOW_PRINT, FINAL_STATUS_MAX, }; diff --git a/chrome/browser/prerender/prerender_observer.h b/chrome/browser/prerender/prerender_observer.h index f2ec018..760132d 100644 --- a/chrome/browser/prerender/prerender_observer.h +++ b/chrome/browser/prerender/prerender_observer.h @@ -4,22 +4,17 @@ #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_OBSERVER_H_ #define CHROME_BROWSER_PRERENDER_PRERENDER_OBSERVER_H_ -#pragma once -#include <list> -#include <vector> +#include "content/browser/tab_contents/tab_contents_observer.h" -#include "base/memory/scoped_ptr.h" #include "base/time.h" -#include "content/browser/tab_contents/tab_contents_observer.h" -#include "googleurl/src/gurl.h" -class PrerenderContents; -class Profile; class TabContents; +class GURL; namespace prerender { +class PrerenderContents; class PrerenderManager; // PrerenderObserver is responsible for recording perceived pageload times diff --git a/chrome/browser/prerender/prerender_render_view_host_observer.cc b/chrome/browser/prerender/prerender_render_view_host_observer.cc index fe297a8..aac0d6a 100644 --- a/chrome/browser/prerender/prerender_render_view_host_observer.cc +++ b/chrome/browser/prerender/prerender_render_view_host_observer.cc @@ -41,6 +41,8 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived( IPC_MESSAGE_HANDLER(ViewHostMsg_RunJavaScriptMessage, OnRunJavaScriptMessage) IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewGone, OnRenderViewGone) + IPC_MESSAGE_HANDLER(ViewHostMsg_CancelPrerenderForPrinting, + OnCancelPrerenderForPrinting) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -97,7 +99,11 @@ void PrerenderRenderViewHostObserver::OnUpdateFaviconURL( } void PrerenderRenderViewHostObserver::OnMaybeCancelPrerenderForHTML5Media() { - prerender_contents_->OnMaybeCancelPrerenderForHTML5Media(); + prerender_contents_->Destroy(FINAL_STATUS_HTML5_MEDIA); +} + +void PrerenderRenderViewHostObserver::OnCancelPrerenderForPrinting() { + prerender_contents_->Destroy(FINAL_STATUS_WINDOW_PRINT); } } diff --git a/chrome/browser/prerender/prerender_render_view_host_observer.h b/chrome/browser/prerender/prerender_render_view_host_observer.h index 6ca6179..4f0ae9f2 100644 --- a/chrome/browser/prerender/prerender_render_view_host_observer.h +++ b/chrome/browser/prerender/prerender_render_view_host_observer.h @@ -52,6 +52,7 @@ class PrerenderRenderViewHostObserver : public RenderViewHostObserver { const GURL& url); void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls); void OnMaybeCancelPrerenderForHTML5Media(); + void OnCancelPrerenderForPrinting(); // The associated prerender contents. PrerenderContents* prerender_contents_; diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index 78199db..18304a9 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -466,6 +466,11 @@ IPC_MESSAGE_ROUTED4(ViewHostMsg_PageTranslated, // the renderer is prerendering. IPC_MESSAGE_ROUTED0(ViewHostMsg_MaybeCancelPrerenderForHTML5Media) +// Message sent from the renderer to the browser to notify it of a +// window.print() call which should cancel the prerender. The message is sent +// only when the renderer is prerendering. +IPC_MESSAGE_ROUTED0(ViewHostMsg_CancelPrerenderForPrinting) + // Sent by the renderer to check if a URL has permission to trigger a clipboard // read/write operation from the DOM. IPC_SYNC_MESSAGE_ROUTED1_1(ViewHostMsg_CanTriggerClipboardRead, diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index f07ef87..cc3da51 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -12,6 +12,8 @@ #include "base/utf_string_conversions.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/print_messages.h" +#include "chrome/common/render_messages.h" +#include "chrome/renderer/prerender/prerender_helper.h" #include "content/renderer/render_view.h" #include "grit/generated_resources.h" #include "printing/metafile.h" @@ -132,6 +134,12 @@ PrintWebViewHelper::~PrintWebViewHelper() {} void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { DCHECK(frame); + // Allow Prerendering to cancel this print request if necessary. + if (prerender::PrerenderHelper::IsPrerendering(render_view())) { + Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); + return; + } + if (IsScriptInitiatedPrintTooFrequent(frame)) return; IncrementScriptedPrintCount(); diff --git a/chrome/test/data/prerender/prerender_print.html b/chrome/test/data/prerender/prerender_print.html new file mode 100644 index 0000000..41b9498 --- /dev/null +++ b/chrome/test/data/prerender/prerender_print.html @@ -0,0 +1,10 @@ +<html> + <head> + <title>Prerender Print</title> + <script> + window.print(); + </script> + </head> + <body></body> +</html> + |