| Index: third_party/WebKit/Source/core/workers/WorkerClients.h
|
| diff --git a/third_party/WebKit/Source/core/workers/WorkerClients.h b/third_party/WebKit/Source/core/workers/WorkerClients.h
|
| index 35ecdff94ea2be52a5a613d5020d1de9add0ed8e..09abcb131680ff68446ecdd99837ca5fcff8f5c8 100644
|
| --- a/third_party/WebKit/Source/core/workers/WorkerClients.h
|
| +++ b/third_party/WebKit/Source/core/workers/WorkerClients.h
|
| @@ -34,11 +34,10 @@
|
| #include "core/CoreExport.h"
|
| #include "platform/Supplementable.h"
|
| #include "platform/wtf/Forward.h"
|
| +#include "platform/wtf/Noncopyable.h"
|
|
|
| namespace blink {
|
|
|
| -class WorkerClients;
|
| -
|
| // This is created on the main thread, passed to the worker thread and
|
| // attached to WorkerOrWorkletGlobalScope when it is created.
|
| // This class can be used to provide "client" implementations to workers or
|
| @@ -61,6 +60,62 @@ class CORE_EXPORT WorkerClients final : public GarbageCollected<WorkerClients>,
|
|
|
| extern template class CORE_EXTERN_TEMPLATE_EXPORT Supplement<WorkerClients>;
|
|
|
| +// Allows for the registration of a callback that is invoked whenever a new
|
| +// worker starts. Callbacks are expected to provide module clients to a given
|
| +// WorkerClients. All functions must be called on the main thread.
|
| +//
|
| +// Example:
|
| +// // In ModulesInitializer.cpp.
|
| +// WorkerClientsInitializer<CoolWorker>::Register(
|
| +// [](WorkerClients* worker_clients) {
|
| +// // Provides module clients to |worker_clients| here.
|
| +// });
|
| +//
|
| +// // In CoolWorker.cpp.
|
| +// WorkerClients* worker_clients = WorkerClients::Create();
|
| +// WorkerClients<CoolWorker>::Run(worker_clients);
|
| +//
|
| +template <class WorkerType>
|
| +class WorkerClientsInitializer {
|
| + WTF_MAKE_NONCOPYABLE(WorkerClientsInitializer);
|
| + static_assert(sizeof(WorkerType), "WorkerType must be a complete type.");
|
| +
|
| + public:
|
| + using Callback = void (*)(WorkerClients*);
|
| +
|
| + WorkerClientsInitializer() = default;
|
| +
|
| + static void Register(Callback callback) {
|
| + DCHECK(IsMainThread());
|
| + if (!instance_)
|
| + instance_ = new WorkerClientsInitializer<WorkerType>;
|
| + instance_->RegisterInternal(callback);
|
| + }
|
| +
|
| + static void Run(WorkerClients* worker_clients) {
|
| + DCHECK(IsMainThread());
|
| + DCHECK(instance_);
|
| + instance_->RunInternal(worker_clients);
|
| + }
|
| +
|
| + private:
|
| + void RegisterInternal(Callback callback) { callbacks_.push_back(callback); }
|
| +
|
| + void RunInternal(WorkerClients* worker_clients) {
|
| + DCHECK(!callbacks_.IsEmpty());
|
| + for (auto& callback : callbacks_)
|
| + callback(worker_clients);
|
| + }
|
| +
|
| + Vector<Callback> callbacks_;
|
| +
|
| + static WorkerClientsInitializer<WorkerType>* instance_;
|
| +};
|
| +
|
| +template <class WorkerType>
|
| +WorkerClientsInitializer<WorkerType>*
|
| + WorkerClientsInitializer<WorkerType>::instance_ = nullptr;
|
| +
|
| } // namespace blink
|
|
|
| #endif // WorkerClients_h
|
|
|