 Chromium Code Reviews
 Chromium Code Reviews Issue 1292433002:
  Defer media playback in background tabs.  (Closed) 
  Base URL: http://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1292433002:
  Defer media playback in background tabs.  (Closed) 
  Base URL: http://chromium.googlesource.com/chromium/src.git@master| 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 | 
| } |