Index: chrome/browser/resources/md_bookmarks/folder_node.js |
diff --git a/chrome/browser/resources/md_bookmarks/folder_node.js b/chrome/browser/resources/md_bookmarks/folder_node.js |
index 94cc5e7a665fea47fdf550a04549d56e42d91e4c..5bf1cd2ff9cd2711ea7568de22b187678ea37081 100644 |
--- a/chrome/browser/resources/md_bookmarks/folder_node.js |
+++ b/chrome/browser/resources/md_bookmarks/folder_node.js |
@@ -83,19 +83,26 @@ Polymer({ |
* @param {!Event} e |
*/ |
onKeydown_: function(e) { |
- var direction = 0; |
+ var yDirection = 0; |
+ var xDirection = 0; |
var handled = true; |
- // TODO(calamity): Handle left/right arrow keys. |
if (e.key == 'ArrowUp') { |
- direction = -1; |
+ yDirection = -1; |
} else if (e.key == 'ArrowDown') { |
- direction = 1; |
+ yDirection = 1; |
+ } else if (e.key == 'ArrowLeft') { |
+ xDirection = -1; |
+ } else if (e.key == 'ArrowRight') { |
+ xDirection = 1; |
} else { |
handled = false; |
} |
- if (direction) |
- this.changeKeyboardSelection_(direction, this.root.activeElement); |
+ if (this.getComputedStyleValue('direction') == 'rtl') |
+ xDirection *= -1; |
+ |
+ this.changeKeyboardSelection_( |
+ xDirection, yDirection, this.root.activeElement); |
if (!handled) |
return; |
@@ -106,17 +113,45 @@ Polymer({ |
/** |
* @private |
- * @param {number} direction |
+ * @param {number} xDirection |
+ * @param {number} yDirection |
* @param {!HTMLElement} currentFocus |
*/ |
- changeKeyboardSelection_: function(direction, currentFocus) { |
+ changeKeyboardSelection_: function(xDirection, yDirection, currentFocus) { |
var newFocusFolderNode = null; |
var isChildFolderNodeFocused = |
currentFocus.tagName == 'BOOKMARKS-FOLDER-NODE'; |
- var reverse = direction == -1; |
+ |
+ if (xDirection == 1) { |
+ // The right arrow opens a folder if closed and goes to the first child |
+ // otherwise. |
+ if (this.hasChildFolder_()) { |
+ if (this.isClosed_) { |
+ this.dispatch( |
+ bookmarks.actions.changeFolderOpen(this.item_.id, true)); |
+ } else { |
+ yDirection = 1; |
+ } |
+ } |
+ } else if (xDirection == -1) { |
+ // The left arrow closes a folder if open and goes to the parent |
+ // otherwise. |
+ if (this.hasChildFolder_() && !this.isClosed_) { |
+ this.dispatch(bookmarks.actions.changeFolderOpen(this.item_.id, false)); |
+ } else { |
+ var parentFolderNode = this.getParentFolderNode_(); |
+ if (parentFolderNode.itemId != ROOT_NODE_ID) { |
+ parentFolderNode.selectFolder_(); |
+ parentFolderNode.getFocusTarget().focus(); |
+ } |
+ } |
+ } |
+ |
+ if (!yDirection) |
+ return; |
// The current node's successor is its first child when open. |
- if (!isChildFolderNodeFocused && !reverse && !this.isClosed_) { |
+ if (!isChildFolderNodeFocused && yDirection == 1 && !this.isClosed_) { |
var children = this.getChildFolderNodes_(); |
if (children.length) |
newFocusFolderNode = children[0]; |
@@ -126,19 +161,20 @@ Polymer({ |
// Get the next child folder node if a child is focused. |
if (!newFocusFolderNode) { |
newFocusFolderNode = this.getNextChild_( |
- reverse, |
+ yDirection == -1, |
/** @type {!BookmarksFolderNodeElement} */ (currentFocus)); |
} |
// The first child's predecessor is this node. |
- if (!newFocusFolderNode && reverse) |
+ if (!newFocusFolderNode && yDirection == -1) |
newFocusFolderNode = this; |
} |
// If there is no newly focused node, allow the parent to handle the change. |
if (!newFocusFolderNode) { |
if (this.itemId != ROOT_NODE_ID) |
- this.getParentFolderNode_().changeKeyboardSelection_(direction, this); |
+ this.getParentFolderNode_().changeKeyboardSelection_( |
+ 0, yDirection, this); |
return; |
} |