WebKit/win:
authorkmccullough@apple.com <kmccullough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Nov 2007 01:05:58 +0000 (01:05 +0000)
committerkmccullough@apple.com <kmccullough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Nov 2007 01:05:58 +0000 (01:05 +0000)
        Reviewed by Adam.

        - Make Drosera show source, source URLs, and function stack on Windows
        and some minor fixes.

        * WebScriptCallFrame.cpp: Fixed a bug where the callFrame was not reffed
        properly before being returned, and changed functionName() to check for
        Null or if the name is empty.
        (EnumScopes::Clone):
        (WebScriptCallFrame::WebScriptCallFrame):
        (WebScriptCallFrame::createInstance):
        (WebScriptCallFrame::caller):
        (WebScriptCallFrame::functionName):
        * WebScriptCallFrame.h: Ditto
        * WebScriptDebugServer.cpp: Made the listenerSet static since we were
        already treating it as if it were. Removed the EnumViews stuff.  This
        was added by Steve to demonstrate DCOM and he thought it would be needed
        by Drosera, but I don't believe it will be.
        Implemented suspendProcessIfPaused() also added calls to it at the end
        of several functions to ensure we pause if Drosera has told WebKit to.
        (WebScriptDebugServer::WebScriptDebugServer):
        (WebScriptDebugServer::sharedWebScriptDebugServer):
        (WebScriptDebugServer::addListener):
        (WebScriptDebugServer::removeListener):
        (WebScriptDebugServer::suspendProcessIfPaused):
        (WebScriptDebugServer::didLoadMainResourceForDataSource):
        (WebScriptDebugServer::didParseSource):
        (WebScriptDebugServer::failedToParseSource):
        (WebScriptDebugServer::didEnterCallFrame):
        (WebScriptDebugServer::willExecuteStatement):
        (WebScriptDebugServer::willLeaveCallFrame):
        (WebScriptDebugServer::exceptionWasRaised):
        * WebScriptDebugServer.h: Ditto.
        * WebScriptDebugger.cpp: The important change here is that leaveFrame()
        is called before willLeaveCallFrame().  I think there is some EOL stuff
        going on too.
        - It was the implementing of these functions that allows source, the
        source URLs and function stack to be displayed.
        (WebScriptDebugger::callEvent):
        (WebScriptDebugger::atStatement):
        (WebScriptDebugger::returnEvent):
        (WebScriptDebugger::exception):
        (WebScriptDebugger::enterFrame):
        (WebScriptDebugger::leaveFrame):
        * WebView.cpp: Removed the EnumView functions.
        (WebView::WebView):
        (WebView::~WebView):

WebKitTools:

        Reviewed by Adam.

        - Make Drosera show source, source URLs, and function stack on Windows,
        and some minor fixes.

        * Drosera/DebuggerDocument.cpp: Force source to always update display.
        (DebuggerDocument::updateFileSource):
        * Drosera/debugger.js: Force source to always update display.
        * Drosera/win/DebuggerClient.cpp: Create the needed functions for the
        menu controls.
        (DebuggerClient::resume):
        (DebuggerClient::pause):
        (DebuggerClient::stepInto):
        (DebuggerClient::stepOver):
        (DebuggerClient::stepOut):
        (DebuggerClient::showConsole):
        (DebuggerClient::closeCurrentFile):
        * Drosera/win/DebuggerClient.h: Ditto.
        * Drosera/win/DebuggerDocumentPlatform.cpp: Changed
        getPlatformCurrentFunctionStack to not use an unecessary HRESULT and
        removed two bugs.  1) caller could be in a bad state when asked to
        assign into it. 2) BSTRs were not created correctly.
        (DebuggerDocument::getPlatformCurrentFunctionStack):
        * Drosera/win/Drosera.cpp: Hook up the menu controls.
        (droseraWndProc):
        (handleCommand):
        (Drosera::resume):
        (Drosera::pause):
        (Drosera::stepInto):
        (Drosera::stepOver):
        (Drosera::stepOut):
        (Drosera::showConsole):
        (Drosera::closeCurrentFile):
        * Drosera/win/Drosera.h: Hook up the menu controls.
        * Drosera/win/ServerConnection.cpp: Removed unncessary server connection
        functions, added a null check, and fixed another bug where caller could
        be in a bad state when asked to assign into it.
        (ServerConnection::didLoadMainResourceForDataSource):
        (ServerConnection::getCallerFrame):
        * Drosera/win/ServerConnection.h: Safety first.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@27769 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
