| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 /** | 5 /** |
| 6 * Represents each volume, such as "drive", "download directory", each "USB | 6 * Represents each volume, such as "drive", "download directory", each "USB |
| 7 * flush storage", or "mounted zip archive" etc. | 7 * flush storage", or "mounted zip archive" etc. |
| 8 * | 8 * |
| 9 * @constructor | 9 * @constructor |
| 10 * @struct | 10 * @struct |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 * Holds VolumeInfo instances. | 348 * Holds VolumeInfo instances. |
| 349 * @type {cr.ui.ArrayDataModel} | 349 * @type {cr.ui.ArrayDataModel} |
| 350 * @private | 350 * @private |
| 351 */ | 351 */ |
| 352 this.model_ = new cr.ui.ArrayDataModel([]); | 352 this.model_ = new cr.ui.ArrayDataModel([]); |
| 353 this.model_.setCompareFunction(field, | 353 this.model_.setCompareFunction(field, |
| 354 /** @type {function(*, *): number} */ | 354 /** @type {function(*, *): number} */ |
| 355 (volumeManagerUtil.compareVolumeInfo_)); | 355 (volumeManagerUtil.compareVolumeInfo_)); |
| 356 this.model_.sort(field, 'asc'); | 356 this.model_.sort(field, 'asc'); |
| 357 | 357 |
| 358 /** @private {!Object.<string, !importer.Resolver.<!VolumeInfo>>} */ | |
| 359 this.volumeInfoResolvers_ = {}; | |
| 360 | |
| 361 Object.freeze(this); | 358 Object.freeze(this); |
| 362 } | 359 } |
| 363 | 360 |
| 364 VolumeInfoList.prototype = { | 361 VolumeInfoList.prototype = { |
| 365 get length() { return this.model_.length; } | 362 get length() { return this.model_.length; } |
| 366 }; | 363 }; |
| 367 | 364 |
| 368 /** | 365 /** |
| 369 * Adds the event listener to listen the change of volume info. | 366 * Adds the event listener to listen the change of volume info. |
| 370 * @param {string} type The name of the event. | 367 * @param {string} type The name of the event. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 387 * Adds the volumeInfo to the appropriate position. If there already exists, | 384 * Adds the volumeInfo to the appropriate position. If there already exists, |
| 388 * just replaces it. | 385 * just replaces it. |
| 389 * @param {VolumeInfo} volumeInfo The information of the new volume. | 386 * @param {VolumeInfo} volumeInfo The information of the new volume. |
| 390 */ | 387 */ |
| 391 VolumeInfoList.prototype.add = function(volumeInfo) { | 388 VolumeInfoList.prototype.add = function(volumeInfo) { |
| 392 var index = this.findIndex(volumeInfo.volumeId); | 389 var index = this.findIndex(volumeInfo.volumeId); |
| 393 if (index !== -1) | 390 if (index !== -1) |
| 394 this.model_.splice(index, 1, volumeInfo); | 391 this.model_.splice(index, 1, volumeInfo); |
| 395 else | 392 else |
| 396 this.model_.push(volumeInfo); | 393 this.model_.push(volumeInfo); |
| 397 | |
| 398 // Some folks might be expecting this volume to be initialized soon. | |
| 399 // In that case there'll be a resolver function (associated with a promise) | |
| 400 // waiting for us here. | |
| 401 var resolver = this.volumeInfoResolvers_[volumeInfo.volumeId]; | |
| 402 if (resolver) { | |
| 403 resolver.resolve(volumeInfo); | |
| 404 } | |
| 405 }; | 394 }; |
| 406 | 395 |
| 407 /** | 396 /** |
| 408 * Removes the VolumeInfo having the given ID. | 397 * Removes the VolumeInfo having the given ID. |
| 409 * @param {string} volumeId ID of the volume. | 398 * @param {string} volumeId ID of the volume. |
| 410 */ | 399 */ |
| 411 VolumeInfoList.prototype.remove = function(volumeId) { | 400 VolumeInfoList.prototype.remove = function(volumeId) { |
| 412 var index = this.findIndex(volumeId); | 401 var index = this.findIndex(volumeId); |
| 413 if (index !== -1) | 402 if (index !== -1) |
| 414 this.model_.splice(index, 1); | 403 this.model_.splice(index, 1); |
| 415 | |
| 416 // Remove any associated resolvers. | |
| 417 delete this.volumeInfoResolvers_[volumeId]; | |
| 418 }; | 404 }; |
| 419 | 405 |
| 420 /** | 406 /** |
| 421 * Obtains an index from the volume ID. | 407 * Obtains an index from the volume ID. |
| 422 * @param {string} volumeId Volume ID. | 408 * @param {string} volumeId Volume ID. |
| 423 * @return {number} Index of the volume. | 409 * @return {number} Index of the volume. |
| 424 */ | 410 */ |
| 425 VolumeInfoList.prototype.findIndex = function(volumeId) { | 411 VolumeInfoList.prototype.findIndex = function(volumeId) { |
| 426 for (var i = 0; i < this.model_.length; i++) { | 412 for (var i = 0; i < this.model_.length; i++) { |
| 427 if (this.model_.item(i).volumeId === volumeId) | 413 if (this.model_.item(i).volumeId === volumeId) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 | 470 |
| 485 /** | 471 /** |
| 486 * Returns a promise that will be resolved when volume info, identified | 472 * Returns a promise that will be resolved when volume info, identified |
| 487 * by {@code volumeId} is created. | 473 * by {@code volumeId} is created. |
| 488 * | 474 * |
| 489 * @param {string} volumeId | 475 * @param {string} volumeId |
| 490 * @return {!Promise.<!VolumeInfo>} The VolumeInfo. Will not resolve | 476 * @return {!Promise.<!VolumeInfo>} The VolumeInfo. Will not resolve |
| 491 * if the volume is never mounted. | 477 * if the volume is never mounted. |
| 492 */ | 478 */ |
| 493 VolumeInfoList.prototype.whenVolumeInfoReady = function(volumeId) { | 479 VolumeInfoList.prototype.whenVolumeInfoReady = function(volumeId) { |
| 494 var info = this.findByVolumeId_(volumeId); | 480 return new Promise(function(fulfill) { |
| 495 if (!!info) { | 481 var handler = function() { |
| 496 return Promise.resolve(info); | 482 var info = this.findByVolumeId_(volumeId); |
| 497 } | 483 if (info) { |
| 498 | 484 fulfill(info); |
| 499 var resolver = this.volumeInfoResolvers_[volumeId]; | 485 this.model_.removeEventListener('splice', handler); |
| 500 if (!resolver) { | 486 } |
| 501 resolver = new importer.Resolver(); | 487 }.bind(this); |
| 502 this.volumeInfoResolvers_[volumeId] = resolver; | 488 this.model_.addEventListener('splice', handler); |
| 503 } | 489 handler(); |
| 504 | 490 }.bind(this)); |
| 505 return resolver.promise; | |
| 506 }; | 491 }; |
| 507 | 492 |
| 508 /** | 493 /** |
| 509 * @param {number} index The index of the volume in the list. | 494 * @param {number} index The index of the volume in the list. |
| 510 * @return {!VolumeInfo} The VolumeInfo instance. | 495 * @return {!VolumeInfo} The VolumeInfo instance. |
| 511 */ | 496 */ |
| 512 VolumeInfoList.prototype.item = function(index) { | 497 VolumeInfoList.prototype.item = function(index) { |
| 513 return /** @type {!VolumeInfo} */ (this.model_.item(index)); | 498 return /** @type {!VolumeInfo} */ (this.model_.item(index)); |
| 514 }; | 499 }; |
| 515 | 500 |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 this.isDriveBased; | 1028 this.isDriveBased; |
| 1044 | 1029 |
| 1045 /** | 1030 /** |
| 1046 * Whether the entry is read only or not. | 1031 * Whether the entry is read only or not. |
| 1047 * @type {boolean} | 1032 * @type {boolean} |
| 1048 */ | 1033 */ |
| 1049 this.isReadOnly = isReadOnly; | 1034 this.isReadOnly = isReadOnly; |
| 1050 | 1035 |
| 1051 Object.freeze(this); | 1036 Object.freeze(this); |
| 1052 } | 1037 } |
| OLD | NEW |