summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/android/browser_jni_registrar.cc2
-rw-r--r--content/browser/android/content_video_view.cc6
-rw-r--r--content/browser/power_save_blocker_android.cc65
-rw-r--r--content/browser/power_save_blocker_android.h11
-rw-r--r--content/browser/power_save_blocker_impl.h9
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc42
-rw-r--r--content/browser/renderer_host/render_view_host_impl.h12
-rw-r--r--content/browser/web_contents/web_contents_impl.cc51
-rw-r--r--content/browser/web_contents/web_contents_impl.h19
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_;