WebKit/win/ChangeLog
WebKit/win/WebScriptCallFrame.cpp
WebKit/win/WebScriptCallFrame.h
WebKit/win/WebScriptDebugServer.cpp
WebKit/win/WebScriptDebugServer.h
WebKit/win/WebScriptDebugger.cpp
WebKit/win/WebView.cpp
WebKitTools/ChangeLog
WebKitTools/Drosera/DebuggerDocument.cpp
WebKitTools/Drosera/debugger.js
WebKitTools/Drosera/win/DebuggerClient.cpp
WebKitTools/Drosera/win/DebuggerClient.h
WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp
WebKitTools/Drosera/win/Drosera.cpp
WebKitTools/Drosera/win/Drosera.h
WebKitTools/Drosera/win/ServerConnection.cpp
WebKitTools/Drosera/win/ServerConnection.h

index 5788474a139b83159d92c88c5dc0332cc221f1a8..f8871c0d384ff5e4621a0ebf2a500ec17d53003c 100644 (file)
@@ -1,3 +1,53 @@
+2007-11-13  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Adam.
+
+        - Make Drosera show source, source URLs, and function stack on Windows
+        and some minor fixes.
+
+        * WebScriptCallFrame.cpp: Fixed a bug where the callFrame was not reffed
+        properly before being returned, and changed functionName() to check for
+        Null or if the name is empty.
+        (EnumScopes::Clone):
+        (WebScriptCallFrame::WebScriptCallFrame):
+        (WebScriptCallFrame::createInstance):
+        (WebScriptCallFrame::caller):
+        (WebScriptCallFrame::functionName):
+        * WebScriptCallFrame.h: Ditto
+        * WebScriptDebugServer.cpp: Made the listenerSet static since we were
+        already treating it as if it were. Removed the EnumViews stuff.  This
+        was added by Steve to demonstrate DCOM and he thought it would be needed
+        by Drosera, but I don't believe it will be.
+        Implemented suspendProcessIfPaused() also added calls to it at the end
+        of several functions to ensure we pause if Drosera has told WebKit to.
+        (WebScriptDebugServer::WebScriptDebugServer):
+        (WebScriptDebugServer::sharedWebScriptDebugServer):
+        (WebScriptDebugServer::addListener):
+        (WebScriptDebugServer::removeListener):
+        (WebScriptDebugServer::suspendProcessIfPaused):
+        (WebScriptDebugServer::didLoadMainResourceForDataSource):
+        (WebScriptDebugServer::didParseSource):
+        (WebScriptDebugServer::failedToParseSource):
+        (WebScriptDebugServer::didEnterCallFrame):
+        (WebScriptDebugServer::willExecuteStatement):
+        (WebScriptDebugServer::willLeaveCallFrame):
+        (WebScriptDebugServer::exceptionWasRaised):
+        * WebScriptDebugServer.h: Ditto.
+        * WebScriptDebugger.cpp: The important change here is that leaveFrame()
+        is called before willLeaveCallFrame().  I think there is some EOL stuff
+        going on too.
+        - It was the implementing of these functions that allows source, the
+        source URLs and function stack to be displayed.
+        (WebScriptDebugger::callEvent):
+        (WebScriptDebugger::atStatement):
+        (WebScriptDebugger::returnEvent):
+        (WebScriptDebugger::exception):
+        (WebScriptDebugger::enterFrame):
+        (WebScriptDebugger::leaveFrame):
+        * WebView.cpp: Removed the EnumView functions.
+        (WebView::WebView):
+        (WebView::~WebView):
+
 2007-11-13  Adam Roben  <aroben@apple.com>
 
         Fix <rdar://5346832> Infinite recursion when opening Web Inspector on more than one tab
index ca037d569cf4e60869bd0a7674f6184997cf58ee..0bdf3419d63c71386e221f4f373f819c9e5284e0 100644 (file)
@@ -63,7 +63,7 @@ private:
     }
 
 public:
-    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void** ppvObject);
     virtual ULONG STDMETHODCALLTYPE AddRef();
     virtual ULONG STDMETHODCALLTYPE Release();
     virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT* rgVar, ULONG* pCeltFetched);
@@ -153,13 +153,15 @@ HRESULT STDMETHODCALLTYPE EnumScopes::Clone(IEnumVARIANT**)
 {
     return E_NOTIMPL;
 }
-// WebScriptCallFrame -----------------------------------------------------------
-
 
+// WebScriptCallFrame -----------------------------------------------------------
 
-WebScriptCallFrame::WebScriptCallFrame()
+WebScriptCallFrame::WebScriptCallFrame(ExecState* state, IWebScriptCallFrame* caller)
     : m_refCount(0)
 {
+    m_state = state;
+    m_caller = caller;
+
     gClassCount++;
 }
 
@@ -168,9 +170,9 @@ WebScriptCallFrame::~WebScriptCallFrame()
     gClassCount--;
 }
 
-WebScriptCallFrame* WebScriptCallFrame::createInstance()
+WebScriptCallFrame* WebScriptCallFrame::createInstance(ExecState* state, IWebScriptCallFrame* caller)
 {
-    WebScriptCallFrame* instance = new WebScriptCallFrame();
+    WebScriptCallFrame* instance = new WebScriptCallFrame(state, caller);
     instance->AddRef();
     return instance;
 }
