// Copyright 2017 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_LOCKS_LOCK_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_LOCKS_LOCK_H_ #include "third_party/blink/public/mojom/feature_observer/feature_observer.mojom-blink.h" #include "third_party/blink/public/mojom/locks/lock_manager.mojom-blink.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.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_associated_remote.h" #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { class LockManager; class ScriptPromise; class ScriptPromiseResolver; class ScriptState; class Lock final : public ScriptWrappable, public ExecutionContextLifecycleObserver { DEFINE_WRAPPERTYPEINFO(); public: Lock(ScriptState*, const String& name, mojom::blink::LockMode, mojo::PendingAssociatedRemote, mojo::PendingRemote, LockManager*); ~Lock() override; void Trace(Visitor*) const override; // Lock.idl String name() const { return name_; } String mode() const; // ExecutionContextLifecycleObserver void ContextDestroyed() override; // The lock is held until the passed promise resolves. When it is released, // the passed resolver is invoked with the promise's result. void HoldUntil(ScriptPromise, ScriptPromiseResolver*); static mojom::blink::LockMode StringToMode(const String&); static String ModeToString(mojom::blink::LockMode); private: class ThenFunction; void ReleaseIfHeld(); void OnConnectionError(); Member resolver_; const String name_; const mojom::blink::LockMode mode_; // An opaque handle; this one end of a mojo pipe. When this is closed, // the lock is released by the back end. HeapMojoAssociatedRemote handle_; HeapMojoRemote lock_lifetime_; // LockManager::OnLockReleased() is called when this lock is released, to // stop artificially keeping this instance alive. It is necessary in the // case where the resolver's promise could potentially be GC'd. Member manager_; }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_LOCKS_LOCK_H_