15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (c) 2010, 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)#ifndef ScriptDebugServer_h 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define ScriptDebugServer_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "InspectorBackendDispatcher.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScopedPersistent.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptBreakpoint.h" 38f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/inspector/ScriptDebugListener.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <v8-debug.h> 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/HashMap.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Noncopyable.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/PassOwnPtr.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Vector.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/StringHash.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h" 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScriptDebugListener; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScriptObject; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScriptState; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScriptValue; 53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass JavaScriptCallFrame; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScriptDebugServer { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(ScriptDebugServer); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch String setBreakpoint(const String& sourceID, const ScriptBreakpoint&, int* actualLineNumber, int* actualColumnNumber, bool interstatementLocation); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeBreakpoint(const String& breakpointId); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clearBreakpoints(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setBreakpointsActivated(bool activated); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum PauseOnExceptionsState { 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DontPauseOnExceptions, 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnAllExceptions, 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnUncaughtExceptions 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnExceptionsState pauseOnExceptionsState(); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setPauseOnExceptionsState(PauseOnExceptionsState pauseOnExceptionsState); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setPauseOnNextStatement(bool pause); 72521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool canBreakProgram(); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void breakProgram(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void continueProgram(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void stepIntoStatement(); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void stepOverStatement(); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void stepOutOfFunction(); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch bool setScriptSource(const String& sourceID, const String& newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetScriptSourceError>&, ScriptValue* newCallFrames, ScriptObject* result); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void updateCallStack(ScriptValue* callFrame); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch void setScriptPreprocessor(const String& preprocessorBody); 8383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Task { 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~Task() { } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void run() = 0; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) static void interruptAndRun(PassOwnPtr<Task>, v8::Isolate*); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void runPendingTasks(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isPaused(); 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool runningNestedMessageLoop() { return m_runningNestedMessageLoop; } 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Local<v8::Value> functionScopes(v8::Handle<v8::Function>); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Local<v8::Value> getInternalProperties(v8::Handle<v8::Object>&); 975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) v8::Handle<v8::Value> setFunctionVariableValue(v8::Handle<v8::Value> functionValue, int scopeNumber, const String& variableName, v8::Handle<v8::Value> newValue); 9883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void compileScript(ScriptState*, const String& expression, const String& sourceURL, String* scriptId, String* exceptionMessage); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void clearCompiledScripts(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void runScript(ScriptState*, const String& scriptId, ScriptValue* result, bool* wasThrown, String* exceptionMessage); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 105e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) explicit ScriptDebugServer(v8::Isolate*); 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual ~ScriptDebugServer(); 10702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScriptValue currentCallFrame(); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ScriptDebugListener* getDebugListenerForContext(v8::Handle<v8::Context>) = 0; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void runMessageLoopOnPause(v8::Handle<v8::Context>) = 0; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void quitMessageLoopOnPause() = 0; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static void breakProgramCallback(const v8::FunctionCallbackInfo<v8::Value>& args); 115e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void handleProgramBreak(v8::Handle<v8::Object> executionState, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpoints); 116e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void handleProgramBreak(const v8::Debug::EventDetails&, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void v8DebugEventCallback(const v8::Debug::EventDetails& eventDetails); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void handleV8DebugEvent(const v8::Debug::EventDetails& eventDetails); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void dispatchDidParseSource(ScriptDebugListener* listener, v8::Handle<v8::Object> sourceObject); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void ensureDebuggerScriptCompiled(); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch v8::Local<v8::Value> callDebuggerMethod(const char* functionName, int argc, v8::Handle<v8::Value> argv[]); 12683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 12783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch String preprocessSourceCode(const String& sourceCode); 12883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnExceptionsState m_pauseOnExceptionsState; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScopedPersistent<v8::Object> m_debuggerScript; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScopedPersistent<v8::Object> m_executionState; 1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) v8::Handle<v8::Context> m_pausedContext; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_breakpointsActivated; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScopedPersistent<v8::FunctionTemplate> m_breakProgramCallbackTemplate; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashMap<String, OwnPtr<ScopedPersistent<v8::Script> > > m_compiledScripts; 13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) v8::Isolate* m_isolate; 13702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 139e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch PassRefPtr<JavaScriptCallFrame> wrapCallFrames(v8::Handle<v8::Object> executionState, int maximumLimit); 140f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) bool executeSkipPauseRequest(ScriptDebugListener::SkipPauseRequest, v8::Handle<v8::Object> executionState); 14183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 14283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch class ScriptPreprocessor; 14383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch OwnPtr<ScriptPreprocessor> m_scriptPreprocessor; 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool m_runningNestedMessageLoop; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // ScriptDebugServer_h 151