@@ -210,11 +212,7 @@ ULONG STDMETHODCALLTYPE WebScriptCallFrame::Release()
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::caller(
     /* [out, retval] */ IWebScriptCallFrame** callFrame)
 {
-    if (!callFrame)
-        return E_POINTER;
-
-    *callFrame = m_caller.get();
-    return S_OK;
+    return m_caller.copyRefTo(callFrame);
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::scopeChain(
@@ -236,17 +234,23 @@ HRESULT STDMETHODCALLTYPE WebScriptCallFrame::functionName(
     if (!funcName)
         return E_POINTER;
 
-    if (m_state->currentBody()) {
-        FunctionImp* func = m_state->function();
-        if (!func)
-            return E_FAIL;
+    *funcName = 0;
 
-        *funcName = WebCore::BString(func->functionName()).release();
-    }
+    if (!m_state->currentBody())
+        return S_OK;
+
+    FunctionImp* func = m_state->function();
+    if (!func)
+        return E_FAIL;
+
+    const Identifier& funcIdent = func->functionName();
+    if (!funcIdent.isEmpty())
+        *funcName = WebCore::BString(funcIdent).release();
 
     return S_OK;
 }
 
+
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::stringByEvaluatingJavaScriptFromString(
     /* [in] */ BSTR script,
     /* [out, retval] */ BSTR* result)
@@ -303,3 +307,4 @@ HRESULT STDMETHODCALLTYPE WebScriptCallFrame::stringByEvaluatingJavaScriptFromSt
 
     return S_OK;
 }
+
index 27578d9b8340a16fe9e2ba964844f09be01a91c0..1a565fa965ffe36675564d53df9e5584ced7d4fa 100644 (file)
 
 class WebScriptCallFrame : public IWebScriptCallFrame {
 public:
-    static WebScriptCallFrame* createInstance();
+    static WebScriptCallFrame* createInstance(KJS::ExecState*, IWebScriptCallFrame* caller);
 
 private:
-    WebScriptCallFrame();
+    WebScriptCallFrame(KJS::ExecState*, IWebScriptCallFrame* caller);
     virtual ~WebScriptCallFrame();
 
 public:
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
-        /* [in] */ REFIID riid,
+        /* [in] */ REFIID,
         /* [retval][out] */ void** ppvObject);
     
     virtual ULONG STDMETHODCALLTYPE AddRef();
@@ -70,7 +70,7 @@ public:
 
 private:
     KJS::ExecState* m_state;
-    COMPtr<WebScriptCallFrame> m_caller;
+    COMPtr<IWebScriptCallFrame> m_caller;
 
     ULONG m_refCount;
 };
index 5994efd5d487ba40619ea92026147d2666711245..fe721c542c93dcec2ad38b7b48bd5853597dbe92 100644 (file)
 #include <wtf/Assertions.h>
 #include <wtf/Vector.h>
 
-static Vector<IWebView*> sViews;
-static WebScriptDebugServer* sSharedWebScriptDebugServer;
-static unsigned sListenerCount = 0;
+typedef HashSet<COMPtr<IWebScriptDebugListener> > ListenerSet;
 
-unsigned WebScriptDebugServer::listenerCount() { return sListenerCount; };
+static ListenerSet s_Listeners;
+static unsigned s_ListenerCount = 0;
+static OwnPtr<WebScriptDebugServer> s_SharedWebScriptDebugServer;
 
