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 c6885cecd50d592923c7b65ad115a2d6ecbd63c3..31a3a854fce3e8db880efd445dbbda253227c874 100644 |
--- a/chrome/browser/resources/md_bookmarks/folder_node.js |
+++ b/chrome/browser/resources/md_bookmarks/folder_node.js |
@@ -40,12 +40,22 @@ Polymer({ |
reflectToAttribute: true, |
computed: 'computeIsSelected_(itemId, selectedFolder_, searchActive_)' |
}, |
+ |
+ /** @private */ |
+ hasChildFolder_: { |
+ type: Boolean, |
+ computed: 'computeHasChildFolder_(item_.children)', |
+ }, |
}, |
listeners: { |
'keydown': 'onKeydown_', |
}, |
+ observers: [ |
+ 'updateAriaExpanded_(hasChildFolder_, isClosed_)', |
+ ], |
+ |
/** @override */ |
attached: function() { |
this.watch('item_', function(state) { |
@@ -135,7 +145,7 @@ Polymer({ |
if (xDirection == 1) { |
// The right arrow opens a folder if closed and goes to the first child |
// otherwise. |
- if (this.hasChildFolder_()) { |
+ if (this.hasChildFolder_) { |
if (this.isClosed_) { |
this.dispatch( |
bookmarks.actions.changeFolderOpen(this.item_.id, true)); |
@@ -146,7 +156,7 @@ Polymer({ |
} else if (xDirection == -1) { |
// The left arrow closes a folder if open and goes to the parent |
// otherwise. |
- if (this.hasChildFolder_() && !this.isClosed_) { |
+ if (this.hasChildFolder_ && !this.isClosed_) { |
this.dispatch(bookmarks.actions.changeFolderOpen(this.item_.id, false)); |
} else { |
var parentFolderNode = this.getParentFolderNode_(); |
@@ -317,13 +327,15 @@ Polymer({ |
* @private |
* @return {boolean} |
*/ |
- hasChildFolder_: function() { |
+ computeHasChildFolder_: function() { |
return bookmarks.util.hasChildFolders(this.itemId, this.getState().nodes); |
}, |
/** @private */ |
depthChanged_: function() { |
this.style.setProperty('--node-depth', String(this.depth)); |
+ if (this.depth == -1) |
+ this.$.descendants.removeAttribute('role'); |
}, |
/** |
@@ -358,4 +370,18 @@ Polymer({ |
getTabIndex_: function() { |
return this.isSelectedFolder_ ? '0' : '-1'; |
}, |
+ |
+ /** |
+ * Sets the 'aria-expanded' accessibility on nodes which need it. Note that |
+ * aria-expanded="false" is different to having the attribute be undefined. |
+ * @param {boolean} hasChildFolder |
+ * @param {boolean} isClosed |
+ * @private |
+ */ |
+ updateAriaExpanded_: function(hasChildFolder, isClosed) { |
+ if (hasChildFolder) |
+ this.getFocusTarget().setAttribute('aria-expanded', String(!isClosed)); |
+ else |
+ this.getFocusTarget().removeAttribute('aria-expanded'); |
+ }, |
}); |