summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-18 22:26:40 +0000
committerderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-18 22:26:40 +0000
commita3102766e725636ad23ad99faa1e8a481a1129e7 (patch)
treecea797379b158ff00fb8d4b2e86c67046b548946 /chrome
parent8431abd52eb3f7cc0eb9812933fe3eb5e83def45 (diff)
downloadchromium_src-a3102766e725636ad23ad99faa1e8a481a1129e7.zip
chromium_src-a3102766e725636ad23ad99faa1e8a481a1129e7.tar.gz
chromium_src-a3102766e725636ad23ad99faa1e8a481a1129e7.tar.bz2
aura/chromeos: Avoid suspending while video is playing.
This adds an ash::VideoDetector class that watches for layer updates and attempts to detect the playback of video. A Chrome OS-specific observer updates a _CHROME_VIDEO_TIME property on the X root window, which is used by the power manager to defer screen dimming or other power management features. This matches the implementation currently in use on Chrome OS, with Chrome taking the X window manager's role for detecting video and setting the property. BUG=110114 TEST=added; also manually checked that the property is updated Review URL: http://codereview.chromium.org/9249004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118171 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/chromeos/chrome_browser_main_chromeos.cc5
-rw-r--r--chrome/browser/chromeos/chrome_browser_main_chromeos.h2
-rw-r--r--chrome/browser/chromeos/power/video_property_writer.cc47
-rw-r--r--chrome/browser/chromeos/power/video_property_writer.h35
-rw-r--r--chrome/chrome_browser.gypi4
5 files changed, 92 insertions, 1 deletions
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 00681a3..1bafd75 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -64,6 +64,7 @@
#include "chrome/browser/chromeos/legacy_window_manager/initial_browser_window_observer.h"
#include "chrome/browser/chromeos/power/power_button_controller_delegate_chromeos.h"
#include "chrome/browser/chromeos/power/power_button_observer.h"
+#include "chrome/browser/chromeos/power/video_property_writer.h"
#endif
class MessageLoopObserver : public MessageLoopForUI::Observer {
@@ -455,11 +456,13 @@ void ChromeBrowserMainPartsChromeos::PostBrowserStart() {
}
#if defined(USE_AURA)
- // This is dependent on the ash::Shell singleton already having been
+ // These are dependent on the ash::Shell singleton already having been
// initialized.
power_button_observer_.reset(new chromeos::PowerButtonObserver);
chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
power_button_observer_.get());
+
+ video_property_writer_.reset(new chromeos::VideoPropertyWriter);
#endif
ChromeBrowserMainPartsLinux::PostBrowserStart();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index 6aa771f..7e165f8 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -15,6 +15,7 @@ class SessionManagerObserver;
#if defined(USE_AURA)
class InitialBrowserWindowObserver;
class PowerButtonObserver;
+class VideoPropertyWriter;
#endif
} // namespace chromeos
@@ -46,6 +47,7 @@ class ChromeBrowserMainPartsChromeos : public ChromeBrowserMainPartsLinux {
scoped_ptr<chromeos::InitialBrowserWindowObserver>
initial_browser_window_observer_;
scoped_ptr<chromeos::PowerButtonObserver> power_button_observer_;
+ scoped_ptr<chromeos::VideoPropertyWriter> video_property_writer_;
#endif
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos);
diff --git a/chrome/browser/chromeos/power/video_property_writer.cc b/chrome/browser/chromeos/power/video_property_writer.cc
new file mode 100644
index 0000000..186e104
--- /dev/null
+++ b/chrome/browser/chromeos/power/video_property_writer.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2012 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/browser/chromeos/power/video_property_writer.h"
+
+#include <ctime>
+
+#include "ash/shell.h"
+#include "ui/base/x/x11_util.h"
+
+namespace {
+
+// Minimum number of seconds between updates to the X property.
+const int kUpdateIntervalSec = 5;
+
+// Name of the X property on the root window. Also used as the property's type.
+const char kPropertyName[] = "_CHROME_VIDEO_TIME";
+
+} // namespace
+
+namespace chromeos {
+
+VideoPropertyWriter::VideoPropertyWriter() {
+ ash::Shell::GetInstance()->video_detector()->AddObserver(this);
+}
+
+VideoPropertyWriter::~VideoPropertyWriter() {
+ ash::Shell::GetInstance()->video_detector()->RemoveObserver(this);
+}
+
+void VideoPropertyWriter::OnVideoDetected() {
+ base::TimeTicks now = base::TimeTicks::Now();
+ if (last_update_time_.is_null() ||
+ (now - last_update_time_).InSecondsF() >= kUpdateIntervalSec) {
+ last_update_time_ = now;
+ if (!ui::SetIntProperty(
+ ui::GetX11RootWindow(),
+ kPropertyName,
+ kPropertyName,
+ time(NULL))) {
+ LOG(WARNING) << "Failed setting " << kPropertyName << " on root window";
+ }
+ }
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/power/video_property_writer.h b/chrome/browser/chromeos/power/video_property_writer.h
new file mode 100644
index 0000000..95480a7
--- /dev/null
+++ b/chrome/browser/chromeos/power/video_property_writer.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2012 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_BROWSER_CHROMEOS_POWER_VIDEO_PROPERTY_WRITER_H_
+#define CHROME_BROWSER_CHROMEOS_POWER_VIDEO_PROPERTY_WRITER_H_
+#pragma once
+
+#include "ash/wm/video_detector.h"
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/time.h"
+
+namespace chromeos {
+
+// Writes a property on the X root window to inform the power manager that a
+// video is playing.
+class VideoPropertyWriter : public ash::VideoDetectorObserver {
+ public:
+ VideoPropertyWriter();
+ virtual ~VideoPropertyWriter();
+
+ // ash::VideoDetectorObserver implementation.
+ virtual void OnVideoDetected() OVERRIDE;
+
+ private:
+ // Last time that the X property was updated.
+ base::TimeTicks last_update_time_;
+
+ DISALLOW_COPY_AND_ASSIGN(VideoPropertyWriter);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_POWER_VIDEO_PROPERTY_WRITER_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index c5abb17..382c34f 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -739,6 +739,8 @@
'browser/chromeos/power/power_button_controller_delegate_chromeos.h',
'browser/chromeos/power/power_button_observer.cc',
'browser/chromeos/power/power_button_observer.h',
+ 'browser/chromeos/power/video_property_writer.cc',
+ 'browser/chromeos/power/video_property_writer.h',
'browser/chromeos/preferences.cc',
'browser/chromeos/preferences.h',
'browser/chromeos/prerender_condition_network.cc',
@@ -5214,6 +5216,8 @@
['exclude', '^browser/chromeos/power/power_button_controller_delegate_chromeos.h'],
['exclude', '^browser/chromeos/power/power_button_observer.cc'],
['exclude', '^browser/chromeos/power/power_button_observer.h'],
+ ['exclude', '^browser/chromeos/power/video_property_writer.cc'],
+ ['exclude', '^browser/chromeos/power/video_property_writer.h'],
['exclude', '^browser/download/download_shelf.h'],
['exclude', '^browser/notifications/balloon_collection_impl.cc'],
['exclude', '^browser/notifications/balloon_collection_impl.h'],