diff options
author | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-09 02:45:44 +0000 |
---|---|---|
committer | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-09 02:45:44 +0000 |
commit | bb6fd406ca9ae8f069bc8e9de211de327aff3ec5 (patch) | |
tree | 0b8c0c0e753ad802ed9a0378eeeafda2430f0826 /chrome/renderer/prerender | |
parent | 4e7b588132af2c49945df83d40ab77b964d08d85 (diff) | |
download | chromium_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.cc | 11 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_helper.h | 3 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_webmediaplayer.cc | 76 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_webmediaplayer.h | 56 |
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_ |