This source file includes following definitions.
- m_workerGlobalScope
- addListener
- removeListener
- interruptAndRunTask
- getDebugListenerForContext
- runMessageLoopOnPause
- quitMessageLoopOnPause
#include "config.h"
#include "bindings/v8/WorkerScriptDebugServer.h"
#include "bindings/v8/V8ScriptRunner.h"
#include "core/inspector/ScriptDebugListener.h"
#include "core/inspector/WorkerDebuggerAgent.h"
#include "core/workers/WorkerGlobalScope.h"
#include "core/workers/WorkerThread.h"
#include <v8.h>
#include "wtf/MessageQueue.h"
namespace WebCore {
WorkerScriptDebugServer::WorkerScriptDebugServer(WorkerGlobalScope* workerGlobalScope)
: ScriptDebugServer(v8::Isolate::GetCurrent())
, m_listener(0)
, m_workerGlobalScope(workerGlobalScope)
{
ASSERT(m_isolate);
}
void WorkerScriptDebugServer::addListener(ScriptDebugListener* listener)
{
v8::HandleScope scope(m_isolate);
v8::Local<v8::Context> debuggerContext = v8::Debug::GetDebugContext();
v8::Context::Scope contextScope(debuggerContext);
ASSERT(!m_listener);
m_listener = listener;
ensureDebuggerScriptCompiled();
v8::Local<v8::Object> debuggerScript = m_debuggerScript.newLocal(m_isolate);
ASSERT(!debuggerScript->IsUndefined());
v8::Debug::SetDebugEventListener2(&WorkerScriptDebugServer::v8DebugEventCallback, v8::External::New(m_isolate, this));
v8::Handle<v8::Function> getScriptsFunction = v8::Local<v8::Function>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getWorkerScripts")));
v8::Handle<v8::Value> value = V8ScriptRunner::callInternalFunction(getScriptsFunction, debuggerScript, 0, 0, m_isolate);
if (value.IsEmpty())
return;
ASSERT(!value->IsUndefined() && value->IsArray());
v8::Handle<v8::Array> scriptsArray = v8::Handle<v8::Array>::Cast(value);
for (unsigned i = 0; i < scriptsArray->Length(); ++i)
dispatchDidParseSource(listener, v8::Handle<v8::Object>::Cast(scriptsArray->Get(v8::Integer::New(m_isolate, i))));
}
void WorkerScriptDebugServer::removeListener(ScriptDebugListener* listener)
{
ASSERT(m_listener == listener);
continueProgram();
m_listener = 0;
v8::Debug::SetDebugEventListener2(0);
}
void WorkerScriptDebugServer::interruptAndRunTask(PassOwnPtr<Task> task)
{
interruptAndRun(task, m_isolate);
}
ScriptDebugListener* WorkerScriptDebugServer::getDebugListenerForContext(v8::Handle<v8::Context>)
{
return m_listener;
}
void WorkerScriptDebugServer::runMessageLoopOnPause(v8::Handle<v8::Context>)
{
MessageQueueWaitResult result;
do {
result = m_workerGlobalScope->thread()->runLoop().runDebuggerTask();
} while (result == MessageQueueMessageReceived && isPaused());
if (m_listener)
m_listener->didContinue();
}
void WorkerScriptDebugServer::quitMessageLoopOnPause()
{
}
}