WorkerDebuggerAgent.cpp [plain text]
#include "config.h"
#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) && ENABLE(WORKERS)
#include "WorkerDebuggerAgent.h"
#include "ScriptDebugServer.h"
#include "WorkerContext.h"
#include "WorkerThread.h"
#include <wtf/MessageQueue.h>
namespace WebCore {
namespace {
Mutex& workerDebuggerAgentsMutex()
{
AtomicallyInitializedStatic(Mutex&, mutex = *new Mutex);
return mutex;
}
typedef HashMap<WorkerThread*, WorkerDebuggerAgent*> WorkerDebuggerAgents;
WorkerDebuggerAgents& workerDebuggerAgents()
{
DEFINE_STATIC_LOCAL(WorkerDebuggerAgents, agents, ());
return agents;
}
class RunInspectorCommandsTask : public ScriptDebugServer::Task {
public:
RunInspectorCommandsTask(WorkerThread* thread, WorkerContext* workerContext)
: m_thread(thread)
, m_workerContext(workerContext) { }
virtual ~RunInspectorCommandsTask() { }
virtual void run()
{
while (MessageQueueMessageReceived == m_thread->runLoop().runInMode(m_workerContext, WorkerDebuggerAgent::debuggerTaskMode, WorkerRunLoop::DontWaitForMessage)) { }
}
private:
RefPtr<WorkerThread> m_thread;
WorkerContext* m_workerContext;
};
}
const char* WorkerDebuggerAgent::debuggerTaskMode = "debugger";
PassOwnPtr<WorkerDebuggerAgent> WorkerDebuggerAgent::create(InstrumentingAgents* instrumentingAgents, InspectorState* inspectorState, WorkerContext* inspectedWorkerContext, InjectedScriptManager* injectedScriptManager)
{
return adoptPtr(new WorkerDebuggerAgent(instrumentingAgents, inspectorState, inspectedWorkerContext, injectedScriptManager));
}
WorkerDebuggerAgent::WorkerDebuggerAgent(InstrumentingAgents* instrumentingAgents, InspectorState* inspectorState, WorkerContext* inspectedWorkerContext, InjectedScriptManager* injectedScriptManager)
: InspectorDebuggerAgent(instrumentingAgents, inspectorState, injectedScriptManager)
, m_scriptDebugServer(inspectedWorkerContext)
, m_inspectedWorkerContext(inspectedWorkerContext)
{
MutexLocker lock(workerDebuggerAgentsMutex());
workerDebuggerAgents().set(inspectedWorkerContext->thread(), this);
}
WorkerDebuggerAgent::~WorkerDebuggerAgent()
{
MutexLocker lock(workerDebuggerAgentsMutex());
ASSERT(workerDebuggerAgents().contains(m_inspectedWorkerContext->thread()));
workerDebuggerAgents().remove(m_inspectedWorkerContext->thread());
}
void WorkerDebuggerAgent::interruptAndDispatchInspectorCommands(WorkerThread* thread)
{
MutexLocker lock(workerDebuggerAgentsMutex());
WorkerDebuggerAgent* agent = workerDebuggerAgents().get(thread);
if (agent)
agent->m_scriptDebugServer.interruptAndRunTask(adoptPtr(new RunInspectorCommandsTask(thread, agent->m_inspectedWorkerContext)));
}
void WorkerDebuggerAgent::startListeningScriptDebugServer()
{
scriptDebugServer().addListener(this);
}
void WorkerDebuggerAgent::stopListeningScriptDebugServer()
{
scriptDebugServer().removeListener(this);
}
WorkerScriptDebugServer& WorkerDebuggerAgent::scriptDebugServer()
{
return m_scriptDebugServer;
}
void WorkerDebuggerAgent::muteConsole()
{
}
void WorkerDebuggerAgent::unmuteConsole()
{
}
}
#endif // ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) && ENABLE(WORKERS)