15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/WorkerInspectorController.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorBackendDispatcher.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorFrontend.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptHost.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptManager.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorConsoleAgent.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorFrontendChannel.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorHeapProfilerAgent.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorProfilerAgent.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorStateClient.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorTimelineAgent.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/WorkerConsoleAgent.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/WorkerDebuggerAgent.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/WorkerRuntimeAgent.h" 50591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/workers/WorkerGlobalScope.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/WorkerReportingProxy.h" 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/WorkerThread.h" 53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassOwnPtr.h" 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PageInspectorProxy : public InspectorFrontendChannel { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch explicit PageInspectorProxy(WorkerGlobalScope* workerGlobalScope) : m_workerGlobalScope(workerGlobalScope) { } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~PageInspectorProxy() { } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool sendMessageToFrontend(const String& message) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_workerGlobalScope->thread()->workerReportingProxy().postMessageToPageInspector(message); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 70591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch WorkerGlobalScope* m_workerGlobalScope; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WorkerStateClient : public InspectorStateClient { 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch WorkerStateClient(WorkerGlobalScope* context) : m_workerGlobalScope(context) { } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~WorkerStateClient() { } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void updateInspectorStateCookie(const String& cookie) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 82591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_workerGlobalScope->thread()->workerReportingProxy().updateInspectorStateCookie(cookie); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch WorkerGlobalScope* m_workerGlobalScope; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWorkerInspectorController::WorkerInspectorController(WorkerGlobalScope* workerGlobalScope) 91591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch : m_workerGlobalScope(workerGlobalScope) 92591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_stateClient(adoptPtr(new WorkerStateClient(workerGlobalScope))) 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_state(adoptPtr(new InspectorCompositeState(m_stateClient.get()))) 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_instrumentingAgents(InstrumentingAgents::create()) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_injectedScriptManager(InjectedScriptManager::createForWorker()) 96591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_debugServer(adoptPtr(new WorkerScriptDebugServer(workerGlobalScope, WorkerDebuggerAgent::debuggerTaskMode))) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 98591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_agents.append(WorkerRuntimeAgent::create(m_instrumentingAgents.get(), m_state.get(), m_injectedScriptManager.get(), m_debugServer.get(), workerGlobalScope)); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<InspectorConsoleAgent> consoleAgent = WorkerConsoleAgent::create(m_instrumentingAgents.get(), m_state.get(), m_injectedScriptManager.get()); 101591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_agents.append(WorkerDebuggerAgent::create(m_instrumentingAgents.get(), m_state.get(), m_debugServer.get(), workerGlobalScope, m_injectedScriptManager.get())); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 10393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_agents.append(InspectorProfilerAgent::create(m_instrumentingAgents.get(), consoleAgent.get(), m_state.get(), m_injectedScriptManager.get())); 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.append(InspectorHeapProfilerAgent::create(m_instrumentingAgents.get(), m_state.get(), m_injectedScriptManager.get())); 105e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) m_agents.append(InspectorTimelineAgent::create(m_instrumentingAgents.get(), 0, 0, 0, m_state.get(), InspectorTimelineAgent::WorkerInspector, 0)); 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.append(consoleAgent.release()); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) m_injectedScriptManager->injectedScriptHost()->init(m_instrumentingAgents.get(), m_debugServer.get()); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WorkerInspectorController::~WorkerInspectorController() 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_instrumentingAgents->reset(); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) disconnectFrontend(); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WorkerInspectorController::connectFrontend() 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_frontend); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->unmute(); 121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_frontendChannel = adoptPtr(new PageInspectorProxy(m_workerGlobalScope)); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = adoptPtr(new InspectorFrontend(m_frontendChannel.get())); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_backendDispatcher = InspectorBackendDispatcher::create(m_frontendChannel.get()); 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.registerInDispatcher(m_backendDispatcher.get()); 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.setFrontend(m_frontend.get()); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WorkerInspectorController::disconnectFrontend() 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_frontend) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_backendDispatcher->clearFrontend(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_backendDispatcher.clear(); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Destroying agents would change the state, but we don't want that. 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pre-disconnect state will be used to restore inspector agents. 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->mute(); 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.clearFrontend(); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend.clear(); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontendChannel.clear(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WorkerInspectorController::restoreInspectorStateFromCookie(const String& inspectorCookie) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_frontend); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) connectFrontend(); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->loadFromCookie(inspectorCookie); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_agents.restore(); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WorkerInspectorController::dispatchMessageFromFrontend(const String& message) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_backendDispatcher) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_backendDispatcher->dispatch(message); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WorkerInspectorController::resume() 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (WorkerRuntimeAgent* runtimeAgent = m_instrumentingAgents->workerRuntimeAgent()) { 160521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) ErrorString unused; 161521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) runtimeAgent->run(&unused); 162521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 166