-// EnumViews ------------------------------------------------------------------
-
-class EnumViews : public IEnumVARIANT
-{
-public:
-    EnumViews() : m_refCount(1), m_current(sViews.begin()) { }
-
-    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
-    virtual ULONG STDMETHODCALLTYPE AddRef();
-    virtual ULONG STDMETHODCALLTYPE Release();
-
-    virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched);
-    virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
-    virtual HRESULT STDMETHODCALLTYPE Reset(void);
-    virtual HRESULT STDMETHODCALLTYPE Clone(IEnumVARIANT**);
-
-private:
-    ULONG m_refCount;
-    Vector<IWebView*>::iterator m_current;
-};
-
-HRESULT STDMETHODCALLTYPE EnumViews::QueryInterface(REFIID riid, void** ppvObject)
-{
-    *ppvObject = 0;
-    if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IEnumVARIANT))
-        *ppvObject = this;
-    else
-        return E_NOINTERFACE;
-
-    AddRef();
-    return S_OK;
-}
-
-ULONG STDMETHODCALLTYPE EnumViews::AddRef()
-{
-    return ++m_refCount;
-}
-
-ULONG STDMETHODCALLTYPE EnumViews::Release()
-{
-    ULONG newRef = --m_refCount;
-    if (!newRef)
-        delete(this);
-    return newRef;
-}
-
-HRESULT STDMETHODCALLTYPE EnumViews::Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
-{
-    if (pCeltFetched)
-        *pCeltFetched = 0;
-    if (!rgVar)
-        return E_POINTER;
-    VariantInit(rgVar);
-    if (!celt || celt > 1)
-        return S_FALSE;
-    if (m_current == sViews.end())
-        return S_FALSE;
-
-    IUnknown* unknown;
-    HRESULT hr = (*m_current++)->QueryInterface(IID_IUnknown, (void**)&unknown);
-    if (FAILED(hr))
-        return hr;
-
-    V_VT(rgVar) = VT_UNKNOWN;
-    V_UNKNOWN(rgVar) = unknown;
-
-    if (pCeltFetched)
-        *pCeltFetched = 1;
-    return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE EnumViews::Skip(ULONG celt)
-{
-    m_current += celt;
-    return (m_current != sViews.end()) ? S_OK : S_FALSE;
-}
-
-HRESULT STDMETHODCALLTYPE EnumViews::Reset(void)
-{
-    m_current = sViews.begin();
-    return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE EnumViews::Clone(IEnumVARIANT**)
-{
-    return E_NOTIMPL;
-}
+unsigned WebScriptDebugServer::listenerCount() { return s_ListenerCount; };
 
 // WebScriptDebugServer ------------------------------------------------------------
 
@@ -132,6 +46,7 @@ WebScriptDebugServer::WebScriptDebugServer()
     : m_refCount(0)
     , m_paused(false)
     , m_step(false)
+    , m_sharedInstance(false)
 {
     gClassCount++;
 }
@@ -150,10 +65,12 @@ WebScriptDebugServer* WebScriptDebugServer::createInstance()
 
 WebScriptDebugServer* WebScriptDebugServer::sharedWebScriptDebugServer()
 {
-    if (!sSharedWebScriptDebugServer)
-        sSharedWebScriptDebugServer = WebScriptDebugServer::createInstance();
+    if (!s_SharedWebScriptDebugServer) {
+        s_SharedWebScriptDebugServer.set(WebScriptDebugServer::createInstance());
+        s_SharedWebScriptDebugServer->m_sharedInstance = true;
+    }
 
-    return sSharedWebScriptDebugServer;
+    return s_SharedWebScriptDebugServer.get();
 }
 
 
@@ -187,23 +104,6 @@ ULONG STDMETHODCALLTYPE WebScriptDebugServer::Release()
     return newRef;
 }
 
-void WebScriptDebugServer::viewAdded(IWebView* view)
-{
-    sViews.append(view);
-}
-
-void WebScriptDebugServer::viewRemoved(IWebView* view)
-{
-    Vector<IWebView*>::iterator end = sViews.end();
-    int i=0;
-    for (Vector<IWebView*>::iterator it = sViews.begin(); it != end; ++it, ++i) {
-        if (*it == view) {
-            sViews.remove(i);
-            break;
-        }
-    }
-}
-
 // IWebScriptDebugServer -----------------------------------------------------------
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::sharedWebScriptDebugServer( 
@@ -224,8 +124,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
     if (!listener)
         return E_POINTER;
 
-    sListenerCount++;
-    m_listeners.add(listener);
+    ++s_ListenerCount;
+    s_Listeners.add(listener);
 
     return S_OK;
 }
@@ -236,12 +136,14 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::removeListener(
     if (!listener)
         return E_POINTER;
 
-    if (!m_listeners.contains(listener))
+    if (!s_Listeners.contains(listener))
         return S_OK;
 
-    ASSERT(sListenerCount >= 1);
-    sListenerCount--;
-    m_listeners.remove(listener);
+    s_Listeners.remove(listener);
+
+    ASSERT(s_ListenerCount >= 1);
+    if (--s_ListenerCount == 0)
+        resume();
 
     return S_OK;
 }
@@ -283,7 +185,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::isPaused(
 
 void WebScriptDebugServer::suspendProcessIfPaused()
 {
-    // FIXME: There needs to be some sort of busy wait here.
+    MSG msg;
+    while (m_paused && GetMessage(&msg, 0, 0, 0)) {
+        // FIXME: Listen for Drosera dying. You will get removeListener calls but what if it crashes?
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
 
     if (m_step) {
         m_step = false;
@@ -299,7 +206,7 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didLoadMainResourceForDataSource
     if (!webView || !dataSource)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).didLoadMainResourceForDataSource(webView, dataSource);
 
@@ -317,7 +224,7 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didParseSource(
     if (!webView || !sourceCode || !url || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).didParseSource(webView, sourceCode, baseLineNumber, url, sourceID, webFrame);
 
@@ -335,7 +242,7 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::failedToParseSource(
     if (!webView || !sourceCode || !url || !error || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).failedToParseSource(webView, sourceCode, baseLineNumber, url, error, webFrame);
 
@@ -352,10 +259,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didEnterCallFrame(
     if (!webView || !frame || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).didEnterCallFrame(webView, frame, sourceID, lineNumber, webFrame);
 
+    suspendProcessIfPaused();
+
     return S_OK;
 }
 
@@ -369,10 +278,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willExecuteStatement(
     if (!webView || !frame || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).willExecuteStatement(webView, frame, sourceID, lineNumber, webFrame);
 
+    suspendProcessIfPaused();
+
     return S_OK;
 }
 
@@ -386,10 +297,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willLeaveCallFrame(
     if (!webView || !frame || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).willLeaveCallFrame(webView, frame, sourceID, lineNumber, webFrame);
 
+    suspendProcessIfPaused();
+
     return S_OK;
 }
 
@@ -403,11 +316,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::exceptionWasRaised(
     if (!webView || !frame || !webFrame)
         return E_FAIL;
 
-    ListenerSet listenersCopy = m_listeners;
+    ListenerSet listenersCopy = s_Listeners;
     for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
         (**it).exceptionWasRaised(webView, frame, sourceID, lineNumber, webFrame);
 
+    suspendProcessIfPaused();
+
     return S_OK;
 }
 
-
index 9b953b1a39c52d44d33b2a9723744150386e7b3d..5c9ffdaa61bba90e50f4ff53ad060a30c071320e 100644 (file)
 
 interface IWebView;
 
-typedef HashSet<COMPtr<IWebScriptDebugListener> > ListenerSet;
-
 class WebScriptDebugServer : public IWebScriptDebugServer, public IWebScriptDebugListener
 {
 public:
     static WebScriptDebugServer* createInstance();
     static WebScriptDebugServer* sharedWebScriptDebugServer();
 
-    static void viewAdded(IWebView* view);
-    static void viewRemoved(IWebView* view);
-
 private:
     WebScriptDebugServer();
-    virtual ~WebScriptDebugServer();
 
 public:
+    virtual ~WebScriptDebugServer();
+
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
         /* [in] */ REFIID riid,
@@ -133,10 +129,9 @@ public:
     static unsigned listenerCount();
 
 private:
-    ListenerSet m_listeners;
-
     bool m_paused;
     bool m_step;
+    bool m_sharedInstance;
 
     ULONG m_refCount;
 };
index d75c1362ff433d7c2c0bcad37d1e63feb970e02f..fe4905051c8c143b330925de64cdba590a5cdfba 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "IWebView.h"
 #include "WebFrame.h"
+#include "WebScriptCallFrame.h"
 #include "WebScriptDebugServer.h"
 
 #pragma warning(push, 0)
@@ -93,48 +94,46 @@ bool WebScriptDebugger::sourceParsed(ExecState*, int sourceId, const UString& so
     return true;
 }
 
-bool WebScriptDebugger::callEvent(ExecState* state, int sourceId, int lineno, JSObject* /*function*/, const List &/*args*/)\r
-{\r
-    enterFrame(state);\r
-    WebScriptDebugServer::sharedWebScriptDebugServer()->didEnterCallFrame(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);\r
-\r
-    return true;\r
-}\r
-\r
-bool WebScriptDebugger::atStatement(ExecState*, int sourceId, int firstLine, int /*lastLine*/)\r
-{\r
-    WebScriptDebugServer::sharedWebScriptDebugServer()->willExecuteStatement(m_webView.get(), m_topStackFrame.get(), sourceId, firstLine, m_frame);\r
-\r
-    return true;\r
-}\r
-\r
+bool WebScriptDebugger::callEvent(ExecState* state, int sourceId, int lineno, JSObject* /*function*/, const List &/*args*/)
+{
+    enterFrame(state);
+    WebScriptDebugServer::sharedWebScriptDebugServer()->didEnterCallFrame(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);
+    return true;
+}
+
+bool WebScriptDebugger::atStatement(ExecState*, int sourceId, int firstLine, int /*lastLine*/)
+{
+    WebScriptDebugServer::sharedWebScriptDebugServer()->willExecuteStatement(m_webView.get(), m_topStackFrame.get(), sourceId, firstLine, m_frame);
+    return true;
+}
+
 bool WebScriptDebugger::returnEvent(ExecState*, int sourceId, int lineno, JSObject* /*function*/)
-{\r
-    WebScriptDebugServer::sharedWebScriptDebugServer()->willLeaveCallFrame(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);\r
-    leaveFrame();\r
-    return true;\r
-}\r
-\r
-bool WebScriptDebugger::exception(ExecState*, int sourceId, int lineno, JSValue* /*exception */)\r
-{\r
-    WebScriptDebugServer::sharedWebScriptDebugServer()->exceptionWasRaised(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);\r
-\r
-    return true;\r
-}\r
-\r
-void WebScriptDebugger::enterFrame(ExecState*)\r
-{\r
-    // FIXME: the implementation of this is dependent on finishing the implementation of WebScriptScope.\r
-}\r
-\r
-void WebScriptDebugger::leaveFrame()\r
-{\r
-    if (!m_topStackFrame)\r
-        return;\r
-\r
-    COMPtr<IWebScriptCallFrame> caller;\r
-    if (FAILED(m_topStackFrame->caller(&caller)))\r
-        return;\r
-\r
-    m_topStackFrame = caller;\r
-}\r
+{
+    leaveFrame();
+    WebScriptDebugServer::sharedWebScriptDebugServer()->willLeaveCallFrame(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);
+    return true;
+}
+
+bool WebScriptDebugger::exception(ExecState*, int sourceId, int lineno, JSValue* /*exception */)
+{
+    WebScriptDebugServer::sharedWebScriptDebugServer()->exceptionWasRaised(m_webView.get(), m_topStackFrame.get(), sourceId, lineno, m_frame);
+    return true;
+}
+
+void WebScriptDebugger::enterFrame(ExecState* state)
+{
+    m_topStackFrame = WebScriptCallFrame::createInstance(state, m_topStackFrame.get()); // Set the top as the caller
+}
+
+void WebScriptDebugger::leaveFrame()
+{
+    if (!m_topStackFrame)
+        return;
+
+    COMPtr<IWebScriptCallFrame> caller;
+    if (FAILED(m_topStackFrame->caller(&caller)))
+        return;
+
+    if (caller)
+        m_topStackFrame = caller;
+}
index d1132766d5870a6999ba2fc0b341e9557e4a2a36..4dc58a34789a37f1a9d57c7ece624e1ca2e8d06d 100644 (file)
@@ -267,8 +267,6 @@ WebView::WebView()
     if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
         grammarCheckingEnabled = !!enabled;
 
-    WebScriptDebugServer::viewAdded(this);
-
     WebViewCount++;
     gClassCount++;
 }
@@ -286,7 +284,6 @@ WebView::~WebView()
     ASSERT(!m_page);
     ASSERT(!m_preferences);
 
-    WebScriptDebugServer::viewRemoved(this);
     WebViewCount--;
     gClassCount--;
 }
index 723ceba8bbe573e97fb4de946eeb33104f39e989..8102b4c75a0f1aa4f3e0ff493eb57c7e786bf183 100644 (file)
@@ -1,3 +1,46 @@
+2007-11-13  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Adam.
+
+        - Make Drosera show source, source URLs, and function stack on Windows,
+        and some minor fixes.
+
+        * Drosera/DebuggerDocument.cpp: Force source to always update display.
+        (DebuggerDocument::updateFileSource):
+        * Drosera/debugger.js: Force source to always update display.
+        * Drosera/win/DebuggerClient.cpp: Create the needed functions for the
+        menu controls.
+        (DebuggerClient::resume):
+        (DebuggerClient::pause):
+        (DebuggerClient::stepInto):
+        (DebuggerClient::stepOver):
+        (DebuggerClient::stepOut):
+        (DebuggerClient::showConsole):
+        (DebuggerClient::closeCurrentFile):
+        * Drosera/win/DebuggerClient.h: Ditto.
+        * Drosera/win/DebuggerDocumentPlatform.cpp: Changed
+        getPlatformCurrentFunctionStack to not use an unecessary HRESULT and
+        removed two bugs.  1) caller could be in a bad state when asked to
+        assign into it. 2) BSTRs were not created correctly.
+        (DebuggerDocument::getPlatformCurrentFunctionStack):
+        * Drosera/win/Drosera.cpp: Hook up the menu controls.
+        (droseraWndProc):
+        (handleCommand):
+        (Drosera::resume):
+        (Drosera::pause):
+        (Drosera::stepInto):
+        (Drosera::stepOver):
+        (Drosera::stepOut):
+        (Drosera::showConsole):
+        (Drosera::closeCurrentFile):
+        * Drosera/win/Drosera.h: Hook up the menu controls.
+        * Drosera/win/ServerConnection.cpp: Removed unncessary server connection
+        functions, added a null check, and fixed another bug where caller could
+        be in a bad state when asked to assign into it.
+        (ServerConnection::didLoadMainResourceForDataSource):
+        (ServerConnection::getCallerFrame):
+        * Drosera/win/ServerConnection.h: Safety first.
+
 2007-11-13  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Darin Adler.
index e7b3fe7a8f2a1abb340f3c6e660714a3e8bac80d..f5dbf87c729e448c4f7e12d0bc8dfb05a3e7b48b 100644 (file)
@@ -203,7 +203,7 @@ void DebuggerDocument::updateFileSource(JSContextRef context, JSStringRef docume
 {
     JSValueRef documentSourceValue = JSValueMakeString(context, documentSource);
     JSValueRef urlValue = JSValueMakeString(context, url);
-    JSValueRef forceValue = JSValueMakeBoolean(context, false);
+    JSValueRef forceValue = JSValueMakeBoolean(context, true);
 
     JSValueRef arguments[] = { documentSourceValue, urlValue, forceValue };
     int argumentsSize = sizeof(arguments)/sizeof(arguments[0]);
index 949884436829745b94460a61e1ecef6c225e6126..58302b6c5f4bf30fa50edb2b119c668784a21981 100644 (file)
@@ -1085,7 +1085,7 @@ function updateFileSource(source, url, force)
             file.element = null;
         }
 
-        if (currentFile == fileIndex)
+        if (currentFile == fileIndex || force)
             loadFile(fileIndex, false);
     }
 }
index b3855d08901c166bb83c00912c6fbc8d66a71d38..09d260e65f6fa64408a6236451a3012e0c650310 100644 (file)
@@ -151,6 +151,44 @@ HRESULT STDMETHODCALLTYPE DebuggerClient::runJavaScriptAlertPanelWithMessage(  /
     return S_OK;
 }
 
+// Pause & Step -------------------------------
+void DebuggerClient::resume()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "resume", 0, 0);
+}
+
+void DebuggerClient::pause()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "pause", 0, 0);
+}
+
+void DebuggerClient::stepInto()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "stepInto", 0, 0);
+}
+
+void DebuggerClient::stepOver()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "stepOver", 0, 0);
+}
+
+void DebuggerClient::stepOut()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "stepOut", 0, 0);
+}
+
+void DebuggerClient::showConsole()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "showConsoleWindow", 0, 0);
+}
+
+void DebuggerClient::closeCurrentFile()
+{
+    DebuggerDocument::callGlobalFunction(m_globalContext, "closeCurrentFile", 0, 0);
+}
+
+
+// Server Connection Functions ----------------
 bool DebuggerClient::serverConnected() const
 {
     return m_debuggerDocument->server()->serverConnected();
index 757a4ed7bdb8f2cf9a837a07a4bfdfb4e23199bc..3a6921b6aa1c150acc74fc7b629e65a8a8888731 100644 (file)
@@ -86,8 +86,16 @@ public:
 
     bool webViewLoaded() const { return m_webViewLoaded; }
 
-    // Server Connection Functions
+    // Pause & Step
+    void resume();
+    void pause();
+    void stepInto();
+    void stepOver();
+    void stepOut();
+    void showConsole();
+    void closeCurrentFile();
 
+    // Server Connection Functions
     bool serverConnected() const;
     void attemptToCreateServerConnection();
 
index 586edc72d4a28692bce17acd875ec11069ca60d7..ecf9d99748fb059d0a38fe1df44c65e71c287208 100644 (file)
@@ -85,33 +85,29 @@ JSValueRef DebuggerDocument::platformEvaluateScript(JSContextRef context, JSStri
 
 void DebuggerDocument::getPlatformCurrentFunctionStack(JSContextRef context, Vector<JSValueRef>& currentStack)
 {
-    HRESULT ret = S_OK;
-
-    COMPtr<IWebScriptCallFrame> caller;
-    for (COMPtr<IWebScriptCallFrame> frame = m_server->currentFrame(); frame; frame = caller) {
+    COMPtr<IWebScriptCallFrame> frame = m_server->currentFrame();
+    while (frame) {
+        COMPtr<IWebScriptCallFrame> caller;
         BSTR function = 0;
-        ret = frame->functionName(&function);
-        if (FAILED(ret)) {
+        if (FAILED(frame->functionName(&function))) {
             SysFreeString(function);
             return;
         }
 
-        ret = frame->caller(&caller);
-        if (FAILED(ret))
+        if (FAILED(frame->caller(&caller)))
             return;
 
-        bool needToFree = true;
         if (!function) {
-            needToFree = false;
             if (caller)
-                function = L"(anonymous function)";
+                function = SysAllocString(L"(anonymous function)");
             else
-                function = L"(global scope)";
+                function = SysAllocString(L"(global scope)");
         }
 
         currentStack.append(JSValueRefCreateWithBSTR(context, function));
-        if (needToFree)
-            SysFreeString(function);
+        SysFreeString(function);
+
+        frame = caller;
     }
 }
 
index ae213eb369595eb62ccae6b46226a3f5440677a4..efbc3b4593cdd6d71d5f80df161eceaea1b81595 100644 (file)
@@ -138,7 +138,6 @@ ATOM registerDroseraClass(HINSTANCE hInstance)
 //Processes messages for the main window.
 LRESULT CALLBACK droseraWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
-    int wmId, wmEvent;
     PAINTSTRUCT ps;
     HDC hdc;
 
@@ -147,18 +146,7 @@ LRESULT CALLBACK droseraWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
 
     switch (message) {
         case WM_COMMAND:
-            wmId    = LOWORD(wParam);
-            wmEvent = HIWORD(wParam);
-            switch (wmId) {
-                case ID_HELP_ABOUT:
-                    DialogBox(Drosera::getInst(), MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, ::aboutWndProc);
-                    break;
-                case ID_FILE_EXIT:
-                    DestroyWindow(hWnd);
-                    break;
-                default:
-                    return DefWindowProc(hWnd, message, wParam, lParam);
-            }
+            return drosera->handleCommand(hWnd, message, wParam, lParam);
             break;
         case WM_SIZE:
             if (!drosera)
@@ -175,6 +163,41 @@ LRESULT CALLBACK droseraWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
         default:
             return DefWindowProc(hWnd, message, wParam, lParam);
     }
+
+    return 0;
+}
+
+LRESULT CALLBACK Drosera::handleCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int wmId = LOWORD(wParam);
+    switch (wmId) {
+        case ID_DEBUG_CONTINUE:
+            m_debuggerClient->resume();
+            break;
+        case ID_DEBUG_PAUSE:
+            m_debuggerClient->pause();
+            break;
+        case ID_DEBUG_STEPINTO:
+            m_debuggerClient->stepInto();
+            break;
+        case ID_DEBUG_STEPOVER:
+            m_debuggerClient->stepOver();
+            break;
+        case ID_DEBUG_STEPOUT:
+            m_debuggerClient->stepOut();
+            break;
+        case ID_DEBUG_SHOWCONSOLE:
+            m_debuggerClient->showConsole();
+        case ID_HELP_ABOUT:
+            DialogBox(Drosera::getInst(), MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, ::aboutWndProc);
+            break;
+        case ID_FILE_EXIT:
+            DestroyWindow(hWnd);
+            break;
+        default:
+            return DefWindowProc(hWnd, message, wParam, lParam);
+    }
+
     return 0;
 }
 
index 5827c09b7f0de47d7d8e360f04c277e5b33fcb3f..a73c7f77e849fc3c1579fc60ef054a491889f272 100644 (file)
@@ -47,12 +47,14 @@ public:
 
     HRESULT init(HINSTANCE hInstance, int nCmdShow);
     LRESULT onSize(WPARAM, LPARAM);
+    LRESULT CALLBACK handleCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
     bool webViewLoaded() const;
 
     // Server connection functions
     bool serverConnected() const;
     void attemptToCreateServerConnection();
+
 private:
     HRESULT initUI(HINSTANCE hInstance, int nCmdShow);
     HRESULT attach();
index 5346acbddc0ae312871c8f66cfeb819da44739b8..2a5ddac7f3f9835d9ec38824416de8476d627aca 100644 (file)
@@ -101,20 +101,6 @@ void ServerConnection::stepInto()
         m_server->step();
 }
 
-// Connection Handling
-
-void ServerConnection::applicationTerminating()
-{
-    if (m_server)
-        m_server->removeListener(this);
-}
-
-void ServerConnection::serverConnectionDidDie()
-{
-    if (m_server)
-        m_server->removeListener(this);
-}
-
 // IUnknown --------------------------------------------------
 HRESULT STDMETHODCALLTYPE ServerConnection::QueryInterface(REFIID riid, void** ppvObject)
 {
@@ -146,9 +132,13 @@ HRESULT STDMETHODCALLTYPE ServerConnection::didLoadMainResourceForDataSource(
     /* [in] */ IWebView*,
     /* [in] */ IWebDataSource* dataSource)
 {
+    HRESULT ret = S_OK;
+    if (!m_globalContext || !dataSource)
+        return ret;
+
     // Get document source
     COMPtr<IWebDocumentRepresentation> rep;
-    HRESULT ret = dataSource->representation(&rep);
+    ret = dataSource->representation(&rep);
     if (FAILED(ret))
         return ret;
 
@@ -348,16 +338,16 @@ IWebScriptCallFrame* ServerConnection::currentFrame() const
     return m_currentFrame.get();
 }
 
-IWebScriptCallFrame* ServerConnection::getCallerFrame(int callFrame) const
+COMPtr<IWebScriptCallFrame> ServerConnection::getCallerFrame(int callFrame) const
 {
     COMPtr<IWebScriptCallFrame> cframe = currentFrame();
-    COMPtr<IWebScriptCallFrame> callerFrame;
     for (int count = 0; count < callFrame; count++) {
+        COMPtr<IWebScriptCallFrame> callerFrame;
         if (FAILED(cframe->caller(&callerFrame)))
             return 0;
 
         cframe = callerFrame;
     }
 
-    return cframe.get();
+    return cframe;
 }
index ff1349297a7950ff0a6846f8c91fd669b878eec2..c3ddee574837cd21951271be8de410febdeb344b 100644 (file)
@@ -54,10 +54,6 @@ public:
     void resume();
     void stepInto();
 
-    // Connection Handling
-    void applicationTerminating();
-    void serverConnectionDidDie();
-
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface(
         /* [in] */ REFIID riid,
@@ -117,7 +113,7 @@ public:
 
     // Stack & Variables
     IWebScriptCallFrame* currentFrame() const;
-    IWebScriptCallFrame* getCallerFrame(int callFrame) const;
+    COMPtr<IWebScriptCallFrame> getCallerFrame(int callFrame) const;
 
 private:
     bool m_serverConnected;