summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-17 16:17:45 +0000
committerdominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-17 16:17:45 +0000
commit4c94b8cd2d717d744473f59e69c1055cc5357321 (patch)
treea8005ce6636340a96e3675e5db8176d350192d83
parenta784ce1c1bb7d274fee0320fb72e24037ebc5978 (diff)
downloadchromium_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.cc7
-rw-r--r--chrome/browser/prerender/prerender_contents.cc4
-rw-r--r--chrome/browser/prerender/prerender_contents.h1
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/browser/prerender/prerender_observer.h11
-rw-r--r--chrome/browser/prerender/prerender_render_view_host_observer.cc8
-rw-r--r--chrome/browser/prerender/prerender_render_view_host_observer.h1
-rw-r--r--chrome/common/render_messages.h5
-rw-r--r--chrome/renderer/print_web_view_helper.cc8
-rw-r--r--chrome/test/data/prerender/prerender_print.html10
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>
+