Index: Source/bindings/core/dart/DartScriptDebugServer.h |
diff --git a/Source/bindings/core/dart/DartScriptDebugServer.h b/Source/bindings/core/dart/DartScriptDebugServer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c65ac3a465cbbffe5f7aad739d78d5b8ca383b79 |
--- /dev/null |
+++ b/Source/bindings/core/dart/DartScriptDebugServer.h |
@@ -0,0 +1,281 @@ |
+/* |
+ * Copyright (C) 2014 Google Inc. All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * Redistributions in binary form must reproduce the above |
+ * copyright notice, this list of conditions and the following disclaimer |
+ * in the documentation and/or other materials provided with the |
+ * distribution. |
+ * * Neither the name of Google Inc. nor the names of its |
+ * contributors may be used to endorse or promote products derived from |
+ * this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+#ifndef DartScriptDebugServer_h |
+#define DartScriptDebugServer_h |
+ |
+#include "bindings/core/dart/DartScriptDebugListener.h" |
+#include "bindings/core/v8/PageScriptDebugServer.h" |
+#include "core/inspector/ScriptBreakpoint.h" |
+ |
+#include "wtf/Forward.h" |
+#include "wtf/HashSet.h" |
+#include "wtf/RefCounted.h" |
+#include <dart_api.h> |
+#include <dart_tools_api.h> |
+#include <v8.h> |
+ |
+namespace blink { |
+ |
+class DartInjectedScriptManager; |
+class Page; |
+template<typename T> |
+class HandleMap { |
+public: |
+ HandleMap() : m_lastHandle(0) |
+ { |
+ } |
+ |
+ int add(T value) |
+ { |
+ ASSERT(!m_valueToHandleMap.contains(value)); |
+ int handle = ++m_lastHandle; |
+ m_handleToValueMap.set(handle, value); |
+ m_valueToHandleMap.set(value, handle); |
+ return handle; |
+ } |
+ |
+ T get(int handle) |
+ { |
+ return m_handleToValueMap.get(handle); |
+ } |
+ |
+ bool containsValue(T value) |
+ { |
+ return m_valueToHandleMap.contains(value); |
+ } |
+ |
+ int getByValue(T value) |
+ { |
+ ASSERT(m_valueToHandleMap.contains(value)); |
+ return m_valueToHandleMap.get(value); |
+ } |
+ |
+ T remove(int handle) |
+ { |
+ T value = m_handleToValueMap.take(handle); |
+ m_valueToHandleMap.remove(value); |
+ return value; |
+ } |
+ |
+ int removeByValue(T value) |
+ { |
+ int handle = m_valueToHandleMap.take(value); |
+ m_handleToValueMap.remove(handle); |
+ return handle; |
+ } |
+ |
+ void copyValues(Vector<T>& values) |
+ { |
+ copyKeysToVector(m_valueToHandleMap, values); |
+ } |
+ |
+private: |
+ int m_lastHandle; |
+ HashMap<int, T> m_handleToValueMap; |
+ HashMap<T, int> m_valueToHandleMap; |
+}; |
+ |
+struct DartBreakpoint { |
+ DartBreakpoint(intptr_t breakpointId, Dart_Isolate); |
+ |
+ intptr_t m_breakpointId; |
+ Dart_Isolate m_isolate; |
+}; |
+ |
+ |
+struct DartBreakpointInfo { |
+ DartBreakpointInfo(const String& scriptUrl, const ScriptBreakpoint&); |
+ String m_scriptUrl; |
+ ScriptBreakpoint m_scriptBreakpoint; |
+ Vector<DartBreakpoint> m_breakpoints; |
+}; |
+ |
+typedef HashMap<String, intptr_t> SetBreakpointsMap; |
+ |
+class DartPageDebug { |
+public: |
+ DartPageDebug(Page*, int pageId); |
+ ~DartPageDebug(); |
+ |
+ String setBreakpoint(const String& sourceID, const ScriptBreakpoint&, int* actualLineNumber, int* actualColumnNumber, bool interstatementLocation); |
+ |
+ void registerIsolate(Dart_Isolate); |
+ void unregisterIsolate(Dart_Isolate); |
+ |
+ intptr_t setBreakpointHelper(DartBreakpointInfo*, const String& breakpointIdString, Dart_Isolate, Dart_Handle& exception); |
+ |
+ void removeBreakpoint(const String& breakpointId); |
+ void removeBreakpointHelper(DartBreakpointInfo*); |
+ void clearBreakpointsForIsolate(Dart_Isolate); |
+ void clearBreakpoints(); |
+ void isolateLoaded(); |
+ void deferredReady(); |
+ void addListener(DartScriptDebugListener*); |
+ void removeListener(); |
+ DartScriptDebugListener* listener() { return m_listener; } |
+ String getScriptId(const String& url); |
+ String lookupBreakpointId(intptr_t dartBreakpointId); |
+ |
+ Vector<Dart_Isolate> isolates(); |
+ bool containsIsolate(Dart_Isolate isolate) { return m_isolateMap.containsValue(isolate); } |
+ Page* page() { return m_page; } |
+private: |
+ SetBreakpointsMap* getSetBreakpoints(Dart_Isolate); |
+ |
+ void registerIsolateScripts(Dart_Isolate); |
+ void dispatchDidParseSource(intptr_t libraryId, Dart_Handle scriptURL, Dart_Isolate); |
+ |
+ HandleMap<Dart_Isolate> m_isolateMap; |
+ |
+ Page* m_page; |
+ DartScriptDebugListener* m_listener; |
+ int m_pageId; |
+ HashMap<String, String> m_idToScriptUrlMap; |
+ HashMap<String, String> m_scriptUrlToIdMap; |
+ typedef HashMap<Dart_Isolate, SetBreakpointsMap*> SetBreakpointsForIsolateMap; |
+ SetBreakpointsForIsolateMap m_setBreakpointsForIsolate; |
+ |
+ typedef HashMap<String, DartBreakpointInfo* > BreakpointMap; |
+ BreakpointMap m_breakpoints; |
+ typedef HashMap<intptr_t, String> BreakpointIdMap; |
+ BreakpointIdMap m_breakpointIdMap; |
+ int m_nextBreakpointId; |
+ int m_nextScriptId; |
+}; |
+ |
+class DartScriptDebugServer { |
+ WTF_MAKE_NONCOPYABLE(DartScriptDebugServer); |
+public: |
+ static DartScriptDebugServer& shared(); |
+ |
+ void addListener(DartScriptDebugListener*, Page*); |
+ void removeListener(DartScriptDebugListener*, Page*); |
+ |
+ void setClientMessageLoop(PageScriptDebugServer::ClientMessageLoop*); |
+ |
+ String setBreakpoint(const String& sourceID, const ScriptBreakpoint&, int* actualLineNumber, int* actualColumnNumber, bool interstatementLocation); |
+ void removeBreakpoint(const String& breakpointId); |
+ void clearBreakpoints(); |
+ void setBreakpointsActivated(bool); |
+ |
+ ScriptDebugServer::PauseOnExceptionsState pauseOnExceptionsState(); |
+ void setPauseOnExceptionsState(ScriptDebugServer::PauseOnExceptionsState); |
+ |
+ void setPauseOnNextStatement(bool); |
+ bool canBreakProgram(); |
+ void breakProgram(); |
+ void continueProgram(); |
+ void stepIntoStatement(); |
+ void stepOverStatement(); |
+ void stepOutOfFunction(); |
+ |
+ bool setScriptSource(const String& sourceID, const String& newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetScriptSourceError>&, Dart_StackTrace newCallFrames, RefPtr<JSONObject>* result); |
+ ScriptCallFrame callFrameNoScopes(int index); |
+ |
+ int frameCount(); |
+ Dart_StackTrace currentCallFrames(); |
+ |
+ bool isPaused(); |
+ bool runningNestedMessageLoop() { return m_runningNestedMessageLoop; } |
+ |
+ void runScript(ScriptState*, const String& scriptId, ScriptValue* result, bool* wasThrown, String* exceptionDetailsText, int* lineNumber, int* columnNumber, RefPtrWillBeRawPtr<ScriptCallStack>* stackTrace); |
+ |
+ static void pausedEventHandler(Dart_IsolateId, intptr_t breakpointId, const Dart_CodeLocation&); |
+ static void exceptionHandler(Dart_IsolateId, Dart_Handle, Dart_StackTrace); |
+ void handleException(Dart_IsolateId, Dart_Handle, Dart_StackTrace); |
+ |
+ static void isolateEventHandler(Dart_IsolateId, Dart_IsolateEvent kind); |
+ void handleInterrupted(Dart_IsolateId); |
+ static void interruptAndRunAllTasks(); |
+ void runPendingTasks(); |
+ |
+ void registerIsolate(Dart_Isolate, Page*); |
+ void unregisterIsolate(Dart_Isolate, Page*); |
+ void isolateLoaded(); |
+ void deferredReady(); |
+ |
+ bool resolveCodeLocation(const Dart_CodeLocation&, int* line, int* column); |
+ |
+ String getScriptId(const String& url, Dart_Isolate); |
+ void clearWindowShell(Page*); |
+ |
+ ScriptDebugServer::PauseOnExceptionsState pauseOnExceptionState() { return m_pauseOnExceptionState; } |
+ |
+ void setInjectedScriptManager(DartInjectedScriptManager* manager) { m_injectedScriptManager = manager; } |
+ DartInjectedScriptManager* injectedScriptManager() { return m_injectedScriptManager; } |
+protected: |
+ explicit DartScriptDebugServer(); |
+ ~DartScriptDebugServer(); |
+ |
+ bool isAnyScriptPaused(); |
+ |
+ DartPageDebug* lookupPageDebugForId(const String& id); |
+ DartPageDebug* lookupPageDebug(Page*); |
+ DartPageDebug* lookupPageDebugForCurrentIsolate(); |
+ void runMessageLoopOnPause(Dart_Isolate); |
+ void quitMessageLoopOnPause(); |
+ bool executeSkipPauseRequest(DartScriptDebugListener::SkipPauseRequest, Dart_StackTrace); |
+ void handleProgramBreak(Dart_Isolate, Dart_StackTrace, intptr_t dartBreakpointId, Dart_Handle exception, const Dart_CodeLocation&); |
+ void handleDartDebugEvent(Dart_IsolateId, intptr_t breakpointId, Dart_Handle exception, const Dart_CodeLocation&); |
+ |
+ ScriptCallFrame getScriptCallFrameHelper(int frameIndex); |
+ |
+ void debugBreak(); |
+ void cancelDebugBreak(); |
+ Page* inferPage(Dart_Isolate); |
+ |
+ Vector<Dart_Isolate> isolates(); |
+ Vector<DartPageDebug*> pages(); |
+ |
+ ScriptDebugServer::PauseOnExceptionsState m_pauseOnExceptionState; |
+ bool m_breakpointsActivated; |
+ bool m_runningNestedMessageLoop; |
+ Dart_StackTrace m_executionState; |
+ Dart_Isolate m_pausedIsolate; |
+ Page* m_pausedPage; |
+ HashSet<Dart_Isolate> m_interruptCalled; |
+ HashSet<Dart_Isolate> m_interruptCancelled; |
+ |
+ typedef HashMap<int, DartPageDebug*> DebugDataMap; |
+ DebugDataMap m_pageIdToDebugDataMap; |
+ typedef HashMap<Page*, int> PageToIdMap; |
+ PageToIdMap m_pageToIdMap; |
+ |
+ PageScriptDebugServer::ClientMessageLoop* m_clientMessageLoop; |
+ |
+ DartInjectedScriptManager* m_injectedScriptManager; |
+ |
+ int m_nextPageId; |
+}; |
+ |
+} |
+ |
+#endif // DartScriptDebugServer_h |