This source file includes following definitions.
- m_connected
- WorkerFrontendChannel
- id
- proxy
- connectToWorkerGlobalScope
- disconnectFromWorkerGlobalScope
- dispatchMessageFromWorker
- create
- m_inspectorFrontend
- init
- setFrontend
- restore
- clearFrontend
- enable
- disable
- canInspectWorkers
- connectToWorker
- disconnectFromWorker
- sendMessageToWorker
- setAutoconnectToWorkers
- shouldPauseDedicatedWorkerOnStart
- didStartWorkerGlobalScope
- workerGlobalScopeTerminated
- createWorkerFrontendChannelsForExistingWorkers
- destroyWorkerFrontendChannels
- createWorkerFrontendChannel
#include "config.h"
#include "core/inspector/InspectorWorkerAgent.h"
#include "InspectorFrontend.h"
#include "core/inspector/InspectorState.h"
#include "core/inspector/InstrumentingAgents.h"
#include "core/inspector/JSONParser.h"
#include "core/workers/WorkerGlobalScopeProxy.h"
#include "platform/JSONValues.h"
#include "platform/weborigin/KURL.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/RefPtr.h"
namespace WebCore {
namespace WorkerAgentState {
static const char workerInspectionEnabled[] = "workerInspectionEnabled";
static const char autoconnectToWorkers[] = "autoconnectToWorkers";
};
class InspectorWorkerAgent::WorkerFrontendChannel FINAL : public WorkerGlobalScopeProxy::PageInspector {
WTF_MAKE_FAST_ALLOCATED;
public:
explicit WorkerFrontendChannel(InspectorFrontend* frontend, WorkerGlobalScopeProxy* proxy)
: m_frontend(frontend)
, m_proxy(proxy)
, m_id(s_nextId++)
, m_connected(false)
{
}
virtual ~WorkerFrontendChannel()
{
disconnectFromWorkerGlobalScope();
}
int id() const { return m_id; }
WorkerGlobalScopeProxy* proxy() const { return m_proxy; }
void connectToWorkerGlobalScope()
{
if (m_connected)
return;
m_connected = true;
m_proxy->connectToInspector(this);
}
void disconnectFromWorkerGlobalScope()
{
if (!m_connected)
return;
m_connected = false;
m_proxy->disconnectFromInspector();
}
private:
virtual void dispatchMessageFromWorker(const String& message) OVERRIDE
{
RefPtr<JSONValue> value = parseJSON(message);
if (!value)
return;
RefPtr<JSONObject> messageObject = value->asObject();
if (!messageObject)
return;
m_frontend->worker()->dispatchMessageFromWorker(m_id, messageObject);
}
InspectorFrontend* m_frontend;
WorkerGlobalScopeProxy* m_proxy;
int m_id;
bool m_connected;
static int s_nextId;
};
int InspectorWorkerAgent::WorkerFrontendChannel::s_nextId = 1;
PassOwnPtr<InspectorWorkerAgent> InspectorWorkerAgent::create()
{
return adoptPtr(new InspectorWorkerAgent());
}
InspectorWorkerAgent::InspectorWorkerAgent()
: InspectorBaseAgent<InspectorWorkerAgent>("Worker")
, m_inspectorFrontend(0)
{
}
InspectorWorkerAgent::~InspectorWorkerAgent()
{
m_instrumentingAgents->setInspectorWorkerAgent(0);
}
void InspectorWorkerAgent::init()
{
m_instrumentingAgents->setInspectorWorkerAgent(this);
}
void InspectorWorkerAgent::setFrontend(InspectorFrontend* frontend)
{
m_inspectorFrontend = frontend;
}
void InspectorWorkerAgent::restore()
{
if (m_state->getBoolean(WorkerAgentState::workerInspectionEnabled))
createWorkerFrontendChannelsForExistingWorkers();
}
void InspectorWorkerAgent::clearFrontend()
{
m_state->setBoolean(WorkerAgentState::autoconnectToWorkers, false);
disable(0);
m_inspectorFrontend = 0;
}
void InspectorWorkerAgent::enable(ErrorString*)
{
m_state->setBoolean(WorkerAgentState::workerInspectionEnabled, true);
if (!m_inspectorFrontend)
return;
createWorkerFrontendChannelsForExistingWorkers();
}
void InspectorWorkerAgent::disable(ErrorString*)
{
m_state->setBoolean(WorkerAgentState::workerInspectionEnabled, false);
if (!m_inspectorFrontend)
return;
destroyWorkerFrontendChannels();
}
void InspectorWorkerAgent::canInspectWorkers(ErrorString*, bool* result)
{
*result = true;
}
void InspectorWorkerAgent::connectToWorker(ErrorString* error, int workerId)
{
WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
if (channel)
channel->connectToWorkerGlobalScope();
else
*error = "Worker is gone";
}
void InspectorWorkerAgent::disconnectFromWorker(ErrorString* error, int workerId)
{
WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
if (channel)
channel->disconnectFromWorkerGlobalScope();
else
*error = "Worker is gone";
}
void InspectorWorkerAgent::sendMessageToWorker(ErrorString* error, int workerId, const RefPtr<JSONObject>& message)
{
WorkerFrontendChannel* channel = m_idToChannel.get(workerId);
if (channel)
channel->proxy()->sendMessageToInspector(message->toJSONString());
else
*error = "Worker is gone";
}
void InspectorWorkerAgent::setAutoconnectToWorkers(ErrorString*, bool value)
{
m_state->setBoolean(WorkerAgentState::autoconnectToWorkers, value);
}
bool InspectorWorkerAgent::shouldPauseDedicatedWorkerOnStart()
{
return m_state->getBoolean(WorkerAgentState::autoconnectToWorkers);
}
void InspectorWorkerAgent::didStartWorkerGlobalScope(WorkerGlobalScopeProxy* workerGlobalScopeProxy, const KURL& url)
{
m_dedicatedWorkers.set(workerGlobalScopeProxy, url.string());
if (m_inspectorFrontend && m_state->getBoolean(WorkerAgentState::workerInspectionEnabled))
createWorkerFrontendChannel(workerGlobalScopeProxy, url.string());
}
void InspectorWorkerAgent::workerGlobalScopeTerminated(WorkerGlobalScopeProxy* proxy)
{
m_dedicatedWorkers.remove(proxy);
for (WorkerChannels::iterator it = m_idToChannel.begin(); it != m_idToChannel.end(); ++it) {
if (proxy == it->value->proxy()) {
m_inspectorFrontend->worker()->workerTerminated(it->key);
delete it->value;
m_idToChannel.remove(it);
return;
}
}
}
void InspectorWorkerAgent::createWorkerFrontendChannelsForExistingWorkers()
{
for (DedicatedWorkers::iterator it = m_dedicatedWorkers.begin(); it != m_dedicatedWorkers.end(); ++it)
createWorkerFrontendChannel(it->key, it->value);
}
void InspectorWorkerAgent::destroyWorkerFrontendChannels()
{
for (WorkerChannels::iterator it = m_idToChannel.begin(); it != m_idToChannel.end(); ++it) {
it->value->disconnectFromWorkerGlobalScope();
delete it->value;
}
m_idToChannel.clear();
}
void InspectorWorkerAgent::createWorkerFrontendChannel(WorkerGlobalScopeProxy* workerGlobalScopeProxy, const String& url)
{
WorkerFrontendChannel* channel = new WorkerFrontendChannel(m_inspectorFrontend, workerGlobalScopeProxy);
m_idToChannel.set(channel->id(), channel);
ASSERT(m_inspectorFrontend);
bool autoconnectToWorkers = m_state->getBoolean(WorkerAgentState::autoconnectToWorkers);
if (autoconnectToWorkers)
channel->connectToWorkerGlobalScope();
m_inspectorFrontend->worker()->workerCreated(channel->id(), url, autoconnectToWorkers);
}
}