OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 'use strict'; | 4 'use strict'; |
5 | 5 |
6 /** | 6 /** |
7 * Mock of chrome.runtime. | 7 * Mock of chrome.runtime. |
8 * @type {Object} | 8 * @type {Object} |
9 * @const | 9 * @const |
10 */ | 10 */ |
(...skipping 23 matching lines...) Expand all Loading... |
34 */ | 34 */ |
35 chrome.fileBrowserPrivate = { | 35 chrome.fileBrowserPrivate = { |
36 onCopyProgress: { | 36 onCopyProgress: { |
37 addListener: function(callback) { | 37 addListener: function(callback) { |
38 chrome.fileBrowserPrivate.onCopyProgress.listener_ = callback; | 38 chrome.fileBrowserPrivate.onCopyProgress.listener_ = callback; |
39 }, | 39 }, |
40 removeListener: function() { | 40 removeListener: function() { |
41 chrome.fileBrowserPrivate.onCopyProgress.listener_ = null; | 41 chrome.fileBrowserPrivate.onCopyProgress.listener_ = null; |
42 }, | 42 }, |
43 listener_: null | 43 listener_: null |
44 }, | |
45 startCopy: function(source, destination, newName, callback) { | |
46 var id = 1; | |
47 var events = [ | |
48 'begin_copy_entry', | |
49 'progress', | |
50 'end_copy_entry', | |
51 'success' | |
52 ].map(function(type) { | |
53 return [id, {type: type, sourceUrl: source, destinationUrl: destination}]; | |
54 }); | |
55 var sendEvent = function(index) { | |
56 // Call the function asynchronously. | |
57 return Promise.resolve().then(function() { | |
58 chrome.fileBrowserPrivate.onCopyProgress.listener_.apply( | |
59 null, events[index]); | |
60 if (index + 1 < events.length) | |
61 return sendEvent(index + 1); | |
62 else | |
63 return null; | |
64 }.bind(this)); | |
65 }.bind(this); | |
66 callback(id); | |
67 sendEvent(0).catch(function(error) { | |
68 console.log(error.stack || error); | |
69 window.onerror(); | |
70 }); | |
71 } | 44 } |
72 }; | 45 }; |
73 | 46 |
74 /** | 47 /** |
75 * Reports the result of promise to the test system. | 48 * Reports the result of promise to the test system. |
76 * @param {Promise} promise Promise to be fulfilled or rejected. | 49 * @param {Promise} promise Promise to be fulfilled or rejected. |
77 * @param {function(boolean:hasError)} callback Callback to be passed true on | 50 * @param {function(boolean:hasError)} callback Callback to be passed true on |
78 * error. | 51 * error. |
79 */ | 52 */ |
80 function reportPromise(promise, callback) { | 53 function reportPromise(promise, callback) { |
81 promise.then( | 54 promise.then( |
82 callback.bind(null, false), | 55 callback.bind(null, false), |
83 function(error) { | 56 function(error) { |
84 if (error instanceof FileOperationManager.Error) { | 57 if (error instanceof FileOperationManager.Error) { |
85 console.log('FileOperationManager.Error: code=' + error.code); | 58 console.error('FileOperationManager.Error: code=' + error.code); |
86 } else { | 59 } else { |
87 console.log(error.stack || error.name || error); | 60 console.error(error.stack || error.name || error); |
88 } | 61 } |
89 callback(true); | 62 callback(true); |
90 }); | 63 }); |
91 } | 64 } |
92 | 65 |
93 /** | 66 /** |
| 67 * Size of directory. |
| 68 * @type {number} |
| 69 * @const |
| 70 */ |
| 71 var DIRECTORY_SIZE = -1; |
| 72 |
| 73 /** |
| 74 * Creates test file system. |
| 75 * @param {string} id File system ID. |
| 76 * @param {Object.<string, number>} entries Map of entries' paths and their |
| 77 * size. If the size is equals to DIRECTORY_SIZE, the entry is derectory. |
| 78 */ |
| 79 function createTestFileSystem(id, entries) { |
| 80 var fileSystem = new TestFileSystem(id); |
| 81 for (var path in entries) { |
| 82 if (entries[path] === DIRECTORY_SIZE) { |
| 83 fileSystem.entries[path] = new MockDirectoryEntry(fileSystem, path); |
| 84 } else { |
| 85 fileSystem.entries[path] = |
| 86 new MockFileEntry(fileSystem, path, {size: entries[path]}); |
| 87 } |
| 88 } |
| 89 return fileSystem; |
| 90 } |
| 91 |
| 92 /** |
| 93 * Resolves URL on the file system. |
| 94 * @param {FakeFileSystem} fileSystem Fake file system. |
| 95 * @param {string} url URL. |
| 96 * @param {function(MockEntry)} success Success callback. |
| 97 * @param {function()} failure Failure callback. |
| 98 */ |
| 99 function resolveTestFileSystemURL(fileSystem, url, success, failure) { |
| 100 for (var name in fileSystem.entries) { |
| 101 var entry = fileSystem.entries[name]; |
| 102 if (entry.toURL() == url) { |
| 103 success(entry); |
| 104 return; |
| 105 } |
| 106 } |
| 107 failure(); |
| 108 } |
| 109 |
| 110 /** |
| 111 * Waits for events until 'success'. |
| 112 * @param {FileOperationManager} fileOperationManager File operation manager. |
| 113 * @return {Promise} Promise to be fulfilled with an event list. |
| 114 */ |
| 115 function waitForEvents(fileOperationManager) { |
| 116 return new Promise(function(fulfill) { |
| 117 var events = []; |
| 118 fileOperationManager.addEventListener('copy-progress', function(event) { |
| 119 events.push(event); |
| 120 if (event.reason === 'SUCCESS') |
| 121 fulfill(events); |
| 122 }); |
| 123 fileOperationManager.addEventListener('entry-changed', function(event) { |
| 124 events.push(event); |
| 125 }); |
| 126 fileOperationManager.addEventListener('delete', function(event) { |
| 127 events.push(event); |
| 128 if (event.reason === 'SUCCESS') |
| 129 fulfill(events); |
| 130 }); |
| 131 }); |
| 132 } |
| 133 |
| 134 /** |
94 * Test target. | 135 * Test target. |
95 * @type {FileOperationManager} | 136 * @type {FileOperationManager} |
96 */ | 137 */ |
97 var fileOperationManager; | 138 var fileOperationManager; |
98 | 139 |
99 /** | 140 /** |
100 * Initializes the test environment. | 141 * Initializes the test environment. |
101 */ | 142 */ |
102 function setUp() { | 143 function setUp() { |
103 fileOperationManager = new FileOperationManager(); | 144 fileOperationManager = new FileOperationManager(); |
104 } | 145 } |
105 | 146 |
106 /** | 147 /** |
107 * Tests the fileOperationUtil.resolvePath function. | 148 * Tests the fileOperationUtil.resolvePath function. |
108 * @param {function(boolean:hasError)} callback Callback to be passed true on | 149 * @param {function(boolean:hasError)} callback Callback to be passed true on |
109 * error. | 150 * error. |
110 */ | 151 */ |
111 function testResolvePath(callback) { | 152 function testResolvePath(callback) { |
112 var fileEntry = new MockFileEntry('testVolume', '/file', {}); | 153 var fileSystem = createTestFileSystem('testVolume', { |
113 var directoryEntry = new MockDirectoryEntry('testVolume', '/directory', {}); | 154 '/': DIRECTORY_SIZE, |
114 var root = new MockDirectoryEntry('testVolume', '/', { | 155 '/file': 10, |
115 '/file': fileEntry, | 156 '/directory': DIRECTORY_SIZE |
116 '/directory': directoryEntry | |
117 }); | 157 }); |
| 158 var root = fileSystem.root; |
118 var rootPromise = fileOperationUtil.resolvePath(root, '/'); | 159 var rootPromise = fileOperationUtil.resolvePath(root, '/'); |
119 var filePromise = fileOperationUtil.resolvePath(root, '/file'); | 160 var filePromise = fileOperationUtil.resolvePath(root, '/file'); |
120 var directoryPromise = fileOperationUtil.resolvePath(root, '/directory'); | 161 var directoryPromise = fileOperationUtil.resolvePath(root, '/directory'); |
121 var errorPromise = fileOperationUtil.resolvePath(root, '/not_found').then( | 162 var errorPromise = fileOperationUtil.resolvePath(root, '/not_found').then( |
122 function() { | 163 function() { assertTrue(false, 'The NOT_FOUND error is not reported.'); }, |
123 assertTrue(false, 'The NOT_FOUND error is not reported.'); | 164 function(error) { return error.name; }); |
124 }, | |
125 function(error) { | |
126 assertEquals('NotFoundError', error.name); | |
127 }); | |
128 reportPromise(Promise.all([ | 165 reportPromise(Promise.all([ |
129 rootPromise, | 166 rootPromise, |
130 filePromise, | 167 filePromise, |
131 directoryPromise, | 168 directoryPromise, |
132 errorPromise | 169 errorPromise |
133 ]).then(function(results) { | 170 ]).then(function(results) { |
134 assertArrayEquals([ | 171 assertArrayEquals([ |
135 root, | 172 fileSystem.entries['/'], |
136 fileEntry, | 173 fileSystem.entries['/file'], |
137 directoryEntry, | 174 fileSystem.entries['/directory'], |
138 undefined | 175 'NotFoundError' |
139 ], results); | 176 ], results); |
140 }), callback); | 177 }), callback); |
141 } | 178 } |
142 | 179 |
143 /** | 180 /** |
144 * Tests the fileOperationUtil.deduplicatePath | 181 * Tests the fileOperationUtil.deduplicatePath |
145 * @param {function(boolean:hasError)} callback Callback to be passed true on | 182 * @param {function(boolean:hasError)} callback Callback to be passed true on |
146 * error. | 183 * error. |
147 */ | 184 */ |
148 function testDeduplicatePath(callback) { | 185 function testDeduplicatePath(callback) { |
149 var directoryEntry1 = new MockDirectoryEntry('testVolume', '/directory', {}); | 186 var fileSystem1 = createTestFileSystem('testVolume', {'/': DIRECTORY_SIZE}); |
150 var directoryEntry2 = new MockDirectoryEntry( | 187 var fileSystem2 = createTestFileSystem('testVolume', { |
151 'testVolume', | 188 '/': DIRECTORY_SIZE, |
152 '/directory', | 189 '/file.txt': 10 |
153 {'file.txt': new MockFileEntry('testVolume', '/file.txt', {})}); | 190 }); |
154 var directoryEntry3 = new MockDirectoryEntry( | 191 var fileSystem3 = createTestFileSystem('testVolume', { |
155 'testVolume', | 192 '/': DIRECTORY_SIZE, |
156 '/directory', | 193 '/file.txt': 10, |
157 { | 194 '/file (1).txt': 10, |
158 'file.txt': new MockFileEntry('testVolume', '/file.txt', {}), | 195 '/file (2).txt': 10, |
159 'file (1).txt': new MockFileEntry('testVolume', '/file (1).txt', {}), | 196 '/file (3).txt': 10, |
160 'file (2).txt': new MockFileEntry('testVolume', '/file (2).txt', {}), | 197 '/file (4).txt': 10, |
161 'file (3).txt': new MockFileEntry('testVolume', '/file (3).txt', {}), | 198 '/file (5).txt': 10, |
162 'file (4).txt': new MockFileEntry('testVolume', '/file (4).txt', {}), | 199 '/file (6).txt': 10, |
163 'file (5).txt': new MockFileEntry('testVolume', '/file (5).txt', {}), | 200 '/file (7).txt': 10, |
164 'file (6).txt': new MockFileEntry('testVolume', '/file (6).txt', {}), | 201 '/file (8).txt': 10, |
165 'file (7).txt': new MockFileEntry('testVolume', '/file (7).txt', {}), | 202 '/file (9).txt': 10, |
166 'file (8).txt': new MockFileEntry('testVolume', '/file (8).txt', {}), | 203 }); |
167 'file (9).txt': new MockFileEntry('testVolume', '/file (9).txt', {}) | |
168 }); | |
169 | 204 |
170 var nonExistingPromise = | 205 var nonExistingPromise = |
171 fileOperationUtil.deduplicatePath(directoryEntry1, 'file.txt'). | 206 fileOperationUtil.deduplicatePath(fileSystem1.root, 'file.txt'). |
172 then(function(path) { | 207 then(function(path) { |
173 assertEquals('file.txt', path); | 208 assertEquals('file.txt', path); |
174 }); | 209 }); |
175 var existingPathPromise = | 210 var existingPathPromise = |
176 fileOperationUtil.deduplicatePath(directoryEntry2, 'file.txt'). | 211 fileOperationUtil.deduplicatePath(fileSystem2.root, 'file.txt'). |
177 then(function(path) { | 212 then(function(path) { |
178 assertEquals('file (1).txt', path); | 213 assertEquals('file (1).txt', path); |
179 }); | 214 }); |
180 var failedPromise = | 215 var failedPromise = |
181 fileOperationUtil.deduplicatePath(directoryEntry3, 'file.txt'). | 216 fileOperationUtil.deduplicatePath(fileSystem3.root, 'file.txt'). |
182 then(function() { | 217 then(function() { |
183 assertTrue(false, 'FileOperationManager.Error is not reported.'); | 218 assertTrue(false, 'FileOperationManager.Error is not reported.'); |
184 }, function(error) { | 219 }, function(error) { |
185 assertTrue(error instanceof FileOperationManager.Error); | 220 assertTrue(error instanceof FileOperationManager.Error); |
186 assertEquals(util.FileOperationErrorType.TARGET_EXISTS, error.code); | 221 assertEquals(util.FileOperationErrorType.TARGET_EXISTS, error.code); |
187 }); | 222 }); |
188 | 223 |
189 var testPromise = Promise.all([ | 224 var testPromise = Promise.all([ |
190 nonExistingPromise, | 225 nonExistingPromise, |
191 existingPathPromise, | 226 existingPathPromise, |
192 failedPromise | 227 failedPromise |
193 ]); | 228 ]); |
194 reportPromise(testPromise, callback); | 229 reportPromise(testPromise, callback); |
195 } | 230 } |
196 | 231 |
197 /** | 232 /** |
198 * Tests the fileOperationUtil.paste. | 233 * Tests the fileOperationUtil.paste. |
| 234 * @param {function(boolean:hasError)} callback Callback to be passed true on |
| 235 * error. |
199 */ | 236 */ |
200 function testCopy(callback) { | 237 function testCopy(callback) { |
201 // Prepare entries and their resolver. | 238 // Prepare entries and their resolver. |
202 var sourceEntries = | 239 var fileSystem = createTestFileSystem('testVolume', { |
203 [new MockFileEntry('testVolume', '/test.txt', {size: 10})]; | 240 '/': DIRECTORY_SIZE, |
204 var targetEntry = new MockDirectoryEntry('testVolume', '/', {}); | 241 '/test.txt': 10, |
205 window.webkitResolveLocalFileSystemURL = function(url, success, failure) { | 242 }); |
206 if (url === sourceEntries[0].toURL()) | 243 window.webkitResolveLocalFileSystemURL = |
207 success(sourceEntries[0]); | 244 resolveTestFileSystemURL.bind(null, fileSystem); |
208 else if (url === targetEntry.toURL()) | 245 |
209 success(targetEntry); | 246 chrome.fileBrowserPrivate.startCopy = |
210 else | 247 function(source, destination, newName, callback) { |
211 failure(); | 248 var makeStatus = function(type) { |
212 }; | 249 return {type: type, sourceUrl: source, destinationUrl: destination}; |
| 250 }; |
| 251 callback(1); |
| 252 var listener = chrome.fileBrowserPrivate.onCopyProgress.listener_; |
| 253 listener(1, makeStatus('begin_copy_entry')); |
| 254 listener(1, makeStatus('progress')); |
| 255 var newPath = joinPath('/', newName); |
| 256 fileSystem.entries[newPath] = |
| 257 fileSystem.entries['/test.txt'].clone(newPath); |
| 258 listener(1, makeStatus('end_copy_entry')); |
| 259 listener(1, makeStatus('success')); |
| 260 }; |
213 | 261 |
214 // Observing manager's events. | 262 // Observing manager's events. |
215 var eventsPromise = new Promise(function(fulfill) { | 263 var eventsPromise = waitForEvents(fileOperationManager); |
216 var events = []; | |
217 fileOperationManager.addEventListener('copy-progress', function(event) { | |
218 events.push(event); | |
219 if (event.reason === 'SUCCESS') | |
220 fulfill(events); | |
221 }); | |
222 fileOperationManager.addEventListener('entry-changed', function(event) { | |
223 events.push(event); | |
224 }); | |
225 }); | |
226 | 264 |
227 // Verify the events. | 265 // Verify the events. |
228 reportPromise(eventsPromise.then(function(events) { | 266 reportPromise(eventsPromise.then(function(events) { |
229 var firstEvent = events[0]; | 267 var firstEvent = events[0]; |
230 assertEquals('BEGIN', firstEvent.reason); | 268 assertEquals('BEGIN', firstEvent.reason); |
231 assertEquals(1, firstEvent.status.numRemainingItems); | 269 assertEquals(1, firstEvent.status.numRemainingItems); |
232 assertEquals(0, firstEvent.status.processedBytes); | 270 assertEquals(0, firstEvent.status.processedBytes); |
233 assertEquals(1, firstEvent.status.totalBytes); | 271 assertEquals(1, firstEvent.status.totalBytes); |
234 | 272 |
235 var lastEvent = events[events.length - 1]; | 273 var lastEvent = events[events.length - 1]; |
236 assertEquals('SUCCESS', lastEvent.reason); | 274 assertEquals('SUCCESS', lastEvent.reason); |
237 assertEquals(0, lastEvent.status.numRemainingItems); | 275 assertEquals(0, lastEvent.status.numRemainingItems); |
238 assertEquals(10, lastEvent.status.processedBytes); | 276 assertEquals(10, lastEvent.status.processedBytes); |
239 assertEquals(10, lastEvent.status.totalBytes); | 277 assertEquals(10, lastEvent.status.totalBytes); |
| 278 |
| 279 assertTrue(events.some(function(event) { |
| 280 return event.type === 'entry-changed' && |
| 281 event.kind === util.EntryChangedKind.CREATED && |
| 282 event.entry.fullPath === '/test (1).txt'; |
| 283 })); |
| 284 |
| 285 assertFalse(events.some(function(event) { |
| 286 return event.type === 'delete'; |
| 287 })); |
240 }), callback); | 288 }), callback); |
241 | 289 |
242 fileOperationManager.paste(sourceEntries, targetEntry, false); | 290 fileOperationManager.paste( |
| 291 [fileSystem.entries['/test.txt']], |
| 292 fileSystem.entries['/'], |
| 293 false); |
243 } | 294 } |
| 295 |
| 296 /** |
| 297 * Tests the fileOperationUtil.paste for move. |
| 298 * @param {function(boolean:hasError)} callback Callback to be passed true on |
| 299 * error. |
| 300 */ |
| 301 function testMove(callback) { |
| 302 // Prepare entries and their resolver. |
| 303 var fileSystem = createTestFileSystem('testVolume', { |
| 304 '/': DIRECTORY_SIZE, |
| 305 '/directory': DIRECTORY_SIZE, |
| 306 '/test.txt': 10, |
| 307 }); |
| 308 window.webkitResolveLocalFileSystemURL = |
| 309 resolveTestFileSystemURL.bind(null, fileSystem); |
| 310 |
| 311 // Observing manager's events. |
| 312 var eventsPromise = waitForEvents(fileOperationManager); |
| 313 |
| 314 // Verify the events. |
| 315 reportPromise(eventsPromise.then(function(events) { |
| 316 var firstEvent = events[0]; |
| 317 assertEquals('BEGIN', firstEvent.reason); |
| 318 assertEquals(1, firstEvent.status.numRemainingItems); |
| 319 assertEquals(0, firstEvent.status.processedBytes); |
| 320 assertEquals(1, firstEvent.status.totalBytes); |
| 321 |
| 322 var lastEvent = events[events.length - 1]; |
| 323 assertEquals('SUCCESS', lastEvent.reason); |
| 324 assertEquals(0, lastEvent.status.numRemainingItems); |
| 325 assertEquals(1, lastEvent.status.processedBytes); |
| 326 assertEquals(1, lastEvent.status.totalBytes); |
| 327 |
| 328 assertTrue(events.some(function(event) { |
| 329 return event.type === 'entry-changed' && |
| 330 event.kind === util.EntryChangedKind.DELETED && |
| 331 event.entry.fullPath === '/test.txt'; |
| 332 })); |
| 333 |
| 334 assertTrue(events.some(function(event) { |
| 335 return event.type === 'entry-changed' && |
| 336 event.kind === util.EntryChangedKind.CREATED && |
| 337 event.entry.fullPath === '/directory/test.txt'; |
| 338 })); |
| 339 |
| 340 assertFalse(events.some(function(event) { |
| 341 return event.type === 'delete'; |
| 342 })); |
| 343 }), callback); |
| 344 |
| 345 fileOperationManager.paste( |
| 346 [fileSystem.entries['/test.txt']], |
| 347 fileSystem.entries['/directory'], |
| 348 true); |
| 349 } |
| 350 |
| 351 /** |
| 352 * Tests the fileOperationUtil.deleteEntries. |
| 353 * @param {function(boolean:hasError)} callback Callback to be passed true on |
| 354 * error. |
| 355 */ |
| 356 function testDelete(callback) { |
| 357 // Prepare entries and their resolver. |
| 358 var fileSystem = createTestFileSystem('testVolume', { |
| 359 '/': DIRECTORY_SIZE, |
| 360 '/test.txt': 10, |
| 361 }); |
| 362 window.webkitResolveLocalFileSystemURL = |
| 363 resolveTestFileSystemURL.bind(null, fileSystem); |
| 364 |
| 365 // Observing manager's events. |
| 366 reportPromise(waitForEvents(fileOperationManager).then(function(events) { |
| 367 assertEquals('delete', events[0].type); |
| 368 assertEquals('BEGIN', events[0].reason); |
| 369 assertEquals(10, events[0].totalBytes); |
| 370 assertEquals(0, events[0].processedBytes); |
| 371 |
| 372 var lastEvent = events[events.length - 1]; |
| 373 assertEquals('delete', lastEvent.type); |
| 374 assertEquals('SUCCESS', lastEvent.reason); |
| 375 assertEquals(10, lastEvent.totalBytes); |
| 376 assertEquals(10, lastEvent.processedBytes); |
| 377 |
| 378 assertFalse(events.some(function(event) { |
| 379 return event.type === 'copy-progress'; |
| 380 })); |
| 381 }), callback); |
| 382 |
| 383 fileOperationManager.deleteEntries([fileSystem.entries['/test.txt']]); |
| 384 } |
| 385 |
| 386 /** |
| 387 * Tests the fileOperationUtil.zipSelection. |
| 388 * @param {function(boolean:hasError)} callback Callback to be passed true on |
| 389 * error. |
| 390 */ |
| 391 function testZip(callback) { |
| 392 // Prepare entries and their resolver. |
| 393 var fileSystem = createTestFileSystem('testVolume', { |
| 394 '/': DIRECTORY_SIZE, |
| 395 '/test.txt': 10, |
| 396 }); |
| 397 window.webkitResolveLocalFileSystemURL = |
| 398 resolveTestFileSystemURL.bind(null, fileSystem); |
| 399 chrome.fileBrowserPrivate.zipSelection = |
| 400 function(parentURL, sources, newName, success, error) { |
| 401 var newPath = joinPath('/', newName); |
| 402 var newEntry = new MockFileEntry(fileSystem, newPath, {size: 10}); |
| 403 fileSystem.entries[newPath] = newEntry; |
| 404 success(newEntry); |
| 405 }; |
| 406 |
| 407 // Observing manager's events. |
| 408 reportPromise(waitForEvents(fileOperationManager).then(function(events) { |
| 409 assertEquals('copy-progress', events[0].type); |
| 410 assertEquals('BEGIN', events[0].reason); |
| 411 assertEquals(1, events[0].status.totalBytes); |
| 412 assertEquals(0, events[0].status.processedBytes); |
| 413 |
| 414 var lastEvent = events[events.length - 1]; |
| 415 assertEquals('copy-progress', lastEvent.type); |
| 416 assertEquals('SUCCESS', lastEvent.reason); |
| 417 assertEquals(10, lastEvent.status.totalBytes); |
| 418 assertEquals(10, lastEvent.status.processedBytes); |
| 419 |
| 420 assertFalse(events.some(function(event) { |
| 421 return event.type === 'delete'; |
| 422 })); |
| 423 |
| 424 assertTrue(events.some(function(event) { |
| 425 return event.type === 'entry-changed' && |
| 426 event.entry.fullPath === '/test.zip'; |
| 427 })); |
| 428 }), callback); |
| 429 |
| 430 fileOperationManager.zipSelection( |
| 431 fileSystem.entries['/'], |
| 432 [fileSystem.entries['/test.txt']]); |
| 433 } |
OLD | NEW |