From 8a4d96e3db180d62e4c47b39725858410a973bbd Mon Sep 17 00:00:00 2001
From: Pawel Wasowski
Date: Wed, 4 Apr 2018 18:33:30 +0200
Subject: [PATCH] [Power] Prevent override of power level locked with Web API
Chromium used to override power level locked by Web API with its own
settings. The level set by Web API was not restored.
From now on, Chromium will not override power level lock, after receiving
"__DisableChromiumInternalPowerLock" message from the Web API
and will be able to control the locked power level,
after receiving "__EnableChromiumInternalPowerLock" message.
Change-Id: Ia14f873766e26bd02ae7eecb182c69e0b6af00e8
Signed-off-by: Pawel Wasowski
---
src/power/power_manager.cc | 26 ++++++++++++++++++++++++++
src/power/power_manager.h | 3 +++
src/utils/utils_api.js | 6 +++++-
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/src/power/power_manager.cc b/src/power/power_manager.cc
index c8638b61..3646d8f0 100644
--- a/src/power/power_manager.cc
+++ b/src/power/power_manager.cc
@@ -387,6 +387,16 @@ PlatformResult PowerManager::RequestScreenState(PowerState state) {
("device_power_request_lock error %d", ret));
}
is_screen_state_locked = true;
+
+ /*
+ * In some cases Chromium requests power lock on screen backlight
+ * (e.g. when an mp4 video is played in the app). This results in
+ * overriding the power level set by the Web API.
+ *
+ * Below method prevents Chromium from locking the power level.
+ */
+ DisableChromiumInternalPowerLock();
+
return PlatformResult(ErrorCode::NO_ERROR);
}
@@ -421,6 +431,12 @@ PlatformResult PowerManager::ReleaseScreenState() {
is_screen_state_locked = false;
+ /*
+ * Below method enables Chromium to lock screen backlight power level,
+ * when it is no longer locked by the Web API.
+ */
+ EnableChromiumInternalPowerLock();
+
if (is_screen_bright_set) {
PlatformResult result = RestoreScreenBrightness();
if (result.IsError()) {
@@ -442,5 +458,15 @@ PlatformResult PowerManager::GetScreenBrightness(int* output) {
return PlatformResult(ErrorCode::NO_ERROR);
}
+void PowerManager::EnableChromiumInternalPowerLock() {
+ ScopeLogger();
+ Instance::PostMessage(&instance_, "__EnableChromiumInternalPowerLock");
+}
+
+void PowerManager::DisableChromiumInternalPowerLock() {
+ ScopeLogger();
+ Instance::PostMessage(&instance_, "__DisableChromiumInternalPowerLock");
+}
+
} // namespace power
} // namespace extension
diff --git a/src/power/power_manager.h b/src/power/power_manager.h
index 8f85063e..c3c46d35 100644
--- a/src/power/power_manager.h
+++ b/src/power/power_manager.h
@@ -79,6 +79,9 @@ class PowerManager {
common::PlatformResult ReleaseScreenState();
common::PlatformResult GetScreenBrightness(int* output);
+ void EnableChromiumInternalPowerLock();
+ void DisableChromiumInternalPowerLock();
+
PowerInstance& instance_;
bool is_screen_listener_set;
int max_brightness_;
diff --git a/src/utils/utils_api.js b/src/utils/utils_api.js
index 2aa60088..c6f0c6dc 100644
--- a/src/utils/utils_api.js
+++ b/src/utils/utils_api.js
@@ -1026,7 +1026,11 @@ var NativeManager = function(extension) {
});
extension_.setMessageListener(function(json) {
- var msg = JSON_.parse(json);
+ try {
+ var msg = JSON_.parse(json);
+ } catch (error) {
+ xwalk.utils.error('Invalid JSON received: ' + json);
+ }
var id;
if (msg.hasOwnProperty(this.CALLBACK_ID_KEY)) {
--
2.34.1