3f25a8a5b4a7393ed65031c3936f47eae8a58016
[WebKit-https.git] / WebKit / qt / Api / qwebhistory.cpp
1 /*
2     Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21 #include "qwebhistory.h"
22 #include "qwebhistory_p.h"
23
24 #include "PlatformString.h"
25 #include "Image.h"
26 #include "Page.h"
27 #include "PageGroup.h"
28
29 #include <QSharedData>
30
31 /*!
32   \class QWebHistoryItem
33   \ingroup explicitly-shared
34   \since 4.4
35   \brief The QWebHistoryItem class represents one item in the history of a QWebPage
36
37   Each QWebHistoryItem instance represents an entry in the history stack of a Web page,
38   containing information about the page, its location, and when it was last visited.
39
40   The following table shows the properties of the page held by the history item, and
41   the functions used to access them.
42
43   \table
44   \header \o Function      \o Description
45   \row    \o title()       \o The page title.
46   \row    \o url()         \o The location of the page.
47   \row    \o originalUrl() \o The URL used to access the page.
48   \row    \o lastVisited() \o The date and time of the user's last visit to the page.
49   \row    \o icon()        \o The icon associated with the page that was provided by the server.
50   \endtable
51
52   \note QWebHistoryItem objects are value based and \l{explicitly shared}.
53
54   \sa QWebHistory, QWebPage::history(), QWebHistoryInterface
55 */
56
57 /*!
58   Constructs a history item from \a other.
59 */
60 QWebHistoryItem::QWebHistoryItem(const QWebHistoryItem &other)
61     : d(other.d)
62 {
63 }
64
65 /*!
66   Assigns the \a other history item to this.
67 */
68 QWebHistoryItem &QWebHistoryItem::operator=(const QWebHistoryItem &other)
69 {
70     d = other.d;
71     return *this;
72 }
73
74 /*!
75   Destroys the history item.
76 */
77 QWebHistoryItem::~QWebHistoryItem()
78 {
79 }
80
81 /*!
82  Returns the original URL associated with the history item.
83
84  \sa url()
85 */
86 QUrl QWebHistoryItem::originalUrl() const
87 {
88     return QUrl(d->item->originalURL().string());
89 }
90
91
92 /*!
93  Returns the URL associated with the history item.
94
95  \sa originalUrl(), title(), lastVisited()
96 */
97 QUrl QWebHistoryItem::url() const
98 {
99     return QUrl(d->item->url().string());
100 }
101
102
103 /*!
104  Returns the title of the page associated with the history item.
105
106  \sa icon(), url(), lastVisited()
107 */
108 QString QWebHistoryItem::title() const
109 {
110     return d->item->title();
111 }
112
113
114 /*!
115  Returns the date and time that the page associated with the item was last visited.
116
117  \sa title(), icon(), url()
118 */
119 QDateTime QWebHistoryItem::lastVisited() const
120 {
121     //FIXME : this will be wrong unless we correctly set lastVisitedTime ourselves
122     return QDateTime::fromTime_t((uint)d->item->lastVisitedTime());
123 }
124
125
126 /*!
127  Returns the icon associated with the history item.
128
129  \sa title(), url(), lastVisited()
130 */
131 QIcon QWebHistoryItem::icon() const
132 {
133     return *d->item->icon()->nativeImageForCurrentFrame();
134 }
135
136 /*!
137   \internal
138 */
139 QWebHistoryItem::QWebHistoryItem(QWebHistoryItemPrivate *priv)
140 {
141     d = priv;
142 }
143
144 /*!
145   \class QWebHistory
146   \since 4.4
147   \brief The QWebHistory class represents the history of a QWebPage
148
149   Each QWebPage instance contains a history of visited pages that can be accessed
150   by QWebPage::history(). QWebHistory represents this history and makes it possible
151   to navigate it.
152
153   The history uses the concept of a \e{current item}, dividing the pages visited
154   into those that can be visited by navigating \e back and \e forward using the
155   back() and forward() functions. The current item can be obtained by calling
156   currentItem(), and an arbitrary item in the history can be made the current
157   item by passing it to goToItem().
158
159   A list of items describing the pages that can be visited by going back can be
160   obtained by calling the backItems() function; similarly, items describing the
161   pages ahead of the current page can be obtained with the forwardItems() function.
162   The total list of items is obtained with the items() function.
163
164   Just as with containers, functions are available to examine the history in terms
165   of a list. Arbitrary items in the history can be obtained with itemAt(), the total
166   number of items is given by count(), and the history can be cleared with the
167   clear() function.
168
169   \sa QWebHistoryItem, QWebHistoryInterface, QWebPage
170 */
171
172
173 QWebHistory::QWebHistory()
174     : d(0)
175 {
176 }
177
178 QWebHistory::~QWebHistory()
179 {
180     delete d;
181 }
182
183 /*!
184   Clears the history.
185
186   \sa count(), items()
187 */
188 void QWebHistory::clear()
189 {
190     RefPtr<WebCore::HistoryItem> current = d->lst->currentItem();
191     int capacity = d->lst->capacity();
192     d->lst->setCapacity(0);    
193
194     WebCore::Page* page = d->lst->page();
195     if (page && page->groupPtr())
196         page->groupPtr()->removeVisitedLinks();
197
198     d->lst->setCapacity(capacity);
199     d->lst->addItem(current.get());
200     d->lst->goToItem(current.get());
201 }
202
203 /*!
204   Returns a list of all items currently in the history.
205
206   \sa count(), clear()
207 */
208 QList<QWebHistoryItem> QWebHistory::items() const
209 {
210     const WebCore::HistoryItemVector &items = d->lst->entries();
211
212     QList<QWebHistoryItem> ret;
213     for (int i = 0; i < items.size(); ++i) {
214         QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(items[i].get());
215         ret.append(QWebHistoryItem(priv));
216     }
217     return ret;
218 }
219
220 /*!
221   Returns the list of items in the backwards history list.
222   At most \a maxItems entries are returned.
223
224   \sa forwardItems()
225 */
226 QList<QWebHistoryItem> QWebHistory::backItems(int maxItems) const
227 {
228     WebCore::HistoryItemVector items(maxItems);
229     d->lst->backListWithLimit(maxItems, items);
230
231     QList<QWebHistoryItem> ret;
232     for (int i = 0; i < items.size(); ++i) {
233         QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(items[i].get());
234         ret.append(QWebHistoryItem(priv));
235     }
236     return ret;
237 }
238
239 /*!
240   Returns the list of items in the forward history list.
241   At most \a maxItems entries are returned.
242
243   \sa backItems()
244 */
245 QList<QWebHistoryItem> QWebHistory::forwardItems(int maxItems) const
246 {
247     WebCore::HistoryItemVector items(maxItems);
248     d->lst->forwardListWithLimit(maxItems, items);
249
250     QList<QWebHistoryItem> ret;
251     for (int i = 0; i < items.size(); ++i) {
252         QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(items[i].get());
253         ret.append(QWebHistoryItem(priv));
254     }
255     return ret;
256 }
257
258 /*!
259   Returns true if there is an item preceding the current item in the history;
260   otherwise returns false.
261
262   \sa canGoForward()
263 */
264 bool QWebHistory::canGoBack() const
265 {
266     return d->lst->backListCount() > 0;
267 }
268
269 /*!
270   Returns true if we have an item to go forward to; otherwise returns false.
271
272   \sa canGoBack()
273 */
274 bool QWebHistory::canGoForward() const
275 {
276     return d->lst->forwardListCount() > 0;
277 }
278
279 /*!
280   Set the current item to be the previous item in the history and goes to the
281   corresponding page; i.e., goes back one history item.
282
283   \sa forward(), goToItem()
284 */
285 void QWebHistory::back()
286 {
287     d->lst->goBack();
288     WebCore::Page* page = d->lst->page();
289     page->goToItem(currentItem().d->item, WebCore::FrameLoadTypeIndexedBackForward);
290 }
291
292 /*!
293   Sets the current item to be the next item in the history and goes to the
294   corresponding page; i.e., goes forward one history item.
295
296   \sa back(), goToItem()
297 */
298 void QWebHistory::forward()
299 {
300     d->lst->goForward();
301     WebCore::Page* page = d->lst->page();
302     page->goToItem(currentItem().d->item, WebCore::FrameLoadTypeIndexedBackForward);
303 }
304
305 /*!
306   Sets the current item to be the specified \a item in the history and goes to the page.
307
308   \sa back(), forward()
309 */
310 void QWebHistory::goToItem(const QWebHistoryItem &item)
311 {
312     d->lst->goToItem(item.d->item);
313     WebCore::Page* page = d->lst->page();
314     page->goToItem(currentItem().d->item, WebCore::FrameLoadTypeIndexedBackForward);
315 }
316
317 /*!
318   Returns the item before the current item in the history.
319 */
320 QWebHistoryItem QWebHistory::backItem() const
321 {
322     WebCore::HistoryItem *i = d->lst->backItem();
323     QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(i);
324     return QWebHistoryItem(priv);
325 }
326
327 /*!
328   Returns the current item in the history.
329 */
330 QWebHistoryItem QWebHistory::currentItem() const
331 {
332     WebCore::HistoryItem *i = d->lst->currentItem();
333     QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(i);
334     return QWebHistoryItem(priv);
335 }
336
337 /*!
338   Returns the item after the current item in the history.
339 */
340 QWebHistoryItem QWebHistory::forwardItem() const
341 {
342     WebCore::HistoryItem *i = d->lst->forwardItem();
343     QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(i);
344     return QWebHistoryItem(priv);
345 }
346
347 /*!
348   Returns the item at index \a i in the history.
349 */
350 QWebHistoryItem QWebHistory::itemAt(int i) const
351 {
352     WebCore::HistoryItem *item = d->lst->itemAtIndex(i);
353
354     QWebHistoryItemPrivate *priv = new QWebHistoryItemPrivate(item);
355     return QWebHistoryItem(priv);
356 }
357
358 /*!
359     Returns the total number of items in the history.
360 */
361 int QWebHistory::count() const
362 {
363     return d->lst->entries().size();
364 }
365