| 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
 | 
| 
 |