Reviewed by Adam.
[WebKit-https.git] / WebKitTools / Drosera / win / ServerConnection.cpp
index 5a7242f2df3993eea6d2f340cf0f0e8966299985..89388831222609db4f143bc5bc7b440ef00a57ba 100644 (file)
 
 #include <JavaScriptCore/JSContextRef.h>
 #include <JavaScriptCore/JSRetainPtr.h>
-#include <JavaScriptCore/JSStringRefCF.h>
+#include <JavaScriptCore/JSStringRefCOM.h>
 #include <JavaScriptCore/RetainPtr.h>
 #include <WebKit/WebKit.h>
 
-// FIXME: Some of the below functionality cannot be implemented until the WebScriptDebug Server works on windows.
 ServerConnection::ServerConnection()
     : m_globalContext(0)
 {
@@ -95,7 +94,7 @@ void ServerConnection::serverConnectionDidDie()
 
 // Stack & Variables
 
-WebScriptCallFrame* ServerConnection::currentFrame() const
+IWebScriptCallFrame* ServerConnection::currentFrame() const
 {
     return m_currentFrame;
 }
@@ -129,70 +128,202 @@ ULONG STDMETHODCALLTYPE ServerConnection::Release(void)
 }
 // IWebScriptDebugListener -----------------------------------
 HRESULT STDMETHODCALLTYPE ServerConnection::didLoadMainResourceForDataSource(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ IWebDataSource* /*dataSource*/)
