[WPE] Add initial accessibility support using ATK
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 May 2019 12:45:08 +0000 (12:45 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 May 2019 12:45:08 +0000 (12:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=197413

Reviewed by Michael Catanzaro.

.:

Add ENABLE_ACCESSIBILITY public option to WPE.

* Source/cmake/OptionsGTK.cmake:
* Source/cmake/OptionsWPE.cmake:

Source/WebCore:

Use USE(ATK) instead of PLATFORM(GTK) for ATK related code and use ATK when available for WPE port too.

* PlatformWPE.cmake:
* SourcesWPE.txt:
* accessibility/AXObjectCache.h:
* accessibility/AccessibilityList.cpp:
(WebCore::AccessibilityList::childHasPseudoVisibleListItemMarkers):
* accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::canSetValueAttribute const):
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::textIteratorBehaviorForTextRange const):
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::indexForVisiblePosition const):
(WebCore::AccessibilityRenderObject::shouldNotifyActiveDescendant const):
* accessibility/AccessibilityTableColumn.cpp:
(WebCore::AccessibilityTableColumn::computeAccessibilityIsIgnored const):
* accessibility/AccessibilityTableHeaderContainer.cpp:
(WebCore::AccessibilityTableHeaderContainer::computeAccessibilityIsIgnored const):
* accessibility/atk/WebKitAccessible.cpp:
(webkitAccessibleGetAttributes):
* accessibility/wpe/AXObjectCacheWPE.cpp: Removed.
* accessibility/wpe/AccessibilityObjectWPE.cpp: Removed.
* editing/FrameSelection.h:

Source/WebKit:

Rename WebKitWebViewBaseAccessible as WebKitWebViewAccessible and move it to glib removing its dependency on
GTK. WPEView now implements get_accessible to return its associated WebKitWebViewAccessible.

* PlatformWPE.cmake:
* SourcesGTK.txt:
* SourcesWPE.txt:
* UIProcess/API/glib/WebKitWebViewAccessible.cpp: Added.
(webkitWebViewAccessibleInitialize):
(webkitWebViewAccessibleRefStateSet):
(webkitWebViewAccessibleGetIndexInParent):
(webkit_web_view_accessible_class_init):
(webkitWebViewAccessibleNew):
(webkitWebViewAccessibleSetWebView):
* UIProcess/API/glib/WebKitWebViewAccessible.h: Added.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseDispose):
(webkitWebViewBaseGetAccessible):
* UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp: Removed.
* UIProcess/API/gtk/WebKitWebViewBaseAccessible.h: Removed.
* UIProcess/API/wpe/PageClientImpl.cpp:
(WebKit::PageClientImpl::accessible):
* UIProcess/API/wpe/PageClientImpl.h:
* UIProcess/API/wpe/WPEView.cpp:
(WKWPE::m_backend):
(WKWPE::View::~View):
(WKWPE::View::accessible):
* UIProcess/API/wpe/WPEView.h:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/wpe/WebPageProxyWPE.cpp:
(WebKit::WebPageProxy::bindAccessibilityTree): Call atk_socket_embed() with the given plug ID.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/wpe/WebPageWPE.cpp:
(WebKit::WebPage::platformInitialize): Create the WebKitWebPageAccessibilityObject and send
BindAccessibilityTree message to the UI process.
* WebProcess/wpe/WebProcessMainWPE.cpp:
(WebKit::initializeAccessibility): Implement AtkUtil interface and initialize the atk bridge.

Tools:

Add accessibility support in MiniBrowser and backends used by MiniBrowser and tests.

* MiniBrowser/wpe/CMakeLists.txt:
* MiniBrowser/wpe/main.cpp:
(main):
* TestWebKitAPI/PlatformWPE.cmake:
* WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
* WebKitTestRunner/InjectedBundle/AccessibilityController.h:
* WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
* WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp:
(WTR::AccessibilityNotificationHandler::setNotificationFunctionCallback):
(WTR::AccessibilityNotificationHandler::removeAccessibilityNotificationHandler):
* WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp: Removed.
* WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp: Removed.
* WebKitTestRunner/PlatformWPE.cmake:
* wpe/backends/CMakeLists.txt:
* wpe/backends/HeadlessViewBackend.cpp:
(WPEToolingBackends::HeadlessViewBackend::HeadlessViewBackend):
* wpe/backends/ViewBackend.cpp:
(WPEToolingBackends::addKeyEventListener):
(WPEToolingBackends::removeKeyEventListener):
(WPEToolingBackends::notifyAccessibilityKeyEventListeners):
(WPEToolingBackends::ViewBackend::initialize):
(WPEToolingBackends::ViewBackend::initializeAccessibility):
(WPEToolingBackends::ViewBackend::updateAccessibilityState):
(WPEToolingBackends::ViewBackend::setAccessibleChild):
(WPEToolingBackends::ViewBackend::addActivityState):
(WPEToolingBackends::ViewBackend::removeActivityState):
(WPEToolingBackends::ViewBackend::dispatchInputKeyboardEvent):
* wpe/backends/ViewBackend.h:
* wpe/backends/WebKitAccessibleApplication.cpp: Added.
(webkitAccessibleApplicationWindowInterfaceInit):
(webkitAccessibleApplicationFinalize):
(webkitAccessibleApplicationInitialize):
(webkitAccessibleApplicationGetNChildren):
(webkitAccessibleApplicationRefChild):
(webkitAccessibleApplicationGetName):
(webkit_accessible_application_class_init):
(webkit_accessible_application_init):
(webkitAccessibleApplicationNew):
(webkitAccessibleApplicationSetChild):
* wpe/backends/WebKitAccessibleApplication.h: Added.
* wpe/backends/WindowViewBackend.cpp:
(WPEToolingBackends::WindowViewBackend::WindowViewBackend):
* wpe/jhbuild.modules:

LayoutTests:

Unskip accessibility tests that are passing now and add platform specific results.

* platform/wpe/TestExpectations:
* platform/wpe/accessibility/add-children-pseudo-element-expected.txt: Added.
* platform/wpe/accessibility/aria-fallback-roles-expected.txt: Added.
* platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt: Added.
* platform/wpe/accessibility/aria-label-on-label-element-expected.txt: Added.
* platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt: Added.
* platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt: Added.
* platform/wpe/accessibility/aria-option-role-expected.txt: Added.
* platform/wpe/accessibility/aria-roledescription-expected.txt: Added.
* platform/wpe/accessibility/aria-switch-sends-notification-expected.txt: Added.
* platform/wpe/accessibility/aria-tab-roles-expected.txt: Added.
* platform/wpe/accessibility/aria-table-attributes-expected.txt: Added.
* platform/wpe/accessibility/aria-table-content-expected.txt: Added.
* platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt: Added.
* platform/wpe/accessibility/auto-fill-crash-expected.txt: Added.
* platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt: Added.
* platform/wpe/accessibility/color-well-expected.txt: Added.
* platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt: Added.
* platform/wpe/accessibility/dimensions-include-descendants-expected.txt: Added.
* platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt: Added.
* platform/wpe/accessibility/empty-image-with-title-expected.txt: Added.
* platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt: Added.
* platform/wpe/accessibility/help-text-expected.txt: Added.
* platform/wpe/accessibility/image-link-expected.txt: Added.
* platform/wpe/accessibility/image-map1-expected.txt: Added.
* platform/wpe/accessibility/image-map2-expected.txt: Added.
* platform/wpe/accessibility/inline-continuations-expected.txt: Added.
* platform/wpe/accessibility/label-with-pseudo-elements-expected.txt: Added.
* platform/wpe/accessibility/list-detection-expected.txt: Added.
* platform/wpe/accessibility/lists-expected.txt: Added.
* platform/wpe/accessibility/math-multiscript-attributes-expected.txt: Added.
* platform/wpe/accessibility/media-emits-object-replacement-expected.txt: Added.
* platform/wpe/accessibility/menu-list-crash2-expected.txt: Added.
* platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.
* platform/wpe/accessibility/press-targets-center-point-expected.txt: Added.
* platform/wpe/accessibility/radio-button-title-label-expected.txt: Added.
* platform/wpe/accessibility/render-counter-text-expected.txt: Added.
* platform/wpe/accessibility/roles-computedRoleString-expected.txt: Added.
* platform/wpe/accessibility/roles-exposed-expected.txt: Added.
* platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt: Added.
* platform/wpe/accessibility/svg-remote-element-expected.txt: Added.
* platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt: Added.
* platform/wpe/accessibility/table-attributes-expected.txt: Added.
* platform/wpe/accessibility/table-cell-spans-expected.txt: Added.
* platform/wpe/accessibility/table-cells-expected.txt: Added.
* platform/wpe/accessibility/table-cells-roles-expected.txt: Added.
* platform/wpe/accessibility/table-column-headers-with-captions-expected.txt: Added.
* platform/wpe/accessibility/table-one-cell-expected.txt: Added.
* platform/wpe/accessibility/table-roles-hierarchy-expected.txt: Added.
* platform/wpe/accessibility/table-sections-expected.txt: Added.
* platform/wpe/accessibility/table-with-rules-expected.txt: Added.
* platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt: Added.
* platform/wpe/accessibility/transformed-element-expected.txt: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245565 268f45cc-cd09-0410-ab3c-d52691b4dbfc

112 files changed:
ChangeLog
LayoutTests/ChangeLog
LayoutTests/platform/wpe/TestExpectations
LayoutTests/platform/wpe/accessibility/add-children-pseudo-element-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-fallback-roles-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-label-on-label-element-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-option-role-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-roledescription-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-switch-sends-notification-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-tab-roles-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-table-attributes-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-table-content-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/auto-fill-crash-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/color-well-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/dimensions-include-descendants-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/empty-image-with-title-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/help-text-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/image-link-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/image-map1-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/image-map2-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/inline-continuations-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/label-with-pseudo-elements-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/list-detection-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/lists-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/math-multiscript-attributes-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/media-emits-object-replacement-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/menu-list-crash2-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/press-targets-center-point-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/radio-button-title-label-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/render-counter-text-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/roles-computedRoleString-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/roles-exposed-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/svg-remote-element-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-attributes-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-cell-spans-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-cells-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-cells-roles-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-column-headers-with-captions-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-one-cell-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-roles-hierarchy-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-sections-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/table-with-rules-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt [new file with mode: 0644]
LayoutTests/platform/wpe/accessibility/transformed-element-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/PlatformWPE.cmake
Source/WebCore/SourcesWPE.txt
Source/WebCore/accessibility/AXObjectCache.h
Source/WebCore/accessibility/AccessibilityList.cpp
Source/WebCore/accessibility/AccessibilityNodeObject.cpp
Source/WebCore/accessibility/AccessibilityObject.cpp
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/AccessibilityObjectInterface.h
Source/WebCore/accessibility/AccessibilityRenderObject.cpp
Source/WebCore/accessibility/AccessibilityTableColumn.cpp
Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp
Source/WebCore/accessibility/atk/WebKitAccessible.cpp
Source/WebCore/accessibility/wpe/AXObjectCacheWPE.cpp [deleted file]
Source/WebCore/accessibility/wpe/AccessibilityObjectWPE.cpp [deleted file]
Source/WebCore/editing/FrameSelection.h
Source/WebKit/ChangeLog
Source/WebKit/PlatformWPE.cmake
Source/WebKit/SourcesGTK.txt
Source/WebKit/SourcesWPE.txt
Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.cpp [new file with mode: 0644]
Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.h [new file with mode: 0644]
Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp
Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp [deleted file]
Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.h [deleted file]
Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp
Source/WebKit/UIProcess/API/wpe/PageClientImpl.h
Source/WebKit/UIProcess/API/wpe/WPEView.cpp
Source/WebKit/UIProcess/API/wpe/WPEView.h
Source/WebKit/UIProcess/WebPageProxy.h
Source/WebKit/UIProcess/WebPageProxy.messages.in
Source/WebKit/UIProcess/wpe/WebPageProxyWPE.cpp
Source/WebKit/WebProcess/WebPage/WebPage.h
Source/WebKit/WebProcess/WebPage/wpe/WebPageWPE.cpp
Source/WebKit/WebProcess/wpe/WebProcessMainWPE.cpp
Source/cmake/FindATKBridge.cmake [new file with mode: 0644]
Source/cmake/OptionsGTK.cmake
Source/cmake/OptionsWPE.cmake
Tools/ChangeLog
Tools/MiniBrowser/wpe/CMakeLists.txt
Tools/MiniBrowser/wpe/main.cpp
Tools/TestWebKitAPI/PlatformWPE.cmake
Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp
Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp
Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp [deleted file]
Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp [deleted file]
Tools/WebKitTestRunner/PlatformWPE.cmake
Tools/wpe/backends/CMakeLists.txt
Tools/wpe/backends/HeadlessViewBackend.cpp
Tools/wpe/backends/ViewBackend.cpp
Tools/wpe/backends/ViewBackend.h
Tools/wpe/backends/WebKitAccessibleApplication.cpp [new file with mode: 0644]
Tools/wpe/backends/WebKitAccessibleApplication.h [new file with mode: 0644]
Tools/wpe/backends/WindowViewBackend.cpp
Tools/wpe/jhbuild.modules

index 6982910..93eac70 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2019-05-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] Add initial accessibility support using ATK
+        https://bugs.webkit.org/show_bug.cgi?id=197413
+
+        Reviewed by Michael Catanzaro.
+
+        Add ENABLE_ACCESSIBILITY public option to WPE.
+
+        * Source/cmake/OptionsGTK.cmake:
+        * Source/cmake/OptionsWPE.cmake:
+
 2019-05-20  Ross Kirsling  <ross.kirsling@sony.com>
 
         [WinCairo] Implement Remote Web Inspector Client.
index 65a548e..df95dba 100644 (file)
@@ -1,3 +1,66 @@
+2019-05-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] Add initial accessibility support using ATK
+        https://bugs.webkit.org/show_bug.cgi?id=197413
+
+        Reviewed by Michael Catanzaro.
+
+        Unskip accessibility tests that are passing now and add platform specific results.
+
+        * platform/wpe/TestExpectations:
+        * platform/wpe/accessibility/add-children-pseudo-element-expected.txt: Added.
+        * platform/wpe/accessibility/aria-fallback-roles-expected.txt: Added.
+        * platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt: Added.
+        * platform/wpe/accessibility/aria-label-on-label-element-expected.txt: Added.
+        * platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt: Added.
+        * platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt: Added.
+        * platform/wpe/accessibility/aria-option-role-expected.txt: Added.
+        * platform/wpe/accessibility/aria-roledescription-expected.txt: Added.
+        * platform/wpe/accessibility/aria-switch-sends-notification-expected.txt: Added.
+        * platform/wpe/accessibility/aria-tab-roles-expected.txt: Added.
+        * platform/wpe/accessibility/aria-table-attributes-expected.txt: Added.
+        * platform/wpe/accessibility/aria-table-content-expected.txt: Added.
+        * platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt: Added.
+        * platform/wpe/accessibility/auto-fill-crash-expected.txt: Added.
+        * platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt: Added.
+        * platform/wpe/accessibility/color-well-expected.txt: Added.
+        * platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt: Added.
+        * platform/wpe/accessibility/dimensions-include-descendants-expected.txt: Added.
+        * platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt: Added.
+        * platform/wpe/accessibility/empty-image-with-title-expected.txt: Added.
+        * platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt: Added.
+        * platform/wpe/accessibility/help-text-expected.txt: Added.
+        * platform/wpe/accessibility/image-link-expected.txt: Added.
+        * platform/wpe/accessibility/image-map1-expected.txt: Added.
+        * platform/wpe/accessibility/image-map2-expected.txt: Added.
+        * platform/wpe/accessibility/inline-continuations-expected.txt: Added.
+        * platform/wpe/accessibility/label-with-pseudo-elements-expected.txt: Added.
+        * platform/wpe/accessibility/list-detection-expected.txt: Added.
+        * platform/wpe/accessibility/lists-expected.txt: Added.
+        * platform/wpe/accessibility/math-multiscript-attributes-expected.txt: Added.
+        * platform/wpe/accessibility/media-emits-object-replacement-expected.txt: Added.
+        * platform/wpe/accessibility/menu-list-crash2-expected.txt: Added.
+        * platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.
+        * platform/wpe/accessibility/press-targets-center-point-expected.txt: Added.
+        * platform/wpe/accessibility/radio-button-title-label-expected.txt: Added.
+        * platform/wpe/accessibility/render-counter-text-expected.txt: Added.
+        * platform/wpe/accessibility/roles-computedRoleString-expected.txt: Added.
+        * platform/wpe/accessibility/roles-exposed-expected.txt: Added.
+        * platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt: Added.
+        * platform/wpe/accessibility/svg-remote-element-expected.txt: Added.
+        * platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt: Added.
+        * platform/wpe/accessibility/table-attributes-expected.txt: Added.
+        * platform/wpe/accessibility/table-cell-spans-expected.txt: Added.
+        * platform/wpe/accessibility/table-cells-expected.txt: Added.
+        * platform/wpe/accessibility/table-cells-roles-expected.txt: Added.
+        * platform/wpe/accessibility/table-column-headers-with-captions-expected.txt: Added.
+        * platform/wpe/accessibility/table-one-cell-expected.txt: Added.
+        * platform/wpe/accessibility/table-roles-hierarchy-expected.txt: Added.
+        * platform/wpe/accessibility/table-sections-expected.txt: Added.
+        * platform/wpe/accessibility/table-with-rules-expected.txt: Added.
+        * platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt: Added.
+        * platform/wpe/accessibility/transformed-element-expected.txt: Added.
+
 2019-05-20  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [iOS] Layout viewport size on google.com increases after rotating to landscape and back
index a4ea66d..db1e3f0 100644 (file)
@@ -249,9 +249,19 @@ fast/events/ios [ Skip ]
 fast/events/touch/ios [ Skip ]
 fast/events/touch/gesture [ Skip ]
 
-# Accessibility support isn't glued to any API yet.
-Bug(WPE) accessibility/ [ Skip ]
-Bug(WPE) perf/accessibility-title-ui-element.html [ Failure ]
+# Accessibility tests that should never be run for WPE due to be
+# written in a platform-specific way. They should either be moved to
+# the right platform or re-written in a more platform-agnostic way.
+webkit.org/b/98348 accessibility/internal-link-anchors2.html [ Skip ]
+# Things specific to AX API (at least at the moment)
+webkit.org/b/98348 accessibility/radio-button-group-members.html [ Skip ]
+webkit.org/b/141074 accessibility/auto-filled-value.html [ Skip ]
+webkit.org/b/156045 accessibility/attachment-element.html [ Skip ]
+webkit.org/b/193623 accessibility/set-selected-editable.html [ Skip ]
+
+# Text marker tests are not supported
+webkit.org/b/153292 accessibility/text-marker [ Skip ]
+webkit.org/b/141072 accessibility/frame-disconnect-textmarker-cache-crash.html [ Skip ]
 
 # These are failures that will be enabled once the relevant parts of implementation land.
 webkit.org/b/133122 crypto/subtle/aes-cfb-generate-export-key-jwk-length-128.html [ Skip ]
@@ -784,6 +794,9 @@ webkit.org/b/174459 fast/images/sprite-sheet-image-draw.html [ Timeout ]
 
 webkit.org/b/142292 fast/images/animated-gif-window-resizing.html [ Timeout ]
 
+webkit.org/b/133148 accessibility/content-editable-set-inner-text-generates-axvalue-notification.html [ Timeout ]
+webkit.org/b/182107 accessibility/aria-combobox-control-owns-elements.html [ Timeout ]
+
 #////////////////////////////////////////////////////////////////////////////////////////
 # 9. TESTS FAILING
 #////////////////////////////////////////////////////////////////////////////////////////
@@ -928,6 +941,26 @@ Bug(WPE) security/contentSecurityPolicy/video-with-file-url-allowed-by-media-src
 
 Bug(WPE) userscripts/user-script-plugin-document.html [ Failure ]
 
+# accessibility/
+webkit.org/b/98363 accessibility/canvas-fallback-content-2.html [ Failure ]
+webkit.org/b/98372 accessibility/onclick-handlers.html [ Failure ]
+webkit.org/b/98377 accessibility/textarea-insertion-point-line-number.html [ Failure ]
+webkit.org/b/98380 accessibility/th-as-title-ui.html [ Failure ]
+webkit.org/b/98382 accessibility/visible-elements.html [ Failure ]
+webkit.org/b/68512 accessibility/aria-hidden-updates-alldescendants.html [ Failure ]
+webkit.org/b/98146 accessibility/svg-bounds.html [ Failure ]
+webkit.org/b/135530 accessibility/parent-delete.html [ Failure ]
+webkit.org/b/137109 accessibility/legend-children-are-visible.html [ Failure ]
+webkit.org/b/139352 accessibility/inline-block-assertion.html [ Failure ]
+webkit.org/b/143468 accessibility/plugin.html [ Failure ]
+webkit.org/b/148935 accessibility/scroll-to-make-visible-with-subfocus.html [ Failure ]
+webkit.org/b/161583 accessibility/auto-fill-types.html [ Failure ]
+webkit.org/b/168370 accessibility/hidden-th-still-column-header.html [ Failure ]
+webkit.org/b/174609 accessibility/presentation-role-iframe.html [ Failure ]
+webkit.org/b/182763 accessibility/notification-listeners.html [ Failure ]
+webkit.org/b/185548 accessibility/scroll-to-make-visible-iframe-offscreen.html [ Failure ]
+webkit.org/b/194606 accessibility/set-value-not-work-for-disabled-sliders.html [ Failure ]
+webkit.org/b/126523 perf/accessibility-title-ui-element.html [ Failure ]
 
 # WPT: cors
 # =========
