Index: content/browser/power_save_blocker_android.cc |
diff --git a/content/browser/power_save_blocker_android.cc b/content/browser/power_save_blocker_android.cc |
index 1e91625e19c295a5544f1adfe7f0cffdbac33b16..20ea63ccc58e1c53a10bc036aff8f9008a3e50cc 100644 |
--- a/content/browser/power_save_blocker_android.cc |
+++ b/content/browser/power_save_blocker_android.cc |
@@ -2,30 +2,26 @@ |
// 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 "base/android/jni_android.h" |
-#include "base/android/jni_weak_ref.h" |
#include "base/logging.h" |
+#include "content/browser/android/content_view_core_impl.h" |
#include "content/browser/power_save_blocker_impl.h" |
+#include "content/browser/web_contents/web_contents_impl.h" |
#include "content/public/browser/android/content_view_core.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/web_contents_observer.h" |
#include "jni/PowerSaveBlocker_jni.h" |
#include "ui/android/view_android.h" |
-using base::android::AttachCurrentThread; |
-using base::android::ScopedJavaLocalRef; |
-using gfx::NativeView; |
- |
namespace content { |
+using base::android::AttachCurrentThread; |
+ |
class PowerSaveBlockerImpl::Delegate |
- : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { |
+ : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate>, |
+ public WebContentsObserver { |
public: |
- explicit Delegate(NativeView view_android) { |
- j_view_android_ = JavaObjectWeakGlobalRef( |
- AttachCurrentThread(), view_android->GetJavaObject().obj()); |
- } |
+ explicit Delegate(WebContents* web_contents); |
// Does the actual work to apply or remove the desired power save block. |
void ApplyBlock(); |
@@ -33,27 +29,61 @@ class PowerSaveBlockerImpl::Delegate |
private: |
friend class base::RefCountedThreadSafe<Delegate>; |
- ~Delegate() {} |
+ ~Delegate() override; |
- JavaObjectWeakGlobalRef j_view_android_; |
+ base::android::ScopedJavaLocalRef<jobject> GetContentViewCore(); |
+ |
+ base::android::ScopedJavaGlobalRef<jobject> java_power_save_blocker_; |
DISALLOW_COPY_AND_ASSIGN(Delegate); |
}; |
+PowerSaveBlockerImpl::Delegate::Delegate(WebContents* web_contents) |
+ : WebContentsObserver(web_contents) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ java_power_save_blocker_.Reset(Java_PowerSaveBlocker_create(env)); |
+} |
+ |
+PowerSaveBlockerImpl::Delegate::~Delegate() { |
+} |
+ |
void PowerSaveBlockerImpl::Delegate::ApplyBlock() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ base::android::ScopedJavaLocalRef<jobject> java_content_view_core = |
+ GetContentViewCore(); |
+ if (java_content_view_core.is_null()) |
+ return; |
+ |
+ ScopedJavaLocalRef<jobject> obj(java_power_save_blocker_); |
JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); |
- if (j_object.obj()) |
- Java_PowerSaveBlocker_applyBlock(env, j_object.obj()); |
+ Java_PowerSaveBlocker_applyBlock(env, obj.obj(), |
+ java_content_view_core.obj()); |
} |
void PowerSaveBlockerImpl::Delegate::RemoveBlock() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ base::android::ScopedJavaLocalRef<jobject> java_content_view_core = |
+ GetContentViewCore(); |
+ if (java_content_view_core.is_null()) |
+ return; |
+ |
+ ScopedJavaLocalRef<jobject> obj(java_power_save_blocker_); |
JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); |
- if (j_object.obj()) |
- Java_PowerSaveBlocker_removeBlock(env, j_object.obj()); |
+ Java_PowerSaveBlocker_removeBlock(env, obj.obj(), |
+ java_content_view_core.obj()); |
+} |
+ |
+base::android::ScopedJavaLocalRef<jobject> |
+PowerSaveBlockerImpl::Delegate::GetContentViewCore() { |
+ if (!web_contents()) |
+ return base::android::ScopedJavaLocalRef<jobject>(); |
+ |
+ ContentViewCoreImpl* content_view_core_impl = |
+ ContentViewCoreImpl::FromWebContents(web_contents()); |
+ if (!content_view_core_impl) |
+ return base::android::ScopedJavaLocalRef<jobject>(); |
+ |
+ return content_view_core_impl->GetJavaObject(); |
} |
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, |
@@ -70,15 +100,13 @@ PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { |
} |
} |
-void PowerSaveBlockerImpl::InitDisplaySleepBlocker(NativeView view_android) { |
- if (!view_android) |
+void PowerSaveBlockerImpl::InitDisplaySleepBlocker(WebContents* web_contents) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ if (!web_contents) |
return; |
- delegate_ = new Delegate(view_android); |
- // This may be called on any thread. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&Delegate::ApplyBlock, delegate_)); |
+ delegate_ = new Delegate(web_contents); |
+ delegate_->ApplyBlock(); |
} |
bool RegisterPowerSaveBlocker(JNIEnv* env) { |