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