| 
									
										
										
										
											2014-10-31 11:17:05 -07:00
										 |  |  | // Copyright (c) 2013 GitHub, Inc.
 | 
					
						
							| 
									
										
										
										
											2014-04-25 17:49:37 +08:00
										 |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-16 08:30:26 +08:00
										 |  |  | #include "atom/browser/api/atom_api_power_monitor.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-15 16:50:25 +05:30
										 |  |  | #include "atom/browser/browser.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | #include "atom/common/native_mate_converters/callback.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-11 17:13:43 -07:00
										 |  |  | #include "atom/common/node_includes.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | #include "base/power_monitor/power_monitor.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-11 15:48:19 +08:00
										 |  |  | #include "base/power_monitor/power_monitor_device_source.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-17 17:13:17 +08:00
										 |  |  | #include "native_mate/dictionary.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-11 15:48:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | namespace mate { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | template <> | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | struct Converter<ui::IdleState> { | 
					
						
							|  |  |  |   static v8::Local<v8::Value> ToV8(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                    const ui::IdleState& in) { | 
					
						
							|  |  |  |     switch (in) { | 
					
						
							|  |  |  |       case ui::IDLE_STATE_ACTIVE: | 
					
						
							|  |  |  |         return mate::StringToV8(isolate, "active"); | 
					
						
							|  |  |  |       case ui::IDLE_STATE_IDLE: | 
					
						
							|  |  |  |         return mate::StringToV8(isolate, "idle"); | 
					
						
							|  |  |  |       case ui::IDLE_STATE_LOCKED: | 
					
						
							|  |  |  |         return mate::StringToV8(isolate, "locked"); | 
					
						
							|  |  |  |       case ui::IDLE_STATE_UNKNOWN: | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         return mate::StringToV8(isolate, "unknown"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | }  // namespace mate
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace api { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 10:17:54 +09:00
										 |  |  | PowerMonitor::PowerMonitor(v8::Isolate* isolate) { | 
					
						
							| 
									
										
										
										
											2018-02-05 15:49:43 +09:00
										 |  |  | #if defined(OS_LINUX)
 | 
					
						
							| 
									
										
										
										
											2019-04-29 17:40:39 -07:00
										 |  |  |   SetShutdownHandler(base::BindRepeating(&PowerMonitor::ShouldShutdown, | 
					
						
							|  |  |  |                                          base::Unretained(this))); | 
					
						
							| 
									
										
										
										
											2018-02-05 16:13:35 +09:00
										 |  |  | #elif defined(OS_MACOSX)
 | 
					
						
							| 
									
										
										
										
											2019-04-29 17:40:39 -07:00
										 |  |  |   Browser::Get()->SetShutdownHandler(base::BindRepeating( | 
					
						
							|  |  |  |       &PowerMonitor::ShouldShutdown, base::Unretained(this))); | 
					
						
							| 
									
										
										
										
											2018-02-05 15:49:43 +09:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  |   base::PowerMonitor::Get()->AddObserver(this); | 
					
						
							| 
									
										
										
										
											2016-04-25 10:17:54 +09:00
										 |  |  |   Init(isolate); | 
					
						
							| 
									
										
										
										
											2018-05-01 02:04:27 +10:00
										 |  |  | #if defined(OS_MACOSX) || defined(OS_WIN)
 | 
					
						
							|  |  |  |   InitPlatformSpecificMonitors(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PowerMonitor::~PowerMonitor() { | 
					
						
							|  |  |  |   base::PowerMonitor::Get()->RemoveObserver(this); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 15:49:43 +09:00
										 |  |  | bool PowerMonitor::ShouldShutdown() { | 
					
						
							| 
									
										
										
										
											2018-02-05 16:13:35 +09:00
										 |  |  |   return !Emit("shutdown"); | 
					
						
							| 
									
										
										
										
											2018-02-05 15:49:43 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(OS_LINUX)
 | 
					
						
							|  |  |  | void PowerMonitor::BlockShutdown() { | 
					
						
							|  |  |  |   PowerObserverLinux::BlockShutdown(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PowerMonitor::UnblockShutdown() { | 
					
						
							|  |  |  |   PowerObserverLinux::UnblockShutdown(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | void PowerMonitor::OnPowerStateChange(bool on_battery_power) { | 
					
						
							|  |  |  |   if (on_battery_power) | 
					
						
							|  |  |  |     Emit("on-battery"); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     Emit("on-ac"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PowerMonitor::OnSuspend() { | 
					
						
							|  |  |  |   Emit("suspend"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PowerMonitor::OnResume() { | 
					
						
							|  |  |  |   Emit("resume"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-27 12:54:01 -08:00
										 |  |  | ui::IdleState PowerMonitor::GetSystemIdleState(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                                int idle_threshold) { | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  |   if (idle_threshold > 0) { | 
					
						
							| 
									
										
										
										
											2019-01-22 16:43:22 +05:30
										 |  |  |     return ui::CalculateIdleState(idle_threshold); | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |     isolate->ThrowException(v8::Exception::TypeError(mate::StringToV8( | 
					
						
							|  |  |  |         isolate, "Invalid idle threshold, must be greater than 0"))); | 
					
						
							| 
									
										
										
										
											2019-01-22 16:43:22 +05:30
										 |  |  |     return ui::IDLE_STATE_UNKNOWN; | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-27 12:54:01 -08:00
										 |  |  | int PowerMonitor::GetSystemIdleTime() { | 
					
						
							| 
									
										
										
										
											2019-01-22 16:43:22 +05:30
										 |  |  |   return ui::CalculateIdleTime(); | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2015-05-22 19:11:22 +08:00
										 |  |  | v8::Local<v8::Value> PowerMonitor::Create(v8::Isolate* isolate) { | 
					
						
							| 
									
										
										
										
											2015-04-15 16:50:25 +05:30
										 |  |  |   if (!Browser::Get()->is_ready()) { | 
					
						
							| 
									
										
										
										
											2019-04-29 17:46:08 -07:00
										 |  |  |     isolate->ThrowException(v8::Exception::Error( | 
					
						
							|  |  |  |         mate::StringToV8(isolate, | 
					
						
							|  |  |  |                          "The 'powerMonitor' module can't be used before the " | 
					
						
							|  |  |  |                          "app 'ready' event"))); | 
					
						
							| 
									
										
										
										
											2015-04-15 16:50:25 +05:30
										 |  |  |     return v8::Null(isolate); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 10:40:19 +09:00
										 |  |  |   return mate::CreateHandle(isolate, new PowerMonitor(isolate)).ToV8(); | 
					
						
							| 
									
										
										
										
											2016-04-25 10:17:54 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void PowerMonitor::BuildPrototype(v8::Isolate* isolate, | 
					
						
							|  |  |  |                                   v8::Local<v8::FunctionTemplate> prototype) { | 
					
						
							| 
									
										
										
										
											2016-08-02 19:28:12 +09:00
										 |  |  |   prototype->SetClassName(mate::StringToV8(isolate, "PowerMonitor")); | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-07 10:10:40 -03:00
										 |  |  |   mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |       .MakeDestroyable() | 
					
						
							| 
									
										
										
										
											2018-03-13 22:42:08 -07:00
										 |  |  | #if defined(OS_LINUX)
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |       .SetMethod("blockShutdown", &PowerMonitor::BlockShutdown) | 
					
						
							|  |  |  |       .SetMethod("unblockShutdown", &PowerMonitor::UnblockShutdown) | 
					
						
							| 
									
										
										
										
											2018-02-05 15:28:58 +09:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-02-27 12:54:01 -08:00
										 |  |  |       .SetMethod("getSystemIdleState", &PowerMonitor::GetSystemIdleState) | 
					
						
							|  |  |  |       .SetMethod("getSystemIdleTime", &PowerMonitor::GetSystemIdleTime); | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-17 17:13:17 +08:00
										 |  |  | }  // namespace api
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace atom
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 20:38:35 +09:00
										 |  |  | using atom::api::PowerMonitor; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void Initialize(v8::Local<v8::Object> exports, | 
					
						
							|  |  |  |                 v8::Local<v8::Value> unused, | 
					
						
							|  |  |  |                 v8::Local<v8::Context> context, | 
					
						
							|  |  |  |                 void* priv) { | 
					
						
							| 
									
										
										
										
											2014-06-29 20:48:44 +08:00
										 |  |  |   v8::Isolate* isolate = context->GetIsolate(); | 
					
						
							| 
									
										
										
										
											2014-04-17 17:13:17 +08:00
										 |  |  |   mate::Dictionary dict(isolate, exports); | 
					
						
							| 
									
										
										
										
											2019-05-02 08:32:33 -07:00
										 |  |  |   dict.Set("createPowerMonitor", | 
					
						
							|  |  |  |            base::BindRepeating(&PowerMonitor::Create, isolate)); | 
					
						
							| 
									
										
										
										
											2019-01-09 11:17:05 -08:00
										 |  |  |   dict.Set("PowerMonitor", PowerMonitor::GetConstructor(isolate) | 
					
						
							|  |  |  |                                ->GetFunction(context) | 
					
						
							|  |  |  |                                .ToLocalChecked()); | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-17 17:13:17 +08:00
										 |  |  | }  // namespace
 | 
					
						
							| 
									
										
										
										
											2013-08-03 15:58:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 23:59:52 +05:30
										 |  |  | NODE_LINKED_MODULE_CONTEXT_AWARE(atom_browser_power_monitor, Initialize) |