WebKit/win:
authorkmccullough@apple.com <kmccullough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2007 00:36:48 +0000 (00:36 +0000)
committerkmccullough@apple.com <kmccullough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2007 00:36:48 +0000 (00:36 +0000)
        Reviewed by Sam.

        - <rdar://5618976> Drosera: should listen for the WebScriptDebugServer
        dying and vice versa.

        * Interfaces/IWebScriptDebugListener.idl: Added the new function to the
        interface.
        * WebKit.vcproj/WebKit.def: Added the new function to the def file so
        Safari can tell WebKit when the server is dying.
        * WebKit.vcproj/WebKit_debug.def: Ditto.
        * WebKitDLL.cpp: Added the new function for Safari to call.
        (RunAsLocalServer):
        (LocalServerDidDie):
        * WebScriptDebugServer.cpp:
        (WebScriptDebugServer::WebScriptDebugServer): Removed unused member.
        (WebScriptDebugServer::sharedWebScriptDebugServer): Ditto, and added new
        member to prevent adding or removing listeners when the server is dying.
        (WebScriptDebugServer::addListener): Don't let new listeners be added
        when the server is dying.
        (WebScriptDebugServer::removeListener): Don't let listeners remove
        themselves when the server is dying.  The server will remove them all
        anyways.
        (WebScriptDebugServer::serverDidDie): Notify all listeners that the
        server is dying and remove all listeners.
        * WebScriptDebugServer.h: Added the new method and removed an unused
        member.

WebKitTools:

        Reviewed by Sam.

        - <rdar://5618976> Drosera: should listen for the WebScriptDebugServer
        dying and vice versa.
        - This fix will allow Drosera and Safari to reconnect if either of them
        closes correctly, but does not fix the case where one of them dies
        silently.

        * Drosera/win/ServerConnection.cpp:
        (ServerConnection::attemptToCreateServerConnection): Added a safety
        check, because it's possilbe to try to connect to a server that's dying.
        (ServerConnection::serverDidDie): Implemented. This resets Drosera when
        the server has died.
        * Drosera/win/ServerConnection.h: Added the new function and removed
        an unnecessary member.

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

WebKit/win/ChangeLog
WebKit/win/Interfaces/IWebScriptDebugListener.idl
WebKit/win/WebKit.vcproj/WebKit.def
WebKit/win/WebKit.vcproj/WebKit_debug.def
WebKit/win/WebKitDLL.cpp
WebKit/win/WebScriptDebugServer.cpp
WebKit/win/WebScriptDebugServer.h
WebKitTools/ChangeLog
WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp
WebKitTools/Drosera/win/ServerConnection.cpp
WebKitTools/Drosera/win/ServerConnection.h

index 39312df..97c1d13 100644 (file)
@@ -1,3 +1,32 @@
+2007-11-29  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - <rdar://5618976> Drosera: should listen for the WebScriptDebugServer
+        dying and vice versa.
+
+        * Interfaces/IWebScriptDebugListener.idl: Added the new function to the
+        interface.
+        * WebKit.vcproj/WebKit.def: Added the new function to the def file so
+        Safari can tell WebKit when the server is dying.
+        * WebKit.vcproj/WebKit_debug.def: Ditto.
+        * WebKitDLL.cpp: Added the new function for Safari to call.
+        (RunAsLocalServer):
+        (LocalServerDidDie):
+        * WebScriptDebugServer.cpp: 
+        (WebScriptDebugServer::WebScriptDebugServer): Removed unused member.
+        (WebScriptDebugServer::sharedWebScriptDebugServer): Ditto, and added new
+        member to prevent adding or removing listeners when the server is dying.
+        (WebScriptDebugServer::addListener): Don't let new listeners be added
+        when the server is dying.
+        (WebScriptDebugServer::removeListener): Don't let listeners remove
+        themselves when the server is dying.  The server will remove them all
+        anyways.
+        (WebScriptDebugServer::serverDidDie): Notify all listeners that the
+        server is dying and remove all listeners.
+        * WebScriptDebugServer.h: Added the new method and removed an unused
+        member.
+
 2007-11-29  Brady Eidson  <beidson@apple.com>
 
         Build fix that works...?
index 1aa28f0..a37f4ca 100644 (file)
@@ -75,4 +75,5 @@ interface IWebScriptDebugListener : IUnknown
     HRESULT willExecuteStatement([in] IWebView* view, [in] IWebScriptCallFrame* frame, [in] int sourceID, [in] int lineNumber, [in] IWebFrame* forWebFrame);
     HRESULT willLeaveCallFrame([in] IWebView* view, [in] IWebScriptCallFrame* frame, [in] int sourceID, [in] int lineNumber, [in] IWebFrame* forWebFrame);
     HRESULT exceptionWasRaised([in] IWebView* view, [in] IWebScriptCallFrame* frame, [in] int sourceID, [in] int lineNumber, [in] IWebFrame* forWebFrame);
