cae34b284bcf804b3b24a8195d97ceca8fecf093
[WebKit-https.git] / WebKit / win / WebScriptDebugServer.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28 #include "WebScriptDebugServer.h"
29
30 #include "WebView.h"
31 #include <wtf/Vector.h>
32
33 static Vector<IWebView*> sViews;
34
35 // EnumViews ------------------------------------------------------------------
36
37 class EnumViews : public IEnumVARIANT
38 {
39 public:
40     EnumViews() : m_refCount(1), m_current(sViews.begin()) { }
41
42     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject)
43     {
44         *ppvObject = 0;
45         if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IEnumVARIANT))
46             *ppvObject = this;
47         else
48             return E_NOINTERFACE;
49
50         AddRef();
51         return S_OK;
52     }
53
54     virtual ULONG STDMETHODCALLTYPE AddRef(void)
55     {
56         return ++m_refCount;
57     }
58
59     virtual ULONG STDMETHODCALLTYPE Release(void)
60     {
61         ULONG newRef = --m_refCount;
62         if (!newRef)
63             delete(this);
64         return newRef;
65     }
66
67     virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
68     {
69         if (pCeltFetched)
70             *pCeltFetched = 0;
71         if (!rgVar)
72             return E_POINTER;
73         VariantInit(rgVar);
74         if (!celt || celt > 1)
75             return S_FALSE;
76         if (m_current == sViews.end())
77             return S_FALSE;
78
79         IUnknown* unknown;
80         HRESULT hr = (*m_current++)->QueryInterface(IID_IUnknown, (void**)&unknown);
81         if (FAILED(hr))
82             return hr;
83
84         V_VT(rgVar) = VT_UNKNOWN;
85         V_UNKNOWN(rgVar) = unknown;
86
87         if (pCeltFetched)
88             *pCeltFetched = 1;
89         return S_OK;
90     }
91
92     virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt)
93     {
94         m_current += celt;
95         return (m_current != sViews.end()) ? S_OK : S_FALSE;
96     }
97
98     virtual HRESULT STDMETHODCALLTYPE Reset(void)
99     {
100         m_current = sViews.begin();
101         return S_OK;
102     }
103
104     virtual HRESULT STDMETHODCALLTYPE Clone(IEnumVARIANT**)
105     {
106         return E_NOTIMPL;
107     }
108
109 private:
110     ULONG m_refCount;
111     Vector<IWebView*>::iterator m_current;
112 };
113
114 // WebScriptDebugServer ------------------------------------------------------------
115
116 WebScriptDebugServer::WebScriptDebugServer()
117 : m_refCount(0)
118 {
119     gClassCount++;
120 }
121
122 WebScriptDebugServer::~WebScriptDebugServer()
123 {
124     gClassCount--;
125 }
126
127 WebScriptDebugServer* WebScriptDebugServer::createInstance()
128 {
129     WebScriptDebugServer* instance = new WebScriptDebugServer;
130     instance->AddRef();
131     return instance;
132 }
133
134 // IUnknown -------------------------------------------------------------------
135
136 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::QueryInterface(REFIID riid, void** ppvObject)
137 {
138     *ppvObject = 0;
139     if (IsEqualGUID(riid, IID_IUnknown))
140         *ppvObject = static_cast<WebScriptDebugServer*>(this);
141     else if (IsEqualGUID(riid, IID_IWebScriptDebugServer))
142         *ppvObject = static_cast<WebScriptDebugServer*>(this);
143     else
144         return E_NOINTERFACE;
145
146     AddRef();
147     return S_OK;
148 }
149
150 ULONG STDMETHODCALLTYPE WebScriptDebugServer::AddRef(void)
151 {
152     return ++m_refCount;
153 }
154
155 ULONG STDMETHODCALLTYPE WebScriptDebugServer::Release(void)
156 {
157     ULONG newRef = --m_refCount;
158     if (!newRef)
159         delete(this);
160
161     return newRef;
162 }
163
164 void WebScriptDebugServer::viewAdded(IWebView* view)
165 {
166     sViews.append(view);
167 }
168
169 void WebScriptDebugServer::viewRemoved(IWebView* view)
170 {
171     Vector<IWebView*>::iterator end = sViews.end();
172     int i=0;
173     for (Vector<IWebView*>::iterator it = sViews.begin(); it != end; ++it, ++i) {
174         if (*it == view) {
175             sViews.remove(i);
176             break;
177         }
178     }
179 }
180
181 // IWebScriptDebugServer -----------------------------------------------------------
182
183 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
184     /* [in] */ const IWebScriptDebugListener*)
185 {
186     return S_OK;
187 }
188
189 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::removeListener(
190     /* [in] */ const IWebScriptDebugListener*)
191 {
192     return S_OK;
193 }
194
195 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::step()
196 {
197     return S_OK;
198 }
199
200 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::pause()
201 {
202     return S_OK;
203 }
204
205 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::resume()
206 {
207     return S_OK;
208 }
209
210 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::isPaused(
211     /* [out, retval] */ BOOL*)
212 {
213     return S_OK;
214 }