initial import
[vuplus_webkit] / Source / WebKit / win / WebBackForwardList.cpp
1 /*
2  * Copyright (C) 2006, 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 "WebBackForwardList.h"
29
30 #include "WebFrame.h"
31 #include "WebKit.h"
32 #include "WebPreferences.h"
33
34 #include <WebCore/BackForwardListImpl.h>
35 #include <WebCore/COMPtr.h>
36 #include <WebCore/HistoryItem.h>
37
38 using std::min;
39 using namespace WebCore;
40
41 // WebBackForwardList ----------------------------------------------------------------
42
43 // FIXME: Instead of this we could just create a class derived from BackForwardListImpl
44 // with a pointer to a WebBackForwardList in it.
45 static HashMap<BackForwardListImpl*, WebBackForwardList*>& backForwardListWrappers()
46 {
47     static HashMap<BackForwardListImpl*, WebBackForwardList*> staticBackForwardListWrappers;
48     return staticBackForwardListWrappers;
49 }
50
51 WebBackForwardList::WebBackForwardList(PassRefPtr<BackForwardListImpl> backForwardList)
52     : m_refCount(0)
53     , m_backForwardList(backForwardList)
54 {
55     ASSERT(!backForwardListWrappers().contains(m_backForwardList.get()));
56     backForwardListWrappers().set(m_backForwardList.get(), this);
57
58     gClassCount++;
59     gClassNameCount.add("WebBackForwardList");
60 }
61
62 WebBackForwardList::~WebBackForwardList()
63 {
64     ASSERT(m_backForwardList->closed());
65
66     ASSERT(backForwardListWrappers().contains(m_backForwardList.get()));
67     backForwardListWrappers().remove(m_backForwardList.get());
68
69     gClassCount--;
70     gClassNameCount.remove("WebBackForwardList");
71 }
72
73 WebBackForwardList* WebBackForwardList::createInstance(PassRefPtr<BackForwardListImpl> backForwardList)
74 {
75     WebBackForwardList* instance;
76
77     instance = backForwardListWrappers().get(backForwardList.get());
78
79     if (!instance)
80         instance = new WebBackForwardList(backForwardList);
81
82     instance->AddRef();
83     return instance;
84 }
85
86 // IUnknown -------------------------------------------------------------------
87
88 HRESULT STDMETHODCALLTYPE WebBackForwardList::QueryInterface(REFIID riid, void** ppvObject)
89 {
90     *ppvObject = 0;
91     if (IsEqualGUID(riid, IID_IUnknown))
92         *ppvObject = static_cast<IWebBackForwardList*>(this);
93     else if (IsEqualGUID(riid, IID_IWebBackForwardList))
94         *ppvObject = static_cast<IWebBackForwardList*>(this);
95     else if (IsEqualGUID(riid, IID_IWebBackForwardListPrivate))
96         *ppvObject = static_cast<IWebBackForwardListPrivate*>(this);
97     else
98         return E_NOINTERFACE;
99
100     AddRef();
101     return S_OK;
102 }
103
104 ULONG STDMETHODCALLTYPE WebBackForwardList::AddRef(void)
105 {
106     return ++m_refCount;
107 }
108
109 ULONG STDMETHODCALLTYPE WebBackForwardList::Release(void)
110 {
111     ULONG newRef = --m_refCount;
112     if (!newRef)
113         delete(this);
114
115     return newRef;
116 }
117
118 // IWebBackForwardList ---------------------------------------------------------
119
120 HRESULT STDMETHODCALLTYPE WebBackForwardList::addItem( 
121     /* [in] */ IWebHistoryItem* item)
122 {
123     COMPtr<WebHistoryItem> webHistoryItem;
124  
125     if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
126         return E_FAIL;
127  
128     m_backForwardList->addItem(webHistoryItem->historyItem());
129     return S_OK;
130 }
131
132 HRESULT STDMETHODCALLTYPE WebBackForwardList::goBack( void)
133 {
134     m_backForwardList->goBack();
135     return S_OK;
136 }
137
138 HRESULT STDMETHODCALLTYPE WebBackForwardList::goForward( void)
139 {
140     m_backForwardList->goForward();
141     return S_OK;
142 }
143
144 HRESULT STDMETHODCALLTYPE WebBackForwardList::goToItem( 
145     /* [in] */ IWebHistoryItem* item)
146 {
147     COMPtr<WebHistoryItem> webHistoryItem;
148  
149     if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
150         return E_FAIL;
151
152     m_backForwardList->goToItem(webHistoryItem->historyItem());
153     return S_OK;
154 }
155
156 HRESULT STDMETHODCALLTYPE WebBackForwardList::backItem( 
157     /* [retval][out] */ IWebHistoryItem** item)
158 {
159     if (!item)
160         return E_POINTER;
161
162     HistoryItem* historyItem = m_backForwardList->backItem();
163
164     if (!historyItem)
165         return E_FAIL;
166
167     *item = WebHistoryItem::createInstance(historyItem);
168     return S_OK;
169 }
170
171 HRESULT STDMETHODCALLTYPE WebBackForwardList::currentItem( 
172     /* [retval][out] */ IWebHistoryItem** item)
173 {
174     if (!item)
175         return E_POINTER;
176
177     HistoryItem* historyItem = m_backForwardList->currentItem();
178
179     if (!historyItem)
180         return E_FAIL;
181
182     *item = WebHistoryItem::createInstance(historyItem);
183     return S_OK;
184 }
185
186 HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardItem( 
187     /* [retval][out] */ IWebHistoryItem** item)
188 {
189     if (!item)
190         return E_POINTER;
191
192     HistoryItem* historyItem = m_backForwardList->forwardItem();
193
194     if (!historyItem)
195         return E_FAIL;
196
197     *item = WebHistoryItem::createInstance(historyItem);
198     return S_OK;
199 }
200
201 HRESULT STDMETHODCALLTYPE WebBackForwardList::backListWithLimit( 
202     /* [in] */ int limit,
203     /* [out] */ int* listCount,
204     /* [retval][out] */ IWebHistoryItem** list)
205 {
206     HistoryItemVector historyItemVector;
207     m_backForwardList->backListWithLimit(limit, historyItemVector);
208
209     *listCount = static_cast<int>(historyItemVector.size());
210
211     if (list)
212         for (unsigned i = 0; i < historyItemVector.size(); i++)
213             list[i] = WebHistoryItem::createInstance(historyItemVector[i].get());
214
215     return S_OK;
216 }
217
218 HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardListWithLimit( 
219     /* [in] */ int limit,
220     /* [out] */ int* listCount,
221     /* [retval][out] */ IWebHistoryItem** list)
222 {
223     HistoryItemVector historyItemVector;
224     m_backForwardList->forwardListWithLimit(limit, historyItemVector);
225
226     *listCount = static_cast<int>(historyItemVector.size());
227
228     if (list)
229         for (unsigned i = 0; i < historyItemVector.size(); i++)
230             list[i] = WebHistoryItem::createInstance(historyItemVector[i].get());
231
232     return S_OK;
233 }
234
235 HRESULT STDMETHODCALLTYPE WebBackForwardList::capacity( 
236     /* [retval][out] */ int* result)
237 {
238     *result = (int)m_backForwardList->capacity();
239     return S_OK;
240 }
241
242 HRESULT STDMETHODCALLTYPE WebBackForwardList::setCapacity( 
243     /* [in] */ int size)
244 {
245     if (size < 0)
246         return E_FAIL;
247     
248     m_backForwardList->setCapacity(size);
249     return S_OK;
250 }
251
252 HRESULT STDMETHODCALLTYPE WebBackForwardList::backListCount( 
253     /* [retval][out] */ int* count)
254 {
255     *count = m_backForwardList->backListCount();
256     return S_OK;
257 }
258
259 HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardListCount( 
260     /* [retval][out] */ int* count)
261 {
262     *count = m_backForwardList->forwardListCount();
263     return S_OK;
264 }
265
266 HRESULT STDMETHODCALLTYPE WebBackForwardList::containsItem( 
267     /* [in] */ IWebHistoryItem* item,
268     /* [retval][out] */ BOOL* result)
269 {
270     COMPtr<WebHistoryItem> webHistoryItem;
271
272     if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
273         return E_FAIL;
274
275     *result = m_backForwardList->containsItem(webHistoryItem->historyItem());
276     return S_OK;
277 }
278
279 HRESULT STDMETHODCALLTYPE WebBackForwardList::itemAtIndex( 
280     /* [in] */ int index,
281     /* [retval][out] */ IWebHistoryItem** item)
282 {
283     if (!item)
284         return E_POINTER;
285
286     HistoryItem* historyItem = m_backForwardList->itemAtIndex(index);
287
288     if (!historyItem)
289         return E_FAIL;
290  
291     *item = WebHistoryItem::createInstance(historyItem);
292     return S_OK;
293 }
294
295 // IWebBackForwardListPrivate --------------------------------------------------------
296
297 HRESULT STDMETHODCALLTYPE WebBackForwardList::removeItem( 
298     /* [in] */ IWebHistoryItem* item)
299 {
300     COMPtr<WebHistoryItem> webHistoryItem;
301  
302     if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
303         return E_FAIL;
304  
305     m_backForwardList->removeItem(webHistoryItem->historyItem());
306     return S_OK;
307 }