summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/permission_manager_qt.cpp3
-rw-r--r--src/core/web_contents_adapter.cpp5
-rw-r--r--src/webengine/api/qquickwebengineview.cpp15
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h1
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.cpp31
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.h3
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp13
-rw-r--r--src/webenginewidgets/api/qwebengineview.h4
-rw-r--r--src/webenginewidgets/api/qwebengineview_p.h1
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp22
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h4
-rw-r--r--tests/auto/quick/qquickwebengineview/BLACKLIST3
-rw-r--r--tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp31
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp6
14 files changed, 105 insertions, 37 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp
index 9e8687a47..decc6dd7c 100644
--- a/src/core/permission_manager_qt.cpp
+++ b/src/core/permission_manager_qt.cpp
@@ -67,6 +67,8 @@ ProfileAdapter::PermissionType toQt(content::PermissionType type)
return ProfileAdapter::ClipboardWrite;
case content::PermissionType::NOTIFICATIONS:
return ProfileAdapter::NotificationPermission;
+ case content::PermissionType::ACCESSIBILITY_EVENTS:
+ return ProfileAdapter::UnsupportedPermission;
case content::PermissionType::FLASH:
case content::PermissionType::MIDI_SYSEX:
case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
@@ -74,7 +76,6 @@ ProfileAdapter::PermissionType toQt(content::PermissionType type)
case content::PermissionType::DURABLE_STORAGE:
case content::PermissionType::BACKGROUND_SYNC:
case content::PermissionType::SENSORS:
- case content::PermissionType::ACCESSIBILITY_EVENTS:
case content::PermissionType::PAYMENT_HANDLER:
case content::PermissionType::BACKGROUND_FETCH:
case content::PermissionType::IDLE_DETECTION:
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 9dc2f7b8b..138ea7039 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -1010,7 +1010,10 @@ QAccessibleInterface *WebContentsAdapter::browserAccessible()
CHECK_INITIALIZED(nullptr);
content::RenderViewHost *rvh = m_webContents->GetRenderViewHost();
Q_ASSERT(rvh);
- content::BrowserAccessibilityManager *manager = static_cast<content::RenderFrameHostImpl*>(rvh->GetMainFrame())->GetOrCreateBrowserAccessibilityManager();
+ content::RenderFrameHostImpl *rfh = static_cast<content::RenderFrameHostImpl *>(rvh->GetMainFrame());
+ if (!rfh)
+ return nullptr;
+ content::BrowserAccessibilityManager *manager = rfh->GetOrCreateBrowserAccessibilityManager();
if (!manager) // FIXME!
return nullptr;
content::BrowserAccessibility *acc = manager->GetRoot();
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 8f5313a9d..bcbf95569 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -750,6 +750,17 @@ QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView
: 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();
@@ -773,9 +784,9 @@ int QQuickWebEngineViewAccessible::childCount() const
QAccessibleInterface *QQuickWebEngineViewAccessible::child(int index) const
{
- if (index == 0 && engineView())
+ if (index == 0 && isValid())
return engineView()->d_func()->adapter->browserAccessible();
- return 0;
+ return nullptr;
}
int QQuickWebEngineViewAccessible::indexOfChild(const QAccessibleInterface *c) const
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 1f024167f..6f9b552ec 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -235,6 +235,7 @@ class QQuickWebEngineViewAccessible : public QAccessibleObject
{
public:
QQuickWebEngineViewAccessible(QQuickWebEngineView *o);
+ bool isValid() const override;
QAccessibleInterface *parent() const override;
QAccessibleInterface *focusChild() const override;
int childCount() const override;
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index ede85ca69..d5aae271f 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -226,6 +226,13 @@ bool RenderWidgetHostViewQtDelegateQuick::event(QEvent *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);
}
@@ -380,9 +387,17 @@ RenderWidgetHostViewQtDelegateQuickAccessible::RenderWidgetHostViewQtDelegateQui
{
}
+bool RenderWidgetHostViewQtDelegateQuickAccessible::isValid() const
+{
+ if (!viewAccessible() || !viewAccessible()->isValid())
+ return false;
+
+ return QAccessibleObject::isValid();
+}
+
QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::parent() const
{
- return QAccessible::queryAccessibleInterface(m_view)->parent();
+ return viewAccessible()->parent();
}
QString RenderWidgetHostViewQtDelegateQuickAccessible::text(QAccessible::Text) const
@@ -397,29 +412,33 @@ QAccessible::Role RenderWidgetHostViewQtDelegateQuickAccessible::role() const
QAccessible::State RenderWidgetHostViewQtDelegateQuickAccessible::state() const
{
- return QAccessible::queryAccessibleInterface(m_view)->state();
+ return viewAccessible()->state();
}
QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::focusChild() const
{
- return QAccessible::queryAccessibleInterface(m_view)->focusChild();
+ return viewAccessible()->focusChild();
}
int RenderWidgetHostViewQtDelegateQuickAccessible::childCount() const
{
- return QAccessible::queryAccessibleInterface(m_view)->childCount();
+ return viewAccessible()->childCount();
}
QAccessibleInterface *RenderWidgetHostViewQtDelegateQuickAccessible::child(int index) const
{
- return QAccessible::queryAccessibleInterface(m_view)->child(index);
+ return viewAccessible()->child(index);
}
int RenderWidgetHostViewQtDelegateQuickAccessible::indexOfChild(const QAccessibleInterface *c) const
{
- return QAccessible::queryAccessibleInterface(m_view)->indexOfChild(c);
+ return viewAccessible()->indexOfChild(c);
}
+QQuickWebEngineViewAccessible *RenderWidgetHostViewQtDelegateQuickAccessible::viewAccessible() const
+{
+ return static_cast<QQuickWebEngineViewAccessible *>(QAccessible::queryAccessibleInterface(m_view));
+}
#endif // QT_CONFIG(accessibility)
} // namespace QtWebEngineCore
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h
index 6874aac2b..f70de50d7 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.h
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h
@@ -47,6 +47,7 @@
QT_BEGIN_NAMESPACE
class QQuickWebEngineView;
+class QQuickWebEngineViewAccessible;
class QQuickWebEngineViewPrivate;
QT_END_NAMESPACE
@@ -122,6 +123,7 @@ 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;
@@ -133,6 +135,7 @@ public:
int indexOfChild(const QAccessibleInterface *) const override;
private:
+ QQuickWebEngineViewAccessible *viewAccessible() const;
QQuickWebEngineView *m_view;
};
#endif // QT_CONFIG(accessibility)
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index a51f9b7a5..b06d99478 100644
--- a/src/webenginewidgets/api/qwebengineview.cpp
+++ b/src/webenginewidgets/api/qwebengineview.cpp
@@ -471,6 +471,17 @@ void QWebEngineView::dropEvent(QDropEvent *e)
#endif // QT_CONFIG(draganddrop)
#ifndef QT_NO_ACCESSIBILITY
+bool QWebEngineViewAccessible::isValid() const
+{
+ if (!QAccessibleWidget::isValid())
+ return false;
+
+ if (!view() || !view()->d_func() || !view()->d_func()->page || !view()->d_func()->page->d_func())
+ return false;
+
+ return true;
+}
+
QAccessibleInterface *QWebEngineViewAccessible::focusChild() const
{
if (child(0) && child(0)->focusChild())
@@ -485,7 +496,7 @@ int QWebEngineViewAccessible::childCount() const
QAccessibleInterface *QWebEngineViewAccessible::child(int index) const
{
- if (index == 0 && view() && view()->page())
+ if (index == 0 && isValid())
return view()->page()->d_func()->adapter->browserAccessible();
return nullptr;
}
diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h
index 63a68f46c..04c8ece74 100644
--- a/src/webenginewidgets/api/qwebengineview.h
+++ b/src/webenginewidgets/api/qwebengineview.h
@@ -53,6 +53,7 @@ class QContextMenuEvent;
class QUrl;
class QWebEnginePage;
class QWebEngineSettings;
+class QWebEngineViewAccessible;
class QWebEngineViewPrivate;
class QWEBENGINEWIDGETS_EXPORT QWebEngineView : public QWidget {
@@ -141,6 +142,9 @@ private:
friend class QWebEnginePage;
friend class QWebEnginePagePrivate;
+#if QT_CONFIG(accessibility)
+ friend class QWebEngineViewAccessible;
+#endif
};
QT_END_NAMESPACE
diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h
index dd0a5bedf..a3c619cea 100644
--- a/src/webenginewidgets/api/qwebengineview_p.h
+++ b/src/webenginewidgets/api/qwebengineview_p.h
@@ -87,6 +87,7 @@ public:
QWebEngineViewAccessible(QWebEngineView *o) : QAccessibleWidget(o)
{}
+ bool isValid() const override;
QAccessibleInterface *focusChild() const override;
int childCount() const override;
QAccessibleInterface *child(int index) const override;
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index 8ba312822..fdd6d1c4f 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -41,6 +41,7 @@
#include "qwebenginepage_p.h"
#include "qwebengineview.h"
+#include "qwebengineview_p.h"
#include <QGuiApplication>
#include <QLayout>
#include <QMouseEvent>
@@ -490,24 +491,37 @@ RenderWidgetHostViewQtDelegateWidgetAccessible::RenderWidgetHostViewQtDelegateWi
{
}
+bool RenderWidgetHostViewQtDelegateWidgetAccessible::isValid() const
+{
+ if (!viewAccessible() || !viewAccessible()->isValid())
+ return false;
+
+ return QAccessibleWidget::isValid();
+}
+
QAccessibleInterface *RenderWidgetHostViewQtDelegateWidgetAccessible::focusChild() const
{
- return QAccessible::queryAccessibleInterface(m_view)->focusChild();
+ return viewAccessible()->focusChild();
}
int RenderWidgetHostViewQtDelegateWidgetAccessible::childCount() const
{
- return QAccessible::queryAccessibleInterface(m_view)->childCount();
+ return viewAccessible()->childCount();
}
QAccessibleInterface *RenderWidgetHostViewQtDelegateWidgetAccessible::child(int index) const
{
- return QAccessible::queryAccessibleInterface(m_view)->child(index);
+ return viewAccessible()->child(index);
}
int RenderWidgetHostViewQtDelegateWidgetAccessible::indexOfChild(const QAccessibleInterface *c) const
{
- return QAccessible::queryAccessibleInterface(m_view)->indexOfChild(c);
+ return viewAccessible()->indexOfChild(c);
+}
+
+QWebEngineViewAccessible *RenderWidgetHostViewQtDelegateWidgetAccessible::viewAccessible() const
+{
+ return static_cast<QWebEngineViewAccessible *>(QAccessible::queryAccessibleInterface(m_view));
}
#endif // QT_CONFIG(accessibility)
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
index df1806b6f..c7783117a 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
@@ -50,6 +50,7 @@
QT_BEGIN_NAMESPACE
class QWebEnginePage;
class QWebEngineView;
+class QWebEngineViewAccessible;
class QWebEnginePagePrivate;
QT_END_NAMESPACE
@@ -123,11 +124,14 @@ class RenderWidgetHostViewQtDelegateWidgetAccessible : public QAccessibleWidget
public:
RenderWidgetHostViewQtDelegateWidgetAccessible(RenderWidgetHostViewQtDelegateWidget *o, QWebEngineView *view);
+ bool isValid() const override;
QAccessibleInterface *focusChild() const override;
int childCount() const override;
QAccessibleInterface *child(int index) const override;
int indexOfChild(const QAccessibleInterface *child) const override;
+
private:
+ QWebEngineViewAccessible *viewAccessible() const;
QWebEngineView *m_view;
};
#endif // QT_CONFIG(accessibility)
diff --git a/tests/auto/quick/qquickwebengineview/BLACKLIST b/tests/auto/quick/qquickwebengineview/BLACKLIST
index 322c6f561..af97422a9 100644
--- a/tests/auto/quick/qquickwebengineview/BLACKLIST
+++ b/tests/auto/quick/qquickwebengineview/BLACKLIST
@@ -1,6 +1,3 @@
-[transparentWebEngineViews]
-windows
-
# until qt5.git is updated with new qtdeclarative
[focusChild]
*
diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
index 9e6bbdfb5..5ee30f165 100644
--- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
+++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
@@ -421,32 +421,29 @@ void tst_QQuickWebEngineView::transparentWebEngineViews()
webEngineView1->setSize(QSizeF(300, 400));
webEngineView1->loadHtml("<html><body bgcolor=\"red\"></body></html>");
- QVERIFY(waitForLoadSucceeded(webEngineView1.data()));
- webEngineView1->setVisible(true);
+ QVERIFY(waitForLoadSucceeded(webEngineView1.data(), 30000));
webEngineView2->setSize(QSizeF(300, 400));
webEngineView2->setUrl(urlFromTestPath("/html/basic_page.html"));
QVERIFY(waitForLoadSucceeded(webEngineView2.data()));
// Result image: black text on red background.
- const QImage grabbedWindow = tryToGrabWindowUntil(m_window.data(), [] (const QImage &image) {
- return image.pixelColor(0, 0) == QColor(Qt::red);
+ QSet<QRgb> colors;
+ tryToGrabWindowUntil(m_window.data(), [&colors] (const QImage &image) {
+ colors.clear();
+ for (int i = 0; i < image.width(); i++)
+ for (int j = 0; j < image.height(); j++)
+ colors.insert(image.pixel(i, j));
+ return colors.count() > 1;
});
- QSet<int> redComponents;
- for (int i = 0, width = grabbedWindow.width(); i < width; i++) {
- for (int j = 0, height = grabbedWindow.height(); j < height; j++) {
- QColor color(grabbedWindow.pixel(i, j));
- redComponents.insert(color.red());
- // There are no green or blue components between red and black.
- QVERIFY(color.green() == 0);
- QVERIFY(color.blue() == 0);
- }
+ QVERIFY(colors.count() > 1);
+ QVERIFY(colors.contains(qRgb(0, 0, 0))); // black
+ QVERIFY(colors.contains(qRgb(255, 0, 0))); // red
+ for (auto color : colors) {
+ QCOMPARE(qGreen(color), 0);
+ QCOMPARE(qBlue(color), 0);
}
-
- QVERIFY(redComponents.count() > 1);
- QVERIFY(redComponents.contains(0)); // black
- QVERIFY(redComponents.contains(255)); // red
}
void tst_QQuickWebEngineView::inputMethod()
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index b7954840f..63be1573b 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -824,11 +824,13 @@ void tst_QWebEnginePage::localStorageVisibility()
QVERIFY(evaluateJavaScriptSync(&webPage1, QString("(window.localStorage != undefined)")).toBool());
QVERIFY(!evaluateJavaScriptSync(&webPage2, QString("(window.localStorage != undefined)")).toBool());
- // Switching the feature off does not actively remove the object from webPage1.
+ // Toggle local setting for every page and...
webPage1.settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, false);
webPage2.settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
+ // ...first check second page (for storage to appear) as applying settings is batched and done asynchronously
+ QTRY_VERIFY(evaluateJavaScriptSync(&webPage2, QString("(window.localStorage != undefined)")).toBool());
+ // Switching the feature off does not actively remove the object from webPage1.
QVERIFY(evaluateJavaScriptSync(&webPage1, QString("(window.localStorage != undefined)")).toBool());
- QVERIFY(evaluateJavaScriptSync(&webPage2, QString("(window.localStorage != undefined)")).toBool());
// The object disappears only after reloading.
webPage1.triggerAction(QWebEnginePage::Reload);