summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-11 12:15:17 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-11 12:15:17 +0000
commit7198402cf45cf1f5d18b80d2d85131f4391dfca8 (patch)
tree9a532eff2b6fb891debb76463d78b5851a2bb611
parentcff5dadeb1be4c526a1b3875c9acf422cbaf834d (diff)
downloadchromium_src-7198402cf45cf1f5d18b80d2d85131f4391dfca8.zip
chromium_src-7198402cf45cf1f5d18b80d2d85131f4391dfca8.tar.gz
chromium_src-7198402cf45cf1f5d18b80d2d85131f4391dfca8.tar.bz2
Changes to cancel prerendering when there is HTML5 audio/video on a page.
BUG=76599 TEST=browser tests added. Review URL: http://codereview.chromium.org/6690027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81091 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc17
-rw-r--r--chrome/browser/prerender/prerender_contents.cc14
-rw-r--r--chrome/browser/prerender/prerender_contents.h3
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/chrome_common.gypi1
-rw-r--r--chrome/common/prerender_constants.h21
-rw-r--r--chrome/common/render_messages.h8
-rw-r--r--chrome/test/data/prerender/prerender_html5_audio.html14
-rw-r--r--chrome/test/data/prerender/prerender_html5_video.html13
-rw-r--r--chrome/test/data/prerender/prerender_html5_video_script.html20
-rw-r--r--content/renderer/render_view.cc6
11 files changed, 118 insertions, 0 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 90dfa6f..ddc35aa 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -490,4 +490,21 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, TaskManager) {
EXPECT_EQ(2, model()->ResourceCount());
}
+// Checks that prerenderers will terminate when an audio tag is encountered.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) {
+ PrerenderTestURL("prerender_html5_audio.html", FINAL_STATUS_HTML5_MEDIA, 1);
+}
+
+// Checks that prerenderers will terminate when a video tag is encountered.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) {
+ PrerenderTestURL("prerender_html5_video.html", FINAL_STATUS_HTML5_MEDIA, 1);
+}
+
+// Checks that prerenderers will terminate when a video tag is inserted via
+// javascript.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoJs) {
+ PrerenderTestURL("prerender_html5_video_script.html",
+ FINAL_STATUS_HTML5_MEDIA, 1);
+}
+
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 51fa15d..c142f15 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -415,6 +415,8 @@ bool PrerenderContents::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewHostMsg_DidRedirectProvisionalLoad,
OnDidRedirectProvisionalLoad)
IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_MaybeCancelPrerender,
+ OnMaybeCancelPrerender)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
@@ -451,6 +453,18 @@ void PrerenderContents::OnUpdateFaviconURL(int32 page_id,
icon_url_ = icon_url;
}
+void PrerenderContents::OnMaybeCancelPrerender(
+ PrerenderCancellationReason reason) {
+ switch (reason) {
+ case PRERENDER_CANCELLATION_REASON_HTML5_MEDIA:
+ Destroy(FINAL_STATUS_HTML5_MEDIA);
+ return;
+ default:
+ LOG(DFATAL) << "Invalid reason " << reason
+ << " in OnMaybeCancelPrerender.";
+ }
+}
+
bool PrerenderContents::AddAliasURL(const GURL& url) {
if (!url.SchemeIs("http"))
return false;
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index 13569d2..2e331f5 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -14,6 +14,7 @@
#include "chrome/browser/prerender/prerender_final_status.h"
#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
+#include "chrome/common/prerender_constants.h"
#include "chrome/common/view_types.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/common/notification_registrar.h"
@@ -212,6 +213,8 @@ class PrerenderContents : public RenderViewHostDelegate,
void OnUpdateFaviconURL(int32 page_id, const GURL& icon_url);
+ void OnMaybeCancelPrerender(PrerenderCancellationReason reason);
+
// Adds an alias URL, for one of the many redirections. Returns whether
// the URL is valid.
bool AddAliasURL(const GURL& url);
diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h
index 48122be..19aa715 100644
--- a/chrome/browser/prerender/prerender_final_status.h
+++ b/chrome/browser/prerender/prerender_final_status.h
@@ -29,6 +29,7 @@ enum FinalStatus {
FINAL_STATUS_RATE_LIMIT_EXCEEDED,
FINAL_STATUS_PENDING_SKIPPED,
FINAL_STATUS_CONTROL_GROUP,
+ FINAL_STATUS_HTML5_MEDIA,
FINAL_STATUS_MAX,
};
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index 284f82c..4fb371e 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -65,6 +65,7 @@
'common/nacl_messages.cc',
'common/nacl_messages.h',
'common/nacl_types.h',
+ 'common/prerender_constants.h',
'common/profiling.cc',
'common/profiling.h',
'common/ref_counted_util.h',
diff --git a/chrome/common/prerender_constants.h b/chrome/common/prerender_constants.h
new file mode 100644
index 0000000..7712ea0
--- /dev/null
+++ b/chrome/common/prerender_constants.h
@@ -0,0 +1,21 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Constants related to the prerendering feature in chrome.
+
+#ifndef CHROME_COMMON_PRERENDER_CONSTANTS_H_
+#define CHROME_COMMON_PRERENDER_CONSTANTS_H_
+#pragma once
+
+namespace prerender {
+
+enum PrerenderCancellationReason {
+ PRERENDER_CANCELLATION_REASON_FIRST_UNUSED,
+ PRERENDER_CANCELLATION_REASON_HTML5_MEDIA,
+ PRERENDER_CANCELLATION_REASON_LAST_UNUSED,
+};
+
+} // namespace prerender
+
+#endif // CHROME_COMMON_PRERENDER_CONSTANTS_H_
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index c3e28df..ba64142 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -20,6 +20,7 @@
#include "chrome/common/content_settings.h"
#include "chrome/common/instant_types.h"
#include "chrome/common/nacl_types.h"
+#include "chrome/common/prerender_constants.h"
#include "chrome/common/search_provider.h"
#include "chrome/common/thumbnail_score.h"
#include "chrome/common/translate_errors.h"
@@ -100,6 +101,7 @@ struct ParamTraits<ContentSettings> {
IPC_ENUM_TRAITS(ContentSetting)
IPC_ENUM_TRAITS(ContentSettingsType)
IPC_ENUM_TRAITS(InstantCompleteBehavior)
+IPC_ENUM_TRAITS(prerender::PrerenderCancellationReason)
IPC_ENUM_TRAITS(search_provider::OSDDType)
IPC_ENUM_TRAITS(search_provider::InstallState)
IPC_ENUM_TRAITS(TranslateErrors::Type)
@@ -470,6 +472,12 @@ IPC_MESSAGE_ROUTED4(ViewHostMsg_PageTranslated,
std::string /* the translated language */,
TranslateErrors::Type /* the error type if available */)
+// Message sent from the renderer to the browser to notify it of events which
+// may lead to the cancellation of a prerender. The message is sent only when
+// the renderer is in prerender mode.
+IPC_MESSAGE_ROUTED1(ViewHostMsg_MaybeCancelPrerender,
+ prerender::PrerenderCancellationReason)
+
// Suggest results -----------------------------------------------------------
IPC_MESSAGE_ROUTED3(ViewHostMsg_SetSuggestions,
diff --git a/chrome/test/data/prerender/prerender_html5_audio.html b/chrome/test/data/prerender/prerender_html5_audio.html
new file mode 100644
index 0000000..7a03e20
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_html5_audio.html
@@ -0,0 +1,14 @@
+<html>
+ <!--
+ This test checks that prerender is cancelled when an audio tag is
+ encountered.
+ -->
+ <head>
+ <title>Prerender cancellation for HTML5 audio.</title>
+ </head>
+ <body>
+ <audio controls="controls" autoplay="autoplay">
+ <source src="nonexistant.wav" type="audio/wav" />
+ </audio>
+ </body>
+</html>
diff --git a/chrome/test/data/prerender/prerender_html5_video.html b/chrome/test/data/prerender/prerender_html5_video.html
new file mode 100644
index 0000000..d945d19
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_html5_video.html
@@ -0,0 +1,13 @@
+<html>
+ <!--
+ This test checks that prerender is cancelled when an video tag is
+ encountered.
+ -->
+ <head>
+ <title>Prerender cancellation for HTML5 video.</title>
+ </head>
+ <body>
+ <video src="nonexistant.mp4" width="320" height="240" controls="controls">
+ </video>
+ </body>
+</html>
diff --git a/chrome/test/data/prerender/prerender_html5_video_script.html b/chrome/test/data/prerender/prerender_html5_video_script.html
new file mode 100644
index 0000000..9e65951
--- /dev/null
+++ b/chrome/test/data/prerender/prerender_html5_video_script.html
@@ -0,0 +1,20 @@
+<html>
+ <!--
+ This test checks that prerender is cancelled when an video starts playing
+ through javascript.
+ -->
+ <head>
+ <title>Prerender cancellation for HTML5 video.</title>
+ </head>
+ <body>
+ <div id="vid">
+ </div>
+
+ <script>
+ var videoTag = document.createElement("video");
+ videoTag.src = "nonexistant.mp4";
+ var element = document.getElementById("vid");
+ element.appendChild(videoTag);
+ </script>
+ </body>
+</html>
diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc
index b199f4c..a6c559f 100644
--- a/content/renderer/render_view.cc
+++ b/content/renderer/render_view.cc
@@ -2486,6 +2486,12 @@ WebSharedWorker* RenderView::createSharedWorker(
WebMediaPlayer* RenderView::createMediaPlayer(
WebFrame* frame, WebMediaPlayerClient* client) {
+ // If this is a prerendering page, start the cancel of the prerender.
+ if (is_prerendering_) {
+ Send(new ViewHostMsg_MaybeCancelPrerender(routing_id_,
+ prerender::PRERENDER_CANCELLATION_REASON_HTML5_MEDIA));
+ }
+
scoped_ptr<media::MessageLoopFactory> message_loop_factory(
new media::MessageLoopFactoryImpl());
scoped_ptr<media::FilterCollection> collection(