Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: chrome/browser/resources/file_manager/foreground/js/directory_contents.js

Issue 113293007: [Files.app] Change sort timing during metadata fetch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 * Scanner of the entries. 8 * Scanner of the entries.
9 * @constructor 9 * @constructor
10 */ 10 */
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 this.fileList_ = context.fileList; 451 this.fileList_ = context.fileList;
452 452
453 this.isSearch_ = isSearch; 453 this.isSearch_ = isSearch;
454 this.directoryEntry_ = directoryEntry; 454 this.directoryEntry_ = directoryEntry;
455 this.lastNonSearchDirectoryEntry_ = lastNonSearchDirectoryEntry; 455 this.lastNonSearchDirectoryEntry_ = lastNonSearchDirectoryEntry;
456 456
457 this.scannerFactory_ = scannerFactory; 457 this.scannerFactory_ = scannerFactory;
458 this.scanner_ = null; 458 this.scanner_ = null;
459 this.prefetchMetadataQueue_ = new AsyncUtil.Queue(); 459 this.prefetchMetadataQueue_ = new AsyncUtil.Queue();
460 this.scanCancelled_ = false; 460 this.scanCancelled_ = false;
461 this.fileList_.prepareSort = this.prepareSort_.bind(this);
462 } 461 }
463 462
464 /** 463 /**
465 * DirectoryContents extends cr.EventTarget. 464 * DirectoryContents extends cr.EventTarget.
466 */ 465 */
467 DirectoryContents.prototype.__proto__ = cr.EventTarget.prototype; 466 DirectoryContents.prototype.__proto__ = cr.EventTarget.prototype;
468 467
469 /** 468 /**
470 * Create the copy of the object, but without scan started. 469 * Create the copy of the object, but without scan started.
471 * @return {DirectoryContents} Object copy. 470 * @return {DirectoryContents} Object copy.
472 */ 471 */
473 DirectoryContents.prototype.clone = function() { 472 DirectoryContents.prototype.clone = function() {
474 return new DirectoryContents( 473 return new DirectoryContents(
475 this.context_, this.isSearch_, this.directoryEntry_, 474 this.context_, this.isSearch_, this.directoryEntry_,
476 this.lastNonSearchDirectoryEntry_, this.scannerFactory_); 475 this.lastNonSearchDirectoryEntry_, this.scannerFactory_);
477 }; 476 };
478 477
479 /** 478 /**
480 * Use a given fileList instead of the fileList from the context. 479 * Use a given fileList instead of the fileList from the context.
481 * @param {Array|cr.ui.ArrayDataModel} fileList The new file list. 480 * @param {Array|cr.ui.ArrayDataModel} fileList The new file list.
482 */ 481 */
483 DirectoryContents.prototype.setFileList = function(fileList) { 482 DirectoryContents.prototype.setFileList = function(fileList) {
484 this.fileList_ = fileList; 483 this.fileList_ = fileList;
485 this.fileList_.prepareSort = this.prepareSort_.bind(this); 484 this.context_.metadataCache.setCurrentContentNumber(this.fileList_.length);
486 }; 485 };
487 486
488 /** 487 /**
489 * Use the filelist from the context and replace its contents with the entries 488 * Use the filelist from the context and replace its contents with the entries
490 * from the current fileList. 489 * from the current fileList.
491 */ 490 */
492 DirectoryContents.prototype.replaceContextFileList = function() { 491 DirectoryContents.prototype.replaceContextFileList = function() {
493 if (this.context_.fileList !== this.fileList_) { 492 if (this.context_.fileList !== this.fileList_) {
494 var spliceArgs = [].slice.call(this.fileList_); 493 var spliceArgs = [].slice.call(this.fileList_);
495 var fileList = this.context_.fileList; 494 var fileList = this.context_.fileList;
496 spliceArgs.unshift(0, fileList.length); 495 spliceArgs.unshift(0, fileList.length);
497 fileList.splice.apply(fileList, spliceArgs); 496 fileList.splice.apply(fileList, spliceArgs);
498 this.fileList_ = fileList; 497 this.fileList_ = fileList;
498 this.context_.metadataCache.setCurrentContentNumber(this.fileList_.length);
499 } 499 }
500 }; 500 };
501 501
502 /** 502 /**
503 * @return {boolean} If the scan is active. 503 * @return {boolean} If the scan is active.
504 */ 504 */
505 DirectoryContents.prototype.isScanning = function() { 505 DirectoryContents.prototype.isScanning = function() {
506 return this.scanner_ || this.prefetchMetadataQueue_.isRunning(); 506 return this.scanner_ || this.prefetchMetadataQueue_.isRunning();
507 }; 507 };
508 508
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 if (this.scanCancelled_) 596 if (this.scanCancelled_)
597 return; 597 return;
598 598
599 var entriesFiltered = [].filter.call( 599 var entriesFiltered = [].filter.call(
600 entries, this.context_.fileFilter.filter.bind(this.context_.fileFilter)); 600 entries, this.context_.fileFilter.filter.bind(this.context_.fileFilter));
601 601
602 // Update the filelist without waiting the metadata. 602 // Update the filelist without waiting the metadata.
603 this.fileList_.push.apply(this.fileList_, entriesFiltered); 603 this.fileList_.push.apply(this.fileList_, entriesFiltered);
604 cr.dispatchSimpleEvent(this, 'scan-updated'); 604 cr.dispatchSimpleEvent(this, 'scan-updated');
605 605
606 this.context_.metadataCache.setCurrentContentNumber(this.fileList_.length);
607
606 // Because the prefetchMetadata can be slow, throttling by splitting entries 608 // Because the prefetchMetadata can be slow, throttling by splitting entries
607 // into smaller chunks to reduce UI latency. 609 // into smaller chunks to reduce UI latency.
608 // TODO(hidehiko,mtomasz): This should be handled in MetadataCache. 610 // TODO(hidehiko,mtomasz): This should be handled in MetadataCache.
609 var MAX_CHUNK_SIZE = 50; 611 var MAX_CHUNK_SIZE = 50;
610 for (var i = 0; i < entriesFiltered.length; i += MAX_CHUNK_SIZE) { 612 for (var i = 0; i < entriesFiltered.length; i += MAX_CHUNK_SIZE) {
611 var chunk = entriesFiltered.slice(i, i + MAX_CHUNK_SIZE); 613 var chunk = entriesFiltered.slice(i, i + MAX_CHUNK_SIZE);
612 this.prefetchMetadataQueue_.run(function(chunk, callback) { 614 this.prefetchMetadataQueue_.run(function(i, chunk, callback) {
613 this.prefetchMetadata(chunk, function() { 615 this.prefetchMetadata(chunk, function() {
614 if (this.scanCancelled_) { 616 if (this.scanCancelled_) {
615 // Do nothing if the scanning is cancelled. 617 // Do nothing if the scanning is cancelled.
616 callback(); 618 callback();
617 return; 619 return;
618 } 620 }
619 621
622 // Invoke an update event. It has the updated list sorted.
623 this.fileList_.updateIndex(i);
hirono 2013/12/17 11:35:15 How about the following? var status = this.list_.
yoshiki 2013/12/17 12:11:40 Done.
624
620 cr.dispatchSimpleEvent(this, 'scan-updated'); 625 cr.dispatchSimpleEvent(this, 'scan-updated');
621 callback(); 626 callback();
622 }.bind(this)); 627 }.bind(this));
623 }.bind(this, chunk)); 628 }.bind(this, i, chunk));
624 } 629 }
625 }; 630 };
626 631
627 /** 632 /**
628 * Cache necessary data before a sort happens.
629 *
630 * This is called by the table code before a sort happens, so that we can
631 * go fetch data for the sort field that we may not have yet.
632 * @param {string} field Sort field.
633 * @param {function(Object)} callback Called when done.
634 * @private
635 */
636 DirectoryContents.prototype.prepareSort_ = function(field, callback) {
637 this.prefetchMetadata(this.fileList_.slice(), callback);
638 };
639
640 /**
641 * @param {Array.<Entry>} entries Files. 633 * @param {Array.<Entry>} entries Files.
642 * @param {function(Object)} callback Callback on done. 634 * @param {function(Object)} callback Callback on done.
643 */ 635 */
644 DirectoryContents.prototype.prefetchMetadata = function(entries, callback) { 636 DirectoryContents.prototype.prefetchMetadata = function(entries, callback) {
645 this.context_.metadataCache.get(entries, 'filesystem', callback); 637 this.context_.metadataCache.get(entries, 'filesystem', callback);
646 }; 638 };
647 639
648 /** 640 /**
649 * @param {Array.<Entry>} entries Files. 641 * @param {Array.<Entry>} entries Files.
650 * @param {function(Object)} callback Callback on done. 642 * @param {function(Object)} callback Callback on done.
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 context, fakeDirectoryEntry, driveDirectoryEntry, query, searchType) { 751 context, fakeDirectoryEntry, driveDirectoryEntry, query, searchType) {
760 return new DirectoryContents( 752 return new DirectoryContents(
761 context, 753 context,
762 true, // Search 754 true, // Search
763 fakeDirectoryEntry, 755 fakeDirectoryEntry,
764 driveDirectoryEntry, 756 driveDirectoryEntry,
765 function() { 757 function() {
766 return new DriveMetadataSearchContentScanner(query, searchType); 758 return new DriveMetadataSearchContentScanner(query, searchType);
767 }); 759 });
768 }; 760 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698