+    HRESULT serverDidDie();
 }
index 5882efa..a5e14fc 100644 (file)
@@ -6,6 +6,7 @@ EXPORTS
         DllRegisterServer   PRIVATE
         DllUnregisterServer PRIVATE
         RunAsLocalServer    PRIVATE
+        LocalServerDidDie   PRIVATE
            JSCheckScriptSyntax
            JSClassCreate
            JSClassRelease
index daad5a4..9da2e1f 100644 (file)
@@ -6,6 +6,7 @@ EXPORTS
         DllRegisterServer   PRIVATE
         DllUnregisterServer PRIVATE
         RunAsLocalServer    PRIVATE
+        LocalServerDidDie   PRIVATE
         JSCheckScriptSyntax
         JSClassCreate
         JSClassRelease
index 7d91f89..9de991d 100644 (file)
@@ -31,6 +31,7 @@
 #include "ProgIDMacros.h"
 #include "WebKit.h"
 #include "WebKitClassFactory.h"
+#include "WebScriptDebugServer.h"
 #include "resource.h"
 #pragma warning( push, 0 )
 #include <WebCore/COMPtr.h>
@@ -257,7 +258,7 @@ STDAPI DllRegisterServer(void)
     return hr;
 }
 
-STDAPI RunAsLocalServer(void)
+STDAPI RunAsLocalServer()
 {
     DWORD reg;
     COMPtr<IUnknown> classFactory;
@@ -266,6 +267,12 @@ STDAPI RunAsLocalServer(void)
     return 0;
 }
 
+STDAPI LocalServerDidDie()
+{
+    WebScriptDebugServer::sharedWebScriptDebugServer()->serverDidDie();
+    return 0;
+}
+
 //FIXME: We should consider moving this to a new file for cross-project functionality
 PassRefPtr<WebCore::SharedBuffer> loadResourceIntoBuffer(const char* name)
 {
index c20beb4..463da5d 100644 (file)
@@ -37,6 +37,7 @@ typedef HashSet<COMPtr<IWebScriptDebugListener> > ListenerSet;
 static ListenerSet s_Listeners;
 static unsigned s_ListenerCount = 0;
 static OwnPtr<WebScriptDebugServer> s_SharedWebScriptDebugServer;
+static bool s_dying = false;
 
 unsigned WebScriptDebugServer::listenerCount() { return s_ListenerCount; };
 
@@ -46,7 +47,6 @@ WebScriptDebugServer::WebScriptDebugServer()
     : m_refCount(0)
     , m_paused(false)
     , m_step(false)
-    , m_sharedInstance(false)
 {
     gClassCount++;
 }
@@ -66,8 +66,8 @@ WebScriptDebugServer* WebScriptDebugServer::createInstance()
 WebScriptDebugServer* WebScriptDebugServer::sharedWebScriptDebugServer()
 {
     if (!s_SharedWebScriptDebugServer) {
+        s_dying = false;
         s_SharedWebScriptDebugServer.set(WebScriptDebugServer::createInstance());
-        s_SharedWebScriptDebugServer->m_sharedInstance = true;
     }
 
     return s_SharedWebScriptDebugServer.get();
@@ -121,6 +121,9 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::sharedWebScriptDebugServer(
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
     /* [in] */ IWebScriptDebugListener* listener)
 {
+    if (s_dying)
+        return E_FAIL;
+
     if (!listener)
         return E_POINTER;
 
@@ -133,6 +136,9 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::removeListener(
     /* [in] */ IWebScriptDebugListener* listener)
 {
+    if (s_dying)
+        return S_OK;
+
     if (!listener)
         return E_POINTER;
 
@@ -194,7 +200,6 @@ void WebScriptDebugServer::suspendProcessIfPaused()
 
     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);
     }
@@ -216,7 +221,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didLoadMainResourceForDataSource
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).didLoadMainResourceForDataSource(webView, dataSource);
 
     return S_OK;
@@ -234,7 +240,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didParseSource(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).didParseSource(webView, sourceCode, baseLineNumber, url, sourceID, webFrame);
 
     return S_OK;
@@ -252,7 +259,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::failedToParseSource(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).failedToParseSource(webView, sourceCode, baseLineNumber, url, error, webFrame);
 
     return S_OK;
@@ -269,7 +277,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didEnterCallFrame(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).didEnterCallFrame(webView, frame, sourceID, lineNumber, webFrame);
 
     suspendProcessIfPaused();
@@ -288,7 +297,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willExecuteStatement(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).willExecuteStatement(webView, frame, sourceID, lineNumber, webFrame);
 
     suspendProcessIfPaused();
@@ -307,7 +317,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willLeaveCallFrame(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).willLeaveCallFrame(webView, frame, sourceID, lineNumber, webFrame);
 
     suspendProcessIfPaused();
@@ -326,7 +337,8 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::exceptionWasRaised(
         return E_FAIL;
 
     ListenerSet listenersCopy = s_Listeners;
-    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it)
         (**it).exceptionWasRaised(webView, frame, sourceID, lineNumber, webFrame);
 
     suspendProcessIfPaused();
@@ -334,3 +346,16 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::exceptionWasRaised(
     return S_OK;
 }
 
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::serverDidDie()
+{
+    s_dying = true;
+
+    ListenerSet listenersCopy = s_Listeners;
+    ListenerSet::iterator end = listenersCopy.end();
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != end; ++it) {
+        (**it).serverDidDie();
+        s_Listeners.remove((*it).get());
+    }
+
+    return S_OK;
+}
index 5c9ffda..e7a695f 100644 (file)
@@ -125,13 +125,14 @@ public:
         /* [in] */ int lineNumber,
         /* [in] */ IWebFrame*);
 
