diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-05-09 12:04:12 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-06-09 18:58:54 +0200 |
commit | 5d1ef38f9f6815807596d0606cf7ed06b7930aac (patch) | |
tree | 441c2b27eb9d169d58cb94a30ac424ebb6b42b65 /src/webenginequick | |
parent | 3f5b5213d42376470274f0e3aaa51731f0d2552a (diff) |
Create a RWHV delegate in core
This is adapting the Quick code for shared use with widgets,
and allows us to use it from QWebEnginePage.
Pick-to: 6.4
Fixes: QTBUG-96377
Change-Id: I3f09c1a949eff86d80fbe6c513dc66e3f9f2f611
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src/webenginequick')
10 files changed, 394 insertions, 769 deletions
diff --git a/src/webenginequick/CMakeLists.txt b/src/webenginequick/CMakeLists.txt index 3800f8386..ebe1ddf54 100644 --- a/src/webenginequick/CMakeLists.txt +++ b/src/webenginequick/CMakeLists.txt @@ -34,7 +34,7 @@ qt_internal_add_qml_module(WebEngineQuick api/qquickwebengineforeigntypes_p.h api/qtwebenginequickglobal.cpp api/qtwebenginequickglobal.h api/qtwebenginequickglobal_p.h - render_widget_host_view_qt_delegate_quick.cpp render_widget_host_view_qt_delegate_quick.h + qquickwebengine_accessible.cpp qquickwebengine_accessible.h render_widget_host_view_qt_delegate_quickwindow.cpp render_widget_host_view_qt_delegate_quickwindow.h ui_delegates_manager.cpp ui_delegates_manager.h DEFINES diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index 7eb5a8677..24c059d39 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -59,7 +59,8 @@ #include "file_picker_controller.h" #include "find_text_helper.h" #include "javascript_dialog_controller.h" -#include "render_widget_host_view_qt_delegate_quick.h" +#include "qquickwebengine_accessible.h" +#include "render_widget_host_view_qt_delegate_item.h" #include "render_widget_host_view_qt_delegate_quickwindow.h" #include "touch_selection_menu_controller.h" #include "ui_delegates_manager.h" @@ -139,14 +140,61 @@ Q_STATIC_ASSERT(static_cast<int>(QQuickWebEngineView::LoadSucceededStatus) == st QT_WARNING_POP #endif -#ifndef QT_NO_ACCESSIBILITY +class WebEngineQuickWidgetDelegate : public QtWebEngineCore::WidgetDelegate +{ +public: + WebEngineQuickWidgetDelegate(QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *item, QQuickWebEngineView *parent) + : m_contentItem(item) + , m_parentView(parent) + { + } + + ~WebEngineQuickWidgetDelegate() override + { + if (m_contentItem) + m_contentItem->setWidgetDelegate(nullptr); + } + + void InitAsPopup(const QRect &screenRect) override + { + Q_UNUSED(screenRect); + Q_UNREACHABLE(); + } + + void Bind(WebContentsAdapterClient *client) override + { + QQuickWebEngineViewPrivate::bindViewAndWidget( + static_cast<QQuickWebEngineViewPrivate *>(client)->q_func(), m_contentItem); + } + + void Unbind() override + { + QQuickWebEngineViewPrivate::bindViewAndWidget(nullptr, m_contentItem); + } + + void Destroy() override + { + delete this; + } + + bool ActiveFocusOnPress() override + { + return m_parentView->property("activeFocusOnPress").toBool() || m_parentView->hasActiveFocus(); + } + +private: + QPointer<RenderWidgetHostViewQtDelegateItem> m_contentItem; // deleted by core + QPointer<QQuickWebEngineView> m_parentView; +}; + +#if QT_CONFIG(accessibility) static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *object) { if (QQuickWebEngineView *v = qobject_cast<QQuickWebEngineView*>(object)) return new QQuickWebEngineViewAccessible(v); - return 0; + return nullptr; } -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) static QLatin1String defaultMimeType("text/html;charset=UTF-8"); @@ -174,9 +222,9 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() { memset(actions, 0, sizeof(actions)); -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) QAccessible::installFactory(&webAccessibleFactory); -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) } QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() @@ -234,22 +282,26 @@ UIDelegatesManager *QQuickWebEngineViewPrivate::ui() RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client) { - return new RenderWidgetHostViewQtDelegateQuick(client, /*isPopup = */ false); + Q_Q(QQuickWebEngineView); + auto *item = new RenderWidgetHostViewQtDelegateItem(client, /*isPopup = */ false); + item->setWidgetDelegate(new WebEngineQuickWidgetDelegate(item, q)); + return item; } RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHostViewQtDelegateForPopup(RenderWidgetHostViewQtDelegateClient *client) { Q_Q(QQuickWebEngineView); const bool hasWindowCapability = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::MultipleWindows); - RenderWidgetHostViewQtDelegateQuick *quickDelegate = new RenderWidgetHostViewQtDelegateQuick(client, /*isPopup = */ true); + RenderWidgetHostViewQtDelegateItem *quickDelegate = new RenderWidgetHostViewQtDelegateItem(client, /*isPopup = */ true); if (hasWindowCapability) { RenderWidgetHostViewQtDelegateQuickWindow *wrapperWindow = new RenderWidgetHostViewQtDelegateQuickWindow(quickDelegate, q->window()); + quickDelegate->setWidgetDelegate(wrapperWindow); wrapperWindow->setVirtualParent(q); - quickDelegate->setParentItem(wrapperWindow->contentItem()); - return wrapperWindow; + return quickDelegate; } quickDelegate->setParentItem(q); + quickDelegate->setWidgetDelegate(new WebEngineQuickWidgetDelegate(quickDelegate, q)); quickDelegate->show(); return quickDelegate; } @@ -715,74 +767,6 @@ void QQuickWebEngineViewPrivate::visibleChanged(bool visible) Q_UNUSED(visible); } -#ifndef QT_NO_ACCESSIBILITY -QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView *o) - : QAccessibleObject(o) -{} - -bool QQuickWebEngineViewAccessible::isValid() const -{ - if (!QAccessibleObject::isValid()) - return false; - - if (!engineView() || !engineView()->d_func()) - return false; - - return true; -} - -QAccessibleInterface *QQuickWebEngineViewAccessible::parent() const -{ - QQuickItem *parent = engineView()->parentItem(); - QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(parent); - if (!iface) - return QAccessible::queryAccessibleInterface(engineView()->window()); - return iface; -} - -QAccessibleInterface *QQuickWebEngineViewAccessible::focusChild() const -{ - if (child(0) && child(0)->focusChild()) - return child(0)->focusChild(); - return const_cast<QQuickWebEngineViewAccessible *>(this); -} - -int QQuickWebEngineViewAccessible::childCount() const -{ - return child(0) ? 1 : 0; -} - -QAccessibleInterface *QQuickWebEngineViewAccessible::child(int index) const -{ - if (index == 0 && isValid()) - return engineView()->d_func()->adapter->browserAccessible(); - return nullptr; -} - -int QQuickWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const -{ - if (child(0) && c == child(0)) - return 0; - return -1; -} - -QString QQuickWebEngineViewAccessible::text(QAccessible::Text) const -{ - return QString(); -} - -QAccessible::Role QQuickWebEngineViewAccessible::role() const -{ - return QAccessible::Client; -} - -QAccessible::State QQuickWebEngineViewAccessible::state() const -{ - QAccessible::State s; - return s; -} -#endif // QT_NO_ACCESSIBILITY - class WebContentsAdapterOwner : public QObject { public: @@ -912,7 +896,7 @@ void QQuickWebEngineViewPrivate::setFullScreenMode(bool fullscreen) } void QQuickWebEngineViewPrivate::bindViewAndWidget(QQuickWebEngineView *view, - RenderWidgetHostViewQtDelegateQuick *widget) + RenderWidgetHostViewQtDelegateItem *widget) { auto oldWidget = view ? view->d_func()->widget : nullptr; auto oldView = widget ? widget->m_view : nullptr; @@ -940,8 +924,8 @@ void QQuickWebEngineViewPrivate::bindViewAndWidget(QQuickWebEngineView *view, view->d_func()->widgetChanged(oldWidget, widget); } -void QQuickWebEngineViewPrivate::widgetChanged(RenderWidgetHostViewQtDelegateQuick *oldWidget, - RenderWidgetHostViewQtDelegateQuick *newWidget) +void QQuickWebEngineViewPrivate::widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *oldWidget, + QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *newWidget) { Q_Q(QQuickWebEngineView); diff --git a/src/webenginequick/api/qquickwebengineview_p.h b/src/webenginequick/api/qquickwebengineview_p.h index fb736085b..46b92b9c6 100644 --- a/src/webenginequick/api/qquickwebengineview_p.h +++ b/src/webenginequick/api/qquickwebengineview_p.h @@ -57,10 +57,6 @@ #include <QtQml/qqmlregistration.h> #include <QtQuick/qquickitem.h> -namespace QtWebEngineCore { -class RenderWidgetHostViewQtDelegateQuick; -} - QT_BEGIN_NAMESPACE class QQmlWebChannel; @@ -589,7 +585,6 @@ private: Q_DECLARE_PRIVATE(QQuickWebEngineView) QScopedPointer<QQuickWebEngineViewPrivate> d_ptr; - friend class QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick; friend class QQuickContextMenuBuilder; friend class FaviconImageResponse; friend class FaviconImageResponseRunnable; diff --git a/src/webenginequick/api/qquickwebengineview_p_p.h b/src/webenginequick/api/qquickwebengineview_p_p.h index 2096f79c6..fe9f78322 100644 --- a/src/webenginequick/api/qquickwebengineview_p_p.h +++ b/src/webenginequick/api/qquickwebengineview_p_p.h @@ -66,7 +66,7 @@ #include <QtGui/qaccessibleobject.h> namespace QtWebEngineCore { -class RenderWidgetHostViewQtDelegateQuick; +class RenderWidgetHostViewQtDelegateItem; class TouchSelectionMenuController; class UIDelegatesManager; class WebContentsAdapter; @@ -174,9 +174,9 @@ public: void ensureContentsAdapter(); void setFullScreenMode(bool); - static void bindViewAndWidget(QQuickWebEngineView *view, QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *widget); - void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *oldWidget, - QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *newWidget); + static void bindViewAndWidget(QQuickWebEngineView *view, QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *widget); + void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *oldWidget, + QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *newWidget); QQuickWebEngineProfile *m_profile; QSharedPointer<QtWebEngineCore::WebContentsAdapter> adapter; @@ -200,7 +200,7 @@ public: bool m_defaultAudioMuted; bool m_isBeingAdopted; mutable QQuickWebEngineAction *actions[QQuickWebEngineView::WebActionCount]; - QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *widget = nullptr; + QtWebEngineCore::RenderWidgetHostViewQtDelegateItem *widget = nullptr; bool profileInitialized() const; QQuickWebEngineScriptCollection *getUserScripts(); @@ -216,26 +216,6 @@ private: QQmlComponent *m_touchHandleDelegate; }; -#ifndef QT_NO_ACCESSIBILITY -class QQuickWebEngineViewAccessible : public QAccessibleObject -{ -public: - QQuickWebEngineViewAccessible(QQuickWebEngineView *o); - bool isValid() const override; - QAccessibleInterface *parent() const override; - QAccessibleInterface *focusChild() const override; - int childCount() const override; - QAccessibleInterface *child(int index) const override; - int indexOfChild(const QAccessibleInterface*) const override; - QString text(QAccessible::Text) const override; - QAccessible::Role role() const override; - QAccessible::State state() const override; - -private: - QQuickWebEngineView *engineView() const { return static_cast<QQuickWebEngineView*>(object()); } -}; -#endif // QT_NO_ACCESSIBILITY - class QQuickContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt { public: diff --git a/src/webenginequick/qquickwebengine_accessible.cpp b/src/webenginequick/qquickwebengine_accessible.cpp new file mode 100644 index 000000000..8d9f2bd63 --- /dev/null +++ b/src/webenginequick/qquickwebengine_accessible.cpp @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2022 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 "qquickwebengine_accessible.h" + +#include <QQuickItem> +#include <QQuickWindow> + +#include "api/qquickwebengineview_p.h" +#include "api/qquickwebengineview_p_p.h" +#include "web_contents_adapter.h" + + +#if QT_CONFIG(accessibility) +QT_BEGIN_NAMESPACE +QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView *o) + : QAccessibleObject(o) +{} + +bool QQuickWebEngineViewAccessible::isValid() const +{ + if (!QAccessibleObject::isValid()) + return false; + + if (!engineView() || !engineView()->d_func()) + return false; + + return true; +} + +QAccessibleInterface *QQuickWebEngineViewAccessible::parent() const +{ + QQuickItem *parent = engineView()->parentItem(); + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(parent); + if (!iface) + return QAccessible::queryAccessibleInterface(engineView()->window()); + return iface; +} + +QAccessibleInterface *QQuickWebEngineViewAccessible::focusChild() const +{ + if (child(0) && child(0)->focusChild()) + return child(0)->focusChild(); + return const_cast<QQuickWebEngineViewAccessible *>(this); +} + +int QQuickWebEngineViewAccessible::childCount() const +{ + return child(0) ? 1 : 0; +} + +QAccessibleInterface *QQuickWebEngineViewAccessible::child(int index) const +{ + if (index == 0 && isValid()) + return engineView()->d_func()->adapter->browserAccessible(); + return nullptr; +} + +int QQuickWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const +{ + if (child(0) && c == child(0)) + return 0; + return -1; +} + +QString QQuickWebEngineViewAccessible::text(QAccessible::Text) const +{ + return QString(); +} + +QAccessible::Role QQuickWebEngineViewAccessible::role() const +{ + return QAccessible::Client; +} + +QAccessible::State QQuickWebEngineViewAccessible::state() const +{ + QAccessible::State s; + return s; +} + +QQuickWebEngineView *QQuickWebEngineViewAccessible::engineView() const +{ + return static_cast<QQuickWebEngineView*>(object()); +} + +QT_END_NAMESPACE + +namespace QtWebEngineCore { + +RenderWidgetHostViewQtDelegateQuickAccessible::RenderWidgetHostViewQtDelegateQuickAccessible(QObject *o, QQuickWebEngineView *view) + : QAccessibleObject(o) + , m_view(view) +{ +} + +bool RenderWidgetHostViewQtDelegateQuickAccessible::isValid() const +{ + if (!viewAccessible() || !viewAccessible()->isValid()) + return false; + + return QAccessibleObject::isValid(); +} + +QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::parent() const +{ + return viewAccessible()->parent(); +} + +QString RenderWidgetHostViewQtDelegateQuickAccessible::text(QAccessible::Text) const +{ + return QString(); +} + +QAccessible::Role RenderWidgetHostViewQtDelegateQuickAccessible::role() const +{ + return QAccessible::Client; +} + +QAccessible::State RenderWidgetHostViewQtDelegateQuickAccessible::state() const +{ + return viewAccessible()->state(); +} + +QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::focusChild() const +{ + return viewAccessible()->focusChild(); +} + +int RenderWidgetHostViewQtDelegateQuickAccessible::childCount() const +{ + return viewAccessible()->childCount(); +} + +QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::child(int index) const +{ + return viewAccessible()->child(index); +} + +int RenderWidgetHostViewQtDelegateQuickAccessible::indexOfChild(const QAccessibleInterface *c) const +{ + return viewAccessible()->indexOfChild(c); +} + +QQuickWebEngineViewAccessible *RenderWidgetHostViewQtDelegateQuickAccessible::viewAccessible() const +{ + return static_cast<QQuickWebEngineViewAccessible *>(QAccessible::queryAccessibleInterface(m_view)); +} +} // namespace QtWebEngineCore +#endif // QT_CONFIG(accessibility) diff --git a/src/webenginequick/qquickwebengine_accessible.h b/src/webenginequick/qquickwebengine_accessible.h new file mode 100644 index 000000000..0005ed9cc --- /dev/null +++ b/src/webenginequick/qquickwebengine_accessible.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2022 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$ +** +****************************************************************************/ + +#ifndef QQUICKWEBENGINE_ACCESSIBLE_H +#define QQUICKWEBENGINE_ACCESSIBLE_H + +#include <QtCore/qpointer.h> +#include <QtGui/qaccessibleobject.h> + +#if QT_CONFIG(accessibility) + +QT_BEGIN_NAMESPACE +class QQuickWebEngineView; + +class QQuickWebEngineViewAccessible : public QAccessibleObject +{ +public: + QQuickWebEngineViewAccessible(QQuickWebEngineView *o); + bool isValid() const override; + QAccessibleInterface *parent() const override; + QAccessibleInterface *focusChild() const override; + int childCount() const override; + QAccessibleInterface *child(int index) const override; + int indexOfChild(const QAccessibleInterface *) const override; + QString text(QAccessible::Text) const override; + QAccessible::Role role() const override; + QAccessible::State state() const override; + +private: + QQuickWebEngineView *engineView() const; +}; + +QT_END_NAMESPACE + +namespace QtWebEngineCore { +class RenderWidgetHostViewQtDelegateQuickAccessible : public QAccessibleObject +{ +public: + RenderWidgetHostViewQtDelegateQuickAccessible(QObject *o, QQuickWebEngineView *view); + + bool isValid() const override; + QAccessibleInterface *parent() const override; + QString text(QAccessible::Text t) const override; + QAccessible::Role role() const override; + QAccessible::State state() const override; + + QAccessibleInterface *focusChild() const override; + int childCount() const override; + QAccessibleInterface *child(int index) const override; + int indexOfChild(const QAccessibleInterface *) const override; + +private: + QQuickWebEngineViewAccessible *viewAccessible() const; + QPointer<QQuickWebEngineView> m_view; +}; +} // namespace QtWebEngineCore + +#endif // QT_CONFIG(accessibility) + +#endif // QQUICKWEBENGINE_ACCESSIBLE_H diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quick.cpp b/src/webenginequick/render_widget_host_view_qt_delegate_quick.cpp deleted file mode 100644 index 93311d992..000000000 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quick.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/**************************************************************************** -** -** 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 "render_widget_host_view_qt_delegate_quick.h" - -#include "render_widget_host_view_qt_delegate_client.h" - -#include "qquickwebengineview_p.h" -#include "qquickwebengineview_p_p.h" - -#include <QtCore/qvariant.h> -#include <QtGui/qguiapplication.h> -#include <QtGui/qwindow.h> -#include <QtQuick/qquickwindow.h> -#include <QtQuick/qsgimagenode.h> - -namespace QtWebEngineCore { - -RenderWidgetHostViewQtDelegateQuick::RenderWidgetHostViewQtDelegateQuick(RenderWidgetHostViewQtDelegateClient *client, bool isPopup) - : m_client(client) - , m_isPopup(isPopup) -{ - setFlag(ItemHasContents); - setAcceptedMouseButtons(Qt::AllButtons); - setAcceptHoverEvents(true); - setAcceptTouchEvents(true); - if (!isPopup) { - setFocus(true); - setActiveFocusOnTab(true); - } - bind(client->compositorId()); -} - -RenderWidgetHostViewQtDelegateQuick::~RenderWidgetHostViewQtDelegateQuick() -{ - QQuickWebEngineViewPrivate::bindViewAndWidget(nullptr, this); -} - -void RenderWidgetHostViewQtDelegateQuick::initAsPopup(const QRect &screenRect) -{ - //note this is called when there is no windowing system - //otherwsie see RenderWidgetHostViewQtDelegateQuickWindow - Q_ASSERT(m_isPopup && parentItem()); - setPosition(screenRect.topLeft()); - setSize(screenRect.size()); - setVisible(true); -} - -QRectF RenderWidgetHostViewQtDelegateQuick::viewGeometry() const -{ - // Transform the entire rect to find the correct top left corner. - const QPointF p1 = mapToGlobal(mapFromScene(QPointF(0, 0))); - const QPointF p2 = mapToGlobal(mapFromScene(QPointF(width(), height()))); - QRectF geometry = QRectF(p1, p2).normalized(); - // But keep the size untransformed to behave like other QQuickItems. - geometry.setSize(size()); - return geometry; -} - -QRect RenderWidgetHostViewQtDelegateQuick::windowGeometry() const -{ - if (!window()) - return QRect(); - return window()->frameGeometry(); -} - -void RenderWidgetHostViewQtDelegateQuick::setKeyboardFocus() -{ - setFocus(true); -} - -bool RenderWidgetHostViewQtDelegateQuick::hasKeyboardFocus() -{ - return hasActiveFocus(); -} - -void RenderWidgetHostViewQtDelegateQuick::lockMouse() -{ - grabMouse(); -} - -void RenderWidgetHostViewQtDelegateQuick::unlockMouse() -{ - ungrabMouse(); -} - -void RenderWidgetHostViewQtDelegateQuick::show() -{ - setVisible(true); - m_client->notifyShown(); -} - -void RenderWidgetHostViewQtDelegateQuick::hide() -{ - setVisible(false); - m_client->notifyHidden(); -} - -bool RenderWidgetHostViewQtDelegateQuick::isVisible() const -{ - return QQuickItem::isVisible(); -} - -QWindow* RenderWidgetHostViewQtDelegateQuick::window() const -{ - return QQuickItem::window(); -} - -void RenderWidgetHostViewQtDelegateQuick::readyToSwap() -{ - // Call update() on UI thread. - QMetaObject::invokeMethod(this, &QQuickItem::update, Qt::QueuedConnection); -} - -void RenderWidgetHostViewQtDelegateQuick::updateCursor(const QCursor &cursor) -{ - setCursor(cursor); -} - -void RenderWidgetHostViewQtDelegateQuick::resize(int width, int height) -{ - setSize(QSizeF(width, height)); -} - -void RenderWidgetHostViewQtDelegateQuick::inputMethodStateChanged(bool editorVisible, bool passwordInput) -{ - setFlag(QQuickItem::ItemAcceptsInputMethod, editorVisible && !passwordInput); - - if (parentItem()) - parentItem()->setFlag(QQuickItem::ItemAcceptsInputMethod, editorVisible && !passwordInput); - - qApp->inputMethod()->update(Qt::ImQueryInput | Qt::ImEnabled | Qt::ImHints); - if (qApp->inputMethod()->isVisible() != editorVisible) - qApp->inputMethod()->setVisible(editorVisible); -} - -bool RenderWidgetHostViewQtDelegateQuick::event(QEvent *event) -{ - if (event->type() == QEvent::ShortcutOverride) - return m_client->forwardEvent(event); - -#ifndef QT_NO_GESTURES - if (event->type() == QEvent::NativeGesture) - return m_client->forwardEvent(event); -#endif - - return QQuickItem::event(event); -} - -void RenderWidgetHostViewQtDelegateQuick::focusInEvent(QFocusEvent *event) -{ -#if QT_CONFIG(accessibility) - if (QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(this)->focusChild()) { - QAccessibleEvent focusEvent(iface, QAccessible::Focus); - QAccessible::updateAccessibility(&focusEvent); - } -#endif // QT_CONFIG(accessibility) - - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::focusOutEvent(QFocusEvent *event) -{ - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::mousePressEvent(QMouseEvent *event) -{ - QQuickItem *parent = parentItem(); - if (!m_isPopup && (parent && parent->property("activeFocusOnPress").toBool())) - forceActiveFocus(); - if (!m_isPopup && parent && !parent->property("activeFocusOnPress").toBool() && !parent->hasActiveFocus()) { - event->ignore(); - return; - } - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::mouseMoveEvent(QMouseEvent *event) -{ - QQuickItem *parent = parentItem(); - if (parent && !parent->property("activeFocusOnPress").toBool() && !parent->hasActiveFocus()) { - event->ignore(); - return; - } - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::mouseReleaseEvent(QMouseEvent *event) -{ - QQuickItem *parent = parentItem(); - if (!m_isPopup && parent && !parent->property("activeFocusOnPress").toBool() && !parent->hasActiveFocus()) { - event->ignore(); - return; - } - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::keyPressEvent(QKeyEvent *event) -{ - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::keyReleaseEvent(QKeyEvent *event) -{ - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::wheelEvent(QWheelEvent *event) -{ - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::touchEvent(QTouchEvent *event) -{ - QQuickItem *parent = parentItem(); - if (!m_isPopup && parent) { - if (event->type() == QEvent::TouchBegin && parent->property("activeFocusOnPress").toBool()) - forceActiveFocus(); - - if (!parent->property("activeFocusOnPress").toBool() && !parent->hasActiveFocus()) { - event->ignore(); - return; - } - } - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::hoverMoveEvent(QHoverEvent *event) -{ - QQuickItem *parent = parentItem(); - if ((!m_isPopup && parent && !parent->property("activeFocusOnPress").toBool() - && !parent->hasActiveFocus()) - || event->position() == event->oldPosF()) { - event->ignore(); - return; - } - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::hoverLeaveEvent(QHoverEvent *event) -{ - m_client->forwardEvent(event); -} - -QVariant RenderWidgetHostViewQtDelegateQuick::inputMethodQuery(Qt::InputMethodQuery query) const -{ - return m_client->inputMethodQuery(query); -} - -void RenderWidgetHostViewQtDelegateQuick::inputMethodEvent(QInputMethodEvent *event) -{ - m_client->forwardEvent(event); -} - -void RenderWidgetHostViewQtDelegateQuick::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) -{ - QQuickItem::geometryChange(newGeometry, oldGeometry); - m_client->visualPropertiesChanged(); -} - -void RenderWidgetHostViewQtDelegateQuick::itemChange(ItemChange change, const ItemChangeData &value) -{ - QQuickItem::itemChange(change, value); - if (change == QQuickItem::ItemSceneChange) { - for (const QMetaObject::Connection &c : qAsConst(m_windowConnections)) - disconnect(c); - m_windowConnections.clear(); - if (value.window) { - m_windowConnections.append(connect(value.window, SIGNAL(beforeRendering()), - SLOT(onBeforeRendering()), Qt::DirectConnection)); - m_windowConnections.append(connect(value.window, SIGNAL(xChanged(int)), SLOT(onWindowPosChanged()))); - m_windowConnections.append(connect(value.window, SIGNAL(yChanged(int)), SLOT(onWindowPosChanged()))); - if (!m_isPopup) - m_windowConnections.append(connect(value.window, SIGNAL(closing(QQuickCloseEvent *)), SLOT(onHide()))); - } - m_client->visualPropertiesChanged(); - } else if (change == QQuickItem::ItemVisibleHasChanged) { - if (!m_isPopup && !value.boolValue) - onHide(); - } -} - -QSGNode *RenderWidgetHostViewQtDelegateQuick::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) -{ - auto comp = compositor(); - if (!comp) - return nullptr; - - QQuickWindow *win = QQuickItem::window(); - - // Delete old node before swapFrame to decrement refcount of - // QImage in software mode. - delete oldNode; - QSGImageNode *node = win->createImageNode(); - node->setOwnsTexture(true); - - comp->swapFrame(); - - QSize texSize = comp->size(); - QSizeF texSizeInDips = QSizeF(texSize) / comp->devicePixelRatio(); - node->setRect(QRectF(QPointF(0, 0), texSizeInDips)); - - if (comp->type() == Compositor::Type::Software) { - QImage image = comp->image(); - node->setTexture(win->createTextureFromImage(image)); - } else if (comp->type() == Compositor::Type::OpenGL) { - QQuickWindow::CreateTextureOptions texOpts; -#if QT_CONFIG(opengl) - if (comp->hasAlphaChannel()) - texOpts.setFlag(QQuickWindow::TextureHasAlphaChannel); - int texId = comp->textureId(); - node->setTexture(QNativeInterface::QSGOpenGLTexture::fromNative(texId, win, texSize, texOpts)); - node->setTextureCoordinatesTransform(QSGImageNode::MirrorVertically); -#else - Q_UNREACHABLE(); -#endif - } else { - Q_UNREACHABLE(); - } - - return node; -} - -void RenderWidgetHostViewQtDelegateQuick::onBeforeRendering() -{ - auto comp = compositor(); - if (!comp || comp->type() != Compositor::Type::OpenGL) - return; - comp->waitForTexture(); -} - -void RenderWidgetHostViewQtDelegateQuick::onWindowPosChanged() -{ - m_client->visualPropertiesChanged(); -} - -void RenderWidgetHostViewQtDelegateQuick::onHide() -{ - QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason); - m_client->forwardEvent(&event); -} - -void RenderWidgetHostViewQtDelegateQuick::adapterClientChanged(WebContentsAdapterClient *client) -{ - QQuickWebEngineViewPrivate::bindViewAndWidget( - static_cast<QQuickWebEngineViewPrivate *>(client)->q_func(), this); -} - -#if QT_CONFIG(accessibility) -RenderWidgetHostViewQtDelegateQuickAccessible::RenderWidgetHostViewQtDelegateQuickAccessible(RenderWidgetHostViewQtDelegateQuick *o, QQuickWebEngineView *view) - : QAccessibleObject(o) - , m_view(view) -{ -} - -bool RenderWidgetHostViewQtDelegateQuickAccessible::isValid() const -{ - if (!viewAccessible() || !viewAccessible()->isValid()) - return false; - - return QAccessibleObject::isValid(); -} - -QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::parent() const -{ - return viewAccessible()->parent(); -} - -QString RenderWidgetHostViewQtDelegateQuickAccessible::text(QAccessible::Text) const -{ - return QString(); -} - -QAccessible::Role RenderWidgetHostViewQtDelegateQuickAccessible::role() const -{ - return QAccessible::Client; -} - -QAccessible::State RenderWidgetHostViewQtDelegateQuickAccessible::state() const -{ - return viewAccessible()->state(); -} - -QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::focusChild() const -{ - return viewAccessible()->focusChild(); -} - -int RenderWidgetHostViewQtDelegateQuickAccessible::childCount() const -{ - return viewAccessible()->childCount(); -} - -QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::child(int index) const -{ - return viewAccessible()->child(index); -} - -int RenderWidgetHostViewQtDelegateQuickAccessible::indexOfChild(const QAccessibleInterface *c) const -{ - return viewAccessible()->indexOfChild(c); -} - -QQuickWebEngineViewAccessible *RenderWidgetHostViewQtDelegateQuickAccessible::viewAccessible() const -{ - return static_cast<QQuickWebEngineViewAccessible *>(QAccessible::queryAccessibleInterface(m_view)); -} -#endif // QT_CONFIG(accessibility) - -} // namespace QtWebEngineCore - -#include "moc_render_widget_host_view_qt_delegate_quick.cpp" diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quick.h b/src/webenginequick/render_widget_host_view_qt_delegate_quick.h deleted file mode 100644 index 1580e0614..000000000 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quick.h +++ /dev/null @@ -1,147 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -#ifndef RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_QUICK_H -#define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_QUICK_H - -#include "compositor/compositor.h" -#include "render_widget_host_view_qt_delegate.h" - -#include <QtGui/qaccessibleobject.h> -#include <QtQuick/qquickitem.h> - -QT_BEGIN_NAMESPACE -class QQuickWebEngineView; -class QQuickWebEngineViewAccessible; -class QQuickWebEngineViewPrivate; -QT_END_NAMESPACE - -namespace QtWebEngineCore { - -class RenderWidgetHostViewQtDelegateClient; - -class RenderWidgetHostViewQtDelegateQuick : public QQuickItem, - public RenderWidgetHostViewQtDelegate, - public Compositor::Observer -{ - Q_OBJECT -public: - RenderWidgetHostViewQtDelegateQuick(RenderWidgetHostViewQtDelegateClient *client, bool isPopup); - ~RenderWidgetHostViewQtDelegateQuick(); - - void initAsPopup(const QRect&) override; - QRectF viewGeometry() const override; - QRect windowGeometry() const override; - void setKeyboardFocus() override; - bool hasKeyboardFocus() override; - void lockMouse() override; - void unlockMouse() override; - void show() override; - void hide() override; - bool isVisible() const override; - QWindow* window() const override; - void updateCursor(const QCursor &) override; - void resize(int width, int height) override; - void move(const QPoint&) override { } - void inputMethodStateChanged(bool editorVisible, bool isPasswordInput) override; - void setInputMethodHints(Qt::InputMethodHints) override { } - // The QtQuick view doesn't have a backbuffer of its own and doesn't need this - void setClearColor(const QColor &) override { } - void readyToSwap() override; - void adapterClientChanged(WebContentsAdapterClient *client) override; - -protected: - bool event(QEvent *event) override; - void focusInEvent(QFocusEvent *event) override; - void focusOutEvent(QFocusEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void keyPressEvent(QKeyEvent *event) override; - void keyReleaseEvent(QKeyEvent *event) override; - void wheelEvent(QWheelEvent *event) override; - void touchEvent(QTouchEvent *event) override; - void hoverMoveEvent(QHoverEvent *event) override; - void hoverLeaveEvent(QHoverEvent *event) override; - QVariant inputMethodQuery(Qt::InputMethodQuery query) const override; - void inputMethodEvent(QInputMethodEvent *event) override; - void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; - void itemChange(ItemChange change, const ItemChangeData &value) override; - QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; - -private Q_SLOTS: - void onBeforeRendering(); - void onWindowPosChanged(); - void onHide(); - -private: - friend QQuickWebEngineViewPrivate; - - RenderWidgetHostViewQtDelegateClient *m_client; - QList<QMetaObject::Connection> m_windowConnections; - bool m_isPopup; - QQuickWebEngineView *m_view = nullptr; -}; - -#if QT_CONFIG(accessibility) -class RenderWidgetHostViewQtDelegateQuickAccessible : public QAccessibleObject -{ -public: - RenderWidgetHostViewQtDelegateQuickAccessible(RenderWidgetHostViewQtDelegateQuick *o, QQuickWebEngineView *view); - - bool isValid() const override; - QAccessibleInterface *parent() const override; - QString text(QAccessible::Text t) const override; - QAccessible::Role role() const override; - QAccessible::State state() const override; - - QAccessibleInterface *focusChild() const override; - int childCount() const override; - QAccessibleInterface *child(int index) const override; - int indexOfChild(const QAccessibleInterface *) const override; - -private: - QQuickWebEngineViewAccessible *viewAccessible() const; - QQuickWebEngineView *m_view; -}; -#endif // QT_CONFIG(accessibility) - -} // namespace QtWebEngineCore - -#endif diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp index 7cae38b2e..911d10c8a 100644 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -37,10 +37,9 @@ ** ****************************************************************************/ -#include "render_widget_host_view_qt_delegate_quick.h" #include "render_widget_host_view_qt_delegate_quickwindow.h" -#include <QtQuick/qquickitem.h> +#include "api/qquickwebengineview_p_p.h" namespace QtWebEngineCore { @@ -68,14 +67,19 @@ static inline QPointF transformPoint(const QPointF &point, const QTransform &tra } RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow( - RenderWidgetHostViewQtDelegateQuick *realDelegate, QWindow *parent) + RenderWidgetHostViewQtDelegateItem *realDelegate, QWindow *parent) : QQuickWindow(parent), m_realDelegate(realDelegate), m_virtualParent(nullptr), m_rotated(false) { setFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); + realDelegate->setParentItem(contentItem()); } RenderWidgetHostViewQtDelegateQuickWindow::~RenderWidgetHostViewQtDelegateQuickWindow() { + if (m_realDelegate) { + m_realDelegate->setWidgetDelegate(nullptr); + m_realDelegate->setParentItem(nullptr); + } } void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *virtualParent) @@ -86,9 +90,9 @@ void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *vir // rect is window geometry in form of parent window offset + offset in scene coordinates // chromium knows nothing about local transformation -void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) +void RenderWidgetHostViewQtDelegateQuickWindow::InitAsPopup(const QRect &rect) { - m_rotated = m_virtualParent->parentItem()->rotation() > 0; + m_rotated = m_virtualParent->rotation() > 0 || m_virtualParent->parentItem()->rotation() > 0; if (m_rotated) { // code below tries to cover the case where webengine view is rotated, // the code assumes the rotation is in the form of 90, 180, 270 degrees @@ -104,7 +108,6 @@ void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) QPointF br = transformPoint(rect.bottomRight(), transform, offset, m_virtualParent); QRectF popupRect(tl, br); popupRect = popupRect.normalized(); - m_realDelegate->setSize(rect.size()); // include offset from parent window popupRect.moveTo(popupRect.topLeft() - offset); setGeometry(popupRect.adjusted(0, 0, 1, 1).toRect()); @@ -115,64 +118,51 @@ void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) m_realDelegate->setTransformOrigin(QQuickItem::Center); m_realDelegate->setRotation(m_virtualParent->parentItem()->rotation()); } else { - m_realDelegate->setSize(rect.size()); QRect geometry(rect); geometry.moveTo(rect.topLeft() - getOffset(m_virtualParent)); setGeometry(geometry); } + m_realDelegate->show(); raise(); show(); } -QRectF RenderWidgetHostViewQtDelegateQuickWindow::viewGeometry() const -{ - return m_rotated ? m_rect : geometry(); -} - -QRect RenderWidgetHostViewQtDelegateQuickWindow::windowGeometry() const +void RenderWidgetHostViewQtDelegateQuickWindow::Resize(int width, int height) { - return m_rotated ? m_rect : frameGeometry(); -} - -void RenderWidgetHostViewQtDelegateQuickWindow::show() -{ - QQuickWindow::show(); - m_realDelegate->show(); + if (!m_rotated) + QQuickWindow::resize(width, height); } -void RenderWidgetHostViewQtDelegateQuickWindow::hide() +void RenderWidgetHostViewQtDelegateQuickWindow::MoveWindow(const QPoint &screenPos) { - QQuickWindow::hide(); - m_realDelegate->hide(); + if (!m_rotated) + QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); } -bool RenderWidgetHostViewQtDelegateQuickWindow::isVisible() const +void RenderWidgetHostViewQtDelegateQuickWindow::SetClearColor(const QColor &color) { - return QQuickWindow::isVisible(); + QQuickWindow::setColor(color); } -QWindow *RenderWidgetHostViewQtDelegateQuickWindow::window() const +bool RenderWidgetHostViewQtDelegateQuickWindow::ActiveFocusOnPress() { - return const_cast<RenderWidgetHostViewQtDelegateQuickWindow*>(this); + return false; } -void RenderWidgetHostViewQtDelegateQuickWindow::updateCursor(const QCursor &cursor) +void RenderWidgetHostViewQtDelegateQuickWindow::Bind(QtWebEngineCore::WebContentsAdapterClient *client) { - setCursor(cursor); + QQuickWebEngineViewPrivate::bindViewAndWidget( + static_cast<QQuickWebEngineViewPrivate *>(client)->q_func(), m_realDelegate.data()); } -void RenderWidgetHostViewQtDelegateQuickWindow::resize(int width, int height) +void RenderWidgetHostViewQtDelegateQuickWindow::Unbind() { - if (!m_rotated) { - QQuickWindow::resize(width, height); - m_realDelegate->resize(width, height); - } + QQuickWebEngineViewPrivate::bindViewAndWidget(nullptr, m_realDelegate.data()); } -void RenderWidgetHostViewQtDelegateQuickWindow::move(const QPoint &screenPos) +void RenderWidgetHostViewQtDelegateQuickWindow::Destroy() { - if (!m_rotated) - QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); + deleteLater(); } } // namespace QtWebEngineCore diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h index f7dfd1a05..1b94698ff 100644 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h +++ b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h @@ -41,43 +41,33 @@ #define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_QUICKWINDOW_H #include "render_widget_host_view_qt_delegate.h" +#include "render_widget_host_view_qt_delegate_item.h" -#include <QtCore/qscopedpointer.h> +#include <QtCore/qpointer.h> #include <QtQuick/qquickwindow.h> namespace QtWebEngineCore { -class RenderWidgetHostViewQtDelegateQuick; - -class RenderWidgetHostViewQtDelegateQuickWindow : public QQuickWindow , public RenderWidgetHostViewQtDelegate { +class RenderWidgetHostViewQtDelegateQuickWindow : public QQuickWindow , public WidgetDelegate { public: - RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegateQuick *realDelegate, + RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegateItem *realDelegate, QWindow *parent); ~RenderWidgetHostViewQtDelegateQuickWindow(); - void initAsPopup(const QRect&) override; - QRectF viewGeometry() const override; - QRect windowGeometry() const override; - void setKeyboardFocus() override {} - bool hasKeyboardFocus() override { return false; } - void lockMouse() override {} - void unlockMouse() override {} - void show() override; - void hide() override; - bool isVisible() const override; - QWindow* window() const override; - void updateCursor(const QCursor &) override; - void resize(int width, int height) override; - void move(const QPoint &screenPos) override; - void inputMethodStateChanged(bool, bool) override {} - void setInputMethodHints(Qt::InputMethodHints) override { } - void setClearColor(const QColor &) override { } - void adapterClientChanged(WebContentsAdapterClient *) override { } + void InitAsPopup(const QRect &screenRect) override; + void SetClearColor(const QColor &) override; + bool ActiveFocusOnPress() override; + void MoveWindow(const QPoint &) override; + void Bind(WebContentsAdapterClient *) override; + void Unbind() override; + void Destroy() override; + void Resize(int width, int height) override; + void setVirtualParent(QQuickItem *virtualParent); private: - QScopedPointer<RenderWidgetHostViewQtDelegateQuick> m_realDelegate; + QPointer<RenderWidgetHostViewQtDelegateItem> m_realDelegate; QQuickItem *m_virtualParent; QRect m_rect; bool m_rotated; |