01fca957d9662b8c9595ce51e1ebea2cf2ca3186
[WebKit-https.git] / Source / WebCore / inspector / InspectorDebuggerAgent.h
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2010-2011 Google Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef InspectorDebuggerAgent_h
31 #define InspectorDebuggerAgent_h
32
33 #if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR)
34 #include "InjectedScript.h"
35 #include "InspectorBaseAgent.h"
36 #include "InspectorFrontend.h"
37 #include "ScriptBreakpoint.h"
38 #include "ScriptDebugListener.h"
39 #include "ScriptState.h"
40 #include <wtf/Forward.h>
41 #include <wtf/HashMap.h>
42 #include <wtf/PassOwnPtr.h>
43 #include <wtf/PassRefPtr.h>
44 #include <wtf/Vector.h>
45 #include <wtf/text/StringHash.h>
46
47 namespace WebCore {
48
49 class InjectedScriptManager;
50 class InspectorFrontend;
51 class InspectorArray;
52 class InspectorObject;
53 class InspectorState;
54 class InspectorValue;
55 class InstrumentingAgents;
56 class ScriptDebugServer;
57 class ScriptValue;
58
59 typedef String ErrorString;
60
61 class InspectorDebuggerAgent : public InspectorBaseAgent<InspectorDebuggerAgent>, public ScriptDebugListener {
62     WTF_MAKE_NONCOPYABLE(InspectorDebuggerAgent); WTF_MAKE_FAST_ALLOCATED;
63 public:
64     static const char* backtraceObjectGroup;
65
66     virtual ~InspectorDebuggerAgent();
67
68     void causesRecompilation(ErrorString*, bool*);
69     void canSetScriptSource(ErrorString*, bool*);
70     void supportsNativeBreakpoints(ErrorString*, bool*);
71
72     void enable(ErrorString*);
73     void disable(ErrorString*);
74
75     virtual void setFrontend(InspectorFrontend*);
76     virtual void clearFrontend();
77     virtual void restore();
78
79     void didClearMainFrameWindowObject();
80
81     // Part of the protocol.
82     void setBreakpointsActive(ErrorString*, bool active);
83
84     void setBreakpointByUrl(ErrorString*, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const String* const optionalCondition, String* breakpointId, RefPtr<InspectorArray>& locations);
85     void setBreakpoint(ErrorString*, PassRefPtr<InspectorObject> location, const String* const optionalCondition, String* breakpointId, RefPtr<InspectorObject>& actualLocation);
86     void removeBreakpoint(ErrorString*, const String& breakpointId);
87     void continueToLocation(ErrorString*, PassRefPtr<InspectorObject> location);
88
89     void searchInContent(ErrorString*, const String& scriptId, const String& query, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr<InspectorArray>&);
90     void setScriptSource(ErrorString*, const String& scriptId, const String& newContent, const bool* const preview, RefPtr<InspectorArray>& newCallFrames, RefPtr<InspectorObject>& result);
91     void getScriptSource(ErrorString*, const String& scriptId, String* scriptSource);
92     void getFunctionLocation(ErrorString*, const String& functionId, RefPtr<InspectorObject>& location);
93     void schedulePauseOnNextStatement(const String& breakReason, PassRefPtr<InspectorObject> data);
94     void cancelPauseOnNextStatement();
95     void breakProgram(const String& breakReason, PassRefPtr<InspectorObject> data);
96     void pause(ErrorString*);
97     void resume(ErrorString*);
98     void stepOver(ErrorString*);
99     void stepInto(ErrorString*);
100     void stepOut(ErrorString*);
101     void setPauseOnExceptions(ErrorString*, const String& pauseState);
102     void evaluateOnCallFrame(ErrorString*,
103                              const String& callFrameId,
104                              const String& expression,
105                              const String* const objectGroup,
106                              const bool* const includeCommandLineAPI,
107                              const bool* const returnByValue,
108                              RefPtr<InspectorObject>& result,
109                              bool* wasThrown);
110
111     class Listener {
112     public:
113         virtual ~Listener() { }
114         virtual void debuggerWasEnabled() = 0;
115         virtual void debuggerWasDisabled() = 0;
116     };
117     void setListener(Listener* listener) { m_listener = listener; }
118
119     virtual ScriptDebugServer& scriptDebugServer() = 0;
120
121 protected:
122     InspectorDebuggerAgent(InstrumentingAgents*, InspectorState*, InjectedScriptManager*);
123
124     virtual void startListeningScriptDebugServer() = 0;
125     virtual void stopListeningScriptDebugServer() = 0;
126
127 private:
128     void enable();
129     void disable();
130     bool enabled();
131
132     PassRefPtr<InspectorArray> currentCallFrames();
133
134     virtual void didParseSource(const String& scriptId, const Script&);
135     virtual void failedToParseSource(const String& url, const String& data, int firstLine, int errorLine, const String& errorMessage);
136     virtual void didPause(ScriptState*, const ScriptValue& callFrames, const ScriptValue& exception);
137     virtual void didContinue();
138
139     PassRefPtr<InspectorObject> resolveBreakpoint(const String& breakpointId, const String& scriptId, const ScriptBreakpoint&);
140     void clear();
141     bool assertPaused(ErrorString*);
142     void clearBreakDetails();
143
144     String sourceMapURLForScript(const Script&);
145
146     typedef HashMap<String, Script> ScriptsMap;
147     typedef HashMap<String, Vector<String> > BreakpointIdToDebugServerBreakpointIdsMap;
148
149     InjectedScriptManager* m_injectedScriptManager;
150     InspectorFrontend::Debugger* m_frontend;
151     ScriptState* m_pausedScriptState;
152     ScriptValue m_currentCallStack;
153     ScriptsMap m_scripts;
154     BreakpointIdToDebugServerBreakpointIdsMap m_breakpointIdToDebugServerBreakpointIds;
155     String m_continueToLocationBreakpointId;
156     String m_breakReason;
157     RefPtr<InspectorObject> m_breakAuxData;
158     bool m_javaScriptPauseScheduled;
159     Listener* m_listener;
160 };
161
162 } // namespace WebCore
163
164 #endif // ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR)
165
166 #endif // !defined(InspectorDebuggerAgent_h)