Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: content/renderer/render_widget.cc

Issue 868933002: [Contextual Search] Check ARIA Roles before triggering. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index c2eefbd766a8c00c252c1c06c249675af13d37fa..a56f8085fb2546ebf6debcc4d9b9fcbdfbe22313 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -68,6 +68,7 @@
#include "third_party/WebKit/public/web/WebRange.h"
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "third_party/skia/include/core/SkShader.h"
+#include "ui/accessibility/ax_enums.h"
#include "ui/base/ui_base_switches.h"
#include "ui/gfx/frame_time.h"
#include "ui/gfx/geometry/point_conversions.h"
@@ -2137,13 +2138,77 @@ void RenderWidget::showUnhandledTapUIIfNeeded(
const WebNode& tapped_node,
bool page_changed) {
DCHECK(handling_input_event_);
+ WebCursor::CursorInfo cursor_info;
+ current_cursor_.GetCursorInfo(&cursor_info);
dmazzoni 2015/01/23 17:39:56 I haven't used current_cursor_ before - are we sur
Donn Denman 2015/01/29 22:42:39 I couldn't figure out the cursor stuff, so decided
+ bool has_pointer_cursor = cursor_info.type == WebCursorInfo::TypeHand;
+ bool has_wai_aria_role = hasAriaRole(tapped_node);
bool should_trigger = !page_changed && tapped_node.isTextNode() &&
- !tapped_node.isContentEditable();
+ !tapped_node.isContentEditable() &&
+ !has_wai_aria_role && !tapped_node.isFocusable() &&
dmazzoni 2015/01/23 17:39:56 I think you need to search up the ancestor chain t
Donn Denman 2015/01/29 22:42:39 Done -- Now checking all ancestors for focusabilit
+ !has_pointer_cursor;
if (should_trigger) {
Send(new ViewHostMsg_ShowUnhandledTapUIIfNeeded(routing_id_,
tapped_position.x, tapped_position.y));
}
}
+
+bool RenderWidget::hasAriaRole(const WebNode& node) {
dmazzoni 2015/01/23 17:39:56 This should probably be named hasWidgetAriaRole or
Donn Denman 2015/01/29 22:42:39 Moved this logic into Blink.
+ // From http://www.w3.org/TR/wai-aria/roles#widget_roles
+ const ui::AXRole widget_and_composite_roles[] = {
+ ui::AX_ROLE_ALERT,
dmazzoni 2015/01/23 17:39:56 ui::AXRole is not a list of ARIA roles, it's a lis
Donn Denman 2015/01/29 22:42:39 Thanks for explaining this. Moved to WebAXObject.
+ ui::AX_ROLE_ALERT_DIALOG,
+ ui::AX_ROLE_BUTTON,
+ ui::AX_ROLE_CHECK_BOX,
+ ui::AX_ROLE_DIALOG,
+ // TODO(donnd): add these missing role definitions!
+ // ui::AX_ROLE_GRID_CELL,
+ ui::AX_ROLE_LINK,
+ ui::AX_ROLE_MARQUEE,
+ ui::AX_ROLE_MENU_ITEM,
+ ui::AX_ROLE_MENU_ITEM_CHECK_BOX,
+ ui::AX_ROLE_MENU_ITEM_RADIO,
+ // ui::AX_ROLE_OPTION,
+ // ui::AX_ROLE_PROGRESS_BAR,
+ // ui::AX_ROLE_RADIO,
+ ui::AX_ROLE_SCROLL_BAR,
+ ui::AX_ROLE_SLIDER,
+ ui::AX_ROLE_SPIN_BUTTON,
+ ui::AX_ROLE_STATUS,
+ ui::AX_ROLE_TAB,
+ ui::AX_ROLE_TAB_PANEL,
+ // ui::AX_ROLE_TEXT_BOX,
+ ui::AX_ROLE_TIMER,
+ ui::AX_ROLE_TOOLTIP,
+ ui::AX_ROLE_TREE_ITEM,
+ // Composite roles.
+ ui::AX_ROLE_COMBO_BOX,
+ ui::AX_ROLE_GRID,
+ ui::AX_ROLE_LIST_BOX,
+ ui::AX_ROLE_MENU,
+ ui::AX_ROLE_MENU_BAR,
+ ui::AX_ROLE_RADIO_GROUP,
+ ui::AX_ROLE_TAB_LIST,
+ ui::AX_ROLE_TREE,
+ ui::AX_ROLE_TREE_GRID};
+ WebNode curNode = node;
+ do {
+ if (curNode.isElementNode()) {
+ const blink::WebElement& element = curNode.toConst<blink::WebElement>();
+ VLOG(0) << "ctxs markup: " << element.createMarkup().utf8().data();
+ std::string role = element.getAttribute("role").utf8().data();
dmazzoni 2015/01/23 17:39:56 The role attribute is actually allowed to be a spa
Donn Denman 2015/01/29 22:42:39 Done in the Blink CL. Thanks for pointing this ou
+ if (role.length() > 0) {
+ VLOG(0) << "ctxs role: " << role;
+ for (unsigned i = 0;
dmazzoni 2015/01/23 17:39:56 I'd use a hash_set for this - even if we don't thi
Donn Denman 2015/01/29 22:42:39 Done.
+ i < sizeof(widget_and_composite_roles) / sizeof(roles[0]); i++) {
+ if (ui::ToString(widget_and_composite_roles[i]) == role)
dmazzoni 2015/01/23 17:39:56 This should be case-insensitive. I'd convert the a
Donn Denman 2015/01/29 22:42:39 Done in the Blink CL. Thanks for pointing this ou
+ return true;
+ }
+ }
+ }
+ curNode = curNode.parentNode();
+ } while (!curNode.isNull());
+ return false;
+}
#endif
void RenderWidget::didHandleGestureEvent(
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698