<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[177536] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/177536">177536</a></dd>
<dt>Author</dt> <dd>cfleizach@apple.com</dd>
<dt>Date</dt> <dd>2014-12-18 15:25:27 -0800 (Thu, 18 Dec 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>AX: Heuristic: Avoid exposing an element as clickable if mouse event delegation is handled on an element with any explicit ARIA role, including presentation.
https://bugs.webkit.org/show_bug.cgi?id=133613
Reviewed by Mario Sanchez Prada.
Source/WebCore:
This adds a heuristic to avoid a problem we have where too many objects that say they respond to press actions for accessibility.
It results from people installing click handlers on container nodes and then lots of static text objects are "clickable" in the eyes of VoiceOver.
What we can do is avoid this determination if the element is presentational.
Test: platform/mac/accessibility/press-action-for-presentational-descendants.html
* accessibility/AccessibilityObject.cpp:
(WebCore::nodeHasPresentationRole):
(WebCore::AccessibilityObject::supportsPressAction):
* accessibility/AccessibilityObject.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityActionNames]):
LayoutTests:
* platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt: Added.
* platform/mac/accessibility/press-action-for-presentational-descendants.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityObjectcpp">trunk/Source/WebCore/accessibility/AccessibilityObject.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityObjecth">trunk/Source/WebCore/accessibility/AccessibilityObject.h</a></li>
<li><a href="#trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperMacmm">trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsplatformmacaccessibilitypressactionforpresentationaldescendantsexpectedtxt">trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacaccessibilitypressactionforpresentationaldescendantshtml">trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (177535 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-12-18 23:22:44 UTC (rev 177535)
+++ trunk/LayoutTests/ChangeLog        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -1,5 +1,15 @@
</span><span class="cx"> 2014-12-18 Chris Fleizach <cfleizach@apple.com>
</span><span class="cx">
</span><ins>+ AX: Heuristic: Avoid exposing an element as clickable if mouse event delegation is handled on an element with any explicit ARIA role, including presentation.
+ https://bugs.webkit.org/show_bug.cgi?id=133613
+
+ Reviewed by Mario Sanchez Prada.
+
+ * platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt: Added.
+ * platform/mac/accessibility/press-action-for-presentational-descendants.html: Added.
+
+2014-12-18 Chris Fleizach <cfleizach@apple.com>
+
</ins><span class="cx"> AX: event.target should sometimes be a descendant element on AXPress-triggered mouse clicks
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=135689
</span><span class="cx">
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilitypressactionforpresentationaldescendantsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt (0 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt         (rev 0)
+++ trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants-expected.txt        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+this is a button (user assumes clickable) this is no longer exposed as clickable because of the explicit role on the delegate
+This tests ensures that static text that is inside a click handler parent who IS presentational will not say it supports press.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS button.isPressActionSupported() is true
+PASS text.isPressActionSupported() is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilitypressactionforpresentationaldescendantshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants.html (0 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants.html         (rev 0)
+++ trunk/LayoutTests/platform/mac/accessibility/press-action-for-presentational-descendants.html        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+<!DOCTYPE HTML>
+<html>
+<body>
+<script src="../../../resources/js-test-pre.js"></script>
+
+<div id="content" role="group">
+
+<div role="presentation" onclick="handleClick(this);">
+ <button>this is a button (user assumes clickable)</button>
+ <span>this is no longer exposed as clickable because of the explicit role on the delegate</span>
+</div>
+
+</div>
+
+<div id="console"></div>
+<script>
+
+description("This tests ensures that static text that is inside a click handler parent who IS presentational will not say it supports press.")
+
+if (window.testRunner && window.accessibilityController) {
+
+ var button = accessibilityController.accessibleElementById("content").childAtIndex(0);
+ var text = accessibilityController.accessibleElementById("content").childAtIndex(1);
+ shouldBeTrue("button.isPressActionSupported()");
+ shouldBeFalse("text.isPressActionSupported()");
+}
+
+</script>
+
+<script src="../../../resources/js-test-post.js"></script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177535 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-18 23:22:44 UTC (rev 177535)
+++ trunk/Source/WebCore/ChangeLog        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -1,5 +1,26 @@
</span><span class="cx"> 2014-12-18 Chris Fleizach <cfleizach@apple.com>
</span><span class="cx">
</span><ins>+ AX: Heuristic: Avoid exposing an element as clickable if mouse event delegation is handled on an element with any explicit ARIA role, including presentation.
+ https://bugs.webkit.org/show_bug.cgi?id=133613
+
+ Reviewed by Mario Sanchez Prada.
+
+ This adds a heuristic to avoid a problem we have where too many objects that say they respond to press actions for accessibility.
+ It results from people installing click handlers on container nodes and then lots of static text objects are "clickable" in the eyes of VoiceOver.
+
+ What we can do is avoid this determination if the element is presentational.
+
+ Test: platform/mac/accessibility/press-action-for-presentational-descendants.html
+
+ * accessibility/AccessibilityObject.cpp:
+ (WebCore::nodeHasPresentationRole):
+ (WebCore::AccessibilityObject::supportsPressAction):
+ * accessibility/AccessibilityObject.h:
+ * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+ (-[WebAccessibilityObjectWrapper accessibilityActionNames]):
+
+2014-12-18 Chris Fleizach <cfleizach@apple.com>
+
</ins><span class="cx"> AX: event.target should sometimes be a descendant element on AXPress-triggered mouse clicks
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=135689
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (177535 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2014-12-18 23:22:44 UTC (rev 177535)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -1985,6 +1985,24 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static bool nodeHasPresentationRole(Node* node)
+{
+ return nodeHasRole(node, "presentation") || nodeHasRole(node, "none");
+}
+
+bool AccessibilityObject::supportsPressAction() const
+{
+ if (isButton())
+ return true;
+
+ Element* actionElement = this->actionElement();
+ if (!actionElement)
+ return false;
+
+ // [Bug: 133613] Heuristic: If the action element is presentational, we shouldn't expose press as a supported action.
+ return !nodeHasPresentationRole(actionElement);
+}
+
</ins><span class="cx"> bool AccessibilityObject::supportsDatetimeAttribute() const
</span><span class="cx"> {
</span><span class="cx"> return hasTagName(insTag) || hasTagName(delTag) || hasTagName(timeTag);
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (177535 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityObject.h        2014-12-18 23:22:44 UTC (rev 177535)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -691,6 +691,7 @@
</span><span class="cx"> static AccessibilityObject* anchorElementForNode(Node*);
</span><span class="cx"> static AccessibilityObject* headingElementForNode(Node*);
</span><span class="cx"> virtual Element* anchorElement() const { return nullptr; }
</span><ins>+ bool supportsPressAction() const;
</ins><span class="cx"> virtual Element* actionElement() const { return nullptr; }
</span><span class="cx"> virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
</span><span class="cx"> IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (177535 => 177536)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm        2014-12-18 23:22:44 UTC (rev 177535)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm        2014-12-18 23:25:27 UTC (rev 177536)
</span><span class="lines">@@ -1168,7 +1168,7 @@
</span><span class="cx"> static NSArray *sliderActions = [[defaultElementActions arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:NSAccessibilityIncrementAction, NSAccessibilityDecrementAction, nil]] retain];
</span><span class="cx">
</span><span class="cx"> NSArray *actions;
</span><del>- if (m_object->actionElement() || m_object->isButton())
</del><ins>+ if (m_object->supportsPressAction())
</ins><span class="cx"> actions = actionElementActions;
</span><span class="cx"> else if (m_object->isMenuRelated())
</span><span class="cx"> actions = menuElementActions;
</span></span></pre>
</div>
</div>
</body>
</html>