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