+    virtual HRESULT STDMETHODCALLTYPE serverDidDie();
+
     void suspendProcessIfPaused();
     static unsigned listenerCount();
 
 private:
     bool m_paused;
     bool m_step;
-    bool m_sharedInstance;
 
     ULONG m_refCount;
 };
index ab6b12a..dc0b00a 100644 (file)
@@ -1,8 +1,26 @@
+2007-11-29  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - <rdar://5618976> Drosera: should listen for the WebScriptDebugServer
+        dying and vice versa.
+        - This fix will allow Drosera and Safari to reconnect if either of them
+        closes correctly, but does not fix the case where one of them dies
+        silently.
+
+        * Drosera/win/ServerConnection.cpp:
+        (ServerConnection::attemptToCreateServerConnection): Added a safety
+        check, because it's possilbe to try to connect to a server that's dying.
+        (ServerConnection::serverDidDie): Implemented. This resets Drosera when
+        the server has died.
+        * Drosera/win/ServerConnection.h: Added the new function and removed
+        an unnecessary member.
+
 2007-11-29  Anders Carlsson  <andersca@apple.com>
 
         * DumpRenderTree/win/DumpRenderTree.vcproj:
         Add shlwapi.lib to all configurations.
-        
+
 2007-11-29  Kevin McCullough  <kmccullough@apple.com>
 
         - Build fix.  Added additional includes for VS Express to the Release
index 6b616b9..c8a7043 100644 (file)
@@ -113,7 +113,7 @@ void DebuggerDocument::getPlatformCurrentFunctionStack(JSContextRef context, Vec
 
 void DebuggerDocument::getPlatformLocalScopeVariableNamesForCallFrame(JSContextRef context, int callFrame, Vector<JSValueRef>& variableNames)
 {
-    // FIXME: Move the retrieval of local variables into IWebScriptCallFrame to reduce the number of RPCs and simplify the code.
+    // FIXME: <rdar://5619005> Move the retrieval of local variables into IWebScriptCallFrame to reduce the number of RPCs and simplify the code.
     COMPtr<IWebScriptCallFrame> cframe = m_server->getCallerFrame(callFrame);
     if (!cframe)
         return;
index 2a5ddac..8313ba5 100644 (file)
@@ -66,8 +66,10 @@ void ServerConnection::attemptToCreateServerConnection(JSGlobalContextRef global
         if (FAILED(tempServer->sharedWebScriptDebugServer(&m_server)))
             return;
 
-        if (FAILED(m_server->addListener(this)))
+        if (FAILED(m_server->addListener(this))) {
+            m_server = 0;
             return;
+        }
 
         m_serverConnected = true;
 
@@ -331,6 +333,14 @@ HRESULT STDMETHODCALLTYPE ServerConnection::exceptionWasRaised(
     return ret;
 }
 
+HRESULT STDMETHODCALLTYPE ServerConnection::serverDidDie()
+{
+    m_server = 0;
+    m_currentFrame = 0;
+    m_serverConnected = false;
+    return S_OK;
+}
+
 // Stack & Variables
 
 IWebScriptCallFrame* ServerConnection::currentFrame() const
index c3ddee5..765d487 100644 (file)
@@ -111,13 +111,14 @@ public:
         /* [in] */ int lineNumber,
         /* [in] */ IWebFrame*);
 
+    virtual HRESULT STDMETHODCALLTYPE serverDidDie();
+
     // Stack & Variables
     IWebScriptCallFrame* currentFrame() const;
     COMPtr<IWebScriptCallFrame> getCallerFrame(int callFrame) const;
 
 private:
     bool m_serverConnected;
-    std::wstring m_currentServerName;
 
     COMPtr<IWebScriptCallFrame> m_currentFrame;
     COMPtr<IWebScriptDebugServer> m_server;