diff options
Diffstat (limited to 'content/browser')
-rw-r--r-- | content/browser/android/browser_jni_registrar.cc | 2 | ||||
-rw-r--r-- | content/browser/android/content_video_view.cc | 6 | ||||
-rw-r--r-- | content/browser/power_save_blocker_android.cc | 65 | ||||
-rw-r--r-- | content/browser/power_save_blocker_android.h | 11 | ||||
-rw-r--r-- | content/browser/power_save_blocker_impl.h | 9 | ||||
-rw-r--r-- | content/browser/renderer_host/render_view_host_impl.cc | 42 | ||||
-rw-r--r-- | content/browser/renderer_host/render_view_host_impl.h | 12 | ||||
-rw-r--r-- | content/browser/web_contents/web_contents_impl.cc | 51 | ||||
-rw-r--r-- | content/browser/web_contents/web_contents_impl.h | 19 |
9 files changed, 83 insertions, 134 deletions
diff --git a/content/browser/android/browser_jni_registrar.cc b/content/browser/android/browser_jni_registrar.cc index 9ee8f24..b914a9a 100644 --- a/content/browser/android/browser_jni_registrar.cc +++ b/content/browser/android/browser_jni_registrar.cc @@ -25,7 +25,6 @@ #include "content/browser/android/tracing_intent_handler.h" #include "content/browser/android/web_contents_observer_android.h" #include "content/browser/geolocation/location_api_adapter_android.h" -#include "content/browser/power_save_blocker_android.h" #include "content/browser/renderer_host/ime_adapter_android.h" #include "content/browser/renderer_host/java/java_bound_object.h" #include "content/browser/speech/speech_recognizer_impl_android.h" @@ -54,7 +53,6 @@ base::android::RegistrationMethod kContentRegisteredMethods[] = { { "MediaResourceGetterImpl", content::MediaResourceGetterImpl::RegisterMediaResourceGetter }, { "LoadUrlParams", content::RegisterLoadUrlParams }, - { "PowerSaveBlock", content::RegisterPowerSaveBlocker }, { "RegisterImeAdapter", content::RegisterImeAdapter }, { "SpeechRecognizerImplAndroid", content::SpeechRecognizerImplAndroid::RegisterSpeechRecognizer }, diff --git a/content/browser/android/content_video_view.cc b/content/browser/android/content_video_view.cc index 144ac01..366182e 100644 --- a/content/browser/android/content_video_view.cc +++ b/content/browser/android/content_video_view.cc @@ -65,6 +65,12 @@ void ContentVideoView::OpenVideo() { Java_ContentVideoView_openVideo(env, content_video_view.obj()); } +// static +void ContentVideoView::KeepScreenOn(bool screen_on) { + Java_ContentVideoView_keepScreenOnContentVideoView(AttachCurrentThread(), + screen_on); +} + void ContentVideoView::OnMediaPlayerError(int error_type) { JNIEnv *env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env); diff --git a/content/browser/power_save_blocker_android.cc b/content/browser/power_save_blocker_android.cc index 45dda18..2358049 100644 --- a/content/browser/power_save_blocker_android.cc +++ b/content/browser/power_save_blocker_android.cc @@ -2,27 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/power_save_blocker_android.h" +#include "content/browser/power_save_blocker_impl.h" -#include "base/android/jni_android.h" #include "base/logging.h" -#include "content/browser/power_save_blocker_impl.h" +#include "content/browser/android/content_video_view.h" #include "content/public/browser/browser_thread.h" -#include "jni/PowerSaveBlocker_jni.h" -#include "ui/android/window_android.h" - -using base::android::AttachCurrentThread; -using base::android::ScopedJavaLocalRef; namespace content { class PowerSaveBlockerImpl::Delegate : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { public: - explicit Delegate(gfx::NativeWindow native_window) { - j_window_android_ = JavaObjectWeakGlobalRef(AttachCurrentThread(), - static_cast<ui::WindowAndroid*>(native_window)->GetJavaObject().obj()); - } + explicit Delegate(PowerSaveBlockerType type) : type_(type) {} // Does the actual work to apply or remove the desired power save block. void ApplyBlock(); @@ -32,51 +23,49 @@ class PowerSaveBlockerImpl::Delegate friend class base::RefCountedThreadSafe<Delegate>; ~Delegate() {} - JavaObjectWeakGlobalRef j_window_android_; + // The counter of requests from clients for type + // kPowerSaveBlockPreventDisplaySleep. + static int blocker_count_; + const PowerSaveBlockerType type_; DISALLOW_COPY_AND_ASSIGN(Delegate); }; +int PowerSaveBlockerImpl::Delegate::blocker_count_ = 0; + void PowerSaveBlockerImpl::Delegate::ApplyBlock() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> j_object = j_window_android_.get(env); - if (j_object.obj()) - Java_PowerSaveBlocker_applyBlock(env, j_object.obj()); + if (type_ != kPowerSaveBlockPreventDisplaySleep) + return; + + if (blocker_count_ == 0) + ContentVideoView::KeepScreenOn(true); + ++blocker_count_; } void PowerSaveBlockerImpl::Delegate::RemoveBlock() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> j_object = j_window_android_.get(env); - if (j_object.obj()) - Java_PowerSaveBlocker_removeBlock(env, j_object.obj()); -} - -PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, - const std::string& reason) { - // Don't support kPowerSaveBlockPreventAppSuspension -} + if (type_ != kPowerSaveBlockPreventDisplaySleep) + return; -PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { - if (delegate_) { - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(&Delegate::RemoveBlock, delegate_)); - } + --blocker_count_; + if (blocker_count_ == 0) + ContentVideoView::KeepScreenOn(false); } -void PowerSaveBlockerImpl::InitDisplaySleepBlocker( - gfx::NativeWindow native_window) { - delegate_ = new Delegate(native_window); +PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, + const std::string& reason) + : delegate_(new Delegate(type)) { // This may be called on any thread. BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&Delegate::ApplyBlock, delegate_)); } -bool RegisterPowerSaveBlocker(JNIEnv* env) { - return RegisterNativesImpl(env); +PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&Delegate::RemoveBlock, delegate_)); } } // namespace content diff --git a/content/browser/power_save_blocker_android.h b/content/browser/power_save_blocker_android.h deleted file mode 100644 index 1df7d69..0000000 --- a/content/browser/power_save_blocker_android.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2013 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 <jni.h> - -namespace content { - -bool RegisterPowerSaveBlocker(JNIEnv* env); - -} // namespace content diff --git a/content/browser/power_save_blocker_impl.h b/content/browser/power_save_blocker_impl.h index c3a105d..fd0e63a 100644 --- a/content/browser/power_save_blocker_impl.h +++ b/content/browser/power_save_blocker_impl.h @@ -7,7 +7,6 @@ #include "base/memory/ref_counted.h" #include "content/public/browser/power_save_blocker.h" -#include "ui/gfx/native_widget_types.h" namespace content { @@ -16,14 +15,6 @@ class PowerSaveBlockerImpl : public PowerSaveBlocker { PowerSaveBlockerImpl(PowerSaveBlockerType type, const std::string& reason); virtual ~PowerSaveBlockerImpl(); -#if defined(OS_ANDROID) - // In Android platform, the |native_window| is needed to create the - // kPowerSaveBlockPreventDisplaySleep type of PowerSaveBlocker - // so the blocker could be removed by platform if the window isn't in the - // foreground. - void InitDisplaySleepBlocker(gfx::NativeWindow native_window); -#endif - private: class Delegate; diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 3ff6ed0..a7fa73e 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -50,6 +50,7 @@ #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" +#include "content/public/browser/power_save_blocker.h" #include "content/public/browser/render_view_host_observer.h" #include "content/public/browser/user_metrics.h" #include "content/public/common/bindings_policy.h" @@ -203,7 +204,9 @@ RenderViewHostImpl::~RenderViewHostImpl() { FOR_EACH_OBSERVER( RenderViewHostObserver, observers_, RenderViewHostDestruction()); - GetDelegate()->RenderViewDeleted(this); + ClearPowerSaveBlockers(); + + GetDelegate()->RenderViewDeleted(this); // Be sure to clean up any leftover state from cross-site requests. CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest( @@ -987,6 +990,7 @@ bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { OnSelectionBoundsChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) IPC_MESSAGE_HANDLER(ViewHostMsg_DidZoomURL, OnDidZoomURL) + IPC_MESSAGE_HANDLER(ViewHostMsg_MediaNotification, OnMediaNotification) IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowSnapshot, OnGetWindowSnapshot) IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_RequestPermission, OnRequestDesktopNotificationPermission) @@ -1126,6 +1130,7 @@ void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { static_cast<base::TerminationStatus>(status); // Reset state. + ClearPowerSaveBlockers(); main_frame_id_ = -1; // Our base class RenderWidgetHost needs to reset some stuff. @@ -1611,9 +1616,7 @@ void RenderViewHostImpl::RequestToLockMouse(bool user_gesture, } bool RenderViewHostImpl::IsFullscreen() const { - if (delegate_) - return delegate_->IsFullscreenForCurrentTab(); - return false; + return delegate_->IsFullscreenForCurrentTab(); } void RenderViewHostImpl::OnFocus() { @@ -1946,6 +1949,33 @@ void RenderViewHostImpl::OnDidZoomURL(double zoom_level, } } +void RenderViewHostImpl::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"); + } else if (has_audio) { + blocker = PowerSaveBlocker::Create( + PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, + "Playing audio"); + } + + if (blocker) + power_save_blockers_[player_cookie] = blocker.release(); + } else { + delete power_save_blockers_[player_cookie]; + power_save_blockers_.erase(player_cookie); + } +#endif +} + void RenderViewHostImpl::OnRequestDesktopNotificationPermission( const GURL& source_origin, int callback_context) { GetContentClient()->browser()->RequestDesktopNotificationPermission( @@ -2047,6 +2077,10 @@ void RenderViewHostImpl::SetSwappedOut(bool is_swapped_out) { has_timed_out_on_unload_ = false; } +void RenderViewHostImpl::ClearPowerSaveBlockers() { + STLDeleteValues(&power_save_blockers_); +} + bool RenderViewHostImpl::CanAccessFilesOfPageState( const PageState& state) const { ChildProcessSecurityPolicyImpl* policy = diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 7f63ba9..23d1941 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h @@ -63,6 +63,7 @@ namespace content { class ChildProcessSecurityPolicyImpl; class PageState; +class PowerSaveBlocker; class RenderFrameHostImpl; class RenderViewHostObserver; class RenderWidgetHostDelegate; @@ -567,6 +568,10 @@ class CONTENT_EXPORT RenderViewHostImpl const std::vector<AccessibilityHostMsg_NotificationParams>& params); void OnScriptEvalResponse(int id, const base::ListValue& result); void OnDidZoomURL(double zoom_level, bool remember, const GURL& url); + void OnMediaNotification(int64 player_cookie, + bool has_video, + bool has_audio, + bool is_playing); void OnRequestDesktopNotificationPermission(const GURL& origin, int callback_id); void OnShowDesktopNotification( @@ -590,6 +595,8 @@ class CONTENT_EXPORT RenderViewHostImpl // and clears any waiting state that is no longer relevant. void SetSwappedOut(bool is_swapped_out); + void ClearPowerSaveBlockers(); + bool CanAccessFilesOfPageState(const PageState& state) const; // This is an RenderFrameHost object associated with the top-level frame in @@ -694,6 +701,11 @@ class CONTENT_EXPORT RenderViewHostImpl // The termination status of the last render view that terminated. base::TerminationStatus render_view_termination_status_; + // Holds PowerSaveBlockers for the media players in use. Key is the + // player_cookie passed to OnMediaNotification, value is the PowerSaveBlocker. + typedef std::map<int64, PowerSaveBlocker*> PowerSaveBlockerMap; + PowerSaveBlockerMap power_save_blockers_; + // A list of observers that filter messages. Weak references. ObserverList<RenderViewHostObserver> observers_; diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index e929992..a122414 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -32,7 +32,6 @@ #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" @@ -367,8 +366,6 @@ WebContentsImpl::WebContentsImpl( WebContentsImpl::~WebContentsImpl() { is_being_destroyed_ = true; - ClearAllPowerSaveBlockers(); - for (std::set<RenderWidgetHostImpl*>::iterator iter = created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { (*iter)->DetachDelegate(); @@ -730,7 +727,6 @@ bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, #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; @@ -2593,38 +2589,6 @@ void WebContentsImpl::OnFrameDetached(int64 parent_frame_id, int64 frame_id) { 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()); @@ -2914,7 +2878,6 @@ void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, return; } - ClearPowerSaveBlockers(rvh); SetIsLoading(false, NULL); NotifyDisconnected(); SetIsCrashed(status, error_code); @@ -2926,7 +2889,6 @@ void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, } void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { - ClearPowerSaveBlockers(rvh); render_manager_.RenderViewDeleted(rvh); FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); } @@ -3733,17 +3695,4 @@ BrowserPluginGuestManager* browser_plugin::kBrowserPluginGuestManagerKeyName)); } -void WebContentsImpl::ClearPowerSaveBlockers( - RenderViewHost* render_view_host) { - if (!power_save_blockers_[render_view_host].empty()) - 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) - ClearPowerSaveBlockers(i->first); -} - } // namespace content diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index b42748c..bff25b5 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -47,7 +47,6 @@ class DownloadItem; class InterstitialPageImpl; class JavaBridgeDispatcherHostManager; class JavaScriptDialogManager; -class PowerSaveBlocker; class RenderViewHost; class RenderViewHostDelegateView; class RenderViewHostImpl; @@ -625,11 +624,6 @@ class CONTENT_EXPORT WebContentsImpl const std::string& frame_name); void OnFrameDetached(int64 parent_frame_id, int64 frame_id); - void OnMediaNotification(int64 player_cookie, - bool has_video, - bool has_audio, - bool is_playing); - // Changes the IsLoading state and notifies delegate as needed // |details| is used to provide details on the load that just finished // (but can be null if not applicable). Can be overridden. @@ -747,12 +741,6 @@ class CONTENT_EXPORT WebContentsImpl // Removes browser plugin embedder if there is one. void RemoveBrowserPluginEmbedder(); - // Clear |render_view_host|'s PowerSaveBlockers. - void ClearPowerSaveBlockers(RenderViewHost* render_view_host); - - // Clear all PowerSaveBlockers, leave power_save_blocker_ empty. - void ClearAllPowerSaveBlockers(); - // Data for core operation --------------------------------------------------- // Delegate for notifying our owner about stuff. Not owned by us. @@ -798,13 +786,6 @@ class CONTENT_EXPORT WebContentsImpl // Helper classes ------------------------------------------------------------ - // Maps the RenderViewHost to its media_player_cookie and PowerSaveBlocker - // pairs. Key is the RenderViewHost, value is the map which maps player_cookie - // on to PowerSaveBlocker. - typedef std::map<RenderViewHost*, std::map<int64, PowerSaveBlocker*> > - PowerSaveBlockerMap; - PowerSaveBlockerMap power_save_blockers_; - // Manages creation and swapping of render views. RenderViewHostManager render_manager_; |