Commit b5f6c655 authored by Nate Chapin's avatar Nate Chapin Committed by Commit Bot

Make LockManager a Supplement<NavigatorBase>

NavigatorBase is a newly-added base class for Navigator and
WorkerNavigator. Making LockManager a Supplement of NavigatorBase
allows a single class to handle all of the work of exposing the
navigator.locks getter for both windows and workers, and
greatly reduces boilerplate.

Bug: 1147612
Change-Id: I2eea54d27af56ed1ede3e9f07c2346bffe0796ae
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2545578
Commit-Queue: Nate Chapin <japhet@chromium.org>
Auto-Submit: Nate Chapin <japhet@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829294}
parent 9e648226
......@@ -10,7 +10,5 @@ blink_modules_sources("locks") {
"lock.h",
"lock_manager.cc",
"lock_manager.h",
"navigator_locks.cc",
"navigator_locks.h",
]
}
......@@ -202,10 +202,23 @@ class LockManager::LockRequestImpl final
DISALLOW_COPY_AND_ASSIGN(LockRequestImpl);
};
LockManager::LockManager(ExecutionContext* context)
: ExecutionContextLifecycleObserver(context),
service_(context),
observer_(context) {}
const char LockManager::kSupplementName[] = "LockManager";
// static
LockManager* LockManager::locks(NavigatorBase& navigator) {
auto* supplement = Supplement<NavigatorBase>::From<LockManager>(navigator);
if (!supplement) {
supplement = MakeGarbageCollected<LockManager>(navigator);
Supplement<NavigatorBase>::ProvideTo(navigator, supplement);
}
return supplement;
}
LockManager::LockManager(NavigatorBase& navigator)
: Supplement<NavigatorBase>(navigator),
ExecutionContextLifecycleObserver(navigator.GetExecutionContext()),
service_(navigator.GetExecutionContext()),
observer_(navigator.GetExecutionContext()) {}
ScriptPromise LockManager::request(ScriptState* script_state,
const String& name,
......@@ -416,6 +429,7 @@ bool LockManager::IsPendingRequest(LockRequestImpl* request) {
void LockManager::Trace(Visitor* visitor) const {
ScriptWrappable::Trace(visitor);
Supplement<NavigatorBase>::Trace(visitor);
ExecutionContextLifecycleObserver::Trace(visitor);
visitor->Trace(pending_requests_);
visitor->Trace(held_locks_);
......
......@@ -17,19 +17,27 @@
#include "third_party/blink/renderer/platform/heap/heap_allocator.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 blink {
class NavigatorBase;
class ScriptPromise;
class ScriptState;
class V8LockGrantedCallback;
class LockManager final : public ScriptWrappable,
public Supplement<NavigatorBase>,
public ExecutionContextLifecycleObserver {
DEFINE_WRAPPERTYPEINFO();
public:
explicit LockManager(ExecutionContext*);
static const char kSupplementName[];
// Web-exposed as navigator.locks
static LockManager* locks(NavigatorBase&);
explicit LockManager(NavigatorBase&);
ScriptPromise request(ScriptState*,
const String& name,
......
// 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.
#include "third_party/blink/renderer/modules/locks/navigator_locks.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
#include "third_party/blink/renderer/core/workers/worker_navigator.h"
#include "third_party/blink/renderer/modules/locks/lock_manager.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/supplementable.h"
namespace blink {
namespace {
template <typename T>
class NavigatorLocksImpl final : public GarbageCollected<NavigatorLocksImpl<T>>,
public Supplement<T>,
public NameClient {
public:
static const char kSupplementName[];
static NavigatorLocksImpl& From(T& navigator) {
NavigatorLocksImpl* supplement = static_cast<NavigatorLocksImpl*>(
Supplement<T>::template From<NavigatorLocksImpl>(navigator));
if (!supplement) {
supplement = MakeGarbageCollected<NavigatorLocksImpl>(navigator);
Supplement<T>::ProvideTo(navigator, supplement);
}
return *supplement;
}
explicit NavigatorLocksImpl(T& navigator) : Supplement<T>(navigator) {}
LockManager* GetLockManager(ExecutionContext* context) const {
if (!lock_manager_ && context) {
lock_manager_ = MakeGarbageCollected<LockManager>(context);
}
return lock_manager_.Get();
}
void Trace(Visitor* visitor) const override {
visitor->Trace(lock_manager_);
Supplement<T>::Trace(visitor);
}
const char* NameInHeapSnapshot() const override {
return "NavigatorLocksImpl";
}
private:
mutable Member<LockManager> lock_manager_;
};
// static
template <typename T>
const char NavigatorLocksImpl<T>::kSupplementName[] = "NavigatorLocksImpl";
} // namespace
LockManager* NavigatorLocks::locks(ScriptState* script_state,
Navigator& navigator) {
return NavigatorLocksImpl<Navigator>::From(navigator).GetLockManager(
ExecutionContext::From(script_state));
}
LockManager* NavigatorLocks::locks(ScriptState* script_state,
WorkerNavigator& navigator) {
return NavigatorLocksImpl<WorkerNavigator>::From(navigator).GetLockManager(
ExecutionContext::From(script_state));
}
} // namespace blink
// 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_NAVIGATOR_LOCKS_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_LOCKS_NAVIGATOR_LOCKS_H_
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace blink {
class LockManager;
class Navigator;
class ScriptState;
class WorkerNavigator;
class NavigatorLocks final {
STATIC_ONLY(NavigatorLocks);
public:
static LockManager* locks(ScriptState*, Navigator&);
static LockManager* locks(ScriptState*, WorkerNavigator&);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_LOCKS_NAVIGATOR_LOCKS_H_
......@@ -6,7 +6,7 @@
[
SecureContext,
Exposed=Window,
ImplementedAs=NavigatorLocks
ImplementedAs=LockManager
] partial interface Navigator {
[CallWith=ScriptState] readonly attribute LockManager locks;
readonly attribute LockManager locks;
};
......@@ -6,7 +6,7 @@
[
SecureContext,
Exposed=Worker,
ImplementedAs=NavigatorLocks
ImplementedAs=LockManager
] partial interface WorkerNavigator {
[CallWith=ScriptState] readonly attribute LockManager locks;
readonly attribute LockManager locks;
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment