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

Side by Side Diff: chrome/browser/resources/md_bookmarks/folder_node.js

Issue 2857893002: [MD Bookmarks] Allow left/right keys to close/open folders in sidebar. (Closed)
Patch Set: fix rtl test Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 Polymer({ 5 Polymer({
6 is: 'bookmarks-folder-node', 6 is: 'bookmarks-folder-node',
7 7
8 behaviors: [ 8 behaviors: [
9 bookmarks.StoreClient, 9 bookmarks.StoreClient,
10 ], 10 ],
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 /** @return {boolean} */ 76 /** @return {boolean} */
77 isTopLevelFolder_: function() { 77 isTopLevelFolder_: function() {
78 return this.depth == 0; 78 return this.depth == 0;
79 }, 79 },
80 80
81 /** 81 /**
82 * @private 82 * @private
83 * @param {!Event} e 83 * @param {!Event} e
84 */ 84 */
85 onKeydown_: function(e) { 85 onKeydown_: function(e) {
86 var direction = 0; 86 var yDirection = 0;
87 var xDirection = 0;
87 var handled = true; 88 var handled = true;
88 // TODO(calamity): Handle left/right arrow keys.
89 if (e.key == 'ArrowUp') { 89 if (e.key == 'ArrowUp') {
90 direction = -1; 90 yDirection = -1;
91 } else if (e.key == 'ArrowDown') { 91 } else if (e.key == 'ArrowDown') {
92 direction = 1; 92 yDirection = 1;
93 } else if (e.key == 'ArrowLeft') {
94 xDirection = -1;
95 } else if (e.key == 'ArrowRight') {
96 xDirection = 1;
93 } else { 97 } else {
94 handled = false; 98 handled = false;
95 } 99 }
96 100
97 if (direction) 101 if (this.getComputedStyleValue('direction') == 'rtl')
98 this.changeKeyboardSelection_(direction, this.root.activeElement); 102 xDirection *= -1;
103
104 this.changeKeyboardSelection_(
105 xDirection, yDirection, this.root.activeElement);
99 106
100 if (!handled) 107 if (!handled)
101 return; 108 return;
102 109
103 e.preventDefault(); 110 e.preventDefault();
104 e.stopPropagation(); 111 e.stopPropagation();
105 }, 112 },
106 113
107 /** 114 /**
108 * @private 115 * @private
109 * @param {number} direction 116 * @param {number} xDirection
117 * @param {number} yDirection
110 * @param {!HTMLElement} currentFocus 118 * @param {!HTMLElement} currentFocus
111 */ 119 */
112 changeKeyboardSelection_: function(direction, currentFocus) { 120 changeKeyboardSelection_: function(xDirection, yDirection, currentFocus) {
113 var newFocusFolderNode = null; 121 var newFocusFolderNode = null;
114 var isChildFolderNodeFocused = 122 var isChildFolderNodeFocused =
115 currentFocus.tagName == 'BOOKMARKS-FOLDER-NODE'; 123 currentFocus.tagName == 'BOOKMARKS-FOLDER-NODE';
116 var reverse = direction == -1; 124
125 if (xDirection == 1) {
126 // The right arrow opens a folder if closed and goes to the first child
127 // otherwise.
128 if (this.hasChildFolder_()) {
129 if (this.isClosed_) {
130 this.dispatch(
131 bookmarks.actions.changeFolderOpen(this.item_.id, true));
132 } else {
133 yDirection = 1;
134 }
135 }
136 } else if (xDirection == -1) {
137 // The left arrow closes a folder if open and goes to the parent
138 // otherwise.
139 if (this.hasChildFolder_() && !this.isClosed_) {
140 this.dispatch(bookmarks.actions.changeFolderOpen(this.item_.id, false));
141 } else {
142 var parentFolderNode = this.getParentFolderNode_();
143 if (parentFolderNode.itemId != ROOT_NODE_ID) {
144 parentFolderNode.selectFolder_();
145 parentFolderNode.getFocusTarget().focus();
146 }
147 }
148 }
149
150 if (!yDirection)
151 return;
117 152
118 // The current node's successor is its first child when open. 153 // The current node's successor is its first child when open.
119 if (!isChildFolderNodeFocused && !reverse && !this.isClosed_) { 154 if (!isChildFolderNodeFocused && yDirection == 1 && !this.isClosed_) {
120 var children = this.getChildFolderNodes_(); 155 var children = this.getChildFolderNodes_();
121 if (children.length) 156 if (children.length)
122 newFocusFolderNode = children[0]; 157 newFocusFolderNode = children[0];
123 } 158 }
124 159
125 if (isChildFolderNodeFocused) { 160 if (isChildFolderNodeFocused) {
126 // Get the next child folder node if a child is focused. 161 // Get the next child folder node if a child is focused.
127 if (!newFocusFolderNode) { 162 if (!newFocusFolderNode) {
128 newFocusFolderNode = this.getNextChild_( 163 newFocusFolderNode = this.getNextChild_(
129 reverse, 164 yDirection == -1,
130 /** @type {!BookmarksFolderNodeElement} */ (currentFocus)); 165 /** @type {!BookmarksFolderNodeElement} */ (currentFocus));
131 } 166 }
132 167
133 // The first child's predecessor is this node. 168 // The first child's predecessor is this node.
134 if (!newFocusFolderNode && reverse) 169 if (!newFocusFolderNode && yDirection == -1)
135 newFocusFolderNode = this; 170 newFocusFolderNode = this;
136 } 171 }
137 172
138 // If there is no newly focused node, allow the parent to handle the change. 173 // If there is no newly focused node, allow the parent to handle the change.
139 if (!newFocusFolderNode) { 174 if (!newFocusFolderNode) {
140 if (this.itemId != ROOT_NODE_ID) 175 if (this.itemId != ROOT_NODE_ID)
141 this.getParentFolderNode_().changeKeyboardSelection_(direction, this); 176 this.getParentFolderNode_().changeKeyboardSelection_(
177 0, yDirection, this);
142 178
143 return; 179 return;
144 } 180 }
145 181
146 // The root node is not navigable. 182 // The root node is not navigable.
147 if (newFocusFolderNode.itemId != ROOT_NODE_ID) { 183 if (newFocusFolderNode.itemId != ROOT_NODE_ID) {
148 newFocusFolderNode.selectFolder_(); 184 newFocusFolderNode.selectFolder_();
149 newFocusFolderNode.getFocusTarget().focus(); 185 newFocusFolderNode.getFocusTarget().focus();
150 } 186 }
151 }, 187 },
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 }, 328 },
293 329
294 /** 330 /**
295 * @private 331 * @private
296 * @return {string} 332 * @return {string}
297 */ 333 */
298 getTabIndex_: function() { 334 getTabIndex_: function() {
299 return this.isSelectedFolder_ ? '0' : ''; 335 return this.isSelectedFolder_ ? '0' : '';
300 }, 336 },
301 }); 337 });
OLDNEW
« no previous file with comments | « chrome/browser/resources/md_bookmarks/folder_node.html ('k') | chrome/test/data/webui/md_bookmarks/md_bookmarks_focus_test.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698