15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * from this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY 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 OF 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptHost.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorConsoleAgent.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorDOMAgent.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorDebuggerAgent.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/inspector/InspectorInspectorAgent.h" 38521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/inspector/InstrumentingAgents.h" 391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/JSONValues.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefPtr.h" 42521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/text/StringBuilder.h" 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<InjectedScriptHost> InjectedScriptHost::create() 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return adoptRefWillBeNoop(new InjectedScriptHost()); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InjectedScriptHost::InjectedScriptHost() 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) : m_instrumentingAgents(nullptr) 53521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) , m_scriptDebugServer(0) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_defaultInspectableObject = adoptPtr(new InspectableObject()); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InjectedScriptHost::~InjectedScriptHost() 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InjectedScriptHost::trace(Visitor* visitor) 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_instrumentingAgents); 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InjectedScriptHost::disconnect() 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_instrumentingAgents = nullptr; 70521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) m_scriptDebugServer = 0; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InjectedScriptHost::inspectImpl(PassRefPtr<JSONValue> object, PassRefPtr<JSONValue> hints) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (InspectorInspectorAgent* inspectorAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorInspectorAgent() : 0) { 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Runtime::RemoteObject> remoteObject = TypeBuilder::Runtime::RemoteObject::runtimeCast(object); 77521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) inspectorAgent->inspect(remoteObject, hints->asObject()); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InjectedScriptHost::getEventListenersImpl(EventTarget* target, Vector<EventListenerInfo>& listenersArray) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InspectorDOMAgent::getEventListeners(target, listenersArray, false); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InjectedScriptHost::clearConsoleMessages() 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 88521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (InspectorConsoleAgent* consoleAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorConsoleAgent() : 0) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString error; 90521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) consoleAgent->clearMessages(&error); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScriptValue InjectedScriptHost::InspectableObject::get(ScriptState*) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ScriptValue(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InjectedScriptHost::addInspectedObject(PassOwnPtr<InjectedScriptHost::InspectableObject> object) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectedObjects.prepend(object); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (m_inspectedObjects.size() > 5) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectedObjects.removeLast(); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InjectedScriptHost::clearInspectedObjects() 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectedObjects.clear(); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochInjectedScriptHost::InspectableObject* InjectedScriptHost::inspectedObject(unsigned num) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (num >= m_inspectedObjects.size()) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_defaultInspectableObject.get(); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_inspectedObjects[num].get(); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 118521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void InjectedScriptHost::debugFunction(const String& scriptId, int lineNumber, int columnNumber) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 120521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (InspectorDebuggerAgent* debuggerAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorDebuggerAgent() : 0) 121521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) debuggerAgent->setBreakpoint(scriptId, lineNumber, columnNumber, InspectorDebuggerAgent::DebugCommandBreakpointSource); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 124521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void InjectedScriptHost::undebugFunction(const String& scriptId, int lineNumber, int columnNumber) 1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 126521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (InspectorDebuggerAgent* debuggerAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorDebuggerAgent() : 0) 127521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) debuggerAgent->removeBreakpoint(scriptId, lineNumber, columnNumber, InspectorDebuggerAgent::DebugCommandBreakpointSource); 1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 130521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void InjectedScriptHost::monitorFunction(const String& scriptId, int lineNumber, int columnNumber, const String& functionName) 1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 132521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) StringBuilder builder; 133521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) builder.appendLiteral("console.log(\"function "); 134521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (functionName.isEmpty()) 135521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) builder.appendLiteral("(anonymous function)"); 136521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else 137521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) builder.append(functionName); 138521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) builder.appendLiteral(" called\" + (arguments.length > 0 ? \" with arguments: \" + Array.prototype.join.call(arguments, \", \") : \"\")) && false"); 139521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (InspectorDebuggerAgent* debuggerAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorDebuggerAgent() : 0) 140521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) debuggerAgent->setBreakpoint(scriptId, lineNumber, columnNumber, InspectorDebuggerAgent::MonitorCommandBreakpointSource, builder.toString()); 141521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 142521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 143521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void InjectedScriptHost::unmonitorFunction(const String& scriptId, int lineNumber, int columnNumber) 144521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 145521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (InspectorDebuggerAgent* debuggerAgent = m_instrumentingAgents ? m_instrumentingAgents->inspectorDebuggerAgent() : 0) 146521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) debuggerAgent->removeBreakpoint(scriptId, lineNumber, columnNumber, InspectorDebuggerAgent::MonitorCommandBreakpointSource); 1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 151