diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 12:15:17 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 12:15:17 +0000 |
commit | 7198402cf45cf1f5d18b80d2d85131f4391dfca8 (patch) | |
tree | 9a532eff2b6fb891debb76463d78b5851a2bb611 | |
parent | cff5dadeb1be4c526a1b3875c9acf422cbaf834d (diff) | |
download | chromium_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.cc | 17 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 14 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.h | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 | ||||
-rw-r--r-- | chrome/chrome_common.gypi | 1 | ||||
-rw-r--r-- | chrome/common/prerender_constants.h | 21 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 8 | ||||
-rw-r--r-- | chrome/test/data/prerender/prerender_html5_audio.html | 14 | ||||
-rw-r--r-- | chrome/test/data/prerender/prerender_html5_video.html | 13 | ||||
-rw-r--r-- | chrome/test/data/prerender/prerender_html5_video_script.html | 20 | ||||
-rw-r--r-- | content/renderer/render_view.cc | 6 |
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( |