Chromium Code Reviews| Index: chrome/renderer/chrome_content_renderer_client.cc |
| diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc |
| index d925fe3a1f2bccdcc6b416b4c3d5e6c4ebb1f33f..83e8b4b146421ed8335e7db21fdc71346d8cec37 100644 |
| --- a/chrome/renderer/chrome_content_renderer_client.cc |
| +++ b/chrome/renderer/chrome_content_renderer_client.cc |
| @@ -341,6 +341,29 @@ bool IsStandaloneExtensionProcess() { |
| extensions::switches::kExtensionProcess); |
| } |
| #endif |
| + |
| +// Defers media player loading in background pages until they're visible. |
| +// TODO(dalecurtis): Include an idle listener too. http://crbug.com/509135 |
| +class MediaLoadDeferrer : public content::RenderFrameObserver { |
| + public: |
| + MediaLoadDeferrer(content::RenderFrame* render_frame, |
| + const base::Closure& continue_loading_cb) |
| + : content::RenderFrameObserver(render_frame), |
| + continue_loading_cb_(continue_loading_cb) {} |
| + ~MediaLoadDeferrer() override {} |
| + |
| + private: |
| + // content::RenderFrameObserver implementation: |
| + void WasShown() override { |
| + continue_loading_cb_.Run(); |
| + delete this; |
| + } |
| + |
| + const base::Closure continue_loading_cb_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(MediaLoadDeferrer); |
| +}; |
| + |
| } // namespace |
| ChromeContentRendererClient::ChromeContentRendererClient() { |
| @@ -683,19 +706,31 @@ WebPlugin* ChromeContentRendererClient::CreatePluginReplacement( |
| void ChromeContentRendererClient::DeferMediaLoad( |
| content::RenderFrame* render_frame, |
| + bool render_frame_has_played_media_before, |
| const base::Closure& closure) { |
| #if defined(OS_ANDROID) |
| // Chromium for Android doesn't support prerender yet. |
|
tommycli
2015/08/13 21:50:07
Although we don't have prerender on Android, it se
DaleCurtis
2015/08/13 22:24:30
Android doesn't use WebMediaPlayerImpl and ignores
|
| closure.Run(); |
| return; |
| #else |
| - if (!prerender::PrerenderHelper::IsPrerendering(render_frame)) { |
| - closure.Run(); |
| + if (prerender::PrerenderHelper::IsPrerendering(render_frame)) { |
|
tommycli
2015/08/13 21:50:06
Does this mean that pages that are pre-rendered ar
DaleCurtis
2015/08/13 22:24:30
Hmm, I was counting on prerender not taking affect
mmenke
2015/08/13 22:36:10
Prerendered frames should always be hidden. I don
|
| + // Lifetime is tied to |render_frame| via content::RenderFrameObserver. |
| + new prerender::PrerenderMediaLoadDeferrer(render_frame, closure); |
| + return; |
| + } |
| + |
| + // Don't allow autoplay/autoload of media resources in a RenderFrame that is |
| + // hidden and has never played any media before. We want to allow future |
| + // loads even when hidden to allow playlist-like functionality. |
| + // |
| + // TODO(dalecurtis): Include an idle check too. http://crbug.com/509135 |
| + if (render_frame->IsHidden() && !render_frame_has_played_media_before) { |
| + // Lifetime is tied to |render_frame| via content::RenderFrameObserver. |
| + new MediaLoadDeferrer(render_frame, closure); |
| return; |
| } |
| - // Lifetime is tied to |render_frame| via content::RenderFrameObserver. |
| - new prerender::PrerenderMediaLoadDeferrer(render_frame, closure); |
| + closure.Run(); |
| #endif |
| } |