diff --git a/LayoutTests/platform/wpe/accessibility/add-children-pseudo-element-expected.txt b/LayoutTests/platform/wpe/accessibility/add-children-pseudo-element-expected.txt
new file mode 100644 (file)
index 0000000..33ce4a2
--- /dev/null
@@ -0,0 +1,12 @@
+Language Email 
+Make sure that we are updating the render block flow element's children correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS element.childrenCount is 2
+PASS element.childrenCount is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-fallback-roles-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-fallback-roles-expected.txt
new file mode 100644 (file)
index 0000000..98bdb50
--- /dev/null
@@ -0,0 +1,8 @@
+test
+This tests that aria fallback roles work correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Role should be: AXRole: AXToggleButton
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt
new file mode 100644 (file)
index 0000000..e2ce8bc
--- /dev/null
@@ -0,0 +1,25 @@
+heading1.2
+
+
+
+
+This tests ensures that aria-hidden=false will allow a node to be in the AX hierarchy even if it's not rendered or visible
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS !heading1_1 || !heading1_1.isValid is true
+PASS !heading1_2 || !heading1_3.isValid is true
+PASS !heading1_3 || !heading1_3.isValid is true
+PASS heading2.role is 'AXRole: AXHeading'
+PASS parent.childAtIndex(0).isEqual(heading2) is true
+PASS heading3.role is 'AXRole: AXHeading'
+PASS parent.childAtIndex(1).isEqual(heading3) is true
+PASS heading4.role is 'AXRole: AXHeading'
+PASS parent.childAtIndex(2).isEqual(heading4) is true
+Textfield Title: AXTitle: HiddenText1
+PASS video.childrenCount is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-label-on-label-element-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-label-on-label-element-expected.txt
new file mode 100644 (file)
index 0000000..4cf247c
--- /dev/null
@@ -0,0 +1,20 @@
+Some text  Some other text   
+aria
+
+labelledby
+
+Some text 
+This tests that the aria-label attribute works on element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS titleUIElement1.isEqual(accessibilityController.accessibleElementById('label1')) is true
+PASS input1.title is 'AXTitle: aria label'
+PASS titleUIElement2.isEqual(accessibilityController.accessibleElementById('label2')) is true
+PASS input3.title is 'AXTitle: hidden aria label'
+PASS input4.title is 'AXTitle: aria labelledby'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt
new file mode 100644 (file)
index 0000000..6175336
--- /dev/null
@@ -0,0 +1,12 @@
+This tests that if aria-labelledby is used, then aria-label attributes are not used.
+
+Alpha Beta Delta Eta Epsilon Theta
+usingNone.title: [AXTitle: Alpha]
+usingNone.description: [AXDescription: ]
+usingLabel.title: [AXTitle: Gamma]
+usingLabel.description: [AXDescription: ]
+usingLabelledby.title: [AXTitle: Epsilon]
+usingLabelledby.description: [AXDescription: ]
+usingLabeledby.title: [AXTitle: Theta]
+usingLabeledby.description: [AXDescription: ]
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt
new file mode 100644 (file)
index 0000000..7b08a94
--- /dev/null
@@ -0,0 +1,12 @@
+This tests that if aria-labelledby is used, then label elements are not used
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS platformValueForW3CName(text) is "Shut down computer after 10 minutes"
+PASS text.titleUIElement() != null && text.titleUIElement().isValid is false
+Label element role is: AXRole: AXLabel
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-option-role-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-option-role-expected.txt
new file mode 100644 (file)
index 0000000..11e0622
--- /dev/null
@@ -0,0 +1,17 @@
+option 1
+option 2
+This tests that the aria 'option' role works as expected. That is, it becomes a static text element with no children.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+firstChild.role is AXRole: AXListItem
+firstChild.title is AXTitle: option 1
+secondChild.role is AXRole: AXListItem
+secondChild.title is AXTitle: label 2
+PASS firstChild.childrenCount is 0
+PASS secondChild.childrenCount is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-roledescription-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-roledescription-expected.txt
new file mode 100644 (file)
index 0000000..b1f30d0
--- /dev/null
@@ -0,0 +1,15 @@
+text
+This tests that aria-roledescription works.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Role description: AXRoleDescription: Super Button.
+Role description: AXRoleDescription: .
+Role description: AXRoleDescription: .
+Role description: AXRoleDescription: Super Button.
+Role description: AXRoleDescription: .
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-switch-sends-notification-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-switch-sends-notification-expected.txt
new file mode 100644 (file)
index 0000000..92fbb29
--- /dev/null
@@ -0,0 +1,12 @@
+Test Switch
+This tests that toggling an aria switch sends a notification.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Got notification: CheckedStateChanged
+Got notification: CheckedStateChanged
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-tab-roles-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-tab-roles-expected.txt
new file mode 100644 (file)
index 0000000..6340261
--- /dev/null
@@ -0,0 +1,21 @@
+Crust
+Veges
+Select Crust
+
+This tests that the aria roles for tab, tabpanel and tablist work as expected correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+tabList.role = AXRole: AXTabGroup
+tab1.role = AXRole: AXTab
+tab1.title = AXTitle: Crust
+PASS tab1.childrenCount is 0
+tab2.role = AXRole: AXTab
+tab2.title = AXTitle: Veges
+tabPanel.role = AXRole: AXScrollArea
+tabPanel.subrole = 
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-table-attributes-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-table-attributes-expected.txt
new file mode 100644 (file)
index 0000000..2cebb50
--- /dev/null
@@ -0,0 +1,31 @@
+This tests that attributes related to aria table/grid are working correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS grid.numberAttributeValue('AXARIAColumnCount') is 16
+PASS grid.numberAttributeValue('AXARIARowCount') is 30
+PASS grid.rowCount is 30
+PASS grid.columnCount is 16
+PASS cell1.numberAttributeValue('AXARIAColumnIndex') is 2
+PASS cell1.numberAttributeValue('AXARIARowIndex') is 7
+PASS cell2.numberAttributeValue('AXARIAColumnIndex') is 4
+PASS cell2.numberAttributeValue('AXARIARowIndex') is 8
+PASS cell4.numberAttributeValue('AXARIAColumnIndex') is 3
+PASS cell2.rowIndexRange() is '{7, 2}'
+PASS cell5.columnIndexRange() is '{3, 3}'
+PASS cell3.rowIndexRange() is '{7, 2}'
+PASS cell6.rowIndexRange() is '{0, 2}'
+PASS cell7.rowIndexRange() is '{0, 2}'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+First Name Last Name Company Address
+Fred Jackson Acme, Inc. 123 Broad St.
+Sara James
+Footer 1 Footer 2 Footer 3
+Name Company Address
+Cell Span Cell
+Cell
+January        $100
+February
diff --git a/LayoutTests/platform/wpe/accessibility/aria-table-content-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-table-content-expected.txt
new file mode 100644 (file)
index 0000000..d0e4c5d
--- /dev/null
@@ -0,0 +1,16 @@
+Header
+Item 1
+
+This tests that in an aria table with CSS that makes a row anonymous, the cells can be accessed.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+cell00.role is AXRole: AXColumnHeader
+cell01.role is AXRole: AXCell
+PASS cell00.isEqual(table.rowAtIndex(0).childAtIndex(0)) is true
+PASS cell01.isEqual(table.rowAtIndex(1).childAtIndex(0)) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt b/LayoutTests/platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt
new file mode 100644 (file)
index 0000000..53f4a4a
--- /dev/null
@@ -0,0 +1,15 @@
+Toggle button
+Button title
+This tests that a toggle button properly exposes the title when there isn't a direct relation and textUnderElement is required to be used.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Role: AXRole: AXToggleButton
+PASS tbutton1.title is 'AXTitle: Toggle button'
+Role: AXRole: AXButton
+PASS button.title is 'AXTitle: Button title'
+
diff --git a/LayoutTests/platform/wpe/accessibility/auto-fill-crash-expected.txt b/LayoutTests/platform/wpe/accessibility/auto-fill-crash-expected.txt
new file mode 100644 (file)
index 0000000..a0eacb7
--- /dev/null
@@ -0,0 +1,12 @@
+
+This tests that when an auto fill element is removed we won't crash accessing an old value.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS accessibilityController.accessibleElementById('textfield').childrenCount is 2
+PASS accessibilityController.accessibleElementById('textfield').childrenCount is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt b/LayoutTests/platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt
new file mode 100644 (file)
index 0000000..568c102
--- /dev/null
@@ -0,0 +1,19 @@
+This tests the platform role exposed for buttons with aria-haspopup
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+test1 AXRole: AXButton for aria-haspopup=(null)
+test2 AXRole: AXButton for aria-haspopup='true'
+test3 AXRole: AXButton for aria-haspopup='false'
+test4 AXRole: AXButton for aria-haspopup='dialog'
+test5 AXRole: AXButton for aria-haspopup='grid'
+test6 AXRole: AXButton for aria-haspopup='listbox'
+test7 AXRole: AXButton for aria-haspopup='menu'
+test8 AXRole: AXButton for aria-haspopup='tree'
+test9 AXRole: AXButton for aria-haspopup='foo'
+test10 AXRole: AXButton for aria-haspopup=''
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/color-well-expected.txt b/LayoutTests/platform/wpe/accessibility/color-well-expected.txt
new file mode 100644 (file)
index 0000000..bf82e88
--- /dev/null
@@ -0,0 +1,14 @@
+    
+This test checks the role of ColorWellRolean input with type=color
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Role of input type=color is: AXRole: AXTextField
+Value of empty color well: AXValue: 
+Value of good color well: AXValue: #ff0000
+Value of bad color well: AXValue: purple
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt b/LayoutTests/platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt
new file mode 100644 (file)
index 0000000..09ba597
--- /dev/null
@@ -0,0 +1,43 @@
+Before
+
+After
+
+End of test
+
+This tests that deleting an iframe doesn't cause the accessibility cache to be destroyed and recreated.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Before:
+AXRole: AXScrollArea 
+    AXRole: AXWebArea 
+        AXRole: AXParagraph AXValue: Before
+        AXRole: AXSection AXValue: <obj>
+            AXRole: AXGroup 
+                AXRole: AXScrollArea 
+                    AXRole: AXWebArea 
+                        AXRole: AXGroup AXValue: <obj>
+                            AXRole: AXButton 
+        AXRole: AXParagraph AXValue: After
+        AXRole: AXParagraph AXValue: End of test
+
+After:
+AXRole: AXScrollArea 
+    AXRole: AXWebArea 
+        AXRole: AXParagraph AXValue: Before
+        AXRole: AXParagraph AXValue: After
+        AXRole: AXParagraph AXValue: End of test
+
+PASS frameBodyRole == frameBody.role is false
+PASS frameGroupRole == frameGroup.role is false
+PASS frameButtonRole == frameButton.role is false
+PASS root.isEqual(newRoot) is true
+PASS body.isEqual(newBody) is true
+PASS before.isEqual(newBefore) is true
+PASS after.isEqual(newAfter) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/dimensions-include-descendants-expected.txt b/LayoutTests/platform/wpe/accessibility/dimensions-include-descendants-expected.txt
new file mode 100644 (file)
index 0000000..4c49348
--- /dev/null
@@ -0,0 +1 @@
+link 1 dimensions: 100 x 100; link 2 dimensions: 100 x 99
diff --git a/LayoutTests/platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt b/LayoutTests/platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt
new file mode 100644 (file)
index 0000000..b873fc9
--- /dev/null
@@ -0,0 +1,15 @@
+test1
+test2
+End of test
+This tests that when you have a two nested inline continuations and the child one has no siblings, that we go back to the parent to check for its continuation.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+AXRole: AXWebArea 
+  AXRole: AXSection AXValue: test1<\n>test2<\n>
+    AXRole: AXSection AXValue: test2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/empty-image-with-title-expected.txt b/LayoutTests/platform/wpe/accessibility/empty-image-with-title-expected.txt
new file mode 100644 (file)
index 0000000..2fcc427
--- /dev/null
@@ -0,0 +1,12 @@
+
+This tests that if a missing image has a title attribute, it still appears in the AX hierarchy.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+image1.role is AXRole: AXImage
+image1's accessible name with source is AXTitle: baz
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt b/LayoutTests/platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt
new file mode 100644 (file)
index 0000000..684abbe
--- /dev/null
@@ -0,0 +1,16 @@
+  
+This tests the value of stringValue for a single file- and multiple files-<input type="file"> control.
+
+
+Default value (no files selected):
+accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: no file selected
+accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: no files selected
+
+Drag and drop a single file:
+accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: no file selected
+accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: no files selected
+
+Drag and drop two files:
+accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: no file selected
+accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: no files selected
+
diff --git a/LayoutTests/platform/wpe/accessibility/help-text-expected.txt b/LayoutTests/platform/wpe/accessibility/help-text-expected.txt
new file mode 100644 (file)
index 0000000..09614bb
--- /dev/null
@@ -0,0 +1,29 @@
+Tests accessibility help text in a variety of examples.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS: Help text for <a> is ""
+PASS: Help text for <a> is "bar"
+PASS: Help text for <a> is "baz"
+PASS: Help text for <a> is ""
+PASS: Help text for <h1> is "bar"
+PASS: Help text for <a> is ""
+PASS: Help text for <button> is ""
+PASS: Help text for <button> is "bar"
+PASS: Help text for <button> is "baz"
+PASS: Help text for <button> is ""
+PASS: Help text for <table> is "table summary"
+PASS: Help text for <caption> is ""
+PASS: Help text for <input> is ""
+PASS: Help text for <div> is ""
+PASS: Help text for <main> is "bar"
+PASS: Help text for <button> is ""
+PASS: Help text for <main> is ""
+PASS: Help text for <div> is ""
+PASS: Help text for <a> is "bar"
+PASS: Help text for <div> is ""
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/image-link-expected.txt b/LayoutTests/platform/wpe/accessibility/image-link-expected.txt
new file mode 100644 (file)
index 0000000..98695dd
--- /dev/null
@@ -0,0 +1,46 @@
+Image link in the presence of inline continuations
+
+This test checks that the right accessibility tree is generated for a link inside an image
+
+
+AXRole: AXLink
+AXParent: AXSection
+AXChildren: 1
+AXPosition: { 8.00000, 99.0000 }
+AXSize: { 280.000, 214.000 }
+AXTitle: Delicious cake
+AXDescription: 
+AXValue: <obj>
+AXFocusable: 1
+AXFocused: 1
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXURL: http://www.wowhead.com/?item=33924
+AXPlatformAttributes: computed-role:link, html-id:test, tag:a, toolkit:WPEWebKit
+
+Child 0:
+AXRole: AXImage
+AXParent: AXLink: Delicious cake
+AXChildren: 0
+AXPosition: { 8.00000, 100.000 }
+AXSize: { 280.000, 210.000 }
+AXTitle: Delicious cake
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXURL: LayoutTests/accessibility/resources/cake.png
+AXPlatformAttributes: computed-role:img, tag:img, toolkit:WPEWebKit
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/image-map1-expected.txt b/LayoutTests/platform/wpe/accessibility/image-map1-expected.txt
new file mode 100644 (file)
index 0000000..635797e
--- /dev/null
@@ -0,0 +1,22 @@
+This tests that you can reach the links within an image map.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Link1 role: AXRole: AXLink
+Link1 title: AXTitle: Link1
+Link1 description: AXDescription: 
+
+Link2 role: AXRole: AXLink
+Link2 title: AXTitle: Link2
+Link2 description: AXDescription: 
+
+Link3 role: AXRole: AXLink
+Link3 title: AXTitle: Link3
+Link3 description: AXDescription: 
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/image-map2-expected.txt b/LayoutTests/platform/wpe/accessibility/image-map2-expected.txt
new file mode 100644 (file)
index 0000000..572dfd1
--- /dev/null
@@ -0,0 +1,64 @@
+Image map - test 2 - 2 Links (alt tags)
+----------------------
+AXRole: AXSection
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 8.00000, 8.00000 }
+AXSize: { 784.000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Image map - test 2 - 2 Links (alt tags)<\n>----------------------<\n>
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: html-id:result, tag:div, toolkit:WPEWebKit
+------------
+AXRole: AXLink
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 18.0000, 55.0000 }
+AXSize: { 123.000, 62.0000 }
+AXTitle: Link1
+AXDescription: 
+AXValue: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXURL: http://www.apple.com/
+AXPlatformAttributes: computed-role:link, tag:area, toolkit:WPEWebKit
+------------
+AXRole: AXLink
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 20.0000, 119.000 }
+AXSize: { 122.000, 14.0000 }
+AXTitle: Link2
+AXDescription: 
+AXValue: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXURL: http://www.apple.com/
+AXPlatformAttributes: computed-role:link, tag:area, toolkit:WPEWebKit
+------------
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/inline-continuations-expected.txt b/LayoutTests/platform/wpe/accessibility/inline-continuations-expected.txt
new file mode 100644 (file)
index 0000000..b9243ed
--- /dev/null
@@ -0,0 +1,13 @@
+Inline continuations - accessibility tree linkage
+
+This test checks that the right accessibility tree is generated in the presence of inline continuations. Each of the five numbers below should be visited only ones traversing the accessibility tree.
+
+1
+2
+34
+5
+FAIL nonGroupDescendants(accessibilityController.focusedElement) should be 5. Was 0.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/label-with-pseudo-elements-expected.txt b/LayoutTests/platform/wpe/accessibility/label-with-pseudo-elements-expected.txt
new file mode 100644 (file)
index 0000000..6af6ed5
--- /dev/null
@@ -0,0 +1,38 @@
+
+
+
+
+
+This tests the accessible text alternatives results for labels with pseudo elements.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+       AXTitle: before test 1
+       AXDescription: 
+       AXTitleUIElement: non-null
+
+       AXTitle: test 2 after
+       AXDescription: 
+       AXTitleUIElement: non-null
+
+       AXTitle: before test 3 after
+       AXDescription: 
+       AXTitleUIElement: non-null
+
+       AXTitle: 
+       AXDescription: 
+       AXTitleUIElement: null
+
+       AXTitle: test 5 input value
+       AXDescription: 
+       AXTitleUIElement: non-null
+
+       AXTitle: before test 6 input value after
+       AXDescription: 
+       AXTitleUIElement: non-null
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/list-detection-expected.txt b/LayoutTests/platform/wpe/accessibility/list-detection-expected.txt
new file mode 100644 (file)
index 0000000..efd4fe6
--- /dev/null
@@ -0,0 +1,65 @@
+This tests the heuristic to determine if a 'list' is really a list, or just being used for layout.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Ordered list is a list.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Empty ordered list is not a list.
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+Empty description list is not a list.
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+Description list is a list.
+PASS axElement.role == 'AXRole: AXDescriptionList' is true
+
+
+ARIA role=list is a list.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Empty ARIA list is not a list.
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+ARIA list with one item is a list.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Default styled Unordered list is a list, because it shows markers.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Unordered list with more than 1 item and no style is not a list.
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+Unordered list with 1 item and no style is not list.
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+List with non list item children is not a list
+PASS axElement.role == 'AXRole: AXList' is false
+
+
+Unordered list with image for markers is a list - even if image fails to load.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Unordered list with aria role and at least one aria list items is a list.
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+Inline list elements with an aria role should be a list
+PASS axElement.role == 'AXRole: AXList' is true
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/lists-expected.txt b/LayoutTests/platform/wpe/accessibility/lists-expected.txt
new file mode 100644 (file)
index 0000000..eadc79e
--- /dev/null
@@ -0,0 +1,266 @@
+test 1
+test 2
+test 1
+test 2
+term 1
+meaning 2
+term b
+meaning 1
+meaning 2
+
+
+
+
+AXRole: AXList
+AXParent: AXWebArea
+AXChildren: 2
+AXPosition: { 8.00000, 16.0000 }
+AXSize: { 784.000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:list, tag:ul, toolkit:WPEWebKit
+------------
+AXRole: AXList
+AXParent: AXWebArea
+AXChildren: 2
+AXPosition: { 8.00000, 68.0000 }
+AXSize: { 784.000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:list, tag:ol, toolkit:WPEWebKit
+------------
+AXRole: AXDescriptionList
+AXParent: AXWebArea
+AXChildren: 5
+AXPosition: { 8.00000, 120.000 }
+AXSize: { 784.000, 90.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dl, toolkit:WPEWebKit
+------------
+AXRole: AXSection
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 8.00000, 226.000 }
+AXSize: { 784.000, 72.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: <\n><\n><\n><\n>
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: toolkit:WPEWebKit
+------------
+
+
+AXRole: AXListItem
+AXParent: AXList
+AXChildren: 0
+AXPosition: { 48.0000, 16.0000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: test 1
+AXDescription: 
+AXValue: • test 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:listitem, tag:li, toolkit:WPEWebKit
+------------
+AXRole: AXListItem
+AXParent: AXList
+AXChildren: 0
+AXPosition: { 48.0000, 34.0000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: test 2
+AXDescription: 
+AXValue: • test 2
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:listitem, tag:li, toolkit:WPEWebKit
+------------
+
+
+AXRole: AXListItem
+AXParent: AXList
+AXChildren: 0
+AXPosition: { 48.0000, 68.0000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: test 1
+AXDescription: 
+AXValue: 1. test 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:listitem, tag:li, toolkit:WPEWebKit
+------------
+AXRole: AXListItem
+AXParent: AXList
+AXChildren: 0
+AXPosition: { 48.0000, 86.0000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: test 2
+AXDescription: 
+AXValue: 2. test 2
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:listitem, tag:li, toolkit:WPEWebKit
+------------
+
+
+AXRole: AXDescriptionTerm
+AXParent: AXDescriptionList
+AXChildren: 0
+AXPosition: { 8.00000, 120.000 }
+AXSize: { 769.000, 18.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: term 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dt, toolkit:WPEWebKit
+------------
+AXRole: AXDescriptionValue
+AXParent: AXDescriptionList
+AXChildren: 0
+AXPosition: { 48.0000, 138.000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: meaning 2
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dd, toolkit:WPEWebKit
+------------
+AXRole: AXDescriptionTerm
+AXParent: AXDescriptionList
+AXChildren: 0
+AXPosition: { 8.00000, 156.000 }
+AXSize: { 769.000, 18.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: term b
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dt, toolkit:WPEWebKit
+------------
+AXRole: AXDescriptionValue
+AXParent: AXDescriptionList
+AXChildren: 0
+AXPosition: { 48.0000, 174.000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: meaning 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dd, toolkit:WPEWebKit
+------------
+AXRole: AXDescriptionValue
+AXParent: AXDescriptionList
+AXChildren: 0
+AXPosition: { 48.0000, 192.000 }
+AXSize: { 729.000, 18.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: meaning 2
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:dd, toolkit:WPEWebKit
+------------
+
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/math-multiscript-attributes-expected.txt b/LayoutTests/platform/wpe/accessibility/math-multiscript-attributes-expected.txt
new file mode 100644 (file)
index 0000000..df426fe
--- /dev/null
@@ -0,0 +1,110 @@
+X
+D
+C
+B
+A
+This tests the attributes of the children of a MathML mmultiscripts element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+AXRole: AXStatic
+AXParent: AXSection
+AXChildren: 0
+AXPosition:  { 17.0000, -33.0000 }
+AXSize: { 14.0000, 106.000 }
+AXTitle: 
+AXDescription: 
+AXValue: X
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:mi, toolkit:WPEWebKit
+------------
+AXRole: AXSubscript
+AXParent: AXSection
+AXChildren: 0
+AXPosition:  { 30.0000, -15.0000 }
+AXSize: { 11.0000, 81.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: D
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: multiscript-type:post, tag:mi, toolkit:WPEWebKit
+------------
+AXRole: AXSuperscript
+AXParent: AXSection
+AXChildren: 0
+AXPosition:  { 30.0000, -26.0000 }
+AXSize: { 10.0000, 80.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: C
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: multiscript-type:post, tag:mi, toolkit:WPEWebKit
+------------
+AXRole: AXSubscript
+AXParent: AXSection
+AXChildren: 0
+AXPosition:  { 8.00000, -15.0000 }
+AXSize: { 10.0000, 81.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: B
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: multiscript-type:pre, tag:mi, toolkit:WPEWebKit
+------------
+AXRole: AXSuperscript
+AXParent: AXSection
+AXChildren: 0
+AXPosition:  { 8.00000, -26.0000 }
+AXSize: { 10.0000, 80.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: A
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: multiscript-type:pre, tag:mi, toolkit:WPEWebKit
+------------
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/media-emits-object-replacement-expected.txt b/LayoutTests/platform/wpe/accessibility/media-emits-object-replacement-expected.txt
new file mode 100644 (file)
index 0000000..de0c749
--- /dev/null
@@ -0,0 +1,28 @@
+a  b
+
+a  b
+End of test
+AXRole: AXWebArea 
+    AXRole: AXSection AXValue: a <obj> b
+        AXRole: AXVideo 
+            AXRole: AXToolbar 
+                AXRole: AXButton 
+                AXRole: AXButton 
+                AXRole: AXSection AXValue: 
+    AXRole: AXSection AXValue: <\n>
+    AXRole: AXSection AXValue: a <obj> b
+        AXRole: AXAudio 
+            AXRole: AXToolbar 
+                AXRole: AXButton 
+                AXRole: AXButton 
+                AXRole: AXSection AXValue: 
+    AXRole: AXSection AXValue: End of test
+This tests ensures that if video or audio tags are used, they will emit an object replacement character in a range for string operation.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/menu-list-crash2-expected.txt b/LayoutTests/platform/wpe/accessibility/menu-list-crash2-expected.txt
new file mode 100644 (file)
index 0000000..9f9e054
--- /dev/null
@@ -0,0 +1,13 @@
+TEST
+TEST
+This tests that there's no crash if we hide menu list and then try to access accessibility information.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Role before removal: AXRole: AXComboBox
+Role after removal: AXRole: AXInvalid
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt b/LayoutTests/platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt
new file mode 100644 (file)
index 0000000..f2d64d0
--- /dev/null
@@ -0,0 +1,17 @@
+This tests that minimal tables are treated as data tables if they have ARIA table-related properties.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+cell1: AXRole: AXCell
+cell2: AXRole: AXCell
+cell3: AXRole: AXCell
+cell4: AXRole: AXCell
+cell5: AXRole: AXCell
+cell6: AXRole: AXCell
+cell7: AXRole: AXCell
+cell8: AXRole: AXSection
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/press-targets-center-point-expected.txt b/LayoutTests/platform/wpe/accessibility/press-targets-center-point-expected.txt
new file mode 100644 (file)
index 0000000..1064b83
--- /dev/null
@@ -0,0 +1,25 @@
+target
+Actual: (89, 18)
+Expected: (89, 18)
+
+translate transform target
+Actual: (289, 266)
+Expected: (289, 266)
+
+vertical left-to-right writing mode target
+Actual: (18, 309)
+Expected: (18, 309)
+
+right-to-left direction target
+Actual: (129, 512)
+Expected: (129, 512)
+
+This tests that press targets the receiving elements center point.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/radio-button-title-label-expected.txt b/LayoutTests/platform/wpe/accessibility/radio-button-title-label-expected.txt
new file mode 100644 (file)
index 0000000..d17601a
--- /dev/null
@@ -0,0 +1,22 @@
+This test checks that radio buttons expose title ui elements correctly under a variety of cirmcumstances. In general, the should NOT disappear and should be the titleUIElement for the checkbox.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS radio1.title is 'AXTitle: LABEL'
+PASS titleUIElement.isEqual(accessibilityController.accessibleElementById('label1')) is true
+PASS radio2.title is 'AXTitle: LABEL2a'
+PASS radio2.description is 'AXDescription: '
+PASS !titleUIElement || titleUIElement.title == 'AXTitle: ' is true
+PASS radio3.title is 'AXTitle: radio3'
+PASS radio2.description is 'AXDescription: '
+PASS !titleUIElement || titleUIElement.title == 'AXTitle: ' is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Test
+LABEL  Test
+LABEL2
+LABEL2a
+Test
+LABEL3
diff --git a/LayoutTests/platform/wpe/accessibility/render-counter-text-expected.txt b/LayoutTests/platform/wpe/accessibility/render-counter-text-expected.txt
new file mode 100644 (file)
index 0000000..d091f93
--- /dev/null
@@ -0,0 +1,10 @@
+This tests that the text for RenderCounter is exposed correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS line1.stringValue is 'AXValue: 1 : line1'
+PASS line2.stringValue is 'AXValue: 2 : line2'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/roles-computedRoleString-expected.txt b/LayoutTests/platform/wpe/accessibility/roles-computedRoleString-expected.txt
new file mode 100644 (file)
index 0000000..d36d08d
--- /dev/null
@@ -0,0 +1,198 @@
+This tests that native elements and ARIA overrides result in the same ARIA computed role, regardless of platform.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS: a[href] -> link. 
+PASS: article -> article. 
+PASS: aside -> complementary. 
+PASS: button -> button. 
+PASS: dfn -> definition. 
+PASS: dl -> . 
+PASS: footer -> contentinfo. 
+PASS: form -> form. 
+PASS: header -> banner. 
+PASS: h1 -> heading. 
+PASS: h2 -> heading. 
+PASS: h3 -> heading. 
+PASS: h4 -> heading. 
+PASS: h5 -> heading. 
+PASS: h5 -> heading. 
+PASS: hr -> separator. 
+PASS: img[alt='X'] -> img. 
+PASS: input[type='button'] -> button. 
+PASS: input[type='checkbox'] -> checkbox. 
+PASS: input[type='date'] -> . 
+PASS: input[type='datetime'] -> . 
+PASS: input[type='datetime-local'] -> . 
+PASS: input[type='email'] -> . 
+PASS: input[type='file'] -> button. 
+PASS: input[type='image'] -> button. 
+PASS: input[type='month'] -> . 
+PASS: input[type='number'] -> . 
+PASS: input[type='password'] -> . 
+PASS: input[type='radio'] -> radio. 
+PASS: input[type='range'] -> slider. 
+PASS: input[type='reset'] -> button. 
+PASS: input[type='search'] -> searchbox. 
+PASS: input[type='submit'] -> button. 
+PASS: input[type='tel'] -> . 
+PASS: input[type='text'] -> . 
+PASS: input[type='time'] -> . 
+PASS: input[type='url'] -> . 
+PASS: input[type='week'] -> . 
+PASS: ins -> . 
+PASS: math -> math. 
+PASS: nav -> navigation. 
+PASS: ol -> list. 
+PASS: li -> listitem. 
+PASS: p -> paragraph. 
+PASS: pre -> . 
+PASS: progress -> progressbar. 
+PASS: samp -> . 
+PASS: section:not([aria-label]:not([aria-labelledby]) -> . 
+PASS: section[aria-label] -> region. 
+PASS: section[aria-labelledby] -> region. 
+PASS: select:not([multiple]) -> button. 
+PASS: option -> . 
+PASS: option -> . 
+PASS: select[multiple] -> listbox. 
+PASS: option -> option. 
+PASS: optgroup -> option. 
+PASS: option -> option. 
+PASS: option -> option. 
+PASS: sub -> . 
+PASS: sup -> . 
+PASS: table -> table. 
+PASS: caption -> caption. 
+PASS: tr -> row. 
+PASS: th -> columnheader. 
+PASS: tr -> row. 
+PASS: td -> cell. 
+PASS: tr -> row. 
+PASS: td -> cell. 
+PASS: table[role="grid"] -> grid. 
+PASS: tr -> row. 
+PASS: th -> columnheader. 
+PASS: tr -> row. 
+PASS: td[role="gridcell"] -> gridcell. 
+PASS: tr -> row. 
+PASS: td[role="gridcell"] -> gridcell. 
+PASS: textarea -> textbox. 
+PASS: time -> . 
+PASS: ul -> list. 
+PASS: li -> listitem. 
+PASS: var -> . 
+PASS: div[role="command"] -> . 
+PASS: div[role="composite"] -> . 
+PASS: div[role="input"] -> . 
+PASS: div[role="landmark"] -> . 
+PASS: div[role="range"] -> . 
+PASS: div[role="roletype"] -> . 
+PASS: div[role="section"] -> . 
+PASS: div[role="sectionhead"] -> . 
+PASS: div[role="select"] -> . 
+PASS: div[role="structure"] -> . 
+PASS: div[role="widget"] -> . 
+PASS: div[role="window"] -> . 
+PASS: div[role="alert"] -> alert. 
+PASS: div[role="alertdialog"] -> alertdialog. 
+PASS: div[role="application"] -> application. 
+PASS: div[role="article"] -> article. 
+PASS: div[role="banner"] -> banner. 
+PASS: div[role="blockquote"] -> blockquote. 
+PASS: div[role="button"] -> button. 
+PASS: div[role="caption"] -> caption. 
+PASS: div[role="checkbox"] -> checkbox. 
+PASS: div[role="combobox"] -> combobox. 
+PASS: div[role="complementary"] -> complementary. 
+PASS: div[role="contentinfo"] -> contentinfo. 
+PASS: div[role="definition"] -> definition. 
+PASS: div[role="dialog"] -> dialog. 
+PASS: div[role="directory"] -> list. 
+PASS: div[role="document"] -> document. 
+PASS: div[role="figure"] -> figure. 
+PASS: div[role="form"] -> form. 
+PASS: div[role="graphics-document"] -> document. 
+PASS: div[role="graphics-object"] -> group. 
+PASS: div[role="graphics-symbol"] -> img. 
+PASS: div[role="grid"] -> grid. 
+PASS: div[role="row"] -> row. 
+PASS: div[role="rowheader"] -> rowheader. 
+PASS: div[role="columnheader"] -> columnheader. 
+PASS: div[role="gridcell"] -> gridcell. 
+PASS: div[role="feed"] -> feed. 
+PASS: div[role="group"] -> group. 
+PASS: div[role="heading"] -> heading. 
+PASS: div[role="img"] -> img. 
+PASS: div[role="link"] -> link. 
+PASS: div[role="list"] -> list. 
+PASS: div[role="listitem"] -> listitem. 
+PASS: div[role="listbox"] -> listbox. 
+PASS: div[role="option"] -> option. 
+PASS: div[role="log"] -> log. 
+PASS: div[role="main"] -> main. 
+PASS: div[role="marquee"] -> marquee. 
+PASS: div[role="math"] -> math. 
+PASS: div[role="menu"] -> menu. 
+PASS: div[role="menuitem"] -> menuitem. 
+PASS: div[role="menuitemcheckbox"] -> menuitemcheckbox. 
+PASS: div[role="menuitemradio"] -> menuitemradio. 
+PASS: div[role="menubar"] -> menubar. 
+PASS: div[role="menuitem"] -> menuitem. 
+PASS: div[role="menuitemcheckbox"] -> menuitemcheckbox. 
+PASS: div[role="menuitemradio"] -> menuitemradio. 
+PASS: div[role="meter"] -> meter. 
+PASS: div[role="navigation"] -> navigation. 
+PASS: div[role="note"] -> note. 
+PASS: div[role="paragraph"] -> paragraph. 
+PASS: div[role="progressbar"] -> progressbar. 
+PASS: div[role="radiogroup"] -> radiogroup. 
+PASS: div[role="radio"] -> radio. 
+PASS: div[role="region"]:not([aria-label]:not([aria-labelledby]) -> . 
+PASS: div[role="region"][aria-label] -> region. 
+PASS: div[role="region"][aria-labelledby] -> region. 
+PASS: div[role="scrollbar"] -> scrollbar. 
+PASS: div[role="search"] -> search. 
+PASS: div[role="separator"] -> separator. 
+PASS: div[role="slider"] -> slider. 
+PASS: div[role="spinbutton"] -> spinbutton. 
+PASS: div[role="status"] -> status. 
+PASS: div[role="tablist"] -> tablist. 
+PASS: div[role="tab"] -> tab. 
+PASS: div[role="tabpanel"] -> tabpanel. 
+PASS: div[role="textbox"] -> . 
+PASS: div[role="term"] -> term. 
+PASS: div[role="timer"] -> timer. 
+PASS: div[role="toolbar"] -> toolbar. 
+PASS: div[role="tooltip"] -> tooltip. 
+PASS: div[role="tree"] -> tree. 
+PASS: div[role="treeitem"] -> treeitem. 
+PASS: div[role="treeitem"] -> treeitem. 
+PASS: div[role="treegrid"] -> treegrid. 
+PASS: div[role="row"] -> row. 
+PASS: div[role="rowheader"] -> rowheader. 
+PASS: div[role="columnheader"] -> columnheader. 
+PASS: div[role="gridcell"] -> gridcell. 
+PASS: div[role="button foo"] -> button. 
+PASS: div[role="foo button bar"] -> button. 
+PASS: div[role="foo  button  bar"] -> button. 
+PASS: div[role="foo    button  bar"] -> . 
+PASS: div[role="foo
+button
+bar"] -> . 
+PASS: img[role="foo"] -> img. 
+PASS: img[role="foo bar"] -> img. 
+PASS: img[role="foo  bar"] -> img. 
+PASS: img[role="foo    bar"] -> img. 
+PASS: img[role="foo    
+bar"] -> img. 
+PASS: img[role="text"] -> text. 
+PASS: img[role="text img"] -> text. 
+PASS: img[role="img text"] -> img. 
+PASS: img[role="presentation"][aria-label] -> img. 
+PASS: a[role="foo bar"] -> link. 
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/roles-exposed-expected.txt b/LayoutTests/platform/wpe/accessibility/roles-exposed-expected.txt
new file mode 100644 (file)
index 0000000..5b2ebd4
--- /dev/null
@@ -0,0 +1,862 @@
+X
+This tests that native elements and ARIA overrides result in the expected role, subrole and role description.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+a[href]
+      AXRole: AXLink
+      
+a:not([href])
+      AXRole: 
+      
+abbr:not([title])
+      AXRole: 
+      
+abbr[title]
+      AXRole: AXStatic
+      
+address
+      AXRole: AXLandmarkContentInfo
+      
+article
+      AXRole: AXArticle
+      
+aside
+      AXRole: AXLandmarkComplementary
+      
+audio
+      AXRole: 
+      
+b
+      AXRole: 
+      
+bdo
+      AXRole: 
+      
+blockquote
+      AXRole: AXBlockquote
+      
+button
+      AXRole: AXButton
+      
+canvas
+      AXRole: 
+      
+cite
+      AXRole: AXStatic
+      
+code
+      AXRole: AXStatic
+      
+del:not([datetime])
+      AXRole: AXStatic
+      
+del[datetime]
+      AXRole: AXStatic
+      
+dfn
+      AXRole: AXDefinition
+      
+dl
+      AXRole: AXDescriptionList
+      
+dt
+      AXRole: AXDescriptionTerm
+      
+dd
+      AXRole: AXDescriptionValue
+      
+div
+      AXRole: AXSection
+      
+em
+      AXRole: 
+      
+fieldset
+      AXRole: AXGroup
+      
+legend
+      AXRole: AXLabel
+      
+footer
+      AXRole: AXLandmarkContentInfo
+      
+form
+      AXRole: AXForm
+      
+header
+      AXRole: AXLandmarkBanner
+      
+hgroup
+      AXRole: AXGroup
+      
+h1
+      AXRole: AXHeading
+      
+h2
+      AXRole: AXHeading
+      
+h3
+      AXRole: AXHeading
+      
+h4
+      AXRole: AXHeading
+      
+h5
+      AXRole: AXHeading
+      
+h6
+      AXRole: AXHeading
+      
+hr
+      AXRole: AXSeparator
+      
+i
+      AXRole: 
+      
+img:not([src]):not([alt])
+      AXRole: 
+      
+img[alt='']
+      AXRole: 
+      
+img[src]:not([alt])
+      AXRole: 
+      
+img[alt='X']
+      AXRole: AXImage
+      
+img[usemap][alt='X']
+      AXRole: AXImageMap
+      
+img[usemap]:not([alt])
+      AXRole: 
+      
+input[type='button']
+      AXRole: AXButton
+      
+input[type='color']
+      AXRole: AXTextField
+      
+input[type='checkbox']
+      AXRole: AXCheckBox
+      
+input[type='date']
+      AXRole: AXTextField
+      
+input[type='datetime']
+      AXRole: AXTextField
+      
+input[type='datetime-local']
+      AXRole: AXTextField
+      
+input[type='email']
+      AXRole: AXTextField
+      
+input[type='file']
+      AXRole: AXButton
+      
+input[type='hidden']
+      AXRole: 
+      
+input[type='image']
+      AXRole: AXButton
+      
+input[type='month']
+      AXRole: AXTextField
+      
+input[type='number']
+      AXRole: AXTextField
+      
+input[type='password']
+      AXRole: AXPasswordField
+      
+input[type='radio']
+      AXRole: AXRadioButton
+      
+input[type='range']
+      AXRole: AXSlider
+      
+input[type='reset']
+      AXRole: AXButton
+      
+input[type='search']
+      AXRole: AXTextField
+      
+input[type='submit']
+      AXRole: AXButton
+      
+input[type='tel']
+      AXRole: AXTextField
+      
+input[type='text']
+      AXRole: AXTextField
+      
+input[type='time']
+      AXRole: AXTextField
+      
+input[type='url']
+      AXRole: AXTextField
+      
+input[type='week']
+      AXRole: AXTextField
+      
+ins:not([datetime])
+      AXRole: AXStatic
+      
+ins[datetime]
+      AXRole: AXStatic
+      
+map
+      AXRole: 
+      
+area
+      AXRole: 
+      
+mark
+      AXRole: 
+      
+math
+      AXRole: AXMath
+      
+merror
+      AXRole: AXGroup
+      
+mfenced
+      AXRole: AXGroup
+      
+mfrac
+      AXRole: AXMathFraction
+      
+mi
+      AXRole: AXStatic
+      
+mn
+      AXRole: AXStatic
+      
+mo
+      AXRole: AXStatic
+      
+mroot
+      AXRole: AXMathRoot
+      
+msqrt
+      AXRole: AXMathRoot
+      
+mrow
+      AXRole: AXGroup
+      
+ms
+      AXRole: AXStatic
+      
+msub
+      AXRole: AXSection
+      
+mi
+      AXRole: AXStatic
+      
+mi
+      AXRole: AXSubscript
+      
+msup
+      AXRole: AXSection
+      
+mi
+      AXRole: AXStatic
+      
+mi
+      AXRole: AXSuperscript
+      
+msubsup
+      AXRole: AXSection
+      
+mi
+      AXRole: AXStatic
+      
+mi
+      AXRole: AXSubscript
+      
+mi
+      AXRole: AXSuperscript
+      
+mmultiscripts
+      AXRole: AXSection
+      
+mi
+      AXRole: AXStatic
+      
+mi
+      AXRole: AXSubscript
+      
+mi
+      AXRole: AXSuperscript
+      
+mprescripts
+      AXRole: 
+      
+mi
+      AXRole: AXSubscript
+      
+mi
+      AXRole: AXSuperscript
+      
+mtext
+      AXRole: AXStatic
+      
+mtable
+      AXRole: AXTable
+      
+mlabeledtr
+      AXRole: AXRow
+      
+mtd
+      AXRole: AXCell
+      
+mtr
+      AXRole: AXRow
+      
+mtd
+      AXRole: AXCell
+      
+nav
+      AXRole: AXLandmarkNavigation
+      
+ol
+      AXRole: AXList
+      
+li
+      AXRole: AXListItem
+      
+p
+      AXRole: AXParagraph
+      
+pre
+      AXRole: AXSection
+      
+progress
+      AXRole: AXProgressIndicator
+      
+q
+      AXRole: 
+      
+s
+      AXRole: 
+      
+samp
+      AXRole: AXStatic
+      
+section:not([aria-label]:not([aria-labelledby])
+      AXRole: AXSection
+      
+section[aria-label]
+      AXRole: AXLandmarkRegion
+      
+section[aria-labelledby]
+      AXRole: AXLandmarkRegion
+      
+select:not([multiple])
+      AXRole: AXComboBox
+      
+option
+      AXRole: AXMenuItem
+      
+optgroup
+      AXRole: 
+      
+select[multiple]
+      AXRole: AXListBox
+      
+option
+      AXRole: AXListItem
+      
+optgroup
+      AXRole: AXListItem
+      
+small
+      AXRole: 
+      
+span:not([onclick])
+      AXRole: 
+      
+span[onclick]
+      AXRole: AXStatic
+      
+strong
+      AXRole: 
+      
+sub
+      AXRole: AXSubscript
+      
+sup
+      AXRole: AXSuperscript
+      
+svg
+      AXRole: 
+      
+table
+      AXRole: AXTable
+      
+caption
+      AXRole: AXCaption
+      
+thead
+      AXRole: 
+      
+tr
+      AXRole: AXRow
+      
+th
+      AXRole: AXColumnHeader
+      
+tbody
+      AXRole: 
+      
+tr
+      AXRole: AXRow
+      
+td
+      AXRole: AXCell
+      
+tfoot
+      AXRole: 
+      
+tr
+      AXRole: AXRow
+      
+th
+      AXRole: AXRowHeader
+      
+textarea
+      AXRole: AXTextField
+      
+time:not([datetime])
+      AXRole: AXStatic
+      
+time[datetime]
+      AXRole: AXStatic
+      
+ul
+      AXRole: AXList
+      
+li
+      AXRole: AXListItem
+      
+var
+      AXRole: AXStatic
+      
+wbr
+      AXRole: 
+      
+div[role=command]
+      AXRole: AXSection
+      
+div[role=composite]
+      AXRole: AXSection
+      
+div[role=input]
+      AXRole: AXSection
+      
+div[role=landmark]
+      AXRole: AXSection
+      
+div[role=range]
+      AXRole: AXSection
+      
+div[role=roletype]
+      AXRole: AXSection
+      
+div[role=section]
+      AXRole: AXSection
+      
+div[role=sectionhead]
+      AXRole: AXSection
+      
+div[role=select]
+      AXRole: AXSection
+      
+div[role=structure]
+      AXRole: AXSection
+      
+div[role=widget]
+      AXRole: AXSection
+      
+div[role=window]
+      AXRole: AXSection
+      
+div[role=alert]
+      AXRole: AXAlert
+      
+div[role=alertdialog]
+      AXRole: AXDialog
+      
+div[role=application]
+      AXRole: AXEmbedded
+      
+div[role=article]
+      AXRole: AXArticle
+      
+div[role=banner]
+      AXRole: AXLandmarkBanner
+      
+div[role=blockquote]
+      AXRole: AXBlockquote
+      
+div[role=button]
+      AXRole: AXButton
+      
+div[role=caption]
+      AXRole: AXCaption
+      
+div[role=checkbox]
+      AXRole: AXCheckBox
+      
+div[role=combobox]
+      AXRole: AXComboBox
+      
+div[role=complementary]
+      AXRole: AXLandmarkComplementary
+      
+div[role=contentinfo]
+      AXRole: AXLandmarkContentInfo
+      
+div[role=definition]
+      AXRole: AXDefinition
+      
+div[role=dialog]
+      AXRole: AXDialog
+      
+div[role=directory]
+      AXRole: AXList
+      
+div[role=doc-abstract]
+      AXRole: AXSection
+      
+div[role=doc-acknowledgments]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-afterword]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-appendix]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-backlink]
+      AXRole: AXLink
+      
+div[role=doc-biblioentry]
+      AXRole: AXListItem
+      
+div[role=doc-bibliography]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-biblioref]
+      AXRole: AXLink
+      
+div[role=doc-chapter]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-colophon]
+      AXRole: AXSection
+      
+div[role=doc-conclusion]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-cover]
+      AXRole: AXImage
+      
+div[role=doc-credit]
+      AXRole: AXSection
+      
+div[role=doc-credits]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-dedication]
+      AXRole: AXSection
+      
+div[role=doc-endnote]
+      AXRole: AXListItem
+      
+div[role=doc-endnotes]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-epigraph]
+      AXRole: AXSection
+      
+div[role=doc-epilogue]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-errata]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-example]
+      AXRole: AXSection
+      
+div[role=doc-footnote]
+      AXRole: AXFootnote
+      
+div[role=doc-foreword]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-glossary]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-glossref]
+      AXRole: AXLink
+      
+div[role=doc-index]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-introduction]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-noteref]
+      AXRole: AXLink
+      
+div[role=doc-notice]
+      AXRole: AXComment
+      
+div[role=doc-pagebreak]
+      AXRole: AXSeparator
+      
+div[role=doc-pagelist]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-part]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-preface]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-prologue]
+      AXRole: AXLandmarkRegion
+      
+div[role=doc-pullquote]
+      AXRole: AXSection
+      
+div[role=doc-qna]
+      AXRole: AXSection
+      
+div[role=doc-subtitle]
+      AXRole: AXHeading
+      
+div[role=doc-tip]
+      AXRole: AXComment
+      
+div[role=doc-toc]
+      AXRole: AXLandmarkRegion
+      
+div[role=document]
+      AXRole: AXDocument
+      
+div[role=figure]
+      AXRole: AXGroup
+      
+div[role=form]
+      AXRole: AXLandmarkForm
+      
+div[role=graphics-document]
+      AXRole: AXDocument
+      
+div[role=graphics-object]
+      AXRole: AXGroup
+      
+div[role=graphics-symbol]
+      AXRole: AXImage
+      
+div[role=grid]
+      AXRole: AXTable
+      
+div[role=rowgroup]
+      AXRole: 
+      
+div[role=row]
+      AXRole: AXRow
+      
+div[role=rowheader]
+      AXRole: AXRowHeader
+      
+div[role=columnheader]
+      AXRole: AXColumnHeader
+      
+div[role=gridcell]
+      AXRole: AXCell
+      
+div[role=feed]
+      AXRole: AXGroup
+      
+div[role=group]
+      AXRole: AXGroup
+      
+div[role=heading]
+      AXRole: AXHeading
+      
+div[role=img]
+      AXRole: AXImage
+      
+div[role=link]
+      AXRole: AXLink
+      
+div[role=list]
+      AXRole: AXList
+      
+div[role=listitem]
+      AXRole: AXListItem
+      
+div[role=listbox]
+      AXRole: AXListBox
+      
+div[role=option]
+      AXRole: AXListItem
+      
+div[role=log]
+      AXRole: AXLog
+      
+div[role=main]
+      AXRole: AXLandmarkMain
+      
+div[role=marquee]
+      AXRole: AXMarquee
+      
+div[role=math]
+      AXRole: AXMath
+      
+div[role=menu]
+      AXRole: AXMenu
+      
+div[role=menuitem]
+      AXRole: AXMenuItem
+      
+div[role=menuitemcheckbox]
+      AXRole: AXCheckMenuItem
+      
+div[role=menuitemradio]
+      AXRole: AXRadioMenuItem
+      
+div[role=menubar]
+      AXRole: AXMenuBar
+      
+div[role=menuitem]
+      AXRole: AXMenuItem
+      
+div[role=menuitemcheckbox]
+      AXRole: AXCheckMenuItem
+      
+div[role=menuitemradio]
+      AXRole: AXRadioMenuItem
+      
+div[role=meter]
+      AXRole: AXLevelIndicator
+      
+div[role=navigation]
+      AXRole: AXLandmarkNavigation
+      
+div[role=note]
+      AXRole: AXComment
+      
+div[role=paragraph]
+      AXRole: AXParagraph
+      
+div[role=presentation]
+      AXRole: 
+      
+div[role=progressbar]
+      AXRole: AXProgressIndicator
+      
+div[role=radiogroup]
+      AXRole: AXGroup
+      
+div[role=radio]
+      AXRole: AXRadioButton
+      
+div[role=region]:not([aria-label]:not([aria-labelledby])
+      AXRole: AXSection
+      
+div[role=region][aria-label]
+      AXRole: AXLandmarkRegion
+      
+div[role=region][aria-labelledby]
+      AXRole: AXLandmarkRegion
+      
+div[role=scrollbar]
+      AXRole: AXScrollBar
+      
+div[role=search]
+      AXRole: AXLandmarkSearch
+      
+div[role=searchbox]
+      AXRole: AXTextField
+      
+div[role=separator]
+      AXRole: AXSeparator
+      
+div[role=slider]
+      AXRole: AXSlider
+      
+div[role=spinbutton]
+      AXRole: AXSpinButton
+      
+div[role=status]
+      AXRole: AXStatusBar
+      
+div[role=switch]
+      AXRole: AXToggleButton
+      
+div[role=tablist]
+      AXRole: AXTabGroup
+      
+div[role=tab]
+      AXRole: AXTab
+      
+div[role=tabpanel]
+      AXRole: AXScrollArea
+      
+div[role=term]
+      AXRole: AXDescriptionTerm
+      
+div[role=textbox]
+      AXRole: AXTextField
+      
+div[role=timer]
+      AXRole: AXTimer
+      
+div[role=toolbar]
+      AXRole: AXToolbar
+      
+div[role=tooltip]
+      AXRole: AXUserInterfaceTooltip
+      
+div[role=tree]
+      AXRole: AXTree
+      
+div[role=treeitem]
+      AXRole: AXTreeItem
+      
+div[role=group]
+      AXRole: 
+      
+div[role=treeitem]
+      AXRole: AXTreeItem
+      
+div[role=treegrid]
+      AXRole: AXTreeGrid
+      
+div[role=rowgroup]
+      AXRole: 
+      
+div[role=row]
+      AXRole: AXRow
+      
+div[role=rowheader]
+      AXRole: AXRowHeader
+      
+div[role=columnheader]
+      AXRole: AXColumnHeader
+      
+div[role=gridcell]
+      AXRole: AXCell
+      
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt b/LayoutTests/platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt
new file mode 100644 (file)
index 0000000..336c8dd
--- /dev/null
@@ -0,0 +1,29 @@
+hello world test
+This tests that selected text ranges can be set on a contenteditable element.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Initial selected range: {1, 0}
+
+Set range: {3, 0}
+PASS content.selectedTextRange became '{3, 0}'
+
+Set range: {100, 0}
+PASS content.selectedTextRange became '{16, 0}'
+
+Set range: {0, 0}
+PASS content.selectedTextRange became '{0, 0}'
+
+Set range: {1, 12}
+PASS content.selectedTextRange became '{1, 12}'
+
+Set range: {-1, 0}
+PASS content.selectedTextRange became '{16, 0}'
+
+Set range: {7, 3}
+PASS content.selectedTextRange became '{7, 3}'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/svg-remote-element-expected.txt b/LayoutTests/platform/wpe/accessibility/svg-remote-element-expected.txt
new file mode 100644 (file)
index 0000000..d9371dc
--- /dev/null
@@ -0,0 +1,35 @@
+
+This test ensures that accessibility elements can be created out of what a remote SVG image defines.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+container location: (7, 7)
+Face role: AXRole: AXButton
+Face label: AXTitle: face
+FaceX: 0
+FaceY: 0
+
+
+Eye role: AXRole: AXButton
+Eye label: AXTitle: left-eye
+EyeX: 103
+EyeY: 148
+
+
+Nose role: AXRole: AXButton
+Nose label: AXTitle: nose
+NoseX: 193
+NoseY: 206
+
+
+Mouth role: AXRole: AXButton
+Mouth label: AXTitle: smile
+MouthX: 116
+MouthY: 276
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt b/LayoutTests/platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt
new file mode 100644 (file)
index 0000000..6692d14
--- /dev/null
@@ -0,0 +1,28 @@
+test test test
+test
+
+This tests that if tabindex is set on an object, it will be accessible (even if it is usually not)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Item 1: Is focusable: true
+Item 1: AXRole: AXGroup
+
+
+Item 2: Is focusable: true
+Item 2: AXRole: AXGroup
+
+
+Item 3: Is focusable: true
+Item 3: AXRole: AXGroup
+
+
+Item 4: Is focusable: true
+Item 4: AXRole: AXParagraph
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-attributes-expected.txt b/LayoutTests/platform/wpe/accessibility/table-attributes-expected.txt
new file mode 100644 (file)
index 0000000..bf0585b
--- /dev/null
@@ -0,0 +1,548 @@
+Example #1: Nested Stubs
+Ruritanian
+Population 
+Survey All
+Genders        By Gender
+Males  Females
+All Regions    North   3333    1111    2222
+South  3333    1111    2222
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 234.000, 27.0000 }
+AXSize: { 144.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 234.000, 27.0000 }
+AXSize: { 144.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 377.000, 27.0000 }
+AXSize: { 70.0000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All<\n>Genders
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 446.000, 27.0000 }
+AXSize: { 120.000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: By Gender
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 446.000, 27.0000 }
+AXSize: { 120.000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: By Gender
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 93.0000 }
+AXSize: { 90.0000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All Regions
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 93.0000 }
+AXSize: { 90.0000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All Regions
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+
+
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 27.0000 }
+AXSize: { 143.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 27.0000 }
+AXSize: { 143.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 370.000, 27.0000 }
+AXSize: { 69.0000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All<\n>Genders
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 27.0000 }
+AXSize: { 119.000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: By Gender
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 27.0000 }
+AXSize: { 119.000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: By Gender
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 27.0000 }
+AXSize: { 143.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 27.0000 }
+AXSize: { 143.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 370.000, 27.0000 }
+AXSize: { 69.0000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All<\n>Genders
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 57.0000 }
+AXSize: { 52.0000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Males
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 491.000, 57.0000 }
+AXSize: { 67.0000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Females
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 93.0000 }
+AXSize: { 90.0000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All Regions
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 317.000, 93.0000 }
+AXSize: { 53.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: North
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 370.000, 93.0000 }
+AXSize: { 69.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 3333
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 93.0000 }
+AXSize: { 52.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1111
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 491.000, 93.0000 }
+AXSize: { 67.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 2222
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 93.0000 }
+AXSize: { 90.0000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: All Regions
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 317.000, 123.000 }
+AXSize: { 53.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: South
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 370.000, 123.000 }
+AXSize: { 69.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 3333
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 123.000 }
+AXSize: { 52.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1111
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 491.000, 123.000 }
+AXSize: { 67.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 2222
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-cell-spans-expected.txt b/LayoutTests/platform/wpe/accessibility/table-cell-spans-expected.txt
new file mode 100644 (file)
index 0000000..946d584
--- /dev/null
@@ -0,0 +1,124 @@
+Cell A
+COLSPAN="2"
+ROWSPAN="2"    Cell B
+COLSPAN="2"
+2,3    2,4
+Cell C
+ROWSPAN="2"    3,2     3,3     3,4
+4,2    4,3     4,4
+----------------------
+{ 0, 0 }
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 154.000, 9.00000 }
+AXSize: { 246.000, 78.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Cell A<\n>COLSPAN="2"<\n>ROWSPAN="2"
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+{0, 2}, {0, 2}
+
+----------------------
+{ 1, 1 }
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 154.000, 9.00000 }
+AXSize: { 246.000, 78.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Cell A<\n>COLSPAN="2"<\n>ROWSPAN="2"
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+{0, 2}, {0, 2}
+
+----------------------
+{ 3, 0 }
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 146.000, 87.0000 }
+AXSize: { 124.000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Cell C<\n>ROWSPAN="2"
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+{2, 2}, {0, 1}
+
+----------------------
+{ 2, 0 }
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 146.000, 87.0000 }
+AXSize: { 124.000, 60.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Cell C<\n>ROWSPAN="2"
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+{2, 2}, {0, 1}
+
+----------------------
+{ 2, 3 }
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 515.000, 87.0000 }
+AXSize: { 124.000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 3,4
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+{2, 1}, {3, 1}
+
+----------------------
+{ 10, 10 }
+
+{0, 0}, {0, 0}
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-cells-expected.txt b/LayoutTests/platform/wpe/accessibility/table-cells-expected.txt
new file mode 100644 (file)
index 0000000..17e21c0
--- /dev/null
@@ -0,0 +1,117 @@
+Example #1: Nested Stubs
+Ruritanian
+Population 
+Survey All
+Genders        By Gender
+Males  Females
+All Regions    North   3333    1111    2222
+South  3333    1111    2222
+South  3333    1111    2222
+South  3333    1111    2222
+------------------------
+[0,0]
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 234.000, 27.0000 }
+AXSize: { 144.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------------------
+[3,1]
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 446.000, 57.0000 }
+AXSize: { 53.0000, 36.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Males
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:th, toolkit:WPEWebKit
+------------------------
+[1,1]
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 227.000, 27.0000 }
+AXSize: { 143.000, 66.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Ruritanian<\n>Population <\n>Survey
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------------------
+[2,2]
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 370.000, 93.0000 }
+AXSize: { 69.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 3333
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------------------
+[3,5]
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 439.000, 183.000 }
+AXSize: { 52.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1111
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------------------
+[100,0]
+
+------------------------
+[0,100]
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-cells-roles-expected.txt b/LayoutTests/platform/wpe/accessibility/table-cells-roles-expected.txt
new file mode 100644 (file)
index 0000000..e797a1c
--- /dev/null
@@ -0,0 +1,32 @@
+table
+No     Country Capital
+1.     Poland  Warsaw
+2.     Russia  Moscow
+3.     Ukraine Kiev
+All    3 countries     3 capitals
+
+
+table2
+No     Country Capital
+1.     Germany Berlin
+2.     Sweden  Stockholm
+3.     Norway  Oslo
+
+
+This test checks the correctness of roles for different cases of table cells.
+
+The table cell at (2,0) currently has role  AXRole: AXColumnHeader .
+The table cell at (1,2) currently has role  AXRole: AXCell .
+The table cell at (2,3) currently has role  AXRole: AXCell .
+The table cell at (1,4) currently has role  AXRole: AXCell .
+The table cell at (0,2) currently has role  AXRole: AXRowHeader .
+The table cell at (0,4) currently has role  AXRole: AXRowHeader .
+
+The table2 cell at (2,0) currently has role  AXRole: AXColumnHeader .
+The table2 cell at (1,2) currently has role  AXRole: AXCell .
+The table2 cell at (2,3) currently has role  AXRole: AXCell .
+The table2 cell at (0,2) currently has role  AXRole: AXRowHeader .
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-column-headers-with-captions-expected.txt b/LayoutTests/platform/wpe/accessibility/table-column-headers-with-captions-expected.txt
new file mode 100644 (file)
index 0000000..54d167c
--- /dev/null
@@ -0,0 +1,14 @@
+caption
+header1        header2
+a      b
+This tests that a table with a caption and an empty colgroup will still correctly report its headers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS colHeaders[0].isEqual(table.cellForColumnAndRow(0,0)) is true
+PASS colHeaders[1].isEqual(table.cellForColumnAndRow(1,0)) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-one-cell-expected.txt b/LayoutTests/platform/wpe/accessibility/table-one-cell-expected.txt
new file mode 100644 (file)
index 0000000..6a7fb79
--- /dev/null
@@ -0,0 +1,21 @@
+Pick Your Location!
+Get specific content for your area. 
+http://web.apple.com
+AXRole: AXParagraph
+AXParent: AXWebArea
+AXChildren: 1
+AXPosition: { 11.0000, 11.0000 }
+AXSize: { 132.000, 90.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: Pick Your Location!<\n>Get specific content for your area. <\n>http://web.apple.com<\n>
+AXFocusable: 1
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:paragraph, tag:p, toolkit:WPEWebKit
diff --git a/LayoutTests/platform/wpe/accessibility/table-roles-hierarchy-expected.txt b/LayoutTests/platform/wpe/accessibility/table-roles-hierarchy-expected.txt
new file mode 100644 (file)
index 0000000..3e73683
--- /dev/null
@@ -0,0 +1,35 @@
+No     Country Capital
+1.     Poland  Warsaw
+2.     Russia  Moscow
+3.     Ukraine Kiev
+All    3 countries     3 capitals
+
+
+
+This shows the hierarchy of table roles.
+
+role: AXRole: AXTable
+    role: AXRole: AXRow
+        role: AXRole: AXColumnHeader
+        role: AXRole: AXColumnHeader
+        role: AXRole: AXColumnHeader
+    role: AXRole: AXRow
+        role: AXRole: AXRowHeader
+        role: AXRole: AXCell
+        role: AXRole: AXCell
+    role: AXRole: AXRow
+        role: AXRole: AXRowHeader
+        role: AXRole: AXCell
+        role: AXRole: AXCell
+    role: AXRole: AXRow
+        role: AXRole: AXRowHeader
+        role: AXRole: AXCell
+        role: AXRole: AXCell
+    role: AXRole: AXRow
+        role: AXRole: AXRowHeader
+        role: AXRole: AXCell
+        role: AXRole: AXCell
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-sections-expected.txt b/LayoutTests/platform/wpe/accessibility/table-sections-expected.txt
new file mode 100644 (file)
index 0000000..41f7e3d
--- /dev/null
@@ -0,0 +1,756 @@
+Example #1: Nested Stubs
+1      a       b
+1      e       f
+1      c       d
+1      c1      d1
+
+
+1      a       b
+1      c       d
+1      c1      d1
+1      c       d
+1      c1      d1
+1      c       d
+1      c1      d1
+1      e       f
+--------------------------
+THEAD, TFOOT table
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 362.000, 63.0000 }
+AXSize: { 21.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 382.000, 63.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: a
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 409.000, 63.0000 }
+AXSize: { 29.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: b
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 63.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 93.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 123.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+
+
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 63.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 63.0000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: a
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 63.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: b
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 93.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 93.0000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: c
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 93.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: d
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 123.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 123.000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: c1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 123.000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: d1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 153.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 153.000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: e
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 153.000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: f
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+--------------------------
+Multi-TBODY table
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 63.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 63.0000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: a
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 63.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: b
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 63.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 93.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 123.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+
+
+--------------------------
+
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 63.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXColumnHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 63.0000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: a
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:columnheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 63.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: b
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 93.0000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 93.0000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: c
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 93.0000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: d
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXRowHeader
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 123.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:rowheader, tag:th, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 123.000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: c1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 123.000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: d1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 355.000, 153.000 }
+AXSize: { 20.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: 1
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 375.000, 153.000 }
+AXSize: { 27.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: e
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+AXRole: AXCell
+AXParent: AXRow
+AXChildren: 0
+AXPosition: { 402.000, 153.000 }
+AXSize: { 28.0000, 30.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: f
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 1
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:cell, tag:td, toolkit:WPEWebKit
+------------
+
+
+--------------------------
+
+
+
+--------------------------
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/table-with-rules-expected.txt b/LayoutTests/platform/wpe/accessibility/table-with-rules-expected.txt
new file mode 100644 (file)
index 0000000..d7b8df7
--- /dev/null
@@ -0,0 +1,100 @@
+asdf   asdf
+asdf   asdf
+asdf   asdf
+asdf   asdf
+asdf   asdf
+
+------------------------------------
+AXRole: AXTable
+AXParent: AXWebArea
+AXChildren: 1
+AXPosition: { 8.00000, 28.0000 }
+AXSize: { 57.0000, 20.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:table, html-id:testTable2, tag:table, toolkit:WPEWebKit
+
+AXRole: AXTable
+AXParent: AXWebArea
+AXChildren: 1
+AXPosition: { 8.00000, 48.0000 }
+AXSize: { 62.0000, 24.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:table, html-id:testTable3, tag:table, toolkit:WPEWebKit
+
+AXRole: AXTable
+AXParent: AXWebArea
+AXChildren: 1
+AXPosition: { 8.00000, 72.0000 }
+AXSize: { 56.0000, 20.0000 }
+AXTitle: 
+AXDescription: 
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: computed-role:table, html-id:testTable4, tag:table, toolkit:WPEWebKit
+
+AXRole: AXSection
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 10.0000, 94.0000 }
+AXSize: { 28.0000, 20.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: asdf
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:td, toolkit:WPEWebKit
+
+AXRole: AXSection
+AXParent: AXWebArea
+AXChildren: 0
+AXPosition: { 40.0000, 94.0000 }
+AXSize: { 28.0000, 20.0000 }
+AXTitle: 
+AXDescription: 
+AXValue: asdf
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: tag:td, toolkit:WPEWebKit
+
+
diff --git a/LayoutTests/platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt b/LayoutTests/platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt
new file mode 100644 (file)
index 0000000..fd7a098
--- /dev/null
@@ -0,0 +1,24 @@
+This tests text alternative calculation with hidden nodes.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Test 1
+       W3C Name: foo
+       W3C Description: 
+Test 2
+       W3C Name: 
+       W3C Description: bar
+Test 3
+       W3C Name: baz
+       W3C Description: 
+Test 4
+       W3C Name: cell 1 cell 4
+       W3C Description: 
+Test 5
+       W3C Name: 
+       W3C Description: cell 1 cell 4
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/wpe/accessibility/transformed-element-expected.txt b/LayoutTests/platform/wpe/accessibility/transformed-element-expected.txt
new file mode 100644 (file)
index 0000000..e5ea473
--- /dev/null
@@ -0,0 +1,19 @@
+hello
+AXRole: AXSection
+AXParent: AXWebArea
+AXChildren: 1
+AXPosition: { 8.00000, 9.00000 }
+AXSize: { 291.000, 123.000 }
+AXTitle: 
+AXDescription: 
+AXValue: hello
+AXFocusable: 0
+AXFocused: 0
+AXSelectable: 0
+AXSelected: 0
+AXMultiSelectable: 0
+AXEnabled: 1
+AXExpanded: 0
+AXRequired: 0
+AXChecked: 0
+AXPlatformAttributes: html-id:hiddenDiv, tag:div, toolkit:WPEWebKit
index 1dc6f1f..1c6d3a0 100644 (file)
@@ -1,3 +1,36 @@
+2019-05-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] Add initial accessibility support using ATK
+        https://bugs.webkit.org/show_bug.cgi?id=197413
+
+        Reviewed by Michael Catanzaro.
+
+        Use USE(ATK) instead of PLATFORM(GTK) for ATK related code and use ATK when available for WPE port too.
+
+        * PlatformWPE.cmake:
+        * SourcesWPE.txt:
+        * accessibility/AXObjectCache.h:
+        * accessibility/AccessibilityList.cpp:
+        (WebCore::AccessibilityList::childHasPseudoVisibleListItemMarkers):
+        * accessibility/AccessibilityNodeObject.cpp:
+        (WebCore::AccessibilityNodeObject::canSetValueAttribute const):
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::textIteratorBehaviorForTextRange const):
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::indexForVisiblePosition const):
+        (WebCore::AccessibilityRenderObject::shouldNotifyActiveDescendant const):
+        * accessibility/AccessibilityTableColumn.cpp:
+        (WebCore::AccessibilityTableColumn::computeAccessibilityIsIgnored const):
+        * accessibility/AccessibilityTableHeaderContainer.cpp:
+        (WebCore::AccessibilityTableHeaderContainer::computeAccessibilityIsIgnored const):
+        * accessibility/atk/WebKitAccessible.cpp:
+        (webkitAccessibleGetAttributes):
+        * accessibility/wpe/AXObjectCacheWPE.cpp: Removed.
+        * accessibility/wpe/AccessibilityObjectWPE.cpp: Removed.
+        * editing/FrameSelection.h:
+
 2019-05-20  Ross Kirsling  <ross.kirsling@sony.com>
 
         Make lossy LayoutUnit constructors explicit
index 4100c81..bf7f78a 100644 (file)
@@ -17,6 +17,7 @@ list(APPEND WebCore_UNIFIED_SOURCE_LIST_FILES
 )
 
 list(APPEND WebCore_PRIVATE_INCLUDE_DIRECTORIES
+    "${WEBCORE_DIR}/accessibility/atk"
     "${WEBCORE_DIR}/platform/graphics/egl"
     "${WEBCORE_DIR}/platform/graphics/epoxy"
     "${WEBCORE_DIR}/platform/graphics/glx"
@@ -48,6 +49,7 @@ set(WebCore_USER_AGENT_SCRIPTS
 set(WebCore_USER_AGENT_SCRIPTS_DEPENDENCIES ${WEBCORE_DIR}/platform/wpe/RenderThemeWPE.cpp)
 
 list(APPEND WebCore_LIBRARIES
+    ${ATK_LIBRARIES}
     ${GLIB_GIO_LIBRARIES}
     ${GLIB_GMODULE_LIBRARIES}
     ${GLIB_GOBJECT_LIBRARIES}
@@ -58,6 +60,7 @@ list(APPEND WebCore_LIBRARIES
 )
 
 list(APPEND WebCore_SYSTEM_INCLUDE_DIRECTORIES
+    ${ATK_INCLUDE_DIRS}
     ${GIO_UNIX_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
     ${LIBTASN1_INCLUDE_DIRS}
index 3c32d89..dbbd995 100644 (file)
 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 // THE POSSIBILITY OF SUCH DAMAGE.
 
-accessibility/wpe/AXObjectCacheWPE.cpp
-accessibility/wpe/AccessibilityObjectWPE.cpp
-
+accessibility/atk/AXObjectCacheAtk.cpp
+accessibility/atk/AccessibilityObjectAtk.cpp
+accessibility/atk/WebKitAccessible.cpp
+accessibility/atk/WebKitAccessibleHyperlink.cpp
+accessibility/atk/WebKitAccessibleInterfaceAction.cpp @no-unify
+accessibility/atk/WebKitAccessibleInterfaceComponent.cpp
+accessibility/atk/WebKitAccessibleInterfaceDocument.cpp
+accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp
+accessibility/atk/WebKitAccessibleInterfaceHyperlinkImpl.cpp
+accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp
+accessibility/atk/WebKitAccessibleInterfaceImage.cpp
+accessibility/atk/WebKitAccessibleInterfaceSelection.cpp
+accessibility/atk/WebKitAccessibleInterfaceTable.cpp
+accessibility/atk/WebKitAccessibleInterfaceTableCell.cpp
+accessibility/atk/WebKitAccessibleInterfaceText.cpp
+accessibility/atk/WebKitAccessibleInterfaceValue.cpp
+accessibility/atk/WebKitAccessibleUtil.cpp
+
+editing/atk/FrameSelectionAtk.cpp
 editing/libwpe/EditorLibWPE.cpp
 
 loader/soup/ResourceLoaderSoup.cpp
index eb67329..27034fa 100644 (file)
@@ -40,7 +40,7 @@
 #include <wtf/ListHashSet.h>
 #include <wtf/RefPtr.h>
 
-#if PLATFORM(GTK)
+#if USE(ATK)
 #include <wtf/glib/GRefPtr.h>
 #endif
 
@@ -485,7 +485,7 @@ private:
     bool m_isSynchronizingSelection { false };
     bool m_performingDeferredCacheUpdate { false };
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     ListHashSet<RefPtr<AccessibilityObject>> m_deferredAttachedWrapperObjectList;
     ListHashSet<GRefPtr<AccessibilityObjectWrapper>> m_deferredDetachedWrapperList;
 #endif
index 7b297d6..0bd0a73 100644 (file)
@@ -117,7 +117,7 @@ bool AccessibilityList::childHasPseudoVisibleListItemMarkers(RenderObject* listI
     
     // Platforms which expose rendered text content through the parent element will treat
     // those renderers as "ignored" objects.
-#if PLATFORM(GTK)
+#if USE(ATK)
     String text = axObj->textUnderElement();
     return !text.isEmpty() && !text.isAllSpecialCharacters<isHTMLSpace>();
 #else
index 1f2e146..137c858 100644 (file)
@@ -2161,7 +2161,7 @@ bool AccessibilityNodeObject::canSetValueAttribute() const
     if (isProgressIndicator() || isSlider() || isScrollbar())
         return true;
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     // In ATK, input types which support aria-readonly are treated as having a
     // settable value if the user can modify the widget's value or its state.
     if (supportsReadOnly())
index f787fa9..f702fde 100644 (file)
@@ -3274,7 +3274,7 @@ TextIteratorBehavior AccessibilityObject::textIteratorBehaviorForTextRange() con
 {
     TextIteratorBehavior behavior = TextIteratorIgnoresStyleVisibility;
     
-#if PLATFORM(GTK)
+#if USE(ATK)
     // We need to emit replaced elements for GTK, and present
     // them with the 'object replacement character' (0xFFFC).
     behavior = static_cast<TextIteratorBehavior>(behavior | TextIteratorEmitsObjectReplacementCharacters);
index c0a19ff..c2a1bb4 100644 (file)
@@ -47,7 +47,7 @@
 #include <wtf/RetainPtr.h>
 #endif
 
-#if PLATFORM(GTK)
+#if USE(ATK)
 #include <wtf/glib/GRefPtr.h>
 #endif
 
@@ -1045,7 +1045,7 @@ protected:
 
     AccessibilityObject* radioGroupAncestor() const;
 
-#if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
+#if HAVE(ACCESSIBILITY) && USE(ATK)
     bool allowsTextRanges() const;
     unsigned getLengthForTextRange() const;
 #else
@@ -1057,10 +1057,8 @@ protected:
     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
 #elif PLATFORM(WIN)
     COMPtr<AccessibilityObjectWrapper> m_wrapper;
-#elif PLATFORM(GTK)
+#elif USE(ATK)
     GRefPtr<WebKitAccessible> m_wrapper;
-#elif PLATFORM(WPE)
-    RefPtr<AccessibilityObjectWrapper> m_wrapper;
 #endif
 };
 
index 71fa8f0..92b2a90 100644 (file)
 #if PLATFORM(COCOA)
 OBJC_CLASS WebAccessibilityObjectWrapper;
 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
-#elif PLATFORM(GTK)
+#elif USE(ATK)
 typedef struct _WebKitAccessible WebKitAccessible;
 typedef struct _WebKitAccessible AccessibilityObjectWrapper;
-#elif PLATFORM(WPE)
-class AccessibilityObjectWrapper : public RefCounted<AccessibilityObjectWrapper> { };
 #else
 class AccessibilityObjectWrapper;
 #endif
index de2a005..89c4517 100644 (file)
@@ -2022,7 +2022,7 @@ int AccessibilityRenderObject::indexForVisiblePosition(const VisiblePosition& po
     if (indexPosition.isNull() || highestEditableRoot(indexPosition, HasEditableAXRole) != node)
         return 0;
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     // We need to consider replaced elements for GTK, as they will be
     // presented with the 'object replacement character' (0xFFFC).
     bool forSelectionPreservation = true;
@@ -2460,7 +2460,7 @@ AccessibilityObjectInterface* AccessibilityRenderObject::accessibilityHitTest(co
 
 bool AccessibilityRenderObject::shouldNotifyActiveDescendant() const
 {
-#if PLATFORM(GTK)
+#if USE(ATK)
     // According to the Core AAM spec, ATK expects object:state-changed:focused notifications
     // whenever the active descendant changes.
     return true;
index dd81452..3cb7f15 100644 (file)
@@ -176,7 +176,7 @@ bool AccessibilityTableColumn::computeAccessibilityIsIgnored() const
     if (!m_parent)
         return true;
     
-#if PLATFORM(IOS_FAMILY) || PLATFORM(GTK)
+#if PLATFORM(IOS_FAMILY) || USE(ATK)
     return true;
 #endif
     
index 1c65d38..946ef1c 100644 (file)
@@ -54,7 +54,7 @@ bool AccessibilityTableHeaderContainer::computeAccessibilityIsIgnored() const
     if (!m_parent)
         return true;
     
-#if PLATFORM(IOS_FAMILY) || PLATFORM(GTK)
+#if PLATFORM(IOS_FAMILY) || USE(ATK)
     return true;
 #endif
 
index ef5b9ef..63b0382 100644 (file)
@@ -394,6 +394,8 @@ static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
     AtkAttributeSet* attributeSet = nullptr;
 #if PLATFORM(GTK)
     attributeSet = addToAtkAttributeSet(attributeSet, "toolkit", "WebKitGtk");
+#elif PLATFORM(WPE)
+    attributeSet = addToAtkAttributeSet(attributeSet, "toolkit", "WPEWebKit");
 #endif
 
     auto* coreObject = accessible->priv->object;
diff --git a/Source/WebCore/accessibility/wpe/AXObjectCacheWPE.cpp b/Source/WebCore/accessibility/wpe/AXObjectCacheWPE.cpp
deleted file mode 100644 (file)
index 008acca..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2017 Igalia, S.L.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser 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
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include "config.h"
-#include "AXObjectCache.h"
-
-#if HAVE(ACCESSIBILITY)
-
-#include "NotImplemented.h"
-
-namespace WebCore {
-
-void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType)
-{
-    notImplemented();
-}
-
-void AXObjectCache::attachWrapper(AccessibilityObject*)
-{
-    notImplemented();
-}
-
-void AXObjectCache::postPlatformNotification(AccessibilityObject*, AXNotification)
-{
-    notImplemented();
-}
-
-void AXObjectCache::nodeTextChangePlatformNotification(AccessibilityObject*, AXTextChange, unsigned, const String&)
-{
-    notImplemented();
-}
-
-void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject*, AXLoadingEvent)
-{
-    notImplemented();
-}
-
-void AXObjectCache::platformHandleFocusedUIElementChanged(Node*, Node*)
-{
-    notImplemented();
-}
-
-void AXObjectCache::handleScrolledToAnchor(const Node*)
-{
-    notImplemented();
-}
-
-void AXObjectCache::platformPerformDeferredCacheUpdate()
-{
-    notImplemented();
-}
-
-} // namespace WebCore
-
-#endif // HAVE(ACCESSIBILITY)
diff --git a/Source/WebCore/accessibility/wpe/AccessibilityObjectWPE.cpp b/Source/WebCore/accessibility/wpe/AccessibilityObjectWPE.cpp
deleted file mode 100644 (file)
index 866a2ab..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 Igalia, S.L.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser 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
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include "config.h"
-#include "AXObjectCache.h"
-
-#if HAVE(ACCESSIBILITY)
-
-#include "NotImplemented.h"
-
-namespace WebCore {
-
-bool AccessibilityObject::accessibilityIgnoreAttachment() const
-{
-    notImplemented();
-    return false;
-}
-
-AccessibilityObjectInclusion AccessibilityObject::accessibilityPlatformIncludesObject() const
-{
-    notImplemented();
-    return AccessibilityObjectInclusion::DefaultBehavior;
-}
-
-} // namespace WebCore
-
-#endif // HAVE(ACCESSIBILITY)
index e170721..1166a1e 100644 (file)
@@ -385,7 +385,7 @@ inline void FrameSelection::clearTypingStyle()
     m_typingStyle = nullptr;
 }
 
-#if !(PLATFORM(COCOA) || PLATFORM(GTK))
+#if !(PLATFORM(COCOA) || USE(ATK))
 #if HAVE(ACCESSIBILITY)
 inline void FrameSelection::notifyAccessibilityForSelectionChange(const AXTextStateChangeIntent&)
 {
index 12ec5a7..6c4c217 100644 (file)
@@ -1,3 +1,48 @@
+2019-05-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] Add initial accessibility support using ATK
+        https://bugs.webkit.org/show_bug.cgi?id=197413
+
+        Reviewed by Michael Catanzaro.
+
+        Rename WebKitWebViewBaseAccessible as WebKitWebViewAccessible and move it to glib removing its dependency on
+        GTK. WPEView now implements get_accessible to return its associated WebKitWebViewAccessible.
+
+        * PlatformWPE.cmake:
+        * SourcesGTK.txt:
+        * SourcesWPE.txt:
+        * UIProcess/API/glib/WebKitWebViewAccessible.cpp: Added.
+        (webkitWebViewAccessibleInitialize):
+        (webkitWebViewAccessibleRefStateSet):
+        (webkitWebViewAccessibleGetIndexInParent):
+        (webkit_web_view_accessible_class_init):
+        (webkitWebViewAccessibleNew):
+        (webkitWebViewAccessibleSetWebView):
+        * UIProcess/API/glib/WebKitWebViewAccessible.h: Added.
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseDispose):
+        (webkitWebViewBaseGetAccessible):
+        * UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp: Removed.
+        * UIProcess/API/gtk/WebKitWebViewBaseAccessible.h: Removed.
+        * UIProcess/API/wpe/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::accessible):
+        * UIProcess/API/wpe/PageClientImpl.h:
+        * UIProcess/API/wpe/WPEView.cpp:
+        (WKWPE::m_backend):
+        (WKWPE::View::~View):
+        (WKWPE::View::accessible):
+        * UIProcess/API/wpe/WPEView.h:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/wpe/WebPageProxyWPE.cpp:
+        (WebKit::WebPageProxy::bindAccessibilityTree): Call atk_socket_embed() with the given plug ID.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/wpe/WebPageWPE.cpp:
+        (WebKit::WebPage::platformInitialize): Create the WebKitWebPageAccessibilityObject and send
+        BindAccessibilityTree message to the UI process.
+        * WebProcess/wpe/WebProcessMainWPE.cpp:
+        (WebKit::initializeAccessibility): Implement AtkUtil interface and initialize the atk bridge.
+
 2019-05-20  Alex Christensen  <achristensen@webkit.org>
 
         Revert r245501
index 57ab12e..75bf8a6 100644 (file)
@@ -265,6 +265,7 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES
     "${WEBKIT_DIR}/WebProcess/unix"
     "${WEBKIT_DIR}/WebProcess/WebCoreSupport/soup"
     "${WEBKIT_DIR}/WebProcess/WebPage/CoordinatedGraphics"
+    "${WEBKIT_DIR}/WebProcess/WebPage/atk"
     "${WEBKIT_DIR}/WebProcess/WebPage/libwpe"
     "${WEBKIT_DIR}/WebProcess/WebPage/wpe"
     "${WTF_DIR}/wtf/gtk/"
@@ -273,6 +274,8 @@ list(APPEND WebKit_INCLUDE_DIRECTORIES
 )
 
 list(APPEND WebKit_SYSTEM_INCLUDE_DIRECTORIES
+    ${ATK_INCLUDE_DIRS}
+    ${ATK_BRIDGE_INCLUDE_DIRS}
     ${CAIRO_INCLUDE_DIRS}
     ${FREETYPE_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
@@ -284,16 +287,17 @@ list(APPEND WebKit_SYSTEM_INCLUDE_DIRECTORIES
 )
 
 list(APPEND WebKit_LIBRARIES
-    PRIVATE
-        ${CAIRO_LIBRARIES}
-        ${FREETYPE_LIBRARIES}
-        ${GLIB_LIBRARIES}
-        ${GLIB_GMODULE_LIBRARIES}
-        ${GSTREAMER_LIBRARIES}
-        ${HARFBUZZ_LIBRARIES}
-        ${LIBSECCOMP_LIBRARIES}
-        ${LIBSOUP_LIBRARIES}
-        ${WPE_LIBRARIES}
+    ${ATK_LIBRARIES}
+    ${ATK_BRIDGE_LIBRARIES}
+    ${CAIRO_LIBRARIES}
+    ${FREETYPE_LIBRARIES}
+    ${GLIB_LIBRARIES}
+    ${GLIB_GMODULE_LIBRARIES}
+    ${GSTREAMER_LIBRARIES}
+    ${HARFBUZZ_LIBRARIES}
+    ${LIBSECCOMP_LIBRARIES}
+    ${LIBSOUP_LIBRARIES}
+    ${WPE_LIBRARIES}
 )
 
 WEBKIT_BUILD_INSPECTOR_GRESOURCES(${DERIVED_SOURCES_WEBINSPECTORUI_DIR})
index 8b5367f..2ef5b3c 100644 (file)
@@ -180,6 +180,7 @@ UIProcess/API/glib/WebKitVersion.cpp @no-unify
 UIProcess/API/glib/WebKitWebContext.cpp @no-unify
 UIProcess/API/glib/WebKitWebResource.cpp @no-unify
 UIProcess/API/glib/WebKitWebView.cpp @no-unify
+UIProcess/API/glib/WebKitWebViewAccessible.cpp @no-unify
 UIProcess/API/glib/WebKitWebViewSessionState.cpp @no-unify
 UIProcess/API/glib/WebKitWebsiteData.cpp @no-unify
 UIProcess/API/glib/WebKitWebsiteDataManager.cpp @no-unify
@@ -200,7 +201,6 @@ UIProcess/API/gtk/WebKitScriptDialogGtk.cpp @no-unify
 UIProcess/API/gtk/WebKitScriptDialogImpl.cpp @no-unify
 UIProcess/API/gtk/WebKitWebInspector.cpp @no-unify
 UIProcess/API/gtk/WebKitWebViewBase.cpp @no-unify
-UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp @no-unify
 UIProcess/API/gtk/WebKitWebViewDialog.cpp @no-unify
 UIProcess/API/gtk/WebKitWebViewGtk.cpp @no-unify
 
index c302d82..edf5c3a 100644 (file)
@@ -164,6 +164,7 @@ UIProcess/API/glib/WebKitVersion.cpp @no-unify
 UIProcess/API/glib/WebKitWebContext.cpp @no-unify
 UIProcess/API/glib/WebKitWebResource.cpp @no-unify
 UIProcess/API/glib/WebKitWebView.cpp @no-unify
+UIProcess/API/glib/WebKitWebViewAccessible.cpp @no-unify
 UIProcess/API/glib/WebKitWebViewSessionState.cpp @no-unify
 UIProcess/API/glib/WebKitWebsiteData.cpp @no-unify
 UIProcess/API/glib/WebKitWebsiteDataManager.cpp @no-unify
@@ -248,6 +249,8 @@ WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp
 WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp
 WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp
 
+WebProcess/WebPage/atk/WebKitWebPageAccessibilityObject.cpp
+
 WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp
 
 WebProcess/WebPage/libwpe/AcceleratedSurfaceLibWPE.cpp @no-unify
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.cpp
new file mode 100644 (file)
index 0000000..3862886
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * 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 "config.h"
+#include "WebKitWebViewAccessible.h"
+
+#if HAVE(ACCESSIBILITY)
+
+#include <wtf/glib/WTFGType.h>
+
+struct _WebKitWebViewAccessiblePrivate {
+    gpointer webView;
+};
+
+WEBKIT_DEFINE_TYPE(WebKitWebViewAccessible, webkit_web_view_accessible, ATK_TYPE_SOCKET)
+
+static void webkitWebViewAccessibleInitialize(AtkObject* atkObject, gpointer data)
+{
+    if (ATK_OBJECT_CLASS(webkit_web_view_accessible_parent_class)->initialize)
+        ATK_OBJECT_CLASS(webkit_web_view_accessible_parent_class)->initialize(atkObject, data);
+
+    webkitWebViewAccessibleSetWebView(WEBKIT_WEB_VIEW_ACCESSIBLE(atkObject), data);
+    atk_object_set_role(atkObject, ATK_ROLE_FILLER);
+}
+
+static AtkStateSet* webkitWebViewAccessibleRefStateSet(AtkObject* atkObject)
+{
+    WebKitWebViewAccessible* accessible = WEBKIT_WEB_VIEW_ACCESSIBLE(atkObject);
+
+    AtkStateSet* stateSet;
+    if (accessible->priv->webView) {
+        // Use the implementation of AtkSocket if the web view is still alive.
+        stateSet = ATK_OBJECT_CLASS(webkit_web_view_accessible_parent_class)->ref_state_set(atkObject);
+        if (!atk_socket_is_occupied(ATK_SOCKET(atkObject)))
+            atk_state_set_add_state(stateSet, ATK_STATE_TRANSIENT);
+    } else {
+        // If the web view is no longer alive, save some remote calls
+        // (because of AtkSocket's implementation of ref_state_set())
+        // and just return that this AtkObject is defunct.
+        stateSet = atk_state_set_new();
+        atk_state_set_add_state(stateSet, ATK_STATE_DEFUNCT);
+    }
+
+    return stateSet;
+}
+
+static gint webkitWebViewAccessibleGetIndexInParent(AtkObject* atkObject)
+{
+    AtkObject* atkParent = atk_object_get_parent(atkObject);
+    if (!atkParent)
+        return -1;
+
+    guint count = atk_object_get_n_accessible_children(atkParent);
+    for (guint i = 0; i < count; ++i) {
+        AtkObject* child = atk_object_ref_accessible_child(atkParent, i);
+        bool childIsObject = child == atkObject;
+        g_object_unref(child);
+        if (childIsObject)
+            return i;
+    }
+
+    return -1;
+}
+
+static void webkit_web_view_accessible_class_init(WebKitWebViewAccessibleClass* klass)
+{
+    // No need to implement get_n_children() and ref_child() here
+    // since this is a subclass of AtkSocket and all the logic related
+    // to those functions will be implemented by the ATK bridge.
+    AtkObjectClass* atkObjectClass = ATK_OBJECT_CLASS(klass);
+    atkObjectClass->initialize = webkitWebViewAccessibleInitialize;
+    atkObjectClass->ref_state_set = webkitWebViewAccessibleRefStateSet;
+    atkObjectClass->get_index_in_parent = webkitWebViewAccessibleGetIndexInParent;
+}
+
+WebKitWebViewAccessible* webkitWebViewAccessibleNew(gpointer webView)
+{
+    AtkObject* object = ATK_OBJECT(g_object_new(WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE, nullptr));
+    atk_object_initialize(object, webView);
+    return WEBKIT_WEB_VIEW_ACCESSIBLE(object);
+}
+
+void webkitWebViewAccessibleSetWebView(WebKitWebViewAccessible* accessible, gpointer webView)
+{
+    g_return_if_fail(WEBKIT_IS_WEB_VIEW_ACCESSIBLE(accessible));
+
+    if (accessible->priv->webView == webView)
+        return;
+
+    if (accessible->priv->webView && !webView)
+        atk_object_notify_state_change(ATK_OBJECT(accessible), ATK_STATE_DEFUNCT, TRUE);
+
+    bool didHaveWebView = accessible->priv->webView;
+    accessible->priv->webView = webView;
+
+    if (!didHaveWebView && webView)
+        atk_object_notify_state_change(ATK_OBJECT(accessible), ATK_STATE_DEFUNCT, FALSE);
+}
+
+#endif // HAVE(ACCESSIBILITY)
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.h b/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.h
new file mode 100644 (file)
index 0000000..3037d48
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2012, 2019 Igalia S.L.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#if HAVE(ACCESSIBILITY)
+
+#include <atk/atk.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE              (webkit_web_view_accessible_get_type())
+#define WEBKIT_WEB_VIEW_ACCESSIBLE(object)           (G_TYPE_CHECK_INSTANCE_CAST((object), WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE, WebKitWebViewAccessible))
+#define WEBKIT_WEB_VIEW_ACCESSIBLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE, WebKitWebViewAccessibleClass))
+#define WEBKIT_IS_WEB_VIEW_ACCESSIBLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE((object), WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE))
+#define WEBKIT_IS_WEB_VIEW_ACCESSIBLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE))
+#define WEBKIT_WEB_VIEW_ACCESSIBLE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), WEBKIT_TYPE_WEB_VIEW_ACCESSIBLE, WebKitWebViewAccessibleClass))
+
+typedef struct _WebKitWebViewAccessible WebKitWebViewAccessible;
+typedef struct _WebKitWebViewAccessibleClass WebKitWebViewAccessibleClass;
+typedef struct _WebKitWebViewAccessiblePrivate WebKitWebViewAccessiblePrivate;
+
+struct _WebKitWebViewAccessible {
+    AtkSocket parent;
+    /*< private >*/
+    WebKitWebViewAccessiblePrivate* priv;
+};
+
+struct _WebKitWebViewAccessibleClass {
+    AtkSocketClass parentClass;
+};
+
+GType webkit_web_view_accessible_get_type();
+
+WebKitWebViewAccessible* webkitWebViewAccessibleNew(gpointer);
+void webkitWebViewAccessibleSetWebView(WebKitWebViewAccessible*, gpointer);
+
+G_END_DECLS
+
+#endif // HAVE(ACCESSIBILITY)
index e545dc7..7c7b0da 100644 (file)
@@ -43,7 +43,7 @@
 #include "WebInspectorProxy.h"
 #include "WebKit2Initialize.h"
 #include "WebKitEmojiChooser.h"
-#include "WebKitWebViewBaseAccessible.h"
+#include "WebKitWebViewAccessible.h"
 #include "WebKitWebViewBasePrivate.h"
 #include "WebPageGroup.h"
 #include "WebPageProxy.h"
@@ -561,6 +561,7 @@ static void webkitWebViewBaseDispose(GObject* gobject)
 {
     WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(gobject);
     webkitWebViewBaseSetToplevelOnScreenWindow(webView, nullptr);
+    webkitWebViewAccessibleSetWebView(WEBKIT_WEB_VIEW_ACCESSIBLE(webView->priv->accessible.get()), nullptr);
 #if GTK_CHECK_VERSION(3, 24, 0)
     webkitWebViewBaseCompleteEmojiChooserRequest(webView, emptyString());
 #endif
@@ -1301,7 +1302,7 @@ static AtkObject* webkitWebViewBaseGetAccessible(GtkWidget* widget)
     WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv;
     if (!priv->accessible) {
         // Create the accessible object and associate it to the widget.
-        priv->accessible = adoptGRef(ATK_OBJECT(webkitWebViewBaseAccessibleNew(widget)));
+        priv->accessible = adoptGRef(ATK_OBJECT(webkitWebViewAccessibleNew(widget)));
 
         // Set the parent to not break bottom-up navigation.
         if (auto* parentWidget = gtk_widget_get_parent(widget)) {
diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp
deleted file mode 100644 (file)
index 7a13965..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2012 Igalia S.L.
- *
- * 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 "config.h"
-#include "WebKitWebViewBaseAccessible.h"
-
-#include <gtk/gtk.h>
-#include <wtf/glib/WTFGType.h>
-
-struct _WebKitWebViewBaseAccessiblePrivate {
-    GtkWidget* widget;
-};
-
-WEBKIT_DEFINE_TYPE(WebKitWebViewBaseAccessible, webkit_web_view_base_accessible, ATK_TYPE_SOCKET)
-
-static void webkitWebViewBaseAccessibleWidgetDestroyed(GtkWidget*, WebKitWebViewBaseAccessible* accessible)
-{
-    accessible->priv->widget = 0;
-    atk_object_notify_state_change(ATK_OBJECT(accessible), ATK_STATE_DEFUNCT, TRUE);
-}
-
-static void webkitWebViewBaseAccessibleInitialize(AtkObject* atkObject, gpointer data)
-{
-    if (ATK_OBJECT_CLASS(webkit_web_view_base_accessible_parent_class)->initialize)
-        ATK_OBJECT_CLASS(webkit_web_view_base_accessible_parent_class)->initialize(atkObject, data);
-
-    if (data && GTK_IS_WIDGET(data)) {
-        WebKitWebViewBaseAccessible* accessible = WEBKIT_WEB_VIEW_BASE_ACCESSIBLE(atkObject);
-        accessible->priv->widget = GTK_WIDGET(data);
-
-        g_signal_connect_after(accessible->priv->widget, "destroy",
-                               G_CALLBACK(webkitWebViewBaseAccessibleWidgetDestroyed), atkObject);
-    }
-
-    atk_object_set_role(atkObject, ATK_ROLE_FILLER);
-}
-
-static AtkStateSet* webkitWebViewBaseAccessibleRefStateSet(AtkObject* atkObject)
-{
-    WebKitWebViewBaseAccessible* accessible = WEBKIT_WEB_VIEW_BASE_ACCESSIBLE(atkObject);
-
-    AtkStateSet* stateSet;
-    if (accessible->priv->widget) {
-        // Use the implementation of AtkSocket if the widget is still alive.
-        stateSet = ATK_OBJECT_CLASS(webkit_web_view_base_accessible_parent_class)->ref_state_set(atkObject);
-        if (!atk_socket_is_occupied(ATK_SOCKET(atkObject)))
-            atk_state_set_add_state(stateSet, ATK_STATE_TRANSIENT);
-    } else {
-        // If the widget is no longer alive, save some remote calls
-        // (because of AtkSocket's implementation of ref_state_set())
-        // and just return that this AtkObject is defunct.
-        stateSet = atk_state_set_new();
-        atk_state_set_add_state(stateSet, ATK_STATE_DEFUNCT);
-    }
-
-    return stateSet;
-}
-
-static gint webkitWebViewBaseAccessibleGetIndexInParent(AtkObject* atkObject)
-{
-    AtkObject* atkParent = atk_object_get_parent(atkObject);
-    if (!atkParent)
-        return -1;
-
-    guint count = atk_object_get_n_accessible_children(atkParent);
-    for (guint i = 0; i < count; ++i) {
-        AtkObject* child = atk_object_ref_accessible_child(atkParent, i);
-        bool childIsObject = child == atkObject;
-        g_object_unref(child);
-        if (childIsObject)
-            return i;
-    }
-
-    return -1;
-}
-
-static void webkit_web_view_base_accessible_class_init(WebKitWebViewBaseAccessibleClass* klass)
-{
-    // No need to implement get_n_children() and ref_child() here
-    // since this is a subclass of AtkSocket and all the logic related
-    // to those functions will be implemented by the ATK bridge.
-    AtkObjectClass* atkObjectClass = ATK_OBJECT_CLASS(klass);
-    atkObjectClass->initialize = webkitWebViewBaseAccessibleInitialize;
-    atkObjectClass->ref_state_set = webkitWebViewBaseAccessibleRefStateSet;
-    atkObjectClass->get_index_in_parent = webkitWebViewBaseAccessibleGetIndexInParent;
-}
-
-WebKitWebViewBaseAccessible* webkitWebViewBaseAccessibleNew(GtkWidget* widget)
-{
-    AtkObject* object = ATK_OBJECT(g_object_new(WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE, NULL));
-    atk_object_initialize(object, widget);
-    return WEBKIT_WEB_VIEW_BASE_ACCESSIBLE(object);
-}
diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.h b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.h
deleted file mode 100644 (file)
index 3e932c3..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2012 Igalia S.L.
- *
- * 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.
- */
-
-#ifndef WebKitWebViewBaseAccessible_h
-#define WebKitWebViewBaseAccessible_h
-
-#include <atk/atk.h>
-
-G_BEGIN_DECLS
-
-#define WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE              (webkit_web_view_base_accessible_get_type())
-#define WEBKIT_WEB_VIEW_BASE_ACCESSIBLE(object)           (G_TYPE_CHECK_INSTANCE_CAST((object), WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE, WebKitWebViewBaseAccessible))
-#define WEBKIT_WEB_VIEW_BASE_ACCESSIBLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE, WebKitWebViewBaseAccessibleClass))
-#define WEBKIT_IS_WEB_VIEW_BASE_ACCESSIBLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE((object), WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE))
-#define WEBKIT_IS_WEB_VIEW_BASE_ACCESSIBLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE))
-#define WEBKIT_WEB_VIEW_BASE_ACCESSIBLE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), WEBKIT_TYPE_WEB_VIEW_BASE_ACCESSIBLE, WebKitWebViewBaseAccessibleClass))
-
-typedef struct _WebKitWebViewBaseAccessible WebKitWebViewBaseAccessible;
-typedef struct _WebKitWebViewBaseAccessibleClass WebKitWebViewBaseAccessibleClass;
-typedef struct _WebKitWebViewBaseAccessiblePrivate WebKitWebViewBaseAccessiblePrivate;
-
-
-struct _WebKitWebViewBaseAccessible {
-    AtkSocket parent;
-    /*< private >*/
-    WebKitWebViewBaseAccessiblePrivate* priv;
-};
-
-struct _WebKitWebViewBaseAccessibleClass {
-    AtkSocketClass parentClass;
-};
-
-GType webkit_web_view_base_accessible_get_type();
-
-WebKitWebViewBaseAccessible* webkitWebViewBaseAccessibleNew(GtkWidget*);
-
-G_END_DECLS
-
-#endif // WebKitWebViewBaseAccessible_h
index a91ff0f..82d2c15 100644 (file)
 #include <WebCore/DOMPasteAccess.h>
 #include <WebCore/NotImplemented.h>
 
+#if HAVE(ACCESSIBILITY)
+#include <atk/atk.h>
+#endif
+
 namespace WebKit {
 
 PageClientImpl::PageClientImpl(WKWPE::View& view)
@@ -409,4 +413,11 @@ void PageClientImpl::requestDOMPasteAccess(const WebCore::IntRect&, const String
     completionHandler(WebCore::DOMPasteAccessResponse::DeniedForGesture);
 }
 
+#if HAVE(ACCESSIBILITY)
+AtkObject* PageClientImpl::accessible()
+{
+    return ATK_OBJECT(m_view.accessible());
+}
+#endif
+
 } // namespace WebKit
index 50bfbb6..7be9b3e 100644 (file)
@@ -29,6 +29,7 @@
 #include "WebFullScreenManagerProxy.h"
 
 struct wpe_view_backend;
+typedef struct _AtkObject AtkObject;
 
 namespace WKWPE {
 class View;
@@ -55,6 +56,10 @@ public:
 
     struct wpe_view_backend* viewBackend();
 
+#if HAVE(ACCESSIBILITY)
+    AtkObject* accessible();
+#endif
+
 private:
     // PageClient
     std::unique_ptr<DrawingAreaProxy> createDrawingAreaProxy(WebProcessProxy&) override;
index 3060d85..9aa6340 100644 (file)
@@ -100,9 +100,17 @@ View::View(struct wpe_view_backend* backend, const API::PageConfiguration& baseC
                 flags.add(WebCore::ActivityState::IsInWindow);
             view.setViewState(flags);
         },
-        // get_accessible
-        nullptr,
 #if WPE_CHECK_VERSION(1, 3, 0)
+        // get_accessible
+        [](void* data) -> void*
+        {
+#if HAVE(ACCESSIBILITY)
+            auto& view = *reinterpret_cast<View*>(data);
+            return view.accessible();
+#else
+            return nullptr;
+#endif
+        },
         // set_device_scale_factor
         [](void* data, float scale)
         {
@@ -110,9 +118,11 @@ View::View(struct wpe_view_backend* backend, const API::PageConfiguration& baseC
             view.page().setIntrinsicDeviceScaleFactor(scale);
         },
 #else
+        // padding
+        nullptr,
         nullptr,
 #endif // WPE_CHECK_VERSION(1, 3, 0)
-        // padding,
+        // padding
         nullptr
     };
     wpe_view_backend_set_backend_client(m_backend, &s_backendClient, this);
@@ -163,6 +173,14 @@ View::View(struct wpe_view_backend* backend, const API::PageConfiguration& baseC
     m_pageProxy->initializeWebPage();
 }
 
+View::~View()
+{
+#if HAVE(ACCESSIBILITY)
+    if (m_accessible)
+        webkitWebViewAccessibleSetWebView(m_accessible.get(), nullptr);
+#endif
+}
+
 void View::setClient(std::unique_ptr<API::ViewClient>&& client)
 {
     if (!client)
@@ -207,4 +225,13 @@ void View::close()
     m_pageProxy->close();
 }
 
+#if HAVE(ACCESSIBILITY)
+WebKitWebViewAccessible* View::accessible() const
+{
+    if (!m_accessible)
+        m_accessible = webkitWebViewAccessibleNew(const_cast<View*>(this));
+    return m_accessible.get();
+}
+#endif
+
 } // namespace WKWPE
index 16486bf..75ca857 100644 (file)
 #include <wtf/OptionSet.h>
 #include <wtf/RefPtr.h>
 
+#if HAVE(ACCESSIBILITY)
+#include "WebKitWebViewAccessible.h"
+#include <wtf/glib/GRefPtr.h>
+#endif
+
 typedef struct OpaqueJSContext* JSGlobalContextRef;
 struct wpe_view_backend;
 
@@ -55,6 +60,8 @@ public:
         return new View(backend, configuration);
     }
 
+    ~View();
+
     // Client methods
     void setClient(std::unique_ptr<API::ViewClient>&&);
     void frameDisplayed();
@@ -76,6 +83,10 @@ public:
     void setFullScreen(bool fullScreenState) { m_fullScreenModeActive = fullScreenState; };
 #endif
 
+#if HAVE(ACCESSIBILITY)
+    WebKitWebViewAccessible* accessible() const;
+#endif
+
 private:
     View(struct wpe_view_backend*, const API::PageConfiguration&);
 
@@ -94,6 +105,10 @@ private:
 #if ENABLE(FULLSCREEN_API)
     bool m_fullScreenModeActive { false };
 #endif
+
+#if HAVE(ACCESSIBILITY)
+    mutable GRefPtr<WebKitWebViewAccessible> m_accessible;
+#endif
 };
 
 } // namespace WKWPE
index 062a4c8..48432a3 100644 (file)
@@ -1773,6 +1773,9 @@ private:
 
 #if PLATFORM(GTK)
     void getEditorCommandsForKeyEvent(const AtomicString&, Vector<String>&);
+#endif
+
+#if USE(ATK)
     void bindAccessibilityTree(const String&);
     void showEmojiPicker(const WebCore::IntRect&, CompletionHandler<void(String)>&&);
 #endif
index 8a7f8c4..6fcecdc 100644 (file)
@@ -216,10 +216,12 @@ messages -> WebPageProxy {
     PluginScaleFactorDidChange(double zoomFactor)
     PluginZoomFactorDidChange(double zoomFactor)
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     # Support for connecting the Accessibility worlds of the UI and the Web processes
     BindAccessibilityTree(String plugID)
+#endif
 
+#if PLATFORM(GTK)
     SetInputMethodState(bool enabled);
 #endif
 
index 61d44c8..3e88f8a 100644 (file)
@@ -30,6 +30,7 @@
 #include "WebsiteDataStore.h"
 #include <WebCore/NotImplemented.h>
 #include <WebCore/UserAgent.h>
+#include <atk/atk.h>
 
 namespace WebKit {
 
@@ -48,6 +49,15 @@ String WebPageProxy::standardUserAgent(const String& applicationNameForUserAgent
     return WebCore::standardUserAgent(applicationNameForUserAgent);
 }
 
+#if USE(ATK)
+void WebPageProxy::bindAccessibilityTree(const String& plugID)
+{
+    auto* accessible = static_cast<PageClientImpl&>(pageClient()).accessible();
+    atk_socket_embed(ATK_SOCKET(accessible), const_cast<char*>(plugID.utf8().data()));
+    atk_object_notify_state_change(accessible, ATK_STATE_TRANSIENT, FALSE);
+}
+#endif
+
 void WebPageProxy::saveRecentSearches(const String&, const Vector<WebCore::RecentSearch>&)
 {
     notImplemented();
index c486fc4..3608e7e 100644 (file)
@@ -85,7 +85,7 @@
 #include <wtf/WallTime.h>
 #include <wtf/text/WTFString.h>
 
-#if HAVE(ACCESSIBILITY) && PLATFORM(GTK)
+#if HAVE(ACCESSIBILITY) && USE(ATK)
 typedef struct _AtkObject AtkObject;
 #include <wtf/glib/GRefPtr.h>
 #endif
@@ -1664,7 +1664,7 @@ private:
     RetainPtr<NSDictionary> m_dataDetectionContext;
 #endif
 
-#if HAVE(ACCESSIBILITY) && PLATFORM(GTK)
+#if HAVE(ACCESSIBILITY) && USE(ATK)
     GRefPtr<AtkObject> m_accessibilityObject;
 #endif
 
index 8f79614..5c1f255 100644 (file)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "WebPage.h"
 
+#include "WebKitWebPageAccessibilityObject.h"
 #include "WebPreferencesKeys.h"
 #include "WebPreferencesStore.h"
 #include <WebCore/NotImplemented.h>
@@ -37,6 +38,15 @@ using namespace WebCore;
 
 void WebPage::platformInitialize()
 {
+#if HAVE(ACCESSIBILITY)
+    // Create the accessible object (the plug) that will serve as the
+    // entry point to the web process, and send a message to the UI
+    // process to connect the two worlds through the accessibility
+    // object there specifically placed for that purpose (the socket).
+    m_accessibilityObject = adoptGRef(webkitWebPageAccessibilityObjectNew(this));
+    GUniquePtr<gchar> plugID(atk_plug_get_id(ATK_PLUG(m_accessibilityObject.get())));
+    send(Messages::WebPageProxy::BindAccessibilityTree(String::fromUTF8(plugID.get())));
+#endif
 }
 
 void WebPage::platformReinitialize()
index fd8c6ab..14912ce 100644 (file)
 #include "WebProcess.h"
 #include <glib.h>
 
+#if HAVE(ACCESSIBILITY)
+#include <atk-bridge.h>
+#include <atk/atk.h>
+#endif
+
 namespace WebKit {
 using namespace WebCore;
 
+#if HAVE(ACCESSIBILITY)
+static void initializeAccessibility()
+{
+    auto* atkUtilClass = ATK_UTIL_CLASS(g_type_class_ref(ATK_TYPE_UTIL));
+
+    atkUtilClass->add_key_event_listener = [](AtkKeySnoopFunc, gpointer) -> guint {
+        return 0;
+    };
+
+    atkUtilClass->remove_key_event_listener = [](guint) {
+    };
+
+    atkUtilClass->get_root = []() -> AtkObject* {
+        // ATK bridge needs a root object. We use an AtkPlug because that way the
+        // web process is not registered as an application.
+        static AtkObject* root = nullptr;
+        if (!root)
+            root = atk_plug_new();
+        return root;
+    };
+
+    atkUtilClass->get_toolkit_name = []() -> const gchar* {
+        return "WPEWebKit";
+    };
+
+    atkUtilClass->get_toolkit_version = []() -> const gchar* {
+        return "";
+    };
+
+    atk_bridge_adaptor_init(nullptr, nullptr);
+}
+#endif
+
 class WebProcessMain final : public AuxiliaryProcessMainBase {
 public:
     bool platformInitialize() override
@@ -47,6 +85,10 @@ public:
         // FIXME: This should be probably called in other processes as well.
         g_set_prgname("WPEWebProcess");
 
+#if HAVE(ACCESSIBILITY)
+        initializeAccessibility();
+#endif
+
         return true;
     }
 };
diff --git a/Source/cmake/FindATKBridge.cmake b/Source/cmake/FindATKBridge.cmake
new file mode 100644 (file)
index 0000000..331aeeb
--- /dev/null
@@ -0,0 +1,52 @@
+# - Try to find ATK
+# Once done, this will define
+#
+#  ATK_BRIDGE_INCLUDE_DIRS - the ATK bridge include drectories
+#  ATK_BRIDGE_LIBRARIES - link these to use ATK bridge
+#
+# Copyright (C) 2019 Igalia S.L.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
+# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+find_package(PkgConfig)
+pkg_check_modules(PC_ATK_BRIDGE atk-bridge-2.0)
+
+find_path(ATK_BRIDGE_INCLUDE_DIRS
+    NAMES atk-bridge.h
+    HINTS ${PC_ATK_BRIDGE_INCLUDEDIR}
+          ${PC_ATK_BRIDGE_INCLUDE_DIRS}
+    PATH_SUFFIXES at-spi2-atk/2.0
+)
+
+find_library(ATK_BRIDGE_LIBRARIES
+    NAMES atk-bridge-2.0
+    HINTS ${PC_ATK_BRIDGE_LIBRARY_DIRS}
+          ${PC_ATK_BRIDGE_LIBDIR}
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(ATK_BRIDGE REQUIRED_VARS ATK_BRIDGE_INCLUDE_DIRS ATK_BRIDGE_LIBRARIES
+                                      VERSION_VAR   PC_ATK_BRIDGE_VERSION)
+mark_as_advanced(
+    ATK_BRIDGE_INCLUDE_DIRS
+    ATK_BRIDGE_LIBRARIES
+)
index b21a58f..c8906e0 100644 (file)
@@ -44,6 +44,7 @@ WEBKIT_OPTION_BEGIN()
 
 include(GStreamerDefinitions)
 
+SET_AND_EXPOSE_TO_BUILD(USE_ATK TRUE)
 SET_AND_EXPOSE_TO_BUILD(USE_CAIRO TRUE)
 SET_AND_EXPOSE_TO_BUILD(USE_XDGMIME TRUE)
 SET_AND_EXPOSE_TO_BUILD(USE_GCRYPT TRUE)
index c71456a..815566a 100644 (file)
@@ -61,6 +61,7 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_RTC PRIVATE ${ENABLE_EXPERIMENTAL_FE
 # Public options specific to the WPE port. Do not add any options here unless
 # there is a strong reason we should support changing the value of the option,
 # and the option is not relevant to any other WebKit ports.
+WEBKIT_OPTION_DEFINE(ENABLE_ACCESSIBILITY "Whether to enable support for accessibility" PUBLIC ON)
 WEBKIT_OPTION_DEFINE(ENABLE_GTKDOC "Whether or not to use generate gtkdoc." PUBLIC OFF)
 WEBKIT_OPTION_DEFINE(USE_OPENJPEG "Whether to enable support for JPEG2000 images." PUBLIC ON)
 WEBKIT_OPTION_DEFINE(USE_WOFF2 "Whether to enable support for WOFF2 Web Fonts." PUBLIC ON)
@@ -106,6 +107,17 @@ include(GStreamerDependencies)
 
 WEBKIT_OPTION_END()
 
+if (ENABLE_ACCESSIBILITY)
+    find_package(ATK)
+    if (NOT ATK_FOUND)
+        message(FATAL_ERROR "atk is needed for ENABLE_ACCESSIBILITY")
+    endif ()
+    find_package(ATKBridge)
+    if (NOT ATK_BRIDGE_FOUND)
+        message(FATAL_ERROR "at-spi2-atk is needed for ENABLE_ACCESSIBILITY")
+    endif ()
+endif ()
+
 if (USE_OPENJPEG)
     find_package(OpenJPEG)
     if (NOT OpenJPEG_FOUND)
@@ -152,6 +164,8 @@ add_definitions(-DBUILDING_WPE__=1)
 add_definitions(-DGETTEXT_PACKAGE="WPE")
 add_definitions(-DJSC_GLIB_API_ENABLED)
 
+SET_AND_EXPOSE_TO_BUILD(HAVE_ACCESSIBILITY ${ENABLE_ACCESSIBILITY})
+SET_AND_EXPOSE_TO_BUILD(USE_ATK ${ENABLE_ACCESSIBILITY})
 SET_AND_EXPOSE_TO_BUILD(USE_CAIRO TRUE)
 SET_AND_EXPOSE_TO_BUILD(USE_EGL TRUE)
 SET_AND_EXPOSE_TO_BUILD(USE_GCRYPT TRUE)
index 2f0245f..21e7bf9 100644 (file)
@@ -1,3 +1,56 @@
+2019-05-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] Add initial accessibility support using ATK
+        https://bugs.webkit.org/show_bug.cgi?id=197413
+
+        Reviewed by Michael Catanzaro.
+
+        Add accessibility support in MiniBrowser and backends used by MiniBrowser and tests.
+
+        * MiniBrowser/wpe/CMakeLists.txt:
+        * MiniBrowser/wpe/main.cpp:
+        (main):
+        * TestWebKitAPI/PlatformWPE.cmake:
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.h:
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp:
+        (WTR::AccessibilityNotificationHandler::setNotificationFunctionCallback):
+        (WTR::AccessibilityNotificationHandler::removeAccessibilityNotificationHandler):
+        * WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp: Removed.
+        * WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp: Removed.
+        * WebKitTestRunner/PlatformWPE.cmake:
+        * wpe/backends/CMakeLists.txt:
+        * wpe/backends/HeadlessViewBackend.cpp:
+        (WPEToolingBackends::HeadlessViewBackend::HeadlessViewBackend):
+        * wpe/backends/ViewBackend.cpp:
+        (WPEToolingBackends::addKeyEventListener):
+        (WPEToolingBackends::removeKeyEventListener):
+        (WPEToolingBackends::notifyAccessibilityKeyEventListeners):
+        (WPEToolingBackends::ViewBackend::initialize):
+        (WPEToolingBackends::ViewBackend::initializeAccessibility):
+        (WPEToolingBackends::ViewBackend::updateAccessibilityState):
+        (WPEToolingBackends::ViewBackend::setAccessibleChild):
+        (WPEToolingBackends::ViewBackend::addActivityState):
+        (WPEToolingBackends::ViewBackend::removeActivityState):
+        (WPEToolingBackends::ViewBackend::dispatchInputKeyboardEvent):
+        * wpe/backends/ViewBackend.h:
+        * wpe/backends/WebKitAccessibleApplication.cpp: Added.
+        (webkitAccessibleApplicationWindowInterfaceInit):
+        (webkitAccessibleApplicationFinalize):
+        (webkitAccessibleApplicationInitialize):
+        (webkitAccessibleApplicationGetNChildren):
+        (webkitAccessibleApplicationRefChild):
+        (webkitAccessibleApplicationGetName):
+        (webkit_accessible_application_class_init):
+        (webkit_accessible_application_init):
+        (webkitAccessibleApplicationNew):
+        (webkitAccessibleApplicationSetChild):
+        * wpe/backends/WebKitAccessibleApplication.h: Added.
+        * wpe/backends/WindowViewBackend.cpp:
+        (WPEToolingBackends::WindowViewBackend::WindowViewBackend):
+        * wpe/jhbuild.modules:
+
 2019-05-20  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         run-webkit-tests not gathering crash logs on Cygwin Python and Windows Python
index 74591ff..245f319 100644 (file)
@@ -12,6 +12,7 @@ set(MiniBrowser_INCLUDE_DIRECTORIES
 )
 
 set(MiniBrowser_SYSTEM_INCLUDE_DIRECTORIES
+    ${ATK_INCLUDE_DIRS}
     ${WPE_INCLUDE_DIRS}
     ${WPEBACKEND_FDO_INCLUDE_DIRS}
 )
@@ -20,6 +21,7 @@ set(MiniBrowser_LIBRARIES
     ${JavaScriptCore_LIBRARY_NAME}
     WPEToolingBackends
     WebKit
+    ${ATK_LIBRARIES}
     ${WPE_LIBRARIES}
     ${WPEBACKEND_FDO_LIBRARIES}
 )
index cb83d64..be6460e 100644 (file)
 #include <memory>
 #include <wpe/webkit.h>
 
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+#include <atk/atk.h>
+#endif
+
 static const char** uriArguments;
 static const char** ignoreHosts;
 static gboolean headlessMode;
@@ -248,6 +252,11 @@ int main(int argc, char *argv[])
     g_object_unref(settings);
 
     backendPtr->setInputClient(std::make_unique<InputClient>(loop, webView));
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+    auto* accessible = wpe_view_backend_dispatch_get_accessible(wpeBackend);
+    if (ATK_IS_OBJECT(accessible))
+        backendPtr->setAccessibleChild(ATK_OBJECT(accessible));
+#endif
 
     webkit_web_context_set_automation_allowed(webContext, automationMode);
     g_signal_connect(webContext, "automation-started", G_CALLBACK(automationStartedCallback), webView);
index 82749a8..47bf7b3 100644 (file)
@@ -51,9 +51,6 @@ list(APPEND TestWebCore_SYSTEM_INCLUDE_DIRECTORIES
 list(APPEND TestWebKit_SOURCES
     ${test_main_SOURCES}
 
-    ${TOOLS_DIR}/wpe/backends/ViewBackend.cpp
-    ${TOOLS_DIR}/wpe/backends/HeadlessViewBackend.cpp
-
     glib/UtilitiesGLib.cpp
 
     wpe/PlatformUtilitiesWPE.cpp
index 9acf858..b76151f 100644 (file)
@@ -94,7 +94,7 @@ RefPtr<AccessibilityUIElement> AccessibilityController::elementAtPoint(int x, in
     return uiElement->elementAtPoint(x, y);
 }
 
-#if !HAVE(ACCESSIBILITY) && PLATFORM(GTK)
+#if !HAVE(ACCESSIBILITY) && (PLATFORM(GTK) || PLATFORM(WPE))
 RefPtr<AccessibilityUIElement> AccessibilityController::rootElement() { return nullptr; }
 RefPtr<AccessibilityUIElement> AccessibilityController::focusedElement() { return nullptr; }
 #endif
index d5aeebb..dbfe886 100644 (file)
@@ -31,7 +31,7 @@
 #include "JSWrappable.h"
 #include <JavaScriptCore/JSObjectRef.h>
 #include <wtf/Platform.h>
-#if PLATFORM(GTK)
+#if USE(ATK)
 #include "AccessibilityNotificationHandlerAtk.h"
 #endif
 
@@ -73,7 +73,7 @@ private:
 
 #if PLATFORM(COCOA)
     RetainPtr<NotificationHandler> m_globalNotificationHandler;
-#elif PLATFORM(GTK) || PLATFORM(EFL)
+#elif USE(ATK)
     RefPtr<AccessibilityNotificationHandler> m_globalNotificationHandler;
 #endif
 };
index 24c094b..69d3f51 100644 (file)
@@ -40,7 +40,7 @@ typedef id PlatformUIElement;
 #else
 typedef struct objc_object* PlatformUIElement;
 #endif
-#elif HAVE(ACCESSIBILITY) && PLATFORM(GTK)
+#elif HAVE(ACCESSIBILITY) && USE(ATK)
 #include "AccessibilityNotificationHandlerAtk.h"
 #include <atk/atk.h>
 #include <wtf/glib/GRefPtr.h>
@@ -206,7 +206,7 @@ public:
     RefPtr<AccessibilityUIElement> ariaOwnsElementAtIndex(unsigned);
     RefPtr<AccessibilityUIElement> ariaFlowToElementAtIndex(unsigned);
     RefPtr<AccessibilityUIElement> ariaControlsElementAtIndex(unsigned);
-#if PLATFORM(MAC) || PLATFORM(GTK)
+#if PLATFORM(MAC) || USE(ATK)
     RefPtr<AccessibilityUIElement> ariaDetailsElementAtIndex(unsigned);
     RefPtr<AccessibilityUIElement> ariaErrorMessageElementAtIndex(unsigned);
 #else
@@ -214,7 +214,7 @@ public:
     RefPtr<AccessibilityUIElement> ariaErrorMessageElementAtIndex(unsigned) { return nullptr; }
 #endif
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     RefPtr<AccessibilityUIElement> ariaLabelledByElementAtIndex(unsigned);
     RefPtr<AccessibilityUIElement> ariaDescribedByElementAtIndex(unsigned);
     RefPtr<AccessibilityUIElement> ariaOwnsReferencingElementAtIndex(unsigned);
@@ -368,7 +368,7 @@ private:
     void getChildren(Vector<RefPtr<AccessibilityUIElement> >&);
     void getChildrenWithRange(Vector<RefPtr<AccessibilityUIElement> >&, unsigned location, unsigned length);
 
-#if PLATFORM(GTK)
+#if USE(ATK)
     RefPtr<AccessibilityNotificationHandler> m_notificationHandler;
 #endif
 #endif
index 3cd0bdd..5199a9a 100644 (file)
@@ -64,13 +64,9 @@ gboolean axObjectEventListener(GSignalInvocationHint* signalHint, unsigned numPa
     if (!accessible || !ATK_IS_OBJECT(accessible))
         return true;
 
-#if PLATFORM(GTK)
     WKBundlePageRef page = InjectedBundle::singleton().page()->page();
     WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
     JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame);
-#else
-    JSContextRef jsContext = nullptr;
-#endif
 
     GSignalQuery signalQuery;
     const char* notificationName = nullptr;
@@ -184,15 +180,9 @@ void AccessibilityNotificationHandler::setNotificationFunctionCallback(JSValueRe
 
     m_notificationFunctionCallback = notificationFunctionCallback;
 
-#if PLATFORM(GTK)
     WKBundlePageRef page = InjectedBundle::singleton().page()->page();
     WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
     JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame);
-#else
-    JSContextRef jsContext = nullptr;
-#endif
-    if (!jsContext)
-        return;
 
     connectAccessibilityCallbacks();
 
@@ -215,15 +205,9 @@ void AccessibilityNotificationHandler::setNotificationFunctionCallback(JSValueRe
 
 void AccessibilityNotificationHandler::removeAccessibilityNotificationHandler()
 {
-#if PLATFORM(GTK)
     WKBundlePageRef page = InjectedBundle::singleton().page()->page();
     WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
     JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame);
-#else
-    JSContextRef jsContext = nullptr;
-#endif
-    if (!jsContext)
-        return;
 
     if (globalNotificationHandler == this) {
         JSValueUnprotect(jsContext, globalNotificationHandler->notificationFunctionCallback());
diff --git a/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp b/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp
deleted file mode 100644 (file)
index fbea914..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 Igalia, S.L.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser 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
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include "config.h"
-#include "AccessibilityController.h"
-
-#if HAVE(ACCESSIBILITY)
-
-#include <WebCore/NotImplemented.h>
-
-namespace WTR {
-
-void AccessibilityController::resetToConsistentState()
-{
-    notImplemented();
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityController::accessibleElementById(JSStringRef id)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityController::platformName()
-{
-    notImplemented();
-    return nullptr;
-}
-
-Ref<AccessibilityUIElement> AccessibilityController::rootElement()
-{
-    notImplemented();
-    return AccessibilityUIElement::create(nullptr);
-}
-
-Ref<AccessibilityUIElement> AccessibilityController::focusedElement()
-{
-    notImplemented();
-    return AccessibilityUIElement::create(nullptr);
-}
-
-bool AccessibilityController::addNotificationListener(JSValueRef)
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityController::removeNotificationListener()
-{
-    notImplemented();
-    return false;
-}
-
-} // namespace WTR
-
-#endif // HAVE(ACCESSIBILITY)
diff --git a/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp b/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp
deleted file mode 100644 (file)
index f0da27b..0000000
+++ /dev/null
@@ -1,983 +0,0 @@
-/*
- * Copyright (C) 2017 Igalia, S.L.
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser 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
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include "config.h"
-#include "AccessibilityUIElement.h"
-
-#if HAVE(ACCESSIBILITY)
-
-#include <WebCore/NotImplemented.h>
-
-namespace WTR {
-
-AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement)
-{
-    notImplemented();
-}
-
-AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement&)
-{
-    notImplemented();
-}
-
-AccessibilityUIElement::~AccessibilityUIElement()
-{
-    notImplemented();
-}
-
-bool AccessibilityUIElement::isEqual(AccessibilityUIElement*)
-{
-    notImplemented();
-    return false;
-}
-
-void AccessibilityUIElement::getChildren(Vector<RefPtr<AccessibilityUIElement>>&)
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::getChildrenWithRange(Vector<RefPtr<AccessibilityUIElement>>&, unsigned, unsigned)
-{
-    notImplemented();
-}
-
-int AccessibilityUIElement::childrenCount()
-{
-    notImplemented();
-    return 0;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::elementAtPoint(int, int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement*)
-{
-    notImplemented();
-    return 0;
-}
-
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::childAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::linkedUIElementAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::ariaControlsElementAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedRowAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::rowAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedChildAtIndex(unsigned) const
-{
-    notImplemented();
-    return nullptr;
-}
-
-unsigned AccessibilityUIElement::selectedChildrenCount() const
-{
-    notImplemented();
-    return 0;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::selectedRowAtIndex(unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::titleUIElement()
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::parentElement()
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::disclosedByRow()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfLinkedUIElements()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfDocumentLinks()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfChildren()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::allAttributes()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::stringAttributeValue(JSStringRef)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::stringDescriptionOfAttributeValue(JSStringRef)
-{
-    notImplemented();
-    return nullptr;
-}
-
-double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
-{
-    notImplemented();
-    return 0.0;
-}
-
-JSValueRef AccessibilityUIElement::uiElementArrayAttributeValue(JSStringRef attribute) const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSValueRef AccessibilityUIElement::rowHeaders() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSValueRef AccessibilityUIElement::columnHeaders() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementAttributeValue(JSStringRef attribute) const
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
-{
-    notImplemented();
-    return false;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::parameterizedAttributeNames()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::role()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::subrole()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::roleDescription()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::computedRoleString()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::title()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::description()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::language()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::helpText() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-double AccessibilityUIElement::x()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::y()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::width()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::height()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::clickPointX()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::clickPointY()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::intValue() const
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::minValue()
-{
-    notImplemented();
-    return 0.0;
-}
-
-double AccessibilityUIElement::maxValue()
-{
-    notImplemented();
-    return 0.0;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::valueDescription()
-{
-    notImplemented();
-    return nullptr;
-}
-
-int AccessibilityUIElement::insertionPointLineNumber()
-{
-    notImplemented();
-    return 0;
-}
-
-bool AccessibilityUIElement::isPressActionSupported()
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isIncrementActionSupported()
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isDecrementActionSupported()
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isEnabled()
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isRequired() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isFocused() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isSelected() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isSelectedOptionActive() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isExpanded() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isChecked() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isIndeterminate() const
-{
-    notImplemented();
-    return false;
-}
-
-int AccessibilityUIElement::hierarchicalLevel() const
-{
-    notImplemented();
-    return 0;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::speakAs()
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::ariaIsGrabbed() const
-{
-    notImplemented();
-    return false;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::ariaDropEffects() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-int AccessibilityUIElement::lineForIndex(int)
-{
-    notImplemented();
-    return 0;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForLine(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::rangeForPosition(int, int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::boundsForRange(unsigned, unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::stringForRange(unsigned, unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned, unsigned)
-{
-    notImplemented();
-    return false;
-}
-
-unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef, AccessibilityUIElement*, bool, JSValueRef, JSStringRef, bool, bool)
-{
-    notImplemented();
-    return 0;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef, AccessibilityUIElement*, bool, JSValueRef, JSStringRef, bool, bool)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::selectTextWithCriteria(JSContextRef, JSStringRef, JSValueRef, JSStringRef, JSStringRef)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumnHeaders()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRowHeaders()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfColumns()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfRows()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfVisibleCells()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributesOfHeader()
-{
-    notImplemented();
-    return nullptr;
-}
-
-int AccessibilityUIElement::rowCount()
-{
-    notImplemented();
-    return 0;
-}
-
-int AccessibilityUIElement::columnCount()
-{
-    notImplemented();
-    return 0;
-}
-
-int AccessibilityUIElement::indexInTable()
-{
-    notImplemented();
-    return 0;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::rowIndexRange()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::columnIndexRange()
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::cellForColumnAndRow(unsigned, unsigned)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::horizontalScrollbar() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::verticalScrollbar() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::selectedTextRange()
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::setSelectedTextRange(unsigned, unsigned)
-{
-    notImplemented();
-    return false;
-}
-
-void AccessibilityUIElement::increment()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::decrement()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::showMenu()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::press()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement* element) const
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::setSelectedChildAtIndex(unsigned index) const
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::removeSelectionAtIndex(unsigned index) const
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::clearSelectedChildren() const
-{
-    notImplemented();
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::accessibilityValue() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::documentEncoding()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::documentURI()
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::url()
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::addNotificationListener(JSValueRef functionCallback)
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::removeNotificationListener()
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isFocusable() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isSelectable() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isMultiSelectable() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isVisible() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isOffScreen() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isCollapsed() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isIgnored() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isSingleLine() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::isMultiLine() const
-{
-    notImplemented();
-    return false;
-}
-
-bool AccessibilityUIElement::hasPopup() const
-{
-    notImplemented();
-    return false;
-}
-
-void AccessibilityUIElement::takeFocus()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::takeSelection()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::addSelection()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::removeSelection()
-{
-    notImplemented();
-}
-
-RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::lineTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return 0;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::endTextMarkerForBounds(int, int, int, int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::startTextMarkerForBounds(int, int, int, int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::textMarkerForPoint(int, int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityUIElement> AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributedStringForTextMarkerRange(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::attributedStringForTextMarkerRangeWithOptions(AccessibilityTextMarkerRange*, bool)
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute(JSStringRef, AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return false;
-}
-
-int AccessibilityUIElement::indexForTextMarker(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return 0;
-}
-
-bool AccessibilityUIElement::isTextMarkerValid(AccessibilityTextMarker*)
-{
-    notImplemented();
-    return false;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::textMarkerForIndex(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::startTextMarker()
-{
-    notImplemented();
-    return nullptr;
-}
-
-RefPtr<AccessibilityTextMarker> AccessibilityUIElement::endTextMarker()
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::setSelectedVisibleTextRange(AccessibilityTextMarkerRange*)
-{
-    notImplemented();
-    return false;
-}
-
-void AccessibilityUIElement::scrollToMakeVisible()
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::scrollToGlobalPoint(int, int)
-{
-    notImplemented();
-}
-
-void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int, int, int, int)
-{
-    notImplemented();
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::supportedActions() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::pathDescription() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::mathPostscriptsDescription() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::mathPrescriptsDescription() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::classList() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::characterAtOffset(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::wordAtOffset(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::lineAtOffset(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-JSRetainPtr<JSStringRef> AccessibilityUIElement::sentenceAtOffset(int)
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool AccessibilityUIElement::replaceTextInRange(JSStringRef, int, int)
-{
-    notImplemented();
-    return false;
-}
-
-} // namespace  WTF
-
-#endif // HAVE(ACCESSIBILITY)
index 0453ff6..e20087c 100644 (file)
@@ -45,8 +45,9 @@ set(WebKitTestRunnerInjectedBundle_LIBRARIES
 )
 
 list(APPEND WebKitTestRunnerInjectedBundle_SOURCES
-    ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/wpe/AccessibilityControllerWPE.cpp
-    ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/wpe/AccessibilityUIElementWPE.cpp
+    ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/atk/AccessibilityControllerAtk.cpp
+    ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/atk/AccessibilityNotificationHandlerAtk.cpp
+    ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/atk/AccessibilityUIElementAtk.cpp
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/wpe/ActivateFontsWPE.cpp
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/wpe/InjectedBundleWPE.cpp
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/wpe/TestRunnerWPE.cpp
index 98f46ee..570c453 100644 (file)
@@ -11,6 +11,7 @@ set(WPEToolingBackends_SOURCES
     ${DERIVED_SOURCES_WPETOOLINGBACKENDS_DIR}/xdg-shell-unstable-v6-protocol.c
     ${TOOLS_DIR}/wpe/backends/HeadlessViewBackend.cpp
     ${TOOLS_DIR}/wpe/backends/ViewBackend.cpp
+    ${TOOLS_DIR}/wpe/backends/WebKitAccessibleApplication.cpp
     ${TOOLS_DIR}/wpe/backends/WindowViewBackend.cpp
 )
 
@@ -19,6 +20,8 @@ set(WPEToolingBackends_INCLUDE_DIRECTORIES
 )
 
 set(WPEToolingBackends_SYSTEM_INCLUDE_DIRECTORIES
+    ${ATK_INCLUDE_DIRS}
+    ${ATK_BRIDGE_INCLUDE_DIRS}
     ${CAIRO_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
     ${LIBEPOXY_INCLUDE_DIRS}
@@ -27,6 +30,8 @@ set(WPEToolingBackends_SYSTEM_INCLUDE_DIRECTORIES
 )
 
 set(WPEToolingBackends_LIBRARIES
+    ${ATK_LIBRARIES}
+    ${ATK_BRIDGE_LIBRARIES}
     ${CAIRO_LIBRARIES}
     ${GLIB_LIBRARIES}
     ${LIBEPOXY_LIBRARIES}
@@ -51,6 +56,11 @@ add_custom_command(
     COMMAND ${WAYLAND_SCANNER} client-header ${WAYLAND_PROTOCOLS_DATADIR}/unstable/xdg-shell/xdg-shell-unstable-v6.xml ${DERIVED_SOURCES_WPETOOLINGBACKENDS_DIR}/xdg-shell-unstable-v6-client-protocol.h
     VERBATIM)
 
+if (ENABLE_ACCESSIBILITY)
+    add_definitions(-DHAVE_ACCESSIBILITY=1)
+    add_definitions(-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_40)
+endif ()
+
 add_library(WPEToolingBackends STATIC ${WPEToolingBackends_SOURCES})
 include_directories(${WPEToolingBackends_INCLUDE_DIRECTORIES})
 include_directories(SYSTEM ${WPEToolingBackends_SYSTEM_INCLUDE_DIRECTORIES})
index f07e08d..eada21a 100644 (file)
@@ -72,7 +72,7 @@ HeadlessViewBackend::HeadlessViewBackend(uint32_t width, uint32_t height)
     if (!initialize())
         return;
 
-    wpe_view_backend_add_activity_state(backend(), wpe_view_activity_state_visible | wpe_view_activity_state_focused | wpe_view_activity_state_in_window);
+    addActivityState(wpe_view_activity_state_visible | wpe_view_activity_state_focused | wpe_view_activity_state_in_window);
 
     if (!eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, m_eglContext))
         return;
index e9aa59e..b344317 100644 (file)
 #include <glib.h>
 #include <wpe/fdo-egl.h>
 
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+#include "WebKitAccessibleApplication.h"
+#include <atk-bridge.h>
+#include <atk/atk.h>
+#endif
+
 namespace WPEToolingBackends {
 
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+static GHashTable* keyEventListeners;
+
+struct KeyEventListener {
+    AtkKeySnoopFunc function;
+    gpointer userData;
+};
+
+static unsigned addKeyEventListener(AtkKeySnoopFunc function, gpointer userData)
+{
+    if (!keyEventListeners) {
+        keyEventListeners = g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr, [](gpointer data) {
+            delete static_cast<KeyEventListener*>(data);
+        });
+    }
+
+    static unsigned key = 0;
+    key++;
+    g_hash_table_insert(keyEventListeners, GUINT_TO_POINTER(key), new KeyEventListener { function, userData });
+
+    return key;
+}
+
+static void removeKeyEventListener(unsigned key)
+{
+    if (!keyEventListeners)
+        return;
+
+    g_hash_table_remove(keyEventListeners, GUINT_TO_POINTER(key));
+}
+
+static void notifyAccessibilityKeyEventListeners(struct wpe_input_keyboard_event* event)
+{
+    if (!keyEventListeners)
+        return;
+
+    AtkKeyEventStruct atkEvent;
+    atkEvent.type = event->pressed ? ATK_KEY_EVENT_PRESS : ATK_KEY_EVENT_RELEASE;
+    atkEvent.state = event->modifiers;
+    atkEvent.keyval = event->key_code;
+    atkEvent.keycode = event->hardware_key_code;
+    atkEvent.timestamp = event->time;
+
+    atkEvent.string = nullptr;
+    switch (atkEvent.keyval) {
+    case WPE_KEY_ISO_Enter:
+    case WPE_KEY_KP_Enter:
+    case WPE_KEY_Return:
+        atkEvent.string = g_strdup("\r");
+        atkEvent.length = 1;
+        break;
+    case WPE_KEY_BackSpace:
+        atkEvent.string = g_strdup("\x8");
+        atkEvent.length = 1;
+        break;
+    case WPE_KEY_Tab:
+        atkEvent.string = g_strdup("\t");
+        atkEvent.length = 1;
+        break;
+    default:
+        break;
+    }
+
+    if (!atkEvent.string) {
+        auto unicodeCharacter = wpe_key_code_to_unicode(atkEvent.keyval);
+        if (unicodeCharacter) {
+            char buffer[7];
+            int length = g_unichar_to_utf8(unicodeCharacter, buffer);
+            buffer[length] = '\0';
+            size_t bytesWritten;
+            atkEvent.string = g_locale_from_utf8(buffer, length, nullptr, &bytesWritten, nullptr);
+            atkEvent.length = bytesWritten;
+        }
+    }
+
+    if (!atkEvent.string) {
+        atkEvent.length = 0;
+        atkEvent.string = g_strdup("");
+    }
+
+    GHashTableIter iter;
+    gpointer value;
+    g_hash_table_iter_init(&iter, keyEventListeners);
+    while (g_hash_table_iter_next(&iter, nullptr, &value)) {
+        auto* listener = static_cast<KeyEventListener*>(value);
+        listener->function(&atkEvent, listener->userData);
+    }
+
+    g_free(atkEvent.string);
+}
+#endif
+
 ViewBackend::ViewBackend(uint32_t width, uint32_t height)
     : m_width(width)
     , m_height(height)
@@ -101,19 +199,100 @@ bool ViewBackend::initialize()
     };
     m_exportable = wpe_view_backend_exportable_fdo_egl_create(&exportableClient, this, m_width, m_height);
 
+    initializeAccessibility();
+
     return true;
 }
 
+void ViewBackend::initializeAccessibility()
+{
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+    auto* atkUtilClass = ATK_UTIL_CLASS(g_type_class_ref(ATK_TYPE_UTIL));
+    atkUtilClass->add_key_event_listener = [](AtkKeySnoopFunc listener, gpointer userData) -> guint {
+        return addKeyEventListener(listener, userData);
+    };
+
+    atkUtilClass->remove_key_event_listener = [](guint key) {
+        removeKeyEventListener(key);
+    };
+
+    atkUtilClass->get_root = []() -> AtkObject* {
+        static AtkObject* accessible = nullptr;
+        if (!accessible)
+            accessible = ATK_OBJECT(webkitAccessibleApplicationNew());
+        return accessible;
+    };
+
+    atkUtilClass->get_toolkit_name = []() -> const gchar* {
+        return "WPEWebKit";
+    };
+
+    atkUtilClass->get_toolkit_version = []() -> const gchar* {
+        return "";
+    };
+
+    atk_bridge_adaptor_init(nullptr, nullptr);
+#endif
+}
+
+void ViewBackend::updateAccessibilityState(uint32_t previousFlags)
+{
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+    auto* accessible = atk_get_root();
+    if (!WEBKIT_IS_ACCESSIBLE_APPLICATION(accessible))
+        return;
+
+    uint32_t flags = wpe_view_backend_get_activity_state(backend());
+    uint32_t changedFlags = previousFlags ^ flags;
+    if (changedFlags & wpe_view_activity_state_in_window)
+        atk_object_notify_state_change(accessible, ATK_STATE_ACTIVE, flags & wpe_view_activity_state_in_window);
+    if (changedFlags & wpe_view_activity_state_visible)
+        atk_object_notify_state_change(accessible, ATK_STATE_VISIBLE, flags & wpe_view_activity_state_visible);
+    if (changedFlags & wpe_view_activity_state_focused) {
+        atk_object_notify_state_change(accessible, ATK_STATE_FOCUSED, flags & wpe_view_activity_state_focused);
+        if ((flags & wpe_view_activity_state_in_window) && (flags & wpe_view_activity_state_focused))
+            g_signal_emit_by_name(accessible, "activate");
+        else
+            g_signal_emit_by_name(accessible, "deactivate");
+    }
+#endif
+}
+
 void ViewBackend::setInputClient(std::unique_ptr<InputClient>&& client)
 {
     m_inputClient = std::move(client);
 }
 
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+void ViewBackend::setAccessibleChild(AtkObject* child)
+{
+    auto* accessible = atk_get_root();
+    if (!WEBKIT_IS_ACCESSIBLE_APPLICATION(accessible))
+        return;
+
+    webkitAccessibleApplicationSetChild(WEBKIT_ACCESSIBLE_APPLICATION(accessible), child);
+}
+#endif
+
 struct wpe_view_backend* ViewBackend::backend() const
 {
     return m_exportable ? wpe_view_backend_exportable_fdo_get_view_backend(m_exportable) : nullptr;
 }
 
+void ViewBackend::addActivityState(uint32_t flags)
+{
+    uint32_t previousFlags = wpe_view_backend_get_activity_state(backend());
+    wpe_view_backend_add_activity_state(backend(), flags);
+    updateAccessibilityState(previousFlags);
+}
+
+void ViewBackend::removeActivityState(uint32_t flags)
+{
+    uint32_t previousFlags = wpe_view_backend_get_activity_state(backend());
+    wpe_view_backend_remove_activity_state(backend(), flags);
+    updateAccessibilityState(previousFlags);
+}
+
 void ViewBackend::dispatchInputPointerEvent(struct wpe_input_pointer_event* event)
 {
     if (m_inputClient && m_inputClient->dispatchPointerEvent(event))
@@ -130,6 +309,10 @@ void ViewBackend::dispatchInputAxisEvent(struct wpe_input_axis_event* event)
 
 void ViewBackend::dispatchInputKeyboardEvent(struct wpe_input_keyboard_event* event)
 {
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+    notifyAccessibilityKeyEventListeners(event);
+#endif
+
     if (m_inputClient && m_inputClient->dispatchKeyboardEvent(event))
         return;
     wpe_view_backend_dispatch_keyboard_event(backend(), event);
index 63e9f8b..0970b5f 100644 (file)
@@ -32,6 +32,7 @@ typedef void* EGLConfig;
 typedef void* EGLContext;
 typedef void* EGLDisplay;
 typedef void* EGLImageKHR;
+typedef struct _AtkObject AtkObject;
 
 // Manually provide the EGL_CAST C++ definition in case eglplatform.h doesn't provide it.
 #ifndef EGL_CAST
@@ -54,6 +55,9 @@ public:
         virtual bool dispatchTouchEvent(struct wpe_input_touch_event*) { return false; }
     };
     void setInputClient(std::unique_ptr<InputClient>&&);
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+    void setAccessibleChild(AtkObject*);
+#endif
 
     struct wpe_view_backend* backend() const;
 
@@ -61,6 +65,11 @@ protected:
     ViewBackend(uint32_t width, uint32_t height);
 
     bool initialize();
+    void initializeAccessibility();
+    void updateAccessibilityState(uint32_t);
+
+    void addActivityState(uint32_t);
+    void removeActivityState(uint32_t);
 
     void dispatchInputPointerEvent(struct wpe_input_pointer_event*);
     void dispatchInputAxisEvent(struct wpe_input_axis_event*);
diff --git a/Tools/wpe/backends/WebKitAccessibleApplication.cpp b/Tools/wpe/backends/WebKitAccessibleApplication.cpp
new file mode 100644 (file)
index 0000000..6d8ba84
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "WebKitAccessibleApplication.h"
+
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+
+struct _WebKitAccessibleApplicationPrivate {
+    AtkObject* child;
+};
+
+static void webkitAccessibleApplicationWindowInterfaceInit(AtkWindowIface*)
+{
+}
+
+G_DEFINE_TYPE_WITH_CODE(WebKitAccessibleApplication, webkit_accessible_application, ATK_TYPE_OBJECT,
+    G_ADD_PRIVATE(WebKitAccessibleApplication)
+    G_IMPLEMENT_INTERFACE(ATK_TYPE_WINDOW, webkitAccessibleApplicationWindowInterfaceInit))
+
+static void webkitAccessibleApplicationFinalize(GObject* object)
+{
+    auto* accessible = WEBKIT_ACCESSIBLE_APPLICATION(object);
+    webkitAccessibleApplicationSetChild(accessible, nullptr);
+
+    G_OBJECT_CLASS(webkit_accessible_application_parent_class)->finalize(object);
+}
+
+static void webkitAccessibleApplicationInitialize(AtkObject* atkObject, gpointer data)
+{
+    ATK_OBJECT_CLASS(webkit_accessible_application_parent_class)->initialize(atkObject, data);
+    atkObject->role = ATK_ROLE_APPLICATION;
+    atkObject->accessible_parent = nullptr;
+}
+
+static gint webkitAccessibleApplicationGetNChildren(AtkObject* atkObject)
+{
+    auto* accessible = WEBKIT_ACCESSIBLE_APPLICATION(atkObject);
+    return accessible->priv->child ? 1 : 0;
+}
+
+static AtkObject* webkitAccessibleApplicationRefChild(AtkObject* atkObject, int i)
+{
+    if (i)
+        return nullptr;
+
+    auto* accessible = WEBKIT_ACCESSIBLE_APPLICATION(atkObject);
+    return accessible->priv->child ? ATK_OBJECT(g_object_ref(accessible->priv->child)) : nullptr;
+}
+
+static const char* webkitAccessibleApplicationGetName(AtkObject*)
+{
+    return g_get_prgname();
+}
+
+static void webkit_accessible_application_class_init(WebKitAccessibleApplicationClass* klass)
+{
+    GObjectClass* gobjectClass = G_OBJECT_CLASS(klass);
+    gobjectClass->finalize = webkitAccessibleApplicationFinalize;
+
+    AtkObjectClass* atkObjectClass = ATK_OBJECT_CLASS(klass);
+    atkObjectClass->initialize = webkitAccessibleApplicationInitialize;
+    atkObjectClass->get_n_children = webkitAccessibleApplicationGetNChildren;
+    atkObjectClass->ref_child = webkitAccessibleApplicationRefChild;
+    atkObjectClass->get_name = webkitAccessibleApplicationGetName;
+    atkObjectClass->get_parent = nullptr;
+}
+
+static void webkit_accessible_application_init(WebKitAccessibleApplication* accessible)
+{
+    accessible->priv = static_cast<WebKitAccessibleApplicationPrivate*>(webkit_accessible_application_get_instance_private(accessible));
+}
+
+WebKitAccessibleApplication* webkitAccessibleApplicationNew()
+{
+    auto* accessible = ATK_OBJECT(g_object_new(WEBKIT_TYPE_ACCESSIBLE_APPLICATION, nullptr));
+    atk_object_initialize(accessible, nullptr);
+    return WEBKIT_ACCESSIBLE_APPLICATION(accessible);
+}
+
+void webkitAccessibleApplicationSetChild(WebKitAccessibleApplication* accessible, AtkObject* child)
+{
+    g_return_if_fail(WEBKIT_IS_ACCESSIBLE_APPLICATION(accessible));
+
+    if (accessible->priv->child == child)
+        return;
+
+    if (accessible->priv->child) {
+        g_signal_emit_by_name(accessible, "children-changed::remove", 0, accessible->priv->child);
+        atk_object_set_parent(accessible->priv->child, nullptr);
+    }
+
+    accessible->priv->child = child;
+
+    if (accessible->priv->child) {
+        atk_object_set_parent(child, ATK_OBJECT(accessible));
+        g_signal_emit_by_name(accessible, "children-changed::add", 0, child);
+    }
+}
+
+#endif // HAVE(ACCESSIBILITY)
diff --git a/Tools/wpe/backends/WebKitAccessibleApplication.h b/Tools/wpe/backends/WebKitAccessibleApplication.h
new file mode 100644 (file)
index 0000000..9776b95
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2019 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if defined(HAVE_ACCESSIBILITY) && HAVE_ACCESSIBILITY
+
+#include <atk/atk.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_ACCESSIBLE_APPLICATION            (webkit_accessible_application_get_type())
+#define WEBKIT_ACCESSIBLE_APPLICATION(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_ACCESSIBLE_APPLICATION, WebKitAccessibleApplication))
+#define WEBKIT_IS_ACCESSIBLE_APPLICATION(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_ACCESSIBLE_APPLICATION))
+#define WEBKIT_ACCESSIBLE_APPLICATION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_ACCESSIBLE_APPLICATION, WebKitAccessibleApplicationClass))
+#define WEBKIT_IS_ACCESSIBLE_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_ACCESSIBLE_APPLICATION))
+#define WEBKIT_ACCESSIBLE_APPLICATION_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_ACCESSIBLE_APPLICATION, WebKitAccessibleApplicationClass))
+
+typedef struct _WebKitAccessibleApplication        WebKitAccessibleApplication;
+typedef struct _WebKitAccessibleApplicationClass   WebKitAccessibleApplicationClass;
+typedef struct _WebKitAccessibleApplicationPrivate WebKitAccessibleApplicationPrivate;
+
+struct _WebKitAccessibleApplication {
+    AtkObject parent;
+
+    WebKitAccessibleApplicationPrivate *priv;
+};
+
+struct _WebKitAccessibleApplicationClass {
+    AtkObjectClass parent;
+};
+
+GType webkit_accessible_application_get_type(void);
+
+WebKitAccessibleApplication* webkitAccessibleApplicationNew(void);
+void webkitAccessibleApplicationSetChild(WebKitAccessibleApplication*, AtkObject*);
+
+G_END_DECLS
+
+#endif // HAVE(ACCESSIBILITY)
index 5b2cb81..fc21f4c 100644 (file)
@@ -463,15 +463,15 @@ const struct zxdg_toplevel_v6_listener WindowViewBackend::s_xdgToplevelListener
         }
 
         if (isFocused)
-            wpe_view_backend_add_activity_state(window.backend(), wpe_view_activity_state_focused);
+            window.addActivityState(wpe_view_activity_state_focused);
         else
-            wpe_view_backend_remove_activity_state(window.backend(), wpe_view_activity_state_focused);
+            window.removeActivityState(wpe_view_activity_state_focused);
     },
     // close
     [](void* data, struct zxdg_toplevel_v6*)
     {
         auto& window = *static_cast<WindowViewBackend*>(data);
-        wpe_view_backend_remove_activity_state(window.backend(), wpe_view_activity_state_visible | wpe_view_activity_state_focused | wpe_view_activity_state_in_window);
+        window.removeActivityState(wpe_view_activity_state_visible | wpe_view_activity_state_focused | wpe_view_activity_state_in_window);
     },
 };
 
@@ -522,7 +522,7 @@ WindowViewBackend::WindowViewBackend(uint32_t width, uint32_t height)
             zxdg_toplevel_v6_add_listener(m_xdgToplevel, &s_xdgToplevelListener, this);
             zxdg_toplevel_v6_set_title(m_xdgToplevel, "WPE");
             wl_surface_commit(m_surface);
-            wpe_view_backend_add_activity_state(backend(), wpe_view_activity_state_visible | wpe_view_activity_state_in_window);
+            addActivityState(wpe_view_activity_state_visible | wpe_view_activity_state_in_window);
         }
     }
 
index e1afce3..5af0bd9 100644 (file)
@@ -27,6 +27,8 @@
       <dep package="wayland-protocols"/>
       <dep package="openjpeg"/>
       <dep package="xdg-dbus-proxy"/>
+      <dep package="atk"/>
+      <dep package="at-spi2-atk"/>
     </dependencies>
   </metamodule>
 
     </dependencies>
   </autotools>
 
+
+  <meson id="atk" mesonargs="-Dintrospection=false">
+    <branch module="pub/GNOME/sources/atk/2.32/atk-2.32.0.tar.xz" version="2.32.0"
+            repo="ftp.gnome.org"
+            hash="sha256:cb41feda7fe4ef0daa024471438ea0219592baf7c291347e5a858bb64e4091cc"/>
+    <dependencies>
+      <dep package="glib"/>
+    </dependencies>
+  </meson>
+
+  <meson id="at-spi2-core" mesonargs="-Dintrospection=no">
+    <branch module="pub/GNOME/sources/at-spi2-core/2.32/at-spi2-core-2.32.1.tar.xz" version="2.32.1"
+            repo="ftp.gnome.org"
+            hash="sha256:3c2aa937ebfaca2c86569bce9b16a34fbe20d69ef0c58846313b1c42f53b0d53">
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+    </dependencies>
+  </meson>
+
+  <meson id="at-spi2-atk">
+    <branch module="pub/GNOME/sources/at-spi2-atk/2.32/at-spi2-atk-2.32.0.tar.xz" version="2.32.0"
+            repo="ftp.gnome.org"
+            hash="sha256:0b51e6d339fa2bcca3a3e3159ccea574c67b107f1ac8b00047fa60e34ce7a45c">
+    </branch>
+    <dependencies>
+      <dep package="glib"/>
+      <dep package="atk"/>
+      <dep package="at-spi2-core"/>
+    </dependencies>
+  </meson>
+
 </moduleset>