WebKit Bugzilla
Attachment 370310 Details for
Bug 197413
: [WPE] Add initial accessibility support using ATK
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
wpe-a11y.diff (text/plain), 219.26 KB, created by
Carlos Garcia Campos
on 2019-05-21 03:58:21 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2019-05-21 03:58:21 PDT
Size:
219.26 KB
patch
obsolete
>diff --git a/ChangeLog b/ChangeLog >index 6982910383f..93eac70a7fe 100644 >--- 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. >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 65a548ed61a..df95dba883e 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -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 >diff --git a/LayoutTests/platform/wpe/TestExpectations b/LayoutTests/platform/wpe/TestExpectations >index a4ea66d9758..db1e3f0008a 100644 >--- a/LayoutTests/platform/wpe/TestExpectations >+++ b/LayoutTests/platform/wpe/TestExpectations >@@ -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 >index 00000000000..33ce4a2e404 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/add-children-pseudo-element-expected.txt >@@ -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 >index 00000000000..98bdb50514c >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-fallback-roles-expected.txt >@@ -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 >index 00000000000..e2ce8bcd8df >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-hidden-negates-no-visibility-expected.txt >@@ -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 >index 00000000000..4cf247cb9c4 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-label-on-label-element-expected.txt >@@ -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 >index 00000000000..6175336da26 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-aria-label-expected.txt >@@ -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 >index 00000000000..7b08a94b3b7 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-labelledby-overrides-label-expected.txt >@@ -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 >index 00000000000..11e0622144b >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-option-role-expected.txt >@@ -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 >index 00000000000..b1f30d0c084 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-roledescription-expected.txt >@@ -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 >index 00000000000..92fbb292e4e >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-switch-sends-notification-expected.txt >@@ -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 >index 00000000000..634026176ef >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-tab-roles-expected.txt >@@ -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 >index 00000000000..2cebb504be8 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-table-attributes-expected.txt >@@ -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 >index 00000000000..d0e4c5d55d1 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-table-content-expected.txt >@@ -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 >index 00000000000..53f4a4a101c >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/aria-toggle-button-with-title-expected.txt >@@ -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 >index 00000000000..a0eacb71659 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/auto-fill-crash-expected.txt >@@ -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 >index 00000000000..568c1023f45 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/button-with-aria-haspopup-role-expected.txt >@@ -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 >index 00000000000..bf82e8892a4 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/color-well-expected.txt >@@ -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 >index 00000000000..09ba597d705 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/deleting-iframe-destroys-axcache-expected.txt >@@ -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 >index 00000000000..4c493485d4b >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/dimensions-include-descendants-expected.txt >@@ -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 >index 00000000000..b873fc94929 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/double-nested-inline-element-missing-from-tree-expected.txt >@@ -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 >index 00000000000..2fcc4279f17 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/empty-image-with-title-expected.txt >@@ -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 >index 00000000000..684abbea300 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/file-upload-button-stringvalue-expected.txt >@@ -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 >index 00000000000..09614bbd5a2 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/help-text-expected.txt >@@ -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 >index 00000000000..98695dd7ce4 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/image-link-expected.txt >@@ -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 >index 00000000000..635797ede59 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/image-map1-expected.txt >@@ -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 >index 00000000000..572dfd135bc >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/image-map2-expected.txt >@@ -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 >index 00000000000..b9243ed2010 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/inline-continuations-expected.txt >@@ -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 >index 00000000000..6af6ed56782 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/label-with-pseudo-elements-expected.txt >@@ -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 >index 00000000000..efd4fe66e07 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/list-detection-expected.txt >@@ -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 >index 00000000000..eadc79ee312 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/lists-expected.txt >@@ -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 >index 00000000000..df426feabba >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/math-multiscript-attributes-expected.txt >@@ -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 >index 00000000000..de0c749ba5c >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/media-emits-object-replacement-expected.txt >@@ -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 >index 00000000000..9f9e0549720 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/menu-list-crash2-expected.txt >@@ -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 >index 00000000000..f2d64d0cbcd >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/minimal-table-with-aria-is-data-table-expected.txt >@@ -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 >index 00000000000..1064b83fa35 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/press-targets-center-point-expected.txt >@@ -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 >index 00000000000..d17601a1ec7 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/radio-button-title-label-expected.txt >@@ -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 >index 00000000000..d091f935b1e >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/render-counter-text-expected.txt >@@ -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 >index 00000000000..d36d08d278a >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/roles-computedRoleString-expected.txt >@@ -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 >index 00000000000..5b2ebd4fc7d >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/roles-exposed-expected.txt >@@ -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 >index 00000000000..336c8ddf23f >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/set-selected-text-range-contenteditable-expected.txt >@@ -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 >index 00000000000..d9371dced37 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/svg-remote-element-expected.txt >@@ -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 >index 00000000000..6692d1494b5 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/tabindex-elements-are-accessible-expected.txt >@@ -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 >index 00000000000..bf0585b9eff >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-attributes-expected.txt >@@ -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 >index 00000000000..946d5842f9e >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-cell-spans-expected.txt >@@ -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 >index 00000000000..17e21c0df3e >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-cells-expected.txt >@@ -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 >index 00000000000..e797a1c9536 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-cells-roles-expected.txt >@@ -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 >index 00000000000..54d167c7c39 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-column-headers-with-captions-expected.txt >@@ -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 >index 00000000000..6a7fb799267 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-one-cell-expected.txt >@@ -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 >index 00000000000..3e736838ea6 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-roles-hierarchy-expected.txt >@@ -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 >index 00000000000..41f7e3d3d61 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-sections-expected.txt >@@ -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 >index 00000000000..d7b8df7b070 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/table-with-rules-expected.txt >@@ -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 >index 00000000000..fd7a0985146 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/text-alternative-calculation-hidden-nodes-expected.txt >@@ -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 >index 00000000000..e5ea4737524 >--- /dev/null >+++ b/LayoutTests/platform/wpe/accessibility/transformed-element-expected.txt >@@ -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 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 1dc6f1f7d3d..1c6d3a0f6f9 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -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 >diff --git a/Source/WebCore/PlatformWPE.cmake b/Source/WebCore/PlatformWPE.cmake >index 4100c815259..bf7f78a0149 100644 >--- a/Source/WebCore/PlatformWPE.cmake >+++ b/Source/WebCore/PlatformWPE.cmake >@@ -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} >diff --git a/Source/WebCore/SourcesWPE.txt b/Source/WebCore/SourcesWPE.txt >index 3c32d895505..dbbd995ae49 100644 >--- a/Source/WebCore/SourcesWPE.txt >+++ b/Source/WebCore/SourcesWPE.txt >@@ -21,9 +21,25 @@ > // 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 >diff --git a/Source/WebCore/accessibility/AXObjectCache.h b/Source/WebCore/accessibility/AXObjectCache.h >index eb67329a14a..27034fa9cbc 100644 >--- a/Source/WebCore/accessibility/AXObjectCache.h >+++ b/Source/WebCore/accessibility/AXObjectCache.h >@@ -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 >diff --git a/Source/WebCore/accessibility/AccessibilityList.cpp b/Source/WebCore/accessibility/AccessibilityList.cpp >index 7b297d60c0e..0bd0a733acf 100644 >--- a/Source/WebCore/accessibility/AccessibilityList.cpp >+++ b/Source/WebCore/accessibility/AccessibilityList.cpp >@@ -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 >diff --git a/Source/WebCore/accessibility/AccessibilityNodeObject.cpp b/Source/WebCore/accessibility/AccessibilityNodeObject.cpp >index 1f2e146e53d..137c8585e8a 100644 >--- a/Source/WebCore/accessibility/AccessibilityNodeObject.cpp >+++ b/Source/WebCore/accessibility/AccessibilityNodeObject.cpp >@@ -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()) >diff --git a/Source/WebCore/accessibility/AccessibilityObject.cpp b/Source/WebCore/accessibility/AccessibilityObject.cpp >index f787fa9e4b9..f702fde3ce8 100644 >--- a/Source/WebCore/accessibility/AccessibilityObject.cpp >+++ b/Source/WebCore/accessibility/AccessibilityObject.cpp >@@ -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); >diff --git a/Source/WebCore/accessibility/AccessibilityObject.h b/Source/WebCore/accessibility/AccessibilityObject.h >index c0a19ff91fb..c2a1bb4ecca 100644 >--- a/Source/WebCore/accessibility/AccessibilityObject.h >+++ b/Source/WebCore/accessibility/AccessibilityObject.h >@@ -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 > }; > >diff --git a/Source/WebCore/accessibility/AccessibilityObjectInterface.h b/Source/WebCore/accessibility/AccessibilityObjectInterface.h >index 71fa8f08114..92b2a90ed19 100644 >--- a/Source/WebCore/accessibility/AccessibilityObjectInterface.h >+++ b/Source/WebCore/accessibility/AccessibilityObjectInterface.h >@@ -36,11 +36,9 @@ > #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 >diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >index de2a0052b83..89c4517d143 100644 >--- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >+++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >@@ -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; >diff --git a/Source/WebCore/accessibility/AccessibilityTableColumn.cpp b/Source/WebCore/accessibility/AccessibilityTableColumn.cpp >index dd81452d94a..3cb7f15a217 100644 >--- a/Source/WebCore/accessibility/AccessibilityTableColumn.cpp >+++ b/Source/WebCore/accessibility/AccessibilityTableColumn.cpp >@@ -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 > >diff --git a/Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp b/Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp >index 1c65d3858d5..946ef1c1ebc 100644 >--- a/Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp >+++ b/Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp >@@ -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 > >diff --git a/Source/WebCore/accessibility/atk/WebKitAccessible.cpp b/Source/WebCore/accessibility/atk/WebKitAccessible.cpp >index ef5b9ef75f0..63b0382892a 100644 >--- a/Source/WebCore/accessibility/atk/WebKitAccessible.cpp >+++ b/Source/WebCore/accessibility/atk/WebKitAccessible.cpp >@@ -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 >index 008accae9b5..00000000000 >--- a/Source/WebCore/accessibility/wpe/AXObjectCacheWPE.cpp >+++ /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 >index 866a2ab2bb9..00000000000 >--- a/Source/WebCore/accessibility/wpe/AccessibilityObjectWPE.cpp >+++ /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) >diff --git a/Source/WebCore/editing/FrameSelection.h b/Source/WebCore/editing/FrameSelection.h >index e170721a90b..1166a1e2a92 100644 >--- a/Source/WebCore/editing/FrameSelection.h >+++ b/Source/WebCore/editing/FrameSelection.h >@@ -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&) > { >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 12ec5a7bb73..6c4c2172910 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -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 >diff --git a/Source/WebKit/PlatformWPE.cmake b/Source/WebKit/PlatformWPE.cmake >index 57ab12e325c..75bf8a68441 100644 >--- a/Source/WebKit/PlatformWPE.cmake >+++ b/Source/WebKit/PlatformWPE.cmake >@@ -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}) >diff --git a/Source/WebKit/SourcesGTK.txt b/Source/WebKit/SourcesGTK.txt >index 8b5367f307d..2ef5b3c7251 100644 >--- a/Source/WebKit/SourcesGTK.txt >+++ b/Source/WebKit/SourcesGTK.txt >@@ -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 > >diff --git a/Source/WebKit/SourcesWPE.txt b/Source/WebKit/SourcesWPE.txt >index c302d82a432..edf5c3a7433 100644 >--- a/Source/WebKit/SourcesWPE.txt >+++ b/Source/WebKit/SourcesWPE.txt >@@ -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 >index 00000000000..38628862485 >--- /dev/null >+++ b/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.cpp >@@ -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 >index 00000000000..3037d486b01 >--- /dev/null >+++ b/Source/WebKit/UIProcess/API/glib/WebKitWebViewAccessible.h >@@ -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) >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >index e545dc70e10..7c7b0da18eb 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -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 >index 7a139657743..00000000000 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.cpp >+++ /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 >index 3e932c3cd0c..00000000000 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBaseAccessible.h >+++ /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 >diff --git a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp >index a91ff0f7b02..82d2c15490d 100644 >--- a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp >+++ b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.cpp >@@ -37,6 +37,10 @@ > #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 >diff --git a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >index 50bfbb60d30..7be9b3ee93f 100644 >--- a/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >+++ b/Source/WebKit/UIProcess/API/wpe/PageClientImpl.h >@@ -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; >diff --git a/Source/WebKit/UIProcess/API/wpe/WPEView.cpp b/Source/WebKit/UIProcess/API/wpe/WPEView.cpp >index 3060d85535b..9aa63404531 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WPEView.cpp >+++ b/Source/WebKit/UIProcess/API/wpe/WPEView.cpp >@@ -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 >diff --git a/Source/WebKit/UIProcess/API/wpe/WPEView.h b/Source/WebKit/UIProcess/API/wpe/WPEView.h >index 16486bfee24..75ca8579802 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WPEView.h >+++ b/Source/WebKit/UIProcess/API/wpe/WPEView.h >@@ -33,6 +33,11 @@ > #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 >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index 062a4c89905..48432a3c15b 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -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 >diff --git a/Source/WebKit/UIProcess/WebPageProxy.messages.in b/Source/WebKit/UIProcess/WebPageProxy.messages.in >index 8a7f8c4fe91..6fcecdc6b65 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.messages.in >+++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in >@@ -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 > >diff --git a/Source/WebKit/UIProcess/wpe/WebPageProxyWPE.cpp b/Source/WebKit/UIProcess/wpe/WebPageProxyWPE.cpp >index 61d44c847e9..3e88f8a7c4d 100644 >--- a/Source/WebKit/UIProcess/wpe/WebPageProxyWPE.cpp >+++ b/Source/WebKit/UIProcess/wpe/WebPageProxyWPE.cpp >@@ -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(); >diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h >index c486fc46714..3608e7efe55 100644 >--- a/Source/WebKit/WebProcess/WebPage/WebPage.h >+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h >@@ -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 > >diff --git a/Source/WebKit/WebProcess/WebPage/wpe/WebPageWPE.cpp b/Source/WebKit/WebProcess/WebPage/wpe/WebPageWPE.cpp >index 8f796147fb7..5c1f255edf7 100644 >--- a/Source/WebKit/WebProcess/WebPage/wpe/WebPageWPE.cpp >+++ b/Source/WebKit/WebProcess/WebPage/wpe/WebPageWPE.cpp >@@ -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() >diff --git a/Source/WebKit/WebProcess/wpe/WebProcessMainWPE.cpp b/Source/WebKit/WebProcess/wpe/WebProcessMainWPE.cpp >index fd8c6ab2026..14912ce3387 100644 >--- a/Source/WebKit/WebProcess/wpe/WebProcessMainWPE.cpp >+++ b/Source/WebKit/WebProcess/wpe/WebProcessMainWPE.cpp >@@ -31,9 +31,47 @@ > #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 >index 00000000000..331aeebb141 >--- /dev/null >+++ b/Source/cmake/FindATKBridge.cmake >@@ -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 >+) >diff --git a/Source/cmake/OptionsGTK.cmake b/Source/cmake/OptionsGTK.cmake >index b21a58f52bc..c8906e01f48 100644 >--- a/Source/cmake/OptionsGTK.cmake >+++ b/Source/cmake/OptionsGTK.cmake >@@ -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) >diff --git a/Source/cmake/OptionsWPE.cmake b/Source/cmake/OptionsWPE.cmake >index c71456ae7bf..815566af681 100644 >--- a/Source/cmake/OptionsWPE.cmake >+++ b/Source/cmake/OptionsWPE.cmake >@@ -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) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 2f0245f295b..21e7bf9b71e 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -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 >diff --git a/Tools/MiniBrowser/wpe/CMakeLists.txt b/Tools/MiniBrowser/wpe/CMakeLists.txt >index 74591ff5089..245f319abf2 100644 >--- a/Tools/MiniBrowser/wpe/CMakeLists.txt >+++ b/Tools/MiniBrowser/wpe/CMakeLists.txt >@@ -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} > ) >diff --git a/Tools/MiniBrowser/wpe/main.cpp b/Tools/MiniBrowser/wpe/main.cpp >index cb83d64964f..be6460e56b7 100644 >--- a/Tools/MiniBrowser/wpe/main.cpp >+++ b/Tools/MiniBrowser/wpe/main.cpp >@@ -33,6 +33,10 @@ > #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); >diff --git a/Tools/TestWebKitAPI/PlatformWPE.cmake b/Tools/TestWebKitAPI/PlatformWPE.cmake >index 82749a8fdcc..47bf7b35a72 100644 >--- a/Tools/TestWebKitAPI/PlatformWPE.cmake >+++ b/Tools/TestWebKitAPI/PlatformWPE.cmake >@@ -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 >diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp >index 9acf8588d38..b76151fe399 100644 >--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp >+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp >@@ -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 >diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h >index d5aeebbcce7..dbfe8867046 100644 >--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h >+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h >@@ -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 > }; >diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h >index 24c094b023c..69d3f518442 100644 >--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h >+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h >@@ -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 >diff --git a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp >index 3cd0bdda27b..5199a9aca65 100644 >--- a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp >+++ b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp >@@ -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 >index fbea9149a39..00000000000 >--- a/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityControllerWPE.cpp >+++ /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 >index f0da27bf3c5..00000000000 >--- a/Tools/WebKitTestRunner/InjectedBundle/wpe/AccessibilityUIElementWPE.cpp >+++ /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) >diff --git a/Tools/WebKitTestRunner/PlatformWPE.cmake b/Tools/WebKitTestRunner/PlatformWPE.cmake >index 0453ff6ea72..e20087ca55a 100644 >--- a/Tools/WebKitTestRunner/PlatformWPE.cmake >+++ b/Tools/WebKitTestRunner/PlatformWPE.cmake >@@ -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 >diff --git a/Tools/wpe/backends/CMakeLists.txt b/Tools/wpe/backends/CMakeLists.txt >index 98f46ee213b..570c4530f54 100644 >--- a/Tools/wpe/backends/CMakeLists.txt >+++ b/Tools/wpe/backends/CMakeLists.txt >@@ -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}) >diff --git a/Tools/wpe/backends/HeadlessViewBackend.cpp b/Tools/wpe/backends/HeadlessViewBackend.cpp >index f07e08d91dd..eada21ab3aa 100644 >--- a/Tools/wpe/backends/HeadlessViewBackend.cpp >+++ b/Tools/wpe/backends/HeadlessViewBackend.cpp >@@ -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; >diff --git a/Tools/wpe/backends/ViewBackend.cpp b/Tools/wpe/backends/ViewBackend.cpp >index e9aa59e5fed..b344317ef3f 100644 >--- a/Tools/wpe/backends/ViewBackend.cpp >+++ b/Tools/wpe/backends/ViewBackend.cpp >@@ -29,8 +29,106 @@ > #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); >diff --git a/Tools/wpe/backends/ViewBackend.h b/Tools/wpe/backends/ViewBackend.h >index 63e9f8bfb02..0970b5f5cae 100644 >--- a/Tools/wpe/backends/ViewBackend.h >+++ b/Tools/wpe/backends/ViewBackend.h >@@ -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 >index 00000000000..6d8ba845e6b >--- /dev/null >+++ b/Tools/wpe/backends/WebKitAccessibleApplication.cpp >@@ -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 >index 00000000000..9776b956d8a >--- /dev/null >+++ b/Tools/wpe/backends/WebKitAccessibleApplication.h >@@ -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) >diff --git a/Tools/wpe/backends/WindowViewBackend.cpp b/Tools/wpe/backends/WindowViewBackend.cpp >index 5b2cb81dd09..fc21f4c5538 100644 >--- a/Tools/wpe/backends/WindowViewBackend.cpp >+++ b/Tools/wpe/backends/WindowViewBackend.cpp >@@ -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); > } > } > >diff --git a/Tools/wpe/jhbuild.modules b/Tools/wpe/jhbuild.modules >index e1afce3b339..5af0bd9cb6f 100644 >--- a/Tools/wpe/jhbuild.modules >+++ b/Tools/wpe/jhbuild.modules >@@ -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> > >@@ -277,4 +279,36 @@ > </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>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197413
:
368557
|
370043
|
370303
|
370305
|
370307
| 370310