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
+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...?
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();
}
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
RunAsLocalServer PRIVATE
+ LocalServerDidDie PRIVATE
JSCheckScriptSyntax
JSClassCreate
JSClassRelease
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
RunAsLocalServer PRIVATE
+ LocalServerDidDie PRIVATE
JSCheckScriptSyntax
JSClassCreate
JSClassRelease
#include "ProgIDMacros.h"
#include "WebKit.h"
#include "WebKitClassFactory.h"
+#include "WebScriptDebugServer.h"
#include "resource.h"
#pragma warning( push, 0 )
#include <WebCore/COMPtr.h>
return hr;
}
-STDAPI RunAsLocalServer(void)
+STDAPI RunAsLocalServer()
{
DWORD reg;
COMPtr<IUnknown> classFactory;
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)
{
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; };
: m_refCount(0)
, m_paused(false)
, m_step(false)
- , m_sharedInstance(false)
{
gClassCount++;
}
WebScriptDebugServer* WebScriptDebugServer::sharedWebScriptDebugServer()
{
if (!s_SharedWebScriptDebugServer) {
+ s_dying = false;
s_SharedWebScriptDebugServer.set(WebScriptDebugServer::createInstance());
- s_SharedWebScriptDebugServer->m_sharedInstance = true;
}
return s_SharedWebScriptDebugServer.get();
HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
/* [in] */ IWebScriptDebugListener* listener)
{
+ if (s_dying)
+ return E_FAIL;
+
if (!listener)
return E_POINTER;
HRESULT STDMETHODCALLTYPE WebScriptDebugServer::removeListener(
/* [in] */ IWebScriptDebugListener* listener)
{
+ if (s_dying)
+ return S_OK;
+
if (!listener)
return E_POINTER;
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);
}
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;
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;
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;
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();
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();
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();
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();
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;
+}
/* [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;
};
+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
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;
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;
return ret;
}
+HRESULT STDMETHODCALLTYPE ServerConnection::serverDidDie()
+{
+ m_server = 0;
+ m_currentFrame = 0;
+ m_serverConnected = false;
+ return S_OK;
+}
+
// Stack & Variables
IWebScriptCallFrame* ServerConnection::currentFrame() const
/* [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;