1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict'; 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @extends {cr.EventTarget} 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {HTMLDivElement} div Div container for breadcrumbs. 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {MetadataCache} metadataCache To retrieve metadata. 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param {VolumeManagerWrapper} volumeManager Volume manager. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @constructor 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)function BreadcrumbsController(div, metadataCache, volumeManager) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.bc_ = div; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.metadataCache_ = metadataCache; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.volumeManager_ = volumeManager; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.entry_ = null; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Sequence value to skip requests that are out of date. 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @type {number} 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @private 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.showSequence_ = 0; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Register events and seql the object. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) div.addEventListener('click', this.onClick_.bind(this)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extends cr.EventTarget. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BreadcrumbsController.prototype.__proto__ = cr.EventTarget.prototype; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Shows breadcrumbs. 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param {Entry} entry Target entry. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BreadcrumbsController.prototype.show = function(entry) { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry === this.entry_) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.entry_ = entry; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.showSequence_++; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var queue = new AsyncUtil.Queue(); 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var entries = []; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var error = false; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Obtain entries from the target entry to the root. 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch var resolveParent = function(currentEntry, previousEntry, callback) { 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch var entryLocationInfo = this.volumeManager_.getLocationInfo(currentEntry); 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!entryLocationInfo) { 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch error = true; 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback(); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (entryLocationInfo.isRootEntry && 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entryLocationInfo.rootType === 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VolumeManagerCommon.RootType.DRIVE_OTHER) { 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this.metadataCache_.getOne(previousEntry, 'external', function(result) { 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (result && result.sharedWithMe) { 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Adds the shared-with-me entry instead. 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch var driveVolumeInfo = entryLocationInfo.volumeInfo; 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch var sharedWithMeEntry = 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) driveVolumeInfo.fakeEntries[ 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME]; 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (sharedWithMeEntry) 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch entries.unshift(sharedWithMeEntry); 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch else 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch error = true; 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } else { 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch entries.unshift(currentEntry); 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Finishes traversal since the current is root. 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback(); 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }); 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch entries.unshift(currentEntry); 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!entryLocationInfo.isRootEntry) { 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch currentEntry.getParent(function(parentEntry) { 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch resolveParent(parentEntry, currentEntry, callback); 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }.bind(this), function() { 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = true; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback(); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback(); 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }.bind(this); 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch queue.run(resolveParent.bind(this, entry, null)); 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) queue.run(function(callback) { 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If an error occurred, just skip. 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (error) { 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback(); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If the path is not under the drive other root, it is not needed to 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // override root type. 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var locationInfo = this.volumeManager_.getLocationInfo(entry); 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!locationInfo) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) error = true; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback(); 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }.bind(this)); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Update DOM element. 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) queue.run(function(sequence, callback) { 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Check the sequence number to skip requests that are out of date. 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (this.showSequence_ === sequence) { 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.bc_.hidden = false; 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.bc_.textContent = ''; 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!error) 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.updateInternal_(entries); 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback(); 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }.bind(this, this.showSequence_)); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Updates the breadcrumb display. 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch * @param {Array.<Entry>} entries Entries on the target path. 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BreadcrumbsController.prototype.updateInternal_ = function(entries) { 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make elements. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var doc = this.bc_.ownerDocument; 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (var i = 0; i < entries.length; i++) { 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Add a component. 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var entry = entries[i]; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var div = doc.createElement('div'); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) div.className = 'breadcrumb-path entry-name'; 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch div.textContent = util.getEntryLabel(this.volumeManager_, entry); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) div.entry = entry; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.bc_.appendChild(div); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If this is the last component, break here. 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (i === entries.length - 1) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) div.classList.add('breadcrumb-last'); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Add a separator. 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var separator = doc.createElement('div'); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) separator.className = 'separator'; 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this.bc_.appendChild(separator); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.truncate(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Updates breadcrumbs widths in order to truncate it properly. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BreadcrumbsController.prototype.truncate = function() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.bc_.firstChild) 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume style.width == clientWidth (items have no margins or paddings). 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var item = this.bc_.firstChild; item; item = item.nextSibling) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.removeAttribute('style'); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.removeAttribute('collapsed'); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var containerWidth = this.bc_.clientWidth; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var pathWidth = 0; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var currentWidth = 0; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var lastSeparator; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var item = this.bc_.firstChild; item; item = item.nextSibling) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.className == 'separator') { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pathWidth += currentWidth; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) currentWidth = item.clientWidth; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastSeparator = item; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) currentWidth += item.clientWidth; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pathWidth + currentWidth <= containerWidth) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!lastSeparator) { 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this.bc_.lastChild.style.width = 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Math.min(currentWidth, containerWidth) + 'px'; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var lastCrumbSeparatorWidth = lastSeparator.clientWidth; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current directory name may occupy up to 70% of space or even more if the 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // path is short. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var maxPathWidth = Math.max(Math.round(containerWidth * 0.3), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containerWidth - currentWidth); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxPathWidth = Math.min(pathWidth, maxPathWidth); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var parentCrumb = lastSeparator.previousSibling; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var collapsedWidth = 0; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parentCrumb && pathWidth - maxPathWidth > parentCrumb.clientWidth) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At least one crumb is hidden completely (or almost completely). 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show sign of hidden crumbs like this: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // root > some di... > ... > current directory. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parentCrumb.setAttribute('collapsed', ''); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) collapsedWidth = Math.min(maxPathWidth, parentCrumb.clientWidth); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxPathWidth -= collapsedWidth; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parentCrumb.clientWidth != collapsedWidth) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parentCrumb.style.width = collapsedWidth + 'px'; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastSeparator = parentCrumb.previousSibling; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!lastSeparator) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) collapsedWidth += lastSeparator.clientWidth; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxPathWidth = Math.max(0, maxPathWidth - lastSeparator.clientWidth); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pathWidth = 0; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var item = this.bc_.firstChild; item != lastSeparator; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item = item.nextSibling) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(serya): Mixing access item.clientWidth and modifying style and 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attributes could cause multiple layout reflows. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pathWidth + item.clientWidth <= maxPathWidth) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pathWidth += item.clientWidth; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (pathWidth == maxPathWidth) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.style.width = '0'; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (item.classList.contains('separator')) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not truncate separator. Instead let the last crumb be longer. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.style.width = '0'; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxPathWidth = pathWidth; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Truncate the last visible crumb. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.style.width = (maxPathWidth - pathWidth) + 'px'; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pathWidth = maxPathWidth; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) currentWidth = Math.min(currentWidth, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containerWidth - pathWidth - collapsedWidth); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.bc_.lastChild.style.width = 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (currentWidth - lastCrumbSeparatorWidth) + 'px'; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hide breadcrumbs div. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BreadcrumbsController.prototype.hide = function() { 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.bc_.hidden = true; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a click event on a breadcrumb element. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} event The click event. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BreadcrumbsController.prototype.onClick_ = function(event) { 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!event.target.classList.contains('breadcrumb-path') || 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event.target.classList.contains('breadcrumb-last')) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var newEvent = new Event('pathclick'); 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) newEvent.entry = event.target.entry; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dispatchEvent(newEvent); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 268