diff options
author | derat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-18 22:26:40 +0000 |
---|---|---|
committer | derat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-18 22:26:40 +0000 |
commit | a3102766e725636ad23ad99faa1e8a481a1129e7 (patch) | |
tree | cea797379b158ff00fb8d4b2e86c67046b548946 /chrome | |
parent | 8431abd52eb3f7cc0eb9812933fe3eb5e83def45 (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | chrome/browser/chromeos/chrome_browser_main_chromeos.h | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/power/video_property_writer.cc | 47 | ||||
-rw-r--r-- | chrome/browser/chromeos/power/video_property_writer.h | 35 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 |
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'], |