| // Copyright 2018 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. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_H_ |
| |
| #include "services/device/public/mojom/wake_lock.mojom-blink.h" |
| #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" |
| #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" |
| #include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h" |
| #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" |
| #include "third_party/blink/renderer/core/page/page_visibility_observer.h" |
| #include "third_party/blink/renderer/modules/event_target_modules.h" |
| #include "third_party/blink/renderer/platform/heap/handle.h" |
| |
| namespace blink { |
| |
| class Document; |
| class WakeLockRequest; |
| |
| class WakeLock final : public EventTargetWithInlineData, |
| public ActiveScriptWrappable<WakeLock>, |
| public ContextLifecycleObserver, |
| public PageVisibilityObserver { |
| DEFINE_WRAPPERTYPEINFO(); |
| USING_GARBAGE_COLLECTED_MIXIN(WakeLock); |
| |
| public: |
| enum class LockType { kSystem, kScreen }; |
| |
| WakeLock(ScriptState*, LockType); |
| ~WakeLock() override; |
| |
| // wake_lock.idl implementation |
| AtomicString type() const; |
| bool active() const; |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(activechange, kActivechange); |
| WakeLockRequest* createRequest(); |
| |
| // Called by NavigatorWakeLock to create Screen Wake Lock |
| static WakeLock* CreateScreenWakeLock(ScriptState*); |
| // Called by NavigatorWakeLock to create System Wake Lock |
| static WakeLock* CreateSystemWakeLock(ScriptState*); |
| |
| // Resolves and returns same promise of that particular WakeLockType each time |
| ScriptPromise GetPromise(ScriptState*); |
| |
| // EventTarget overrides. |
| const WTF::AtomicString& InterfaceName() const override; |
| ExecutionContext* GetExecutionContext() const override; |
| |
| // ActiveScriptWrappable overrides. |
| bool HasPendingActivity() const final; |
| |
| // ContextLifecycleObserver overrides. |
| void ContextDestroyed(ExecutionContext*) override; |
| |
| // PageVisibilityObserver overrides. |
| void PageVisibilityChanged() override; |
| |
| void Trace(blink::Visitor*) override; |
| |
| // Called by WakeLockRequest to decrease the request counter by one |
| void CancelRequest(); |
| |
| private: |
| // Error handler in case of failure to connect to Wake Lock mojo service |
| void OnConnectionError(); |
| |
| // Depending on active_ status change, requests or cancels Wake Lock |
| void ChangeActiveStatus(bool); |
| |
| // Binds to the Wake Lock mojo service |
| void BindToServiceIfNeeded(); |
| |
| // Returns the document associated with the object. nullptr if there is none. |
| Document* GetDocument(); |
| |
| device::mojom::blink::WakeLockPtr wake_lock_service_; |
| |
| int request_counter_ = 0; |
| LockType type_; |
| bool active_ = false; |
| |
| // We use ScriptPromiseProperty instead of ScriptPromiseResolver or other |
| // mechanism because we need to return same promise of that WakeLockType for |
| // any subsequent calls to navigator.getWakeLock(WakeLockType). |
| using WakeLockProperty = ScriptPromiseProperty<Member<WakeLock>, |
| Member<WakeLock>, |
| Member<DOMException>>; |
| Member<WakeLockProperty> wake_lock_property_; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_H_ |