+    /* [in] */ IWebView*,
+    /* [in] */ IWebDataSource* dataSource)
 {
+    // Get document source
+    COMPtr<IWebDocumentRepresentation> rep;
+    HRESULT ret = dataSource->representation(&rep);
+    if (FAILED(ret))
+        return ret;
+
+    BOOL canProvideDocumentSource = FALSE;
+    ret = rep->canProvideDocumentSource(&canProvideDocumentSource);
+    if (FAILED(ret))
+        return ret;
+
+    BSTR documentSource = 0;
+    if (canProvideDocumentSource)
+        ret = rep->documentSource(&documentSource);
+
+    if (FAILED(ret) || !documentSource)
+        return ret;
+
+    JSRetainPtr<JSStringRef> documentSourceJS(Adopt, JSStringCreateWithBSTR(documentSource));
+    SysFreeString(documentSource);
+
+    // Get URL
+    COMPtr<IWebURLResponse> response;
+    ret = dataSource->response(&response);
+    if (FAILED(ret))
+        return ret;
+
+    BSTR url = 0;
+    ret = response->URL(&url);
+    if (FAILED(ret))
+        return ret;
+
+    JSRetainPtr<JSStringRef> urlJS(Adopt, JSStringCreateWithBSTR(url));
+    SysFreeString(url);
+
+    DebuggerDocument::updateFileSource(m_globalContext, documentSourceJS.get(), urlJS.get());
+
     return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::didParseSource(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ BSTR /*sourceCode*/,
-    /* [in] */ UINT /*baseLineNumber*/,
-    /* [in] */ BSTR /*url*/,
-    /* [in] */ int /*sourceID*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ BSTR sourceCode,
+    /* [in] */ UINT baseLineNumber,
+    /* [in] */ BSTR url,
+    /* [in] */ int sourceID,
+    /* [in] */ IWebFrame* webFrame)
 {
+    HRESULT ret = S_OK;
+    if (!m_globalContext || !sourceCode)\r
+        return ret;\r
+\r
+    COMPtr<IWebDataSource> dataSource;\r
+    ret = webFrame->dataSource(&dataSource);\r
+    if (FAILED(ret))\r
+        return ret;\r
+\r
+    COMPtr<IWebURLResponse> response;\r
+    ret = dataSource->response(&response);\r
+    if (FAILED(ret))\r
+        return ret;\r
+\r
+    BSTR responseURL;\r
+    ret = response->URL(&responseURL);\r
+    if (FAILED(ret))\r
+        return ret;\r
+\r
+    BSTR documentSource = 0;\r
+    if (!url || !wcscmp(responseURL, url)) {\r
+        COMPtr<IWebDocumentRepresentation> rep;\r
+        ret = dataSource->representation(&rep);\r
+        if (FAILED(ret))\r
+            return ret;\r
+\r
+        BOOL canProvideDocumentSource;\r
+        rep->canProvideDocumentSource(&canProvideDocumentSource);\r
+        if (FAILED(ret))\r
+            return ret;\r
+\r
+        if (canProvideDocumentSource) {\r
+            ret = rep->documentSource(&documentSource);\r
+            if (FAILED(ret))\r
+                return ret;\r
+        }\r
+\r
+        if (!url) {\r
+            ret = response->URL(&url);\r
+            if (FAILED(ret))\r
+                return ret;\r
+        }\r
+    }\r
+    SysFreeString(responseURL);\r
+\r
+    JSRetainPtr<JSStringRef> sourceJS(Adopt, JSStringCreateWithBSTR(sourceCode));\r
+    JSRetainPtr<JSStringRef> documentSourceJS(Adopt, JSStringCreateWithBSTR(documentSource));\r
+    SysFreeString(documentSource);\r
+    JSRetainPtr<JSStringRef> urlJS(Adopt, JSStringCreateWithBSTR(url));\r
+    JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
+    JSValueRef baseLineJS = JSValueMakeNumber(m_globalContext, baseLineNumber);\r
+\r
+    DebuggerDocument::didParseScript(m_globalContext, sourceJS.get(), documentSourceJS.get(), urlJS.get(), sidJS, baseLineJS);\r
+
     return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::failedToParseSource(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ BSTR /*sourceCode*/,
-    /* [in] */ UINT /*baseLineNumber*/,
-    /* [in] */ BSTR /*url*/,
-    /* [in] */ BSTR /*error*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ BSTR,
+    /* [in] */ UINT,
+    /* [in] */ BSTR,
+    /* [in] */ BSTR,
+    /* [in] */ IWebFrame*)
 {
     return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::didEnterCallFrame(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ IWebScriptCallFrame* /*frame*/,
-    /* [in] */ int /*sourceID*/,
-    /* [in] */ int /*lineNumber*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame*)
 {
-    return S_OK;
+    HRESULT ret = S_OK;
+    if (!m_globalContext)\r
+        return ret;\r
+\r
+    // FIXME: This won't be relevant until IWebScriptCallFrame is implemented on Windows\r
+    m_currentFrame = frame;\r
+\r
+    JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
+    JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
+\r
+    DebuggerDocument::didEnterCallFrame(m_globalContext, sidJS, linenoJS);\r
+
+    return ret;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::willExecuteStatement(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ IWebScriptCallFrame* /*frame*/,
-    /* [in] */ int /*sourceID*/,
-    /* [in] */ int /*lineNumber*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ IWebScriptCallFrame*,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame*)
 {
-    return S_OK;
+    HRESULT ret = S_OK;
+    if (!m_globalContext)\r
+        return ret;\r
+\r
+    JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
+    JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
+\r
+    DebuggerDocument::willExecuteStatement(m_globalContext, sidJS, linenoJS);
+    return ret;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::willLeaveCallFrame(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ IWebScriptCallFrame* /*frame*/,
-    /* [in] */ int /*sourceID*/,
-    /* [in] */ int /*lineNumber*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame*)
 {
+    HRESULT ret = S_OK;
+    if (!m_globalContext)\r
+        return ret;\r
+\r
+    JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
+    JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
+\r
+    DebuggerDocument::willLeaveCallFrame(m_globalContext, sidJS, linenoJS);\r
+\r
+    // FIXME: This won't be relevant until IWebScriptCallFrame is implemented on Windows\r
+    m_currentFrame = frame;\r
+
     return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE ServerConnection::exceptionWasRaised(
-    /* [in] */ IWebView* /*view*/,
-    /* [in] */ IWebScriptCallFrame* /*frame*/,
-    /* [in] */ int /*sourceID*/,
-    /* [in] */ int /*lineNumber*/,
-    /* [in] */ IWebFrame* /*forWebFrame*/)
+    /* [in] */ IWebView*,
+    /* [in] */ IWebScriptCallFrame*,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame*)
 {
-    return S_OK;
+    HRESULT ret = S_OK;
+    if (!m_globalContext)\r
+        return ret;\r
+\r
+    JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
+    JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
+\r
+    DebuggerDocument::exceptionWasRaised(m_globalContext, sidJS, linenoJS);
+
+    return ret;
 }