Chromium Code Reviews| 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 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Represents each volume, such as "drive", "download directory", each "USB | 8 * Represents each volume, such as "drive", "download directory", each "USB |
| 9 * flush storage", or "mounted zip archive" etc. | 9 * flush storage", or "mounted zip archive" etc. |
| 10 * | 10 * |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 root, | 28 root, |
| 29 error, | 29 error, |
| 30 deviceType, | 30 deviceType, |
| 31 isReadOnly, | 31 isReadOnly, |
| 32 profile) { | 32 profile) { |
| 33 this.volumeType = volumeType; | 33 this.volumeType = volumeType; |
| 34 // TODO(hidehiko): This should include FileSystem instance. | 34 // TODO(hidehiko): This should include FileSystem instance. |
| 35 this.mountPath = mountPath; | 35 this.mountPath = mountPath; |
| 36 this.volumeId = volumeId; | 36 this.volumeId = volumeId; |
| 37 this.root = root; | 37 this.root = root; |
| 38 this.displayRoot = null; | |
| 38 this.fakeEntries = {}; | 39 this.fakeEntries = {}; |
| 40 this.resolveQueue_ = new AsyncUtil.Queue(); | |
| 39 | 41 |
| 40 if (volumeType === util.VolumeType.DRIVE) { | 42 if (volumeType === util.VolumeType.DRIVE) { |
| 41 this.fakeEntries[RootType.DRIVE] = { | |
| 42 fullPath: RootDirectory.DRIVE + '/' + DriveSubRootDirectory.ROOT, | |
| 43 isDirectory: true, | |
| 44 rootType: RootType.DRIVE, | |
| 45 label: PathUtil.getRootLabel(RootType.DRIVE), | |
| 46 toURL: function() { return 'fake-entry://' + this.fullPath; } | |
| 47 }; | |
| 48 this.fakeEntries[RootType.DRIVE_OFFLINE] = { | 43 this.fakeEntries[RootType.DRIVE_OFFLINE] = { |
| 49 fullPath: RootDirectory.DRIVE_OFFLINE, | 44 fullPath: RootDirectory.DRIVE_OFFLINE, |
| 50 isDirectory: true, | 45 isDirectory: true, |
| 51 rootType: RootType.DRIVE_OFFLINE, | 46 rootType: RootType.DRIVE_OFFLINE, |
| 52 label: PathUtil.getRootLabel(RootType.DRIVE_OFFLINE), | |
| 53 toURL: function() { return 'fake-entry://' + this.fullPath; } | 47 toURL: function() { return 'fake-entry://' + this.fullPath; } |
| 54 }; | 48 }; |
| 55 this.fakeEntries[RootType.DRIVE_SHARED_WITH_ME] = { | 49 this.fakeEntries[RootType.DRIVE_SHARED_WITH_ME] = { |
| 56 fullPath: RootDirectory.DRIVE_SHARED_WITH_ME, | 50 fullPath: RootDirectory.DRIVE_SHARED_WITH_ME, |
| 57 isDirectory: true, | 51 isDirectory: true, |
| 58 rootType: RootType.DRIVE_SHARED_WITH_ME, | 52 rootType: RootType.DRIVE_SHARED_WITH_ME, |
| 59 label: PathUtil.getRootLabel(RootType.DRIVE_SHARED_WITH_ME), | |
| 60 toURL: function() { return 'fake-entry://' + this.fullPath; } | 53 toURL: function() { return 'fake-entry://' + this.fullPath; } |
| 61 }; | 54 }; |
| 62 this.fakeEntries[RootType.DRIVE_RECENT] = { | 55 this.fakeEntries[RootType.DRIVE_RECENT] = { |
| 63 fullPath: RootDirectory.DRIVE_RECENT, | 56 fullPath: RootDirectory.DRIVE_RECENT, |
| 64 isDirectory: true, | 57 isDirectory: true, |
| 65 rootType: RootType.DRIVE_RECENT, | 58 rootType: RootType.DRIVE_RECENT, |
| 66 label: PathUtil.getRootLabel(RootType.DRIVE_RECENT), | |
| 67 toURL: function() { return 'fake-entry://' + this.fullPath; } | 59 toURL: function() { return 'fake-entry://' + this.fullPath; } |
| 68 }; | 60 }; |
| 69 } | 61 } |
| 70 | 62 |
| 71 // Note: This represents if the mounting of the volume is successfully done | 63 // Note: This represents if the mounting of the volume is successfully done |
| 72 // or not. (If error is empty string, the mount is successfully done). | 64 // or not. (If error is empty string, the mount is successfully done). |
| 73 // TODO(hidehiko): Rename to make this more understandable. | 65 // TODO(hidehiko): Rename to make this more understandable. |
| 74 this.error = error; | 66 this.error = error; |
| 75 this.deviceType = deviceType; | 67 this.deviceType = deviceType; |
| 76 this.isReadOnly = isReadOnly; | 68 this.isReadOnly = isReadOnly; |
| 77 this.profile = Object.freeze(profile); | 69 this.profile = Object.freeze(profile); |
| 78 | 70 |
| 79 // VolumeInfo is immutable. | 71 Object.seal(this); |
|
yoshiki
2014/01/15 07:33:13
Since you're changing this class into non-immutabl
mtomasz
2014/01/16 01:31:58
Done.
| |
| 80 Object.freeze(this); | |
| 81 } | 72 } |
| 82 | 73 |
| 83 /** | 74 /** |
| 84 * Obtains a URL of the display root directory that users can see as a root. | 75 * Obtains a URL of the display root directory that users can see as a root. |
| 85 * @return {string} URL of root entry. | 76 * @return {string} URL of root entry. |
| 77 * @private | |
| 86 */ | 78 */ |
| 87 VolumeInfo.prototype.getDisplayRootDirectoryURL = function() { | 79 VolumeInfo.prototype.getDisplayRootURL_ = function() { |
| 88 return this.root.toURL() + | 80 return this.root.toURL() + |
|
yoshiki
2014/01/15 07:33:13
I'm not sure but this.root seems null-able, so ple
mtomasz
2014/01/16 01:31:58
In general I think we should not have a volumeInfo
yoshiki
2014/01/17 01:57:52
Ok. Got it.
| |
| 89 (this.volumeType === util.VolumeType.DRIVE ? '/root' : ''); | 81 (this.volumeType === util.VolumeType.DRIVE ? '/root' : ''); |
| 90 }; | 82 }; |
| 91 | 83 |
| 92 /** | 84 /** |
| 85 * Obtains the display root of the entry. It may take long time for Drive. Once | |
| 86 * resolved, it is cached. | |
| 87 * | |
| 88 * @param {function(DirectoryEntry)} onSuccess Success callback with the display | |
| 89 * root directory as an argument. | |
| 90 * @param {function(FileError)} onFailure Failure callback. | |
| 91 */ | |
| 92 VolumeInfo.prototype.resolveDisplayRoot = function(onSuccess, onFailure) { | |
|
yoshiki
2014/01/15 07:33:13
When on non-drive, can't we just use this.root?
mtomasz
2014/01/16 01:31:58
Done.
| |
| 93 this.resolveQueue_.run(function(callback) { | |
| 94 if (this.displayRoot) { | |
| 95 onSuccess(this.displayRoot); | |
| 96 callback(); | |
| 97 return; | |
| 98 } | |
| 99 webkitResolveLocalFileSystemURL( | |
| 100 this.getDisplayRootURL_(), function(directoryEntry) { | |
| 101 console.log('found', directoryEntry); | |
|
yoshiki
2014/01/15 07:33:13
nit: remove
mtomasz
2014/01/16 01:31:58
Done.
| |
| 102 this.displayRoot = directoryEntry; | |
| 103 onSuccess(directoryEntry); | |
| 104 callback(); | |
| 105 }.bind(this), function(fileError) { | |
| 106 console.log('not found', fileError); | |
|
yoshiki
2014/01/15 07:33:13
ditto
mtomasz
2014/01/16 01:31:58
Done.
| |
| 107 onFailure(fileError); | |
| 108 callback(); | |
| 109 }.bind(this)); | |
| 110 }.bind(this)); | |
| 111 }; | |
| 112 | |
| 113 /** | |
| 93 * Obtains volume label. | 114 * Obtains volume label. |
| 94 * @return {string} Label for the volume. | 115 * @return {string} Label for the volume. |
| 95 */ | 116 */ |
| 96 VolumeInfo.prototype.getLabel = function() { | 117 VolumeInfo.prototype.getLabel = function() { |
| 97 if (this.volumeType === util.VolumeType.DRIVE) | 118 if (this.volumeType === util.VolumeType.DRIVE) |
| 98 return str('DRIVE_DIRECTORY_LABEL'); | 119 return str('DRIVE_DIRECTORY_LABEL'); |
| 99 else | 120 else |
| 100 return PathUtil.getFolderLabel(this.mountPath); | 121 return PathUtil.getFolderLabel(this.mountPath); |
| 101 }; | 122 }; |
| 102 | 123 |
| (...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 848 this.isDriveBased; | 869 this.isDriveBased; |
| 849 | 870 |
| 850 /** | 871 /** |
| 851 * Whether the entry is read only or not. | 872 * Whether the entry is read only or not. |
| 852 * @type {boolean} | 873 * @type {boolean} |
| 853 */ | 874 */ |
| 854 this.isReadOnly = isReadOnly; | 875 this.isReadOnly = isReadOnly; |
| 855 | 876 |
| 856 Object.freeze(this); | 877 Object.freeze(this); |
| 857 } | 878 } |
| OLD | NEW |