| 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'); | 
| +  }, | 
| }); | 
|  |