diff options
Diffstat (limited to 'src/webenginequick/api/qquickwebenginehistory.cpp')
-rw-r--r-- | src/webenginequick/api/qquickwebenginehistory.cpp | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/src/webenginequick/api/qquickwebenginehistory.cpp b/src/webenginequick/api/qquickwebenginehistory.cpp new file mode 100644 index 000000000..50feb067c --- /dev/null +++ b/src/webenginequick/api/qquickwebenginehistory.cpp @@ -0,0 +1,355 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickwebenginehistory_p.h" +#include "qquickwebenginehistory_p_p.h" + +#include "qquickwebenginefaviconprovider_p_p.h" +#include "qquickwebengineview_p_p.h" +#include "web_contents_adapter.h" + +QT_BEGIN_NAMESPACE + +QQuickWebEngineHistoryListModelPrivate::QQuickWebEngineHistoryListModelPrivate(QQuickWebEngineViewPrivate *view) + : view(view) +{ +} + +QQuickWebEngineHistoryListModelPrivate::~QQuickWebEngineHistoryListModelPrivate() +{ +} + +int QQuickWebEngineHistoryListModelPrivate::count() const +{ + return adapter()->navigationEntryCount(); +} + +int QQuickWebEngineHistoryListModelPrivate::index(int index) const +{ + return index; +} + +int QQuickWebEngineHistoryListModelPrivate::offsetForIndex(int index) const +{ + return index - adapter()->currentNavigationEntryIndex(); +} + +QtWebEngineCore::WebContentsAdapter *QQuickWebEngineHistoryListModelPrivate::adapter() const +{ + return view->adapter.data(); +} + +QQuickWebEngineBackHistoryListModelPrivate::QQuickWebEngineBackHistoryListModelPrivate(QQuickWebEngineViewPrivate *view) + : QQuickWebEngineHistoryListModelPrivate(view) +{ +} + +int QQuickWebEngineBackHistoryListModelPrivate::count() const +{ + return adapter()->currentNavigationEntryIndex(); +} + +int QQuickWebEngineBackHistoryListModelPrivate::index(int i) const +{ + Q_ASSERT(i >= 0 && i < count()); + return count() - 1 - i; +} + +int QQuickWebEngineBackHistoryListModelPrivate::offsetForIndex(int index) const +{ + return - index - 1; +} + +QQuickWebEngineForwardHistoryListModelPrivate::QQuickWebEngineForwardHistoryListModelPrivate(QQuickWebEngineViewPrivate *view) + : QQuickWebEngineHistoryListModelPrivate(view) +{ +} + +int QQuickWebEngineForwardHistoryListModelPrivate::count() const +{ + if (!adapter()->isInitialized()) + return 0; + return adapter()->navigationEntryCount() - adapter()->currentNavigationEntryIndex() - 1; +} + +int QQuickWebEngineForwardHistoryListModelPrivate::index(int i) const +{ + return adapter()->currentNavigationEntryIndex() + i + 1; +} + +int QQuickWebEngineForwardHistoryListModelPrivate::offsetForIndex(int index) const +{ + return index + 1; +} + +/*! + \qmltype WebEngineHistoryListModel + \instantiates QQuickWebEngineHistoryListModel + \inqmlmodule QtWebEngine + \since QtWebEngine 1.1 + + \brief A data model that represents the history of a web engine page. + + The WebEngineHistoryListModel type exposes the \e title, \e url, \e icon, and \e offset roles. + The \e title, \e url and \e icon specify the title, URL, and favicon of the visited page. + The \e offset specifies + the position of the page in respect to the current page (0). A positive number indicates that + the page was visited after the current page, whereas a negative number indicates that the page + was visited before the current page. + + This type is uncreatable, but it can be accessed by using the + \l{WebEngineView::navigationHistory}{WebEngineView.navigationHistory} property. + + \sa WebEngineHistory +*/ + +QQuickWebEngineHistoryListModel::QQuickWebEngineHistoryListModel() + : QAbstractListModel() +{ +} + +QQuickWebEngineHistoryListModel::QQuickWebEngineHistoryListModel(QQuickWebEngineHistoryListModelPrivate *d) + : QAbstractListModel() + , d_ptr(d) +{ +} + +QQuickWebEngineHistoryListModel::~QQuickWebEngineHistoryListModel() +{ +} + +QHash<int, QByteArray> QQuickWebEngineHistoryListModel::roleNames() const +{ + QHash<int, QByteArray> roles; + roles[QQuickWebEngineHistory::UrlRole] = "url"; + roles[QQuickWebEngineHistory::TitleRole] = "title"; + roles[QQuickWebEngineHistory::OffsetRole] = "offset"; + roles[QQuickWebEngineHistory::IconUrlRole] = "icon"; + return roles; +} + +int QQuickWebEngineHistoryListModel::rowCount(const QModelIndex &index) const +{ + Q_UNUSED(index); + Q_D(const QQuickWebEngineHistoryListModel); + return d->count(); +} + +QVariant QQuickWebEngineHistoryListModel::data(const QModelIndex &index, int role) const +{ + Q_D(const QQuickWebEngineHistoryListModel); + + if (!index.isValid()) + return QVariant(); + + if (role < QQuickWebEngineHistory::UrlRole || role > QQuickWebEngineHistory::IconUrlRole) + return QVariant(); + + if (role == QQuickWebEngineHistory::UrlRole) + return QUrl(d->adapter()->getNavigationEntryUrl(d->index(index.row()))); + + if (role == QQuickWebEngineHistory::TitleRole) + return QString(d->adapter()->getNavigationEntryTitle(d->index(index.row()))); + + if (role == QQuickWebEngineHistory::OffsetRole) + return d->offsetForIndex(index.row()); + + if (role == QQuickWebEngineHistory::IconUrlRole) { + QUrl iconUrl = QUrl(d->adapter()->getNavigationEntryIconUrl(d->index(index.row()))); + return QQuickWebEngineFaviconProvider::faviconProviderUrl(iconUrl); + } + + return QVariant(); +} + +void QQuickWebEngineHistoryListModel::reset() +{ + beginResetModel(); + endResetModel(); +} + +QQuickWebEngineHistoryPrivate::QQuickWebEngineHistoryPrivate(QQuickWebEngineViewPrivate *view) + : m_view(view) +{ +} + +QQuickWebEngineHistoryPrivate::~QQuickWebEngineHistoryPrivate() +{ +} + +/*! + \qmltype WebEngineHistory + \instantiates QQuickWebEngineHistory + \inqmlmodule QtWebEngine + \since QtWebEngine 1.1 + + \brief Provides data models that represent the history of a web engine page. + + The WebEngineHistory type can be accessed by using the + \l{WebEngineView::navigationHistory}{WebEngineView.navigationHistory} property. + + The WebEngineHistory type provides the following WebEngineHistoryListModel data model objects: + + \list + \li \c backItems, which contains the URLs of visited pages. + \li \c forwardItems, which contains the URLs of the pages that were visited after visiting + the current page. + \li \c items, which contains the URLs of the back and forward items, as well as the URL of + the current page. + \endlist + + The easiest way to use these models is to use them in a ListView as illustrated by the + following code snippet: + + \code + ListView { + id: historyItemsList + anchors.fill: parent + model: webEngineView.navigationHistory.items + delegate: + Text { + color: "black" + text: model.title + " - " + model.url + " (" + model.offset + ")" + } + } + \endcode + + The ListView shows the content of the corresponding model. The delegate is responsible for the + format of the list items. The appearance of each item of the list in the delegate can be defined + separately (it is not web engine specific). + + The model roles \e title, \e url, and \e icon specify the title, URL, and favicon of the + visited page. The \e offset + role specifies the position of the page in respect to the current page (0). A positive number + indicates that the page was visited after the current page, whereas a negative number indicates + that the page was visited before the current page. + + The data models can also be used to create a menu, as illustrated by the following code + snippet: + + \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml + \skipto ToolBar + \printuntil onObjectRemoved + \printuntil } + \printuntil } + \printuntil } + + For the complete example, see \l{WebEngine Quick Nano Browser}. + + \sa WebEngineHistoryListModel +*/ + +QQuickWebEngineHistory::QQuickWebEngineHistory(QQuickWebEngineViewPrivate *view) + : d_ptr(new QQuickWebEngineHistoryPrivate(view)) +{ +} + +QQuickWebEngineHistory::~QQuickWebEngineHistory() +{ +} + +/*! + \qmlproperty WebEngineHistoryListModel WebEngineHistory::items + \readonly + + URLs of back items, forward items, and the current item in the history. +*/ +QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::items() const +{ + Q_D(const QQuickWebEngineHistory); + if (!d->m_navigationModel) + d->m_navigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineHistoryListModelPrivate(d->m_view))); + return d->m_navigationModel.data(); +} + +/*! + \qmlproperty WebEngineHistoryListModel WebEngineHistory::backItems + \readonly + + URLs of visited pages. +*/ +QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::backItems() const +{ + Q_D(const QQuickWebEngineHistory); + if (!d->m_backNavigationModel) + d->m_backNavigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineBackHistoryListModelPrivate(d->m_view))); + return d->m_backNavigationModel.data(); +} + +/*! + \qmlproperty WebEngineHistoryListModel WebEngineHistory::forwardItems + \readonly + + URLs of the pages that were visited after visiting the current page. +*/ +QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::forwardItems() const +{ + Q_D(const QQuickWebEngineHistory); + if (!d->m_forwardNavigationModel) + d->m_forwardNavigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineForwardHistoryListModelPrivate(d->m_view))); + return d->m_forwardNavigationModel.data(); +} + +/*! + \qmlmethod void WebEngineHistory::clear() + \since QtWebEngine 1.11 + + Clears the history. +*/ +void QQuickWebEngineHistory::clear() +{ + Q_D(QQuickWebEngineHistory); + d->m_view->adapter->clearNavigationHistory(); + d->m_view->updateNavigationActions(); + reset(); +} + +void QQuickWebEngineHistory::reset() +{ + Q_D(QQuickWebEngineHistory); + if (d->m_navigationModel) + d->m_navigationModel->reset(); + if (d->m_backNavigationModel) + d->m_backNavigationModel->reset(); + if (d->m_forwardNavigationModel) + d->m_forwardNavigationModel->reset(); +} + + +QT_END_NAMESPACE |