Add another failing test to the Windows Skipped file
[WebKit-https.git] / WebKitTools / Drosera / win / ServerConnection.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2006, 2007 Vladimir Olexa (vladimir.olexa@gmail.com)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer. 
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution. 
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "ServerConnection.h"
32
33 #include "DebuggerDocument.h"
34
35 #include <JavaScriptCore/JSContextRef.h>
36 #include <JavaScriptCore/JSRetainPtr.h>
37 #include <JavaScriptCore/JSStringRefCOM.h>
38 #include <JavaScriptCore/RetainPtr.h>
39 #include <WebKit/WebKit.h>
40
41 ServerConnection::ServerConnection()
42     : m_globalContext(0)
43 {
44     HRESULT serverCreated = CoCreateInstance(CLSID_WebScriptDebugServer, 0, CLSCTX_LOCAL_SERVER, IID_IWebScriptDebugServer, (void**)&m_server);
45     if (!FAILED(serverCreated))
46         m_server->addListener(this);
47 }
48
49 ServerConnection::~ServerConnection()
50 {
51     if (m_server)
52         m_server->removeListener(this);
53
54     if (m_globalContext)
55         JSGlobalContextRelease(m_globalContext);
56 }
57
58 void ServerConnection::setGlobalContext(JSGlobalContextRef globalContextRef)
59 {
60     m_globalContext = JSGlobalContextRetain(globalContextRef);
61 }
62
63 void ServerConnection::pause()
64 {
65     if (m_server)
66         m_server->pause();
67 }
68
69 void ServerConnection::resume()
70 {
71     if (m_server)
72         m_server->resume();
73 }
74
75 void ServerConnection::stepInto()
76 {
77     if (m_server)
78         m_server->step();
79 }
80
81 // Connection Handling
82
83 void ServerConnection::applicationTerminating()
84 {
85     if (m_server)
86         m_server->removeListener(this);
87 }
88
89 void ServerConnection::serverConnectionDidDie()
90 {
91     if (m_server)
92         m_server->removeListener(this);
93 }
94
95 // Stack & Variables
96
97 IWebScriptCallFrame* ServerConnection::currentFrame() const
98 {
99     return m_currentFrame;
100 }
101
102
103 // IUnknown --------------------------------------------------
104 HRESULT STDMETHODCALLTYPE ServerConnection::QueryInterface(REFIID riid, void** ppvObject)
105 {
106     *ppvObject = 0;
107     if (IsEqualGUID(riid, IID_IUnknown))
108         *ppvObject = this;
109     else if (IsEqualGUID(riid, IID_IWebScriptDebugListener))
110         *ppvObject = static_cast<IWebScriptDebugListener*>(this);
111     else
112         return E_NOINTERFACE;
113
114     AddRef();
115     return S_OK;
116 }
117
118 ULONG STDMETHODCALLTYPE ServerConnection::AddRef(void)
119 {
120     // COM ref-counting isn't useful to us because we're in charge of the lifetime of the WebView.
121     return 1;
122 }
123
124 ULONG STDMETHODCALLTYPE ServerConnection::Release(void)
125 {
126     // COM ref-counting isn't useful to us because we're in charge of the lifetime of the WebView.
127     return 1;
128 }
129 // IWebScriptDebugListener -----------------------------------
130 HRESULT STDMETHODCALLTYPE ServerConnection::didLoadMainResourceForDataSource(
131     /* [in] */ IWebView*,
132     /* [in] */ IWebDataSource* dataSource)
133 {
134     // Get document source
135     COMPtr<IWebDocumentRepresentation> rep;
136     HRESULT ret = dataSource->representation(&rep);
137     if (FAILED(ret))
138         return ret;
139
140     BOOL canProvideDocumentSource = FALSE;
141     ret = rep->canProvideDocumentSource(&canProvideDocumentSource);
142     if (FAILED(ret))
143         return ret;
144
145     BSTR documentSource = 0;
146     if (canProvideDocumentSource)
147         ret = rep->documentSource(&documentSource);
148
149     if (FAILED(ret) || !documentSource)
150         return ret;
151
152     JSRetainPtr<JSStringRef> documentSourceJS(Adopt, JSStringCreateWithBSTR(documentSource));
153     SysFreeString(documentSource);
154
155     // Get URL
156     COMPtr<IWebURLResponse> response;
157     ret = dataSource->response(&response);
158     if (FAILED(ret))
159         return ret;
160
161     BSTR url = 0;
162     ret = response->URL(&url);
163     if (FAILED(ret))
164         return ret;
165
166     JSRetainPtr<JSStringRef> urlJS(Adopt, JSStringCreateWithBSTR(url));
167     SysFreeString(url);
168
169     DebuggerDocument::updateFileSource(m_globalContext, documentSourceJS.get(), urlJS.get());
170
171     return S_OK;
172 }
173
174 HRESULT STDMETHODCALLTYPE ServerConnection::didParseSource(
175     /* [in] */ IWebView*,
176     /* [in] */ BSTR sourceCode,
177     /* [in] */ UINT baseLineNumber,
178     /* [in] */ BSTR url,
179     /* [in] */ int sourceID,
180     /* [in] */ IWebFrame* webFrame)
181 {
182     HRESULT ret = S_OK;
183     if (!m_globalContext || !sourceCode)\r
184         return ret;\r
185 \r
186     COMPtr<IWebDataSource> dataSource;\r
187     ret = webFrame->dataSource(&dataSource);\r
188     if (FAILED(ret))\r
189         return ret;\r
190 \r
191     COMPtr<IWebURLResponse> response;\r
192     ret = dataSource->response(&response);\r
193     if (FAILED(ret))\r
194         return ret;\r
195 \r
196     BSTR responseURL;\r
197     ret = response->URL(&responseURL);\r
198     if (FAILED(ret))\r
199         return ret;\r
200 \r
201     BSTR documentSource = 0;\r
202     if (!url || !wcscmp(responseURL, url)) {\r
203         COMPtr<IWebDocumentRepresentation> rep;\r
204         ret = dataSource->representation(&rep);\r
205         if (FAILED(ret))\r
206             return ret;\r
207 \r
208         BOOL canProvideDocumentSource;\r
209         rep->canProvideDocumentSource(&canProvideDocumentSource);\r
210         if (FAILED(ret))\r
211             return ret;\r
212 \r
213         if (canProvideDocumentSource) {\r
214             ret = rep->documentSource(&documentSource);\r
215             if (FAILED(ret))\r
216                 return ret;\r
217         }\r
218 \r
219         if (!url) {\r
220             ret = response->URL(&url);\r
221             if (FAILED(ret))\r
222                 return ret;\r
223         }\r
224     }\r
225     SysFreeString(responseURL);\r
226 \r
227     JSRetainPtr<JSStringRef> sourceJS(Adopt, JSStringCreateWithBSTR(sourceCode));\r
228     JSRetainPtr<JSStringRef> documentSourceJS(Adopt, JSStringCreateWithBSTR(documentSource));\r
229     SysFreeString(documentSource);\r
230     JSRetainPtr<JSStringRef> urlJS(Adopt, JSStringCreateWithBSTR(url));\r
231     JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
232     JSValueRef baseLineJS = JSValueMakeNumber(m_globalContext, baseLineNumber);\r
233 \r
234     DebuggerDocument::didParseScript(m_globalContext, sourceJS.get(), documentSourceJS.get(), urlJS.get(), sidJS, baseLineJS);\r
235
236     return S_OK;
237 }
238
239 HRESULT STDMETHODCALLTYPE ServerConnection::failedToParseSource(
240     /* [in] */ IWebView*,
241     /* [in] */ BSTR,
242     /* [in] */ UINT,
243     /* [in] */ BSTR,
244     /* [in] */ BSTR,
245     /* [in] */ IWebFrame*)
246 {
247     return S_OK;
248 }
249
250 HRESULT STDMETHODCALLTYPE ServerConnection::didEnterCallFrame(
251     /* [in] */ IWebView*,
252     /* [in] */ IWebScriptCallFrame* frame,
253     /* [in] */ int sourceID,
254     /* [in] */ int lineNumber,
255     /* [in] */ IWebFrame*)
256 {
257     HRESULT ret = S_OK;
258     if (!m_globalContext)\r
259         return ret;\r
260 \r
261     // FIXME: This won't be relevant until IWebScriptCallFrame is implemented on Windows\r
262     m_currentFrame = frame;\r
263 \r
264     JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
265     JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
266 \r
267     DebuggerDocument::didEnterCallFrame(m_globalContext, sidJS, linenoJS);\r
268
269     return ret;
270 }
271
272 HRESULT STDMETHODCALLTYPE ServerConnection::willExecuteStatement(
273     /* [in] */ IWebView*,
274     /* [in] */ IWebScriptCallFrame*,
275     /* [in] */ int sourceID,
276     /* [in] */ int lineNumber,
277     /* [in] */ IWebFrame*)
278 {
279     HRESULT ret = S_OK;
280     if (!m_globalContext)\r
281         return ret;\r
282 \r
283     JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
284     JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
285 \r
286     DebuggerDocument::willExecuteStatement(m_globalContext, sidJS, linenoJS);
287     return ret;
288 }
289
290 HRESULT STDMETHODCALLTYPE ServerConnection::willLeaveCallFrame(
291     /* [in] */ IWebView*,
292     /* [in] */ IWebScriptCallFrame* frame,
293     /* [in] */ int sourceID,
294     /* [in] */ int lineNumber,
295     /* [in] */ IWebFrame*)
296 {
297     HRESULT ret = S_OK;
298     if (!m_globalContext)\r
299         return ret;\r
300 \r
301     JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
302     JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
303 \r
304     DebuggerDocument::willLeaveCallFrame(m_globalContext, sidJS, linenoJS);\r
305 \r
306     // FIXME: This won't be relevant until IWebScriptCallFrame is implemented on Windows\r
307     m_currentFrame = frame;\r
308
309     return S_OK;
310 }
311
312 HRESULT STDMETHODCALLTYPE ServerConnection::exceptionWasRaised(
313     /* [in] */ IWebView*,
314     /* [in] */ IWebScriptCallFrame*,
315     /* [in] */ int sourceID,
316     /* [in] */ int lineNumber,
317     /* [in] */ IWebFrame*)
318 {
319     HRESULT ret = S_OK;
320     if (!m_globalContext)\r
321         return ret;\r
322 \r
323     JSValueRef sidJS = JSValueMakeNumber(m_globalContext, sourceID);\r
324     JSValueRef linenoJS = JSValueMakeNumber(m_globalContext, lineNumber);\r
325 \r
326     DebuggerDocument::exceptionWasRaised(m_globalContext, sidJS, linenoJS);
327
328     return ret;
329 }