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