Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js |
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js |
index 70d4c926b718e8164eef0ff5a4741d555616e643..c9e84ed3cdcb7b61527fd6c7ddea5cea161a4837 100644 |
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js |
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js |
@@ -483,19 +483,24 @@ Background.prototype = { |
var node = evt.target; |
+ |
+ // Discard focus events on embeddedObject nodes. |
+ if (node.role == RoleType.embeddedObject) |
+ return; |
+ |
// It almost never makes sense to place focus directly on a rootWebArea. |
if (node.role == RoleType.rootWebArea) { |
+ // Discard focus events for root web areas when focus was previously |
+ // placed on a descendant. |
+ if (this.currentRange_.start.node.root == node) |
+ return; |
+ |
+ // Discard focused root nodes without focused state set. |
+ if (!node.state.focused) |
+ return; |
+ |
// Try to find a focusable descendant. |
- node = AutomationUtil.findNodePost(node, |
- Dir.FORWARD, |
- AutomationPredicate.focused) || node; |
- |
- // Fall back to the first leaf node in the document. |
- if (node.role == RoleType.rootWebArea) { |
- node = AutomationUtil.findNodePost(node, |
- Dir.FORWARD, |
- AutomationPredicate.leaf); |
- } |
+ node = node.find({state: {focused: true}}) || node; |
} |
if (evt.target.role == RoleType.textField) |
@@ -558,6 +563,9 @@ Background.prototype = { |
if (!evt.target.state.focused) |
return; |
+ if (evt.target.role != RoleType.textField) |
+ return; |
+ |
if (!this.currentRange_) { |
this.onEventDefault(evt); |
this.currentRange_ = cursors.Range.fromNode(evt.target); |