blob: ed21b16a9ac067aed4eec52b8a1ec64c7a23cec4 [file] [log] [blame]
// Copyright 2016 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 ThreadedMessagingProxyBase_h
#define ThreadedMessagingProxyBase_h
#include "core/CoreExport.h"
#include "core/frame/UseCounter.h"
#include "core/inspector/ConsoleTypes.h"
#include "core/workers/ParentFrameTaskRunners.h"
#include "core/workers/WorkerLoaderProxy.h"
#include "platform/wtf/Forward.h"
namespace blink {
class ExecutionContext;
class SourceLocation;
class WorkerInspectorProxy;
class WorkerLoaderProxy;
class WorkerThread;
class WorkerThreadStartupData;
class CORE_EXPORT ThreadedMessagingProxyBase
: private WorkerLoaderProxyProvider {
public:
void TerminateGlobalScope();
virtual void WorkerThreadCreated();
// This method should be called in the destructor of the object which
// initially created it. This object could either be a Worker or a Worklet.
virtual void ParentObjectDestroyed();
void CountFeature(UseCounter::Feature);
void CountDeprecation(UseCounter::Feature);
void ReportConsoleMessage(MessageSource,
MessageLevel,
const String& message,
std::unique_ptr<SourceLocation>);
void PostMessageToPageInspector(const String&);
// 'virtual' for testing.
virtual void WorkerThreadTerminated();
// Accessed only from the parent thread.
ExecutionContext* GetExecutionContext() const {
return execution_context_.Get();
}
// Accessed from both the parent thread and the worker.
ParentFrameTaskRunners* GetParentFrameTaskRunners() {
return parent_frame_task_runners_.Get();
}
// Number of live messaging proxies, used by leak detection.
static int ProxyCount();
void SetWorkerThreadForTest(std::unique_ptr<WorkerThread>);
protected:
ThreadedMessagingProxyBase(ExecutionContext*);
~ThreadedMessagingProxyBase() override;
void InitializeWorkerThread(std::unique_ptr<WorkerThreadStartupData>);
virtual std::unique_ptr<WorkerThread> CreateWorkerThread(
double origin_time) = 0;
WorkerThread* GetWorkerThread() const { return worker_thread_.get(); }
bool AskedToTerminate() const { return asked_to_terminate_; }
PassRefPtr<WorkerLoaderProxy> LoaderProxy() { return loader_proxy_; }
WorkerInspectorProxy* GetWorkerInspectorProxy() const {
return worker_inspector_proxy_.Get();
}
// Returns true if this is called on the parent context thread.
bool IsParentContextThread() const;
// WorkerLoaderProxyProvider
ThreadableLoadingContext* GetThreadableLoadingContext() override;
private:
friend class InProcessWorkerMessagingProxyForTest;
friend class ThreadedWorkletMessagingProxyForTest;
void ParentObjectDestroyedInternal();
Persistent<ExecutionContext> execution_context_;
Persistent<ThreadableLoadingContext> loading_context_;
Persistent<WorkerInspectorProxy> worker_inspector_proxy_;
// Accessed cross-thread when worker thread posts tasks to the parent.
CrossThreadPersistent<ParentFrameTaskRunners> parent_frame_task_runners_;
std::unique_ptr<WorkerThread> worker_thread_;
RefPtr<WorkerLoaderProxy> loader_proxy_;
bool may_be_destroyed_;
bool asked_to_terminate_;
};
} // namespace blink
#endif // ThreadedMessagingProxyBase_h