• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "bindings/v8/ScriptState.h"
34 #include "core/InspectorFrontend.h"
35 #include "core/frame/ConsoleTypes.h"
36 #include "core/inspector/AsyncCallStackTracker.h"
37 #include "core/inspector/ConsoleAPITypes.h"
38 #include "core/inspector/InjectedScript.h"
39 #include "core/inspector/InspectorBaseAgent.h"
40 #include "core/inspector/ScriptBreakpoint.h"
41 #include "core/inspector/ScriptDebugListener.h"
42 #include "wtf/Forward.h"
43 #include "wtf/HashMap.h"
44 #include "wtf/PassRefPtr.h"
45 #include "wtf/Vector.h"
46 #include "wtf/text/StringHash.h"
47 
48 namespace WebCore {
49 
50 class Document;
51 class Event;
52 class EventListener;
53 class EventTarget;
54 class FormData;
55 class HTTPHeaderMap;
56 class InjectedScriptManager;
57 class InspectorFrontend;
58 class InstrumentingAgents;
59 class JavaScriptCallFrame;
60 class JSONObject;
61 class KURL;
62 class MutationObserver;
63 class ScriptArguments;
64 class ScriptCallStack;
65 class ScriptDebugServer;
66 class ScriptRegexp;
67 class ScriptSourceCode;
68 class ScriptValue;
69 class ThreadableLoaderClient;
70 class XMLHttpRequest;
71 
72 typedef String ErrorString;
73 
74 class InspectorDebuggerAgent : public InspectorBaseAgent<InspectorDebuggerAgent>, public ScriptDebugListener, public InspectorBackendDispatcher::DebuggerCommandHandler {
75     WTF_MAKE_NONCOPYABLE(InspectorDebuggerAgent); WTF_MAKE_FAST_ALLOCATED;
76 public:
77     enum BreakpointSource {
78         UserBreakpointSource,
79         DebugCommandBreakpointSource,
80         MonitorCommandBreakpointSource
81     };
82 
83     static const char backtraceObjectGroup[];
84 
85     virtual ~InspectorDebuggerAgent();
86 
canSetScriptSource(ErrorString *,bool * result)87     virtual void canSetScriptSource(ErrorString*, bool* result) OVERRIDE FINAL { *result = true; }
88 
89     virtual void init() OVERRIDE FINAL;
90     virtual void setFrontend(InspectorFrontend*) OVERRIDE FINAL;
91     virtual void clearFrontend() OVERRIDE FINAL;
92     virtual void restore() OVERRIDE FINAL;
93 
94     bool isPaused();
95     bool runningNestedMessageLoop();
96     void addMessageToConsole(MessageSource, MessageType, MessageLevel, const String&, PassRefPtrWillBeRawPtr<ScriptCallStack>, unsigned long);
97     void addMessageToConsole(MessageSource, MessageType, MessageLevel, const String&, ScriptState*, PassRefPtrWillBeRawPtr<ScriptArguments>, unsigned long);
98 
99     String preprocessEventListener(LocalFrame*, const String& source, const String& url, const String& functionName);
100     PassOwnPtr<ScriptSourceCode> preprocess(LocalFrame*, const ScriptSourceCode&);
101 
102     // Part of the protocol.
103     virtual void enable(ErrorString*) OVERRIDE FINAL;
104     virtual void disable(ErrorString*) OVERRIDE FINAL;
105     virtual void setBreakpointsActive(ErrorString*, bool active) OVERRIDE FINAL;
106     virtual void setSkipAllPauses(ErrorString*, bool skipped, const bool* untilReload) OVERRIDE FINAL;
107 
108     virtual void setBreakpointByUrl(ErrorString*, int lineNumber, const String* optionalURL, const String* optionalURLRegex, const int* optionalColumnNumber, const String* optionalCondition, const bool* isAntiBreakpoint, TypeBuilder::Debugger::BreakpointId*, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::Location> >& locations) OVERRIDE FINAL;
109     virtual void setBreakpoint(ErrorString*, const RefPtr<JSONObject>& location, const String* optionalCondition, TypeBuilder::Debugger::BreakpointId*, RefPtr<TypeBuilder::Debugger::Location>& actualLocation) OVERRIDE FINAL;
110     virtual void removeBreakpoint(ErrorString*, const String& breakpointId) OVERRIDE FINAL;
111     virtual void continueToLocation(ErrorString*, const RefPtr<JSONObject>& location, const bool* interstateLocationOpt) OVERRIDE FINAL;
112     virtual void getStepInPositions(ErrorString*, const String& callFrameId, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::Location> >& positions) OVERRIDE FINAL;
113     virtual void getBacktrace(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CallFrame> >&, RefPtr<TypeBuilder::Debugger::StackTrace>&) OVERRIDE FINAL;
114 
115     virtual void searchInContent(ErrorString*, const String& scriptId, const String& query, const bool* optionalCaseSensitive, const bool* optionalIsRegex, RefPtr<TypeBuilder::Array<TypeBuilder::Page::SearchMatch> >&) OVERRIDE FINAL;
116     virtual void setScriptSource(ErrorString*, RefPtr<TypeBuilder::Debugger::SetScriptSourceError>&, const String& scriptId, const String& newContent, const bool* preview, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CallFrame> >& newCallFrames, RefPtr<JSONObject>& result, RefPtr<TypeBuilder::Debugger::StackTrace>& asyncStackTrace) OVERRIDE FINAL;
117     virtual void restartFrame(ErrorString*, const String& callFrameId, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CallFrame> >& newCallFrames, RefPtr<JSONObject>& result, RefPtr<TypeBuilder::Debugger::StackTrace>& asyncStackTrace) OVERRIDE FINAL;
118     virtual void getScriptSource(ErrorString*, const String& scriptId, String* scriptSource) OVERRIDE FINAL;
119     virtual void getFunctionDetails(ErrorString*, const String& functionId, RefPtr<TypeBuilder::Debugger::FunctionDetails>&) OVERRIDE FINAL;
120     virtual void pause(ErrorString*) OVERRIDE FINAL;
121     virtual void resume(ErrorString*) OVERRIDE FINAL;
122     virtual void stepOver(ErrorString*) OVERRIDE FINAL;
123     virtual void stepInto(ErrorString*) OVERRIDE FINAL;
124     virtual void stepOut(ErrorString*) OVERRIDE FINAL;
125     virtual void setPauseOnExceptions(ErrorString*, const String& pauseState) OVERRIDE FINAL;
126     virtual void evaluateOnCallFrame(ErrorString*,
127         const String& callFrameId,
128         const String& expression,
129         const String* objectGroup,
130         const bool* includeCommandLineAPI,
131         const bool* doNotPauseOnExceptionsAndMuteConsole,
132         const bool* returnByValue,
133         const bool* generatePreview,
134         RefPtr<TypeBuilder::Runtime::RemoteObject>& result,
135         TypeBuilder::OptOutput<bool>* wasThrown) OVERRIDE FINAL;
136     virtual void compileScript(ErrorString*, const String& expression, const String& sourceURL, const int* executionContextId, TypeBuilder::OptOutput<TypeBuilder::Debugger::ScriptId>*, RefPtr<TypeBuilder::Debugger::ExceptionDetails>&) OVERRIDE;
137     virtual void runScript(ErrorString*, const TypeBuilder::Debugger::ScriptId&, const int* executionContextId, const String* objectGroup, const bool* doNotPauseOnExceptionsAndMuteConsole, RefPtr<TypeBuilder::Runtime::RemoteObject>& result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>&) OVERRIDE;
138     virtual void setOverlayMessage(ErrorString*, const String*) OVERRIDE;
139     virtual void setVariableValue(ErrorString*, int in_scopeNumber, const String& in_variableName, const RefPtr<JSONObject>& in_newValue, const String* in_callFrame, const String* in_functionObjectId) OVERRIDE FINAL;
140     virtual void skipStackFrames(ErrorString*, const String* pattern) OVERRIDE FINAL;
141     virtual void setAsyncCallStackDepth(ErrorString*, int depth) OVERRIDE FINAL;
142 
143     void schedulePauseOnNextStatement(InspectorFrontend::Debugger::Reason::Enum breakReason, PassRefPtr<JSONObject> data);
144     void didInstallTimer(ExecutionContext*, int timerId, int timeout, bool singleShot);
145     void didRemoveTimer(ExecutionContext*, int timerId);
146     bool willFireTimer(ExecutionContext*, int timerId);
147     void didFireTimer();
148     void didRequestAnimationFrame(Document*, int callbackId);
149     void didCancelAnimationFrame(Document*, int callbackId);
150     bool willFireAnimationFrame(Document*, int callbackId);
151     void didFireAnimationFrame();
152     void didEnqueueEvent(EventTarget*, Event*);
153     void didRemoveEvent(EventTarget*, Event*);
154     void willHandleEvent(EventTarget*, Event*, EventListener*, bool useCapture);
155     void didHandleEvent();
156     void willLoadXHR(XMLHttpRequest*, ThreadableLoaderClient*, const AtomicString& method, const KURL&, bool async, FormData* body, const HTTPHeaderMap& headers, bool includeCrendentials);
157     void didEnqueueMutationRecord(ExecutionContext*, MutationObserver*);
158     void didClearAllMutationRecords(ExecutionContext*, MutationObserver*);
159     void willDeliverMutationRecords(ExecutionContext*, MutationObserver*);
160     void didDeliverMutationRecords();
161     bool canBreakProgram();
162     void breakProgram(InspectorFrontend::Debugger::Reason::Enum breakReason, PassRefPtr<JSONObject> data);
163     void scriptExecutionBlockedByCSP(const String& directiveText);
164 
165     class Listener {
166     public:
~Listener()167         virtual ~Listener() { }
168         virtual void debuggerWasEnabled() = 0;
169         virtual void debuggerWasDisabled() = 0;
170         virtual void stepInto() = 0;
171         virtual void didPause() = 0;
172     };
setListener(Listener * listener)173     void setListener(Listener* listener) { m_listener = listener; }
174 
175     bool enabled();
176 
177     virtual ScriptDebugServer& scriptDebugServer() = 0;
178 
179     void setBreakpoint(const String& scriptId, int lineNumber, int columnNumber, BreakpointSource, const String& condition = String());
180     void removeBreakpoint(const String& scriptId, int lineNumber, int columnNumber, BreakpointSource);
181 
182 protected:
183     explicit InspectorDebuggerAgent(InjectedScriptManager*);
184 
185     virtual void startListeningScriptDebugServer() = 0;
186     virtual void stopListeningScriptDebugServer() = 0;
187     virtual void muteConsole() = 0;
188     virtual void unmuteConsole() = 0;
injectedScriptManager()189     InjectedScriptManager* injectedScriptManager() { return m_injectedScriptManager; }
190     virtual InjectedScript injectedScriptForEval(ErrorString*, const int* executionContextId) = 0;
191 
192     virtual void enable();
193     virtual void disable();
194     virtual SkipPauseRequest didPause(ScriptState*, const ScriptValue& callFrames, const ScriptValue& exception, const Vector<String>& hitBreakpoints) OVERRIDE FINAL;
195     virtual void didContinue() OVERRIDE FINAL;
196     void reset();
197     void pageDidCommitLoad();
198 
199 private:
200     SkipPauseRequest shouldSkipExceptionPause();
201     SkipPauseRequest shouldSkipStepPause();
202 
203     void cancelPauseOnNextStatement();
204     void addMessageToConsole(MessageSource, MessageType);
205 
206     PassRefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CallFrame> > currentCallFrames();
207     PassRefPtr<TypeBuilder::Debugger::StackTrace> currentAsyncStackTrace();
208 
209     virtual void didParseSource(const String& scriptId, const Script&) OVERRIDE FINAL;
210     virtual void failedToParseSource(const String& url, const String& data, int firstLine, int errorLine, const String& errorMessage) OVERRIDE FINAL;
211 
212     void setPauseOnExceptionsImpl(ErrorString*, int);
213 
214     PassRefPtr<TypeBuilder::Debugger::Location> resolveBreakpoint(const String& breakpointId, const String& scriptId, const ScriptBreakpoint&, BreakpointSource);
215     void removeBreakpoint(const String& breakpointId);
216     void clear();
217     bool assertPaused(ErrorString*);
218     void clearBreakDetails();
219 
220     String sourceMapURLForScript(const Script&);
221 
222     String scriptURL(JavaScriptCallFrame*);
223 
224     typedef HashMap<String, Script> ScriptsMap;
225     typedef HashMap<String, Vector<String> > BreakpointIdToDebugServerBreakpointIdsMap;
226     typedef HashMap<String, std::pair<String, BreakpointSource> > DebugServerBreakpointToBreakpointIdAndSourceMap;
227 
228     InjectedScriptManager* m_injectedScriptManager;
229     InspectorFrontend::Debugger* m_frontend;
230     RefPtr<ScriptState> m_pausedScriptState;
231     ScriptValue m_currentCallStack;
232     ScriptsMap m_scripts;
233     BreakpointIdToDebugServerBreakpointIdsMap m_breakpointIdToDebugServerBreakpointIds;
234     DebugServerBreakpointToBreakpointIdAndSourceMap m_serverBreakpoints;
235     String m_continueToLocationBreakpointId;
236     InspectorFrontend::Debugger::Reason::Enum m_breakReason;
237     RefPtr<JSONObject> m_breakAuxData;
238     bool m_javaScriptPauseScheduled;
239     bool m_debuggerStepScheduled;
240     bool m_pausingOnNativeEvent;
241     Listener* m_listener;
242 
243     int m_skippedStepInCount;
244     int m_minFrameCountForSkip;
245     bool m_skipAllPauses;
246     OwnPtr<ScriptRegexp> m_cachedSkipStackRegExp;
247     AsyncCallStackTracker m_asyncCallStackTracker;
248 };
249 
250 } // namespace WebCore
251 
252 
253 #endif // !defined(InspectorDebuggerAgent_h)
254