The previous implementation is not correct, it depended on the Fullscreen video class, but the PowerSaveBlocker could be used for embedding video or the use case which isn't related to the video at all.

This patch adds new API to PowerSaveBlocker. 

BUG=247892

Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=212022

Review URL: https://chromiumcodereview.appspot.com/17175009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212536 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4cd9375d..53fb4bc5 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -32,6 +32,7 @@
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/browser/host_zoom_map_impl.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
+#include "content/browser/power_save_blocker_impl.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -359,6 +360,8 @@
 WebContentsImpl::~WebContentsImpl() {
   is_being_destroyed_ = true;
 
+  ClearAllPowerSaveBlockers();
+
   for (std::set<RenderWidgetHostImpl*>::iterator iter =
            created_widgets_.begin(); iter != created_widgets_.end(); ++iter) {
     (*iter)->DetachDelegate();
@@ -718,6 +721,7 @@
 #endif
     IPC_MESSAGE_HANDLER(ViewHostMsg_FrameAttached, OnFrameAttached)
     IPC_MESSAGE_HANDLER(ViewHostMsg_FrameDetached, OnFrameDetached)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_MediaNotification, OnMediaNotification)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP_EX()
   message_source_ = NULL;
@@ -2579,6 +2583,38 @@
   parent->RemoveChild(frame_id);
 }
 
+void WebContentsImpl::OnMediaNotification(int64 player_cookie,
+                                          bool has_video,
+                                          bool has_audio,
+                                          bool is_playing) {
+  // Chrome OS does its own detection of audio and video.
+#if !defined(OS_CHROMEOS)
+  if (is_playing) {
+    scoped_ptr<PowerSaveBlocker> blocker;
+    if (has_video) {
+      blocker = PowerSaveBlocker::Create(
+          PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
+          "Playing video");
+#if defined(OS_ANDROID)
+      static_cast<PowerSaveBlockerImpl*>(blocker.get())->
+          InitDisplaySleepBlocker(GetView()->GetTopLevelNativeWindow());
+#endif
+    } else if (has_audio) {
+      blocker = PowerSaveBlocker::Create(
+          PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+          "Playing audio");
+    }
+
+    if (blocker)
+      power_save_blockers_[message_source_][player_cookie] = blocker.release();
+  } else {
+    delete power_save_blockers_[message_source_][player_cookie];
+    power_save_blockers_[message_source_].erase(player_cookie);
+  }
+#endif  // !defined(OS_CHROMEOS)
+}
+
+
 void WebContentsImpl::DidChangeVisibleSSLState() {
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
                     DidChangeVisibleSSLState());
@@ -2868,6 +2904,7 @@
     return;
   }
 
+  ClearPowerSaveBlockers(rvh);
   SetIsLoading(false, NULL);
   NotifyDisconnected();
   SetIsCrashed(status, error_code);
@@ -2879,6 +2916,7 @@
 }
 
 void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) {
+  ClearPowerSaveBlockers(rvh);
   render_manager_.RenderViewDeleted(rvh);
   FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh));
 }
@@ -3685,4 +3723,17 @@
           browser_plugin::kBrowserPluginGuestManagerKeyName));
 }
 
+void WebContentsImpl::ClearPowerSaveBlockers(
+    RenderViewHost* render_view_host) {
+  STLDeleteValues(&power_save_blockers_[render_view_host]);
+  power_save_blockers_.erase(render_view_host);
+}
+
+void WebContentsImpl::ClearAllPowerSaveBlockers() {
+  for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin());
+       i != power_save_blockers_.end(); ++i)
+    STLDeleteValues(&power_save_blockers_[i->first]);
+  power_save_blockers_.clear();
+}
+
 }  // namespace content