// 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 "base/callback.h"
#include "base/gtest_prod_util.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/page/page_visibility_observer.h"
#include "third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/wake_lock/wake_lock_type.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
#include "third_party/blink/renderer/platform/supplementable.h"

namespace WTF {

class String;

}  // namespace WTF

namespace blink {

class ExceptionState;
class NavigatorBase;
class ScriptState;
class WakeLockManager;

class MODULES_EXPORT WakeLock final : public ScriptWrappable,
                                      public Supplement<NavigatorBase>,
                                      public ExecutionContextLifecycleObserver,
                                      public PageVisibilityObserver {
  DEFINE_WRAPPERTYPEINFO();

 public:
  static const char kSupplementName[];

  // Getter for navigator.wakelock
  static WakeLock* wakeLock(NavigatorBase&);

  explicit WakeLock(NavigatorBase&);

  ScriptPromise request(ScriptState*,
                        const WTF::String& type,
                        ExceptionState& exception_state);

  void Trace(Visitor*) const override;

 private:
  // While this could be part of request() itself, having it as a separate
  // function makes testing (which uses a custom ScriptPromiseResolver) a lot
  // easier.
  void DoRequest(WakeLockType, ScriptPromiseResolver*);

  void DidReceivePermissionResponse(WakeLockType,
                                    ScriptPromiseResolver*,
                                    mojom::blink::PermissionStatus);

  // ExecutionContextLifecycleObserver implementation
  void ContextDestroyed() override;

  // PageVisibilityObserver implementation
  void PageVisibilityChanged() override;

  // Permission handling
  void ObtainPermission(
      WakeLockType,
      base::OnceCallback<void(mojom::blink::PermissionStatus)> callback);
  mojom::blink::PermissionService* GetPermissionService();

  HeapMojoRemote<mojom::blink::PermissionService,
                 HeapMojoWrapperMode::kWithoutContextObserver>
      permission_service_;

  // https://w3c.github.io/screen-wake-lock/#concepts-and-state-record
  // Each platform wake lock (one per wake lock type) has an associated state
  // record per responsible document [...] internal slots.
  Member<WakeLockManager> managers_[kWakeLockTypeCount];

  FRIEND_TEST_ALL_PREFIXES(WakeLockSentinelTest, ContextDestruction);
  FRIEND_TEST_ALL_PREFIXES(WakeLockTest, RequestWakeLockGranted);
  FRIEND_TEST_ALL_PREFIXES(WakeLockTest, RequestWakeLockDenied);
  FRIEND_TEST_ALL_PREFIXES(WakeLockTest, LossOfDocumentActivity);
  FRIEND_TEST_ALL_PREFIXES(WakeLockTest, PageVisibilityHidden);
  FRIEND_TEST_ALL_PREFIXES(WakeLockTest,
                           PageVisibilityHiddenBeforeLockAcquisition);
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_WAKE_LOCK_WAKE_LOCK_H_
