summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/prerender
diff options
context:
space:
mode:
authorshishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-09 02:45:44 +0000
committershishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-09 02:45:44 +0000
commitbb6fd406ca9ae8f069bc8e9de211de327aff3ec5 (patch)
tree0b8c0c0e753ad802ed9a0378eeeafda2430f0826 /chrome/renderer/prerender
parent4e7b588132af2c49945df83d40ab77b964d08d85 (diff)
downloadchromium_src-bb6fd406ca9ae8f069bc8e9de211de327aff3ec5.zip
chromium_src-bb6fd406ca9ae8f069bc8e9de211de327aff3ec5.tar.gz
chromium_src-bb6fd406ca9ae8f069bc8e9de211de327aff3ec5.tar.bz2
Defer loading of audio/video tags while prerendering.
BUG=98690 TEST= Review URL: http://codereview.chromium.org/8095007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113742 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/prerender')
-rw-r--r--chrome/renderer/prerender/prerender_helper.cc11
-rw-r--r--chrome/renderer/prerender/prerender_helper.h3
-rw-r--r--chrome/renderer/prerender/prerender_webmediaplayer.cc76
-rw-r--r--chrome/renderer/prerender/prerender_webmediaplayer.h56
4 files changed, 132 insertions, 14 deletions
diff --git a/chrome/renderer/prerender/prerender_helper.cc b/chrome/renderer/prerender/prerender_helper.cc
index c016145..10dfa74c 100644
--- a/chrome/renderer/prerender/prerender_helper.cc
+++ b/chrome/renderer/prerender/prerender_helper.cc
@@ -110,17 +110,6 @@ void PrerenderHelper::RecordHistograms(
delete prerender_helper;
}
-void PrerenderHelper::WillCreateMediaPlayer(
- WebKit::WebFrame* frame,
- WebKit::WebMediaPlayerClient* client) {
- if (is_prerendering_) {
- // Cancel prerendering in the case of HTML5 media, to avoid playing sounds
- // in the background.
- Send(new ChromeViewHostMsg_MaybeCancelPrerenderForHTML5Media(
- render_view()->GetRoutingId()));
- }
-}
-
void PrerenderHelper::DidStartProvisionalLoad(WebKit::WebFrame* frame) {
// If this is the first provisional load since prerendering started, get its
// request time.
diff --git a/chrome/renderer/prerender/prerender_helper.h b/chrome/renderer/prerender/prerender_helper.h
index c716d5d..f5944e1 100644
--- a/chrome/renderer/prerender/prerender_helper.h
+++ b/chrome/renderer/prerender/prerender_helper.h
@@ -39,9 +39,6 @@ class PrerenderHelper
private:
// RenderViewObserver implementation
virtual void DidStartProvisionalLoad(WebKit::WebFrame* frame) OVERRIDE;
- virtual void WillCreateMediaPlayer(
- WebKit::WebFrame* frame,
- WebKit::WebMediaPlayerClient* client) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
void OnSetIsPrerendering(bool is_prerendering);
diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.cc b/chrome/renderer/prerender/prerender_webmediaplayer.cc
new file mode 100644
index 0000000..90cc202
--- /dev/null
+++ b/chrome/renderer/prerender/prerender_webmediaplayer.cc
@@ -0,0 +1,76 @@
+// 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.
+
+#include "chrome/renderer/prerender/prerender_webmediaplayer.h"
+
+#include "chrome/common/render_messages.h"
+#include "content/public/renderer/render_view.h"
+#include "media/base/filter_collection.h"
+#include "media/base/media_log.h"
+#include "media/base/pipeline_impl.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h"
+#include "webkit/media/webmediaplayer_delegate.h"
+
+namespace prerender {
+
+PrerenderWebMediaPlayer::PrerenderWebMediaPlayer(
+ content::RenderView* render_view,
+ WebKit::WebMediaPlayerClient* client,
+ base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate,
+ media::FilterCollection* collection,
+ media::MessageLoopFactory* message_loop_factory,
+ webkit_media::MediaStreamClient* media_stream_client,
+ media::MediaLog* media_log)
+ : RenderViewObserver(render_view),
+ WebMediaPlayerImpl(client,
+ delegate,
+ collection,
+ message_loop_factory,
+ media_stream_client,
+ media_log),
+ is_prerendering_(true),
+ url_loaded_(false) {
+}
+
+PrerenderWebMediaPlayer::~PrerenderWebMediaPlayer() {}
+
+void PrerenderWebMediaPlayer::load(const WebKit::WebURL& url) {
+ DCHECK(!url_loaded_);
+ if (is_prerendering_) {
+ url_to_load_.reset(new WebKit::WebURL(url));
+ return;
+ }
+ url_loaded_ = true;
+ WebMediaPlayerImpl::load(url);
+}
+
+void PrerenderWebMediaPlayer::cancelLoad() {
+ if (is_prerendering_) {
+ url_to_load_.reset(NULL);
+ return;
+ }
+ WebMediaPlayerImpl::cancelLoad();
+}
+
+bool PrerenderWebMediaPlayer::OnMessageReceived(const IPC::Message& message) {
+ IPC_BEGIN_MESSAGE_MAP(PrerenderWebMediaPlayer, message)
+ IPC_MESSAGE_HANDLER(ChromeViewMsg_SetIsPrerendering, OnSetIsPrerendering)
+ IPC_END_MESSAGE_MAP()
+
+ return false;
+}
+
+void PrerenderWebMediaPlayer::OnSetIsPrerendering(bool is_prerendering) {
+ // Prerendering can only be enabled prior to a RenderView's first
+ // navigation, so no PrerenderWebMediaPlayer should see the notification
+ // that enables prerendering.
+ DCHECK(!is_prerendering);
+ if (is_prerendering_ && !is_prerendering) {
+ is_prerendering_ = false;
+ if (url_to_load_.get())
+ load(*url_to_load_);
+ }
+}
+
+} // namespace prerender
diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.h b/chrome/renderer/prerender/prerender_webmediaplayer.h
new file mode 100644
index 0000000..99db44e
--- /dev/null
+++ b/chrome/renderer/prerender/prerender_webmediaplayer.h
@@ -0,0 +1,56 @@
+// 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.
+
+#ifndef CHROME_RENDERER_PRERENDER_PRERENDER_WEBMEDIAPLAYER_H_
+#define CHROME_RENDERER_PRERENDER_PRERENDER_WEBMEDIAPLAYER_H_
+#pragma once
+
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/renderer/render_view_observer.h"
+#include "webkit/media/webmediaplayer_impl.h"
+
+namespace webkit_media {
+class MediaStreamClient;
+class WebMediaPlayerDelegate;
+}
+
+namespace prerender {
+
+// Substitute for WebMediaPlayerImpl to be used in prerendered pages. Defers
+// the loading of the media till the prerendered page is swapped in.
+class PrerenderWebMediaPlayer
+ : public content::RenderViewObserver,
+ public webkit_media::WebMediaPlayerImpl {
+ public:
+ PrerenderWebMediaPlayer(
+ content::RenderView* render_view,
+ WebKit::WebMediaPlayerClient* client,
+ base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate,
+ media::FilterCollection* collection,
+ media::MessageLoopFactory* message_loop_factory,
+ webkit_media::MediaStreamClient* media_stream_client,
+ media::MediaLog* media_log);
+ virtual ~PrerenderWebMediaPlayer();
+
+ // WebMediaPlayer methods:
+ virtual void load(const WebKit::WebURL& url) OVERRIDE;
+ virtual void cancelLoad() OVERRIDE;
+
+ private:
+ // RenderViewObserver method:
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
+ void OnSetIsPrerendering(bool is_prerendering);
+
+ bool is_prerendering_;
+ bool url_loaded_;
+ scoped_ptr<WebKit::WebURL> url_to_load_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrerenderWebMediaPlayer);
+};
+
+} // namespace prerender
+
+#endif // CHROME_RENDERER_PRERENDER_PRERENDER_WEBMEDIAPLAYER_H_