blob: 04937406aa190ea2d55138fec7381838c7ee8933 [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/inspector/ConsoleTypes.h"
#include "core/workers/WorkerLoaderProxy.h"
#include "wtf/Forward.h"
namespace blink {
class ExecutionContext;
class ParentFrameTaskRunners;
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 reportConsoleMessage(MessageSource, MessageLevel, const String& message, std::unique_ptr<SourceLocation>);
void postMessageToPageInspector(const String&);
// 'virtual' for testing.
virtual void workerThreadTerminated();
ExecutionContext* getExecutionContext() const { return m_executionContext.get(); }
ParentFrameTaskRunners* getParentFrameTaskRunners() { return m_parentFrameTaskRunners.get(); }
// Number of live messaging proxies, used by leak detection.
static int proxyCount();
protected:
ThreadedMessagingProxyBase(ExecutionContext*);
~ThreadedMessagingProxyBase() override;
void initializeWorkerThread(std::unique_ptr<WorkerThreadStartupData>);
virtual std::unique_ptr<WorkerThread> createWorkerThread(double originTime) = 0;
WorkerThread* workerThread() const { return m_workerThread.get(); }
bool askedToTerminate() const { return m_askedToTerminate; }
PassRefPtr<WorkerLoaderProxy> loaderProxy() { return m_loaderProxy; }
WorkerInspectorProxy* workerInspectorProxy() { return m_workerInspectorProxy.get(); }
// Returns true if this is called on the parent context thread.
bool isParentContextThread() const;
// WorkerLoaderProxyProvider
// These methods are called on different threads to schedule loading
// requests and to send callbacks back to WorkerGlobalScope.
void postTaskToLoader(const WebTraceLocation&, std::unique_ptr<ExecutionContextTask>) override;
void postTaskToWorkerGlobalScope(const WebTraceLocation&, std::unique_ptr<ExecutionContextTask>) override;
private:
friend class InProcessWorkerMessagingProxyForTest;
void parentObjectDestroyedInternal();
Persistent<ExecutionContext> m_executionContext;
Persistent<WorkerInspectorProxy> m_workerInspectorProxy;
Persistent<ParentFrameTaskRunners> m_parentFrameTaskRunners;
std::unique_ptr<WorkerThread> m_workerThread;
RefPtr<WorkerLoaderProxy> m_loaderProxy;
bool m_mayBeDestroyed;
bool m_askedToTerminate;
};
} // namespace blink
#endif // ThreadedMessagingProxyBase_h