diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-08-16 18:41:02 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-08-20 18:16:03 +0200 |
commit | 6ffb1797617c65bef34d7ce19b07ab07db89aa0b (patch) | |
tree | 922f65a65a8ce07c3b41e8e56ae05a70c928d055 /lib | |
parent | c1c7c3cfa9d8c3e6f05095d0880a84a13a0d9e01 (diff) |
Implement QWebEnginePage::action for basic navigation.
This imports code from qwebpage.cpp and QWebPageAdapter.cpp of WebKit
into qwebenginepage.cpp and thus also restrict the license accordingly.
Change-Id: Ic5da8f2b469109cb10132cbe6585f2d941b14403
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/widgets/Api/qwebenginepage.cpp | 171 | ||||
-rw-r--r-- | lib/widgets/Api/qwebenginepage.h | 4 | ||||
-rw-r--r-- | lib/widgets/Api/qwebenginepage_p.h | 5 | ||||
-rw-r--r-- | lib/widgets/Api/qwebengineview.cpp | 12 |
4 files changed, 149 insertions, 43 deletions
diff --git a/lib/widgets/Api/qwebenginepage.cpp b/lib/widgets/Api/qwebenginepage.cpp index d2dee546f..6367ddecd 100644 --- a/lib/widgets/Api/qwebenginepage.cpp +++ b/lib/widgets/Api/qwebenginepage.cpp @@ -1,43 +1,24 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +/* + Copyright (C) 2012, 2013 Digia Plc and/or its subsidiary(-ies). + Copyright (C) 2008, 2009, 2012 Nokia Corporation and/or its subsidiary(-ies) + Copyright (C) 2007 Staikos Computing Services Inc. + Copyright (C) 2007 Apple Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ #include "qwebenginepage.h" #include "qwebenginepage_p.h" @@ -49,8 +30,9 @@ #include "render_widget_host_view_qt_delegate_widget.h" #include "web_contents_adapter.h" -#include <QUrl> +#include <QAction> #include <QLayout> +#include <QUrl> QWebEnginePagePrivate::QWebEnginePagePrivate() : QObjectPrivate(QObjectPrivateVersion) @@ -60,6 +42,7 @@ QWebEnginePagePrivate::QWebEnginePagePrivate() , m_isLoading(false) { history->d_func()->pagePrivate = this; + memset(actions, 0, sizeof(actions)); } QWebEnginePagePrivate::~QWebEnginePagePrivate() @@ -67,6 +50,11 @@ QWebEnginePagePrivate::~QWebEnginePagePrivate() delete history; } +RenderWidgetHostViewQtDelegate *QWebEnginePagePrivate::CreateRenderWidgetHostViewQtDelegate() +{ + return new RenderWidgetHostViewQtDelegateWidget; +} + void QWebEnginePagePrivate::titleChanged(const QString &title) { Q_Q(QWebEnginePage); @@ -88,6 +76,7 @@ void QWebEnginePagePrivate::loadingStateChanged() if (m_isLoading) Q_EMIT q->loadStarted(); } + updateNavigationActions(); } QRectF QWebEnginePagePrivate::viewportRect() const @@ -108,11 +97,60 @@ void QWebEnginePagePrivate::focusContainer() view->setFocus(); } -RenderWidgetHostViewQtDelegate *QWebEnginePagePrivate::CreateRenderWidgetHostViewQtDelegate() +void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const { - return new RenderWidgetHostViewQtDelegateWidget; +#ifdef QT_NO_ACTION + Q_UNUSED(action) +#else + QAction *a = actions[action]; + if (!a) + return; + + bool enabled = false; + + switch (action) { + case QWebEnginePage::Back: + enabled = adapter->canGoBack(); + break; + case QWebEnginePage::Forward: + enabled = adapter->canGoForward(); + break; + case QWebEnginePage::Stop: + enabled = adapter->isLoading(); + break; + case QWebEnginePage::Reload: + case QWebEnginePage::ReloadAndBypassCache: + enabled = !adapter->isLoading(); + break; + default: + break; + } + + a->setEnabled(enabled); +#endif // QT_NO_ACTION +} + +void QWebEnginePagePrivate::updateNavigationActions() +{ + updateAction(QWebEnginePage::Back); + updateAction(QWebEnginePage::Forward); + updateAction(QWebEnginePage::Stop); + updateAction(QWebEnginePage::Reload); + updateAction(QWebEnginePage::ReloadAndBypassCache); } +#ifndef QT_NO_ACTION +void QWebEnginePagePrivate::_q_webActionTriggered(bool checked) +{ + Q_Q(QWebEnginePage); + QAction *a = qobject_cast<QAction *>(q->sender()); + if (!a) + return; + QWebEnginePage::WebAction action = static_cast<QWebEnginePage::WebAction>(a->data().toInt()); + q->triggerAction(action, checked); +} +#endif // QT_NO_ACTION + QWebEnginePage::QWebEnginePage(QObject* parent) : QObject(*new QWebEnginePagePrivate, parent) { @@ -139,6 +177,53 @@ QWidget *QWebEnginePage::view() const return d->view; } +#ifndef QT_NO_ACTION +QAction *QWebEnginePage::action(WebAction action) const +{ + Q_D(const QWebEnginePage); + if (action == QWebEnginePage::NoWebAction) + return 0; + if (d->actions[action]) + return d->actions[action]; + + QString text; + QIcon icon; + QStyle *style = d->view ? d->view->style() : qApp->style(); + + switch (action) { + case Back: + text = tr("Back"); + icon = style->standardIcon(QStyle::SP_ArrowBack); + break; + case Forward: + text = tr("Forward"); + icon = style->standardIcon(QStyle::SP_ArrowForward); + break; + case Stop: + text = tr("Stop"); + icon = style->standardIcon(QStyle::SP_BrowserStop); + break; + case Reload: + text = tr("Reload"); + icon = style->standardIcon(QStyle::SP_BrowserReload); + break; + default: + break; + } + + QAction *a = new QAction(const_cast<QWebEnginePage*>(this)); + a->setText(text); + a->setData(action); + a->setIcon(icon); + + connect(a, SIGNAL(triggered(bool)), this, SLOT(_q_webActionTriggered(bool))); + + d->actions[action] = a; + d->updateAction(action); + return a; +} +#endif // QT_NO_ACTION + void QWebEnginePage::triggerAction(WebAction action, bool) { Q_D(QWebEnginePage); diff --git a/lib/widgets/Api/qwebenginepage.h b/lib/widgets/Api/qwebenginepage.h index 698a38d83..0a664edf8 100644 --- a/lib/widgets/Api/qwebenginepage.h +++ b/lib/widgets/Api/qwebenginepage.h @@ -549,6 +549,10 @@ protected: private: Q_DECLARE_PRIVATE(QWebEnginePage); +#ifndef QT_NO_ACTION + Q_PRIVATE_SLOT(d_func(), void _q_webActionTriggered(bool checked)) +#endif + friend class QWebEngineView; friend class QWebEngineViewPrivate; }; diff --git a/lib/widgets/Api/qwebenginepage_p.h b/lib/widgets/Api/qwebenginepage_p.h index c7f4e3696..b1987cbd0 100644 --- a/lib/widgets/Api/qwebenginepage_p.h +++ b/lib/widgets/Api/qwebenginepage_p.h @@ -70,9 +70,14 @@ public: virtual void loadFinished(bool success) Q_DECL_OVERRIDE; virtual void focusContainer() Q_DECL_OVERRIDE; + void updateAction(QWebEnginePage::WebAction) const; + void updateNavigationActions(); + void _q_webActionTriggered(bool checked); + QScopedPointer<WebContentsAdapter> adapter; QWebEngineHistory *history; QWebEngineView *view; + mutable QAction *actions[QWebEnginePage::WebActionCount]; bool m_isLoading; }; diff --git a/lib/widgets/Api/qwebengineview.cpp b/lib/widgets/Api/qwebengineview.cpp index 7e8ee3526..1bf1acf4d 100644 --- a/lib/widgets/Api/qwebengineview.cpp +++ b/lib/widgets/Api/qwebengineview.cpp @@ -129,6 +129,18 @@ QUrl QWebEngineView::url() const return page()->url(); } +#ifndef QT_NO_ACTION +QAction* QWebEngineView::pageAction(QWebEnginePage::WebAction action) const +{ + return page()->action(action); +} +#endif + +void QWebEngineView::triggerPageAction(QWebEnginePage::WebAction action, bool checked) +{ + page()->triggerAction(action, checked); +} + void QWebEngineView::stop() { page()->triggerAction(QWebEnginePage::Stop); |