diff options
Diffstat (limited to 'src/plugins/platforms/wasm')
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmaccessibility.cpp | 99 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasmaccessibility.h | 3 | ||||
| -rw-r--r-- | src/plugins/platforms/wasm/qwasminputcontext.cpp | 4 | 
3 files changed, 66 insertions, 40 deletions
| diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp index 35e804531bc..a87c33c8346 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp +++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp @@ -323,8 +323,9 @@ void QWasmAccessibility::setProperty(emscripten::val element, const std::string  } -void QWasmAccessibility::addEventListener(emscripten::val element, const char *eventType) +void QWasmAccessibility::addEventListener(QAccessibleInterface *iface, emscripten::val element, const char *eventType)  { +    element.set("data-qta11yinterface", reinterpret_cast<size_t>(iface));      element.call<void>("addEventListener", emscripten::val(eventType),                         QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex),                         true); @@ -352,7 +353,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac          case QAccessible::Button: {              element = document.call<emscripten::val>("createElement", std::string("button")); -            addEventListener(element, "click"); +            addEventListener(iface, element, "click");          } break;          case QAccessible::CheckBox: { @@ -360,7 +361,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              setAttribute(element, "type", "checkbox");              setAttribute(element, "checked", iface->state().checked);              setProperty(element, "indeterminate", iface->state().checkStateMixed); -            addEventListener(element, "change"); +            addEventListener(iface, element, "change");          } break;          case QAccessible::Switch: { @@ -371,7 +372,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac                  setAttribute(element, "aria-checked", "true");              else                  setAttribute(element, "aria-checked", "false"); -            addEventListener(element, "change"); +            addEventListener(iface, element, "change");          } break;          case QAccessible::RadioButton: { @@ -379,7 +380,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              setAttribute(element, "type", "radio");              setAttribute(element, "checked", iface->state().checked);              setProperty(element, "name", "buttonGroup"); -            addEventListener(element, "change"); +            addEventListener(iface, element, "change");          } break;          case QAccessible::SpinBox: @@ -400,6 +401,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac          case QAccessible::PageTabList:{              element = document.call<emscripten::val>("createElement", std::string("div"));              setAttribute(element, "role", "tablist"); +            setHtmlElementOrientation(element, iface);              m_elements[iface] = element; @@ -413,7 +415,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element =   document.call<emscripten::val>("createElement", std::string("button"));              setAttribute(element, "role", "tab");              setAttribute(element, "title", text.toStdString()); -            addEventListener(element, "click"); +            addEventListener(iface, element, "click");          } break;          case QAccessible::ScrollBar: { @@ -422,7 +424,8 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element = document.call<emscripten::val>("createElement", std::string("div"));              setAttribute(element, "role", "scrollbar");              setAttribute(element, "aria-valuenow", valueString); -            addEventListener(element, "change"); +            setHtmlElementOrientation(element, iface); +            addEventListener(iface, element, "change");          } break;          case QAccessible::StaticText: { @@ -436,7 +439,8 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element = document.call<emscripten::val>("createElement", std::string("div"));              setAttribute(element, "role", "toolbar");              setAttribute(element, "title", text.toStdString()); -            addEventListener(element, "click"); +            setHtmlElementOrientation(element, iface); +            addEventListener(iface, element, "click");          }break;          case QAccessible::MenuItem:          case QAccessible::ButtonMenu: { @@ -444,7 +448,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element = document.call<emscripten::val>("createElement", std::string("button"));              setAttribute(element, "role", "menuitem");              setAttribute(element, "title", text.toStdString()); -            addEventListener(element, "click"); +            addEventListener(iface, element, "click");          }break;          case QAccessible::MenuBar:          case QAccessible::PopupMenu: { @@ -452,6 +456,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element = document.call<emscripten::val>("createElement", std::string("div"));              setAttribute(element, "role", "menubar");              setAttribute(element, "title", text.toStdString()); +            setHtmlElementOrientation(element, iface);              m_elements[iface] = element;              for (int i = 0; i < iface->childCount(); ++i) { @@ -471,7 +476,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac              element = document.call<emscripten::val>("createElement", std::string("div"));          } -        addEventListener(element, "focus"); +        addEventListener(iface, element, "focus");          return element;      }(); @@ -542,6 +547,7 @@ void QWasmAccessibility::linkToParent(QAccessibleInterface *iface)  {      emscripten::val element = getHtmlElement(iface);      emscripten::val container = getElementContainer(iface); +      if (container.isUndefined() || element.isUndefined())          return; @@ -554,21 +560,21 @@ void QWasmAccessibility::linkToParent(QAccessibleInterface *iface)      emscripten::val next = emscripten::val::undefined();      const int thisIndex = iface->parent()->indexOfChild(iface); -    Q_ASSERT(thisIndex >= 0 && thisIndex < iface->parent()->childCount()); -    for (int i = thisIndex + 1; i < iface->parent()->childCount(); ++i) { -        const auto elementI = getHtmlElement(iface->parent()->child(i)); -        if (!elementI.isUndefined() && -            elementI["parentElement"] == container) { -            next = elementI; -            break; +    if (thisIndex >= 0) { +        Q_ASSERT(thisIndex < iface->parent()->childCount()); +        for (int i = thisIndex + 1; i < iface->parent()->childCount(); ++i) { +            const auto elementI = getHtmlElement(iface->parent()->child(i)); +            if (!elementI.isUndefined() && +                elementI["parentElement"] == container) { +                next = elementI; +                break; +            }          } +        if (next.isUndefined()) +            container.call<void>("appendChild", element); +        else +            container.call<void>("insertBefore", element, next);      } -    if (next.isUndefined()) { -        container.call<void>("appendChild", element); -    } else { -        container.call<void>("insertBefore", element, next); -    } -      const auto activeElementAfter = emscripten::val::take_ownership(          getActiveElement_js(emscripten::val::undefined().as_handle()));      if (activeElementBefore != activeElementAfter) { @@ -659,6 +665,21 @@ void QWasmAccessibility::setHtmlElementDisabled(QAccessibleInterface *iface)      setAttribute(element, "aria-disabled", iface->state().disabled);  } +void QWasmAccessibility::setHtmlElementOrientation(emscripten::val element, QAccessibleInterface *iface) +{ +    Q_ASSERT(iface); +    if (QAccessibleAttributesInterface *attributesIface = iface->attributesInterface()) { +        const QVariant orientationVariant = +                attributesIface->attributeValue(QAccessible::Attribute::Orientation); +        if (orientationVariant.isValid()) { +            Q_ASSERT(orientationVariant.canConvert<Qt::Orientation>()); +            const Qt::Orientation orientation = orientationVariant.value<Qt::Orientation>(); +            const std::string value = orientation == Qt::Horizontal ? "horizontal" : "vertical"; +            setAttribute(element, "aria-orientation", value); +        } +    } +} +  void QWasmAccessibility::handleStaticTextUpdate(QAccessibleEvent *event)  {      switch (event->type()) { @@ -712,22 +733,26 @@ void QWasmAccessibility::handleLineEditUpdate(QAccessibleEvent *event)  void QWasmAccessibility::handleEventFromHtmlElement(const emscripten::val event)  { -    QAccessibleInterface *iface = m_elements.key(event["target"]); +    if (event["target"].isNull() || event["target"].isUndefined()) +        return; -    if (iface == nullptr) { +    if (event["target"]["data-qta11yinterface"].isNull() || event["target"]["data-qta11yinterface"].isUndefined())          return; -    } else { -        QString eventType = QString::fromStdString(event["type"].as<std::string>()); -        const auto& actionNames = QAccessibleBridgeUtils::effectiveActionNames(iface); - -        if (eventType == "focus") { -            if (actionNames.contains(QAccessibleActionInterface::setFocusAction())) -                iface->actionInterface()->doAction(QAccessibleActionInterface::setFocusAction()); -        } else if (actionNames.contains(QAccessibleActionInterface::pressAction())) { -            iface->actionInterface()->doAction(QAccessibleActionInterface::pressAction()); -        } else if (actionNames.contains(QAccessibleActionInterface::toggleAction())) { -            iface->actionInterface()->doAction(QAccessibleActionInterface::toggleAction()); -        } + +    auto iface = reinterpret_cast<QAccessibleInterface *>(event["target"]["data-qta11yinterface"].as<size_t>()); +    if (m_elements.find(iface) == m_elements.end()) +        return; + +    const QString eventType = QString::fromStdString(event["type"].as<std::string>()); +    const auto& actionNames = QAccessibleBridgeUtils::effectiveActionNames(iface); + +    if (eventType == "focus") { +        if (actionNames.contains(QAccessibleActionInterface::setFocusAction())) +            iface->actionInterface()->doAction(QAccessibleActionInterface::setFocusAction()); +    } else if (actionNames.contains(QAccessibleActionInterface::pressAction())) { +       iface->actionInterface()->doAction(QAccessibleActionInterface::pressAction()); +    } else if (actionNames.contains(QAccessibleActionInterface::toggleAction())) { +        iface->actionInterface()->doAction(QAccessibleActionInterface::toggleAction());      }  } diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h index 2b4716d64e7..ddbfec918d6 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.h +++ b/src/plugins/platforms/wasm/qwasmaccessibility.h @@ -77,6 +77,7 @@ private:      void setHtmlElementTextNameLE(QAccessibleInterface *iface);      void setHtmlElementFocus(QAccessibleInterface *iface);      void setHtmlElementDisabled(QAccessibleInterface *iface); +    void setHtmlElementOrientation(emscripten::val element, QAccessibleInterface *iface);      void handleStaticTextUpdate(QAccessibleEvent *event);      void handleButtonUpdate(QAccessibleEvent *event); @@ -116,7 +117,7 @@ private:      void setProperty(emscripten::val element, const std::string &attr, const char *val);      void setProperty(emscripten::val element, const std::string &attr, bool val); -    void addEventListener(emscripten::val element, const char *eventType); +    void addEventListener(QAccessibleInterface *, emscripten::val element, const char *eventType);  private:      static QWasmAccessibility *s_instance; diff --git a/src/plugins/platforms/wasm/qwasminputcontext.cpp b/src/plugins/platforms/wasm/qwasminputcontext.cpp index 614d5bd25a3..18a457198f1 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.cpp +++ b/src/plugins/platforms/wasm/qwasminputcontext.cpp @@ -225,8 +225,8 @@ void QWasmInputContext::updateGeometry()          qCDebug(qLcQpaWasmInputContext) << Q_FUNC_INFO << "propagating inputItemRectangle:" << inputItemRectangle;          m_inputElement["style"].set("left", std::to_string(inputItemRectangle.x()) + "px");          m_inputElement["style"].set("top", std::to_string(inputItemRectangle.y()) + "px"); -        m_inputElement["style"].set("width", std::to_string(inputItemRectangle.width()) + "px"); -        m_inputElement["style"].set("height", std::to_string(inputItemRectangle.height()) + "px"); +        m_inputElement["style"].set("width", "1px"); +        m_inputElement["style"].set("height", "1px");      }  } | 
