diff options
Diffstat (limited to 'src/core/browser_accessibility_qt.cpp')
-rw-r--r-- | src/core/browser_accessibility_qt.cpp | 101 |
1 files changed, 71 insertions, 30 deletions
diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp index dd40eaf49..60e5390e3 100644 --- a/src/core/browser_accessibility_qt.cpp +++ b/src/core/browser_accessibility_qt.cpp @@ -6,16 +6,14 @@ // found in the LICENSE.Chromium file. #include "browser_accessibility_qt.h" +#include "browser_accessibility_manager_qt.h" +#include "qtwebenginecoreglobal_p.h" +#include "type_conversion.h" #if QT_CONFIG(accessibility) - #include "content/browser/accessibility/browser_accessibility.h" #include "ui/accessibility/ax_enums.mojom.h" -#include "browser_accessibility_manager_qt.h" -#include "qtwebenginecoreglobal_p.h" -#include "type_conversion.h" - #include <QtGui/qaccessible.h> namespace QtWebEngineCore { @@ -28,10 +26,9 @@ public: BrowserAccessibilityQt(content::BrowserAccessibilityManager *manager, ui::AXNode *node); ~BrowserAccessibilityQt(); - QtWebEngineCore::BrowserAccessibilityInterface *interface() const { return m_interface; } + bool isReady() const; -private: - QtWebEngineCore::BrowserAccessibilityInterface *m_interface = nullptr; + QtWebEngineCore::BrowserAccessibilityInterface *interface = nullptr; }; class BrowserAccessibilityInterface @@ -44,6 +41,7 @@ class BrowserAccessibilityInterface { public: BrowserAccessibilityInterface(BrowserAccessibilityQt *chromiumInterface); + ~BrowserAccessibilityInterface() override; void destroy(); @@ -129,20 +127,31 @@ public: void modelChange(QAccessibleTableModelChangeEvent *event) override; private: + content::BrowserAccessibility *findTable() const; + QObject *m_object = nullptr; QAccessible::Id m_id = 0; BrowserAccessibilityQt *q; }; -BrowserAccessibilityQt::BrowserAccessibilityQt(content::BrowserAccessibilityManager *manager, ui::AXNode *node) - : content::BrowserAccessibility(manager, node), - m_interface(new BrowserAccessibilityInterface(this)) +BrowserAccessibilityQt::BrowserAccessibilityQt(content::BrowserAccessibilityManager *manager, + ui::AXNode *node) + : content::BrowserAccessibility(manager, node) + , interface(new BrowserAccessibilityInterface(this)) { } BrowserAccessibilityQt::~BrowserAccessibilityQt() { - m_interface->destroy(); + if (interface) + interface->destroy(); +} + +bool BrowserAccessibilityQt::isReady() const +{ + // FIXME: This is just a workaround, remove this when the commented out assert in + // BrowserAccessibilityManager::GetFromID(int32_t id) gets fixed. + return manager()->GetFromID(node()->id()) != nullptr; } BrowserAccessibilityInterface::BrowserAccessibilityInterface(BrowserAccessibilityQt *chromiumInterface) @@ -158,6 +167,11 @@ BrowserAccessibilityInterface::BrowserAccessibilityInterface(BrowserAccessibilit m_id = QAccessible::registerAccessibleInterface(this); } +BrowserAccessibilityInterface::~BrowserAccessibilityInterface() +{ + q->interface = nullptr; +} + void BrowserAccessibilityInterface::destroy() { QAccessible::deleteAccessibleInterface(m_id); @@ -165,6 +179,9 @@ void BrowserAccessibilityInterface::destroy() bool BrowserAccessibilityInterface::isValid() const { + if (!q->isReady()) + return false; + auto managerQt = static_cast<content::BrowserAccessibilityManagerQt *>(q->manager()); return managerQt && managerQt->isValid(); } @@ -215,10 +232,10 @@ void *BrowserAccessibilityInterface::interface_cast(QAccessible::InterfaceType t } case QAccessible::TableCellInterface: { QAccessible::Role r = role(); - if (r == QAccessible::Cell || - r == QAccessible::ListItem || - r == QAccessible::TreeItem) - return static_cast<QAccessibleTableCellInterface*>(this); + if (r == QAccessible::Cell || r == QAccessible::ListItem || r == QAccessible::TreeItem) { + if (findTable()) + return static_cast<QAccessibleTableCellInterface *>(this); + } break; } default: @@ -268,6 +285,9 @@ int BrowserAccessibilityInterface::indexOfChild(const QAccessibleInterface *ifac QString BrowserAccessibilityInterface::text(QAccessible::Text t) const { + if (!q->isReady()) + return QString(); + switch (t) { case QAccessible::Name: return toQt(q->GetStringAttribute(ax::mojom::StringAttribute::kName)); @@ -289,7 +309,7 @@ void BrowserAccessibilityInterface::setText(QAccessible::Text t, const QString & QRect BrowserAccessibilityInterface::rect() const { - if (!q->manager()) // needed implicitly by GetScreenBoundsRect() + if (!q->manager() || !q->isReady()) // needed implicitly by GetScreenBoundsRect() return QRect(); gfx::Rect bounds = q->GetUnclippedScreenBoundsRect(); bounds = gfx::ScaleToRoundedRect(bounds, 1.f / q->manager()->device_scale_factor()); // FIXME: check @@ -357,6 +377,8 @@ QAccessible::Role BrowserAccessibilityInterface::role() const case ax::mojom::Role::kComboBoxMenuButton: case ax::mojom::Role::kTextFieldWithComboBox: return QAccessible::ComboBox; + case ax::mojom::Role::kComboBoxSelect: + return QAccessible::PopupMenu; case ax::mojom::Role::kComplementary: return QAccessible::ComplementaryContent; case ax::mojom::Role::kComment: @@ -386,6 +408,7 @@ QAccessible::Role BrowserAccessibilityInterface::role() const case ax::mojom::Role::kDirectory: return QAccessible::List; case ax::mojom::Role::kDisclosureTriangle: + case ax::mojom::Role::kDisclosureTriangleGrouped: return QAccessible::Button; case ax::mojom::Role::kGenericContainer: return QAccessible::Section; @@ -595,7 +618,7 @@ QAccessible::Role BrowserAccessibilityInterface::role() const return QAccessible::ComboBox; case ax::mojom::Role::kPortal: return QAccessible::Button; - case ax::mojom::Role::kPre: + case ax::mojom::Role::kPreDeprecated: return QAccessible::Section; case ax::mojom::Role::kProgressIndicator: return QAccessible::ProgressBar; @@ -689,6 +712,11 @@ QAccessible::Role BrowserAccessibilityInterface::role() const QAccessible::State BrowserAccessibilityInterface::state() const { QAccessible::State state = QAccessible::State(); + if (!q->isReady()) { + state.invalid = true; + return state; + } + if (q->HasState(ax::mojom::State::kCollapsed)) state.collapsed = true; if (q->HasState(ax::mojom::State::kDefault)) @@ -800,7 +828,8 @@ void BrowserAccessibilityInterface::doAction(const QString &actionName) q->manager()->SetFocus(*q); } -QStringList BrowserAccessibilityInterface::keyBindingsForAction(const QString &actionName) const +QStringList +BrowserAccessibilityInterface::keyBindingsForAction(const QString & /*actionName*/) const { QT_NOT_YET_IMPLEMENTED return QStringList(); @@ -1102,14 +1131,20 @@ bool BrowserAccessibilityInterface::isSelected() const return false; } +content::BrowserAccessibility *BrowserAccessibilityInterface::findTable() const +{ + content::BrowserAccessibility *parent = q->PlatformGetParent(); + while (parent && parent->GetRole() != ax::mojom::Role::kTable) + parent = parent->PlatformGetParent(); + + return parent; +} + QAccessibleInterface *BrowserAccessibilityInterface::table() const { - content::BrowserAccessibility *find_table = q->PlatformGetParent(); - while (find_table && find_table->GetRole() != ax::mojom::Role::kTable) - find_table = find_table->PlatformGetParent(); - if (!find_table) - return nullptr; - return content::toQAccessibleInterface(find_table); + content::BrowserAccessibility *table = findTable(); + Q_ASSERT(table); + return content::toQAccessibleInterface(table); } void BrowserAccessibilityInterface::modelChange(QAccessibleTableModelChangeEvent *) @@ -1118,25 +1153,31 @@ void BrowserAccessibilityInterface::modelChange(QAccessibleTableModelChangeEvent } // namespace QtWebEngineCore +#endif // QT_CONFIG(accessibility) namespace content { // static std::unique_ptr<BrowserAccessibility> BrowserAccessibility::Create(BrowserAccessibilityManager *man, ui::AXNode *node) { +#if QT_CONFIG(accessibility) return std::unique_ptr<BrowserAccessibility>(new QtWebEngineCore::BrowserAccessibilityQt(man, node)); +#else + Q_UNUSED(man); + Q_UNUSED(node); + return nullptr; +#endif // #if QT_CONFIG(accessibility) } +#if QT_CONFIG(accessibility) QAccessibleInterface *toQAccessibleInterface(BrowserAccessibility *obj) { - return static_cast<QtWebEngineCore::BrowserAccessibilityQt *>(obj)->interface(); + return static_cast<QtWebEngineCore::BrowserAccessibilityQt *>(obj)->interface; } const QAccessibleInterface *toQAccessibleInterface(const BrowserAccessibility *obj) { - return static_cast<const QtWebEngineCore::BrowserAccessibilityQt *>(obj)->interface(); + return static_cast<const QtWebEngineCore::BrowserAccessibilityQt *>(obj)->interface; } +#endif // #if QT_CONFIG(accessibility) } // namespace content - - -#endif // QT_CONFIG(accessibility) |