| Index: ui/file_manager/gallery/js/background.js
|
| diff --git a/ui/file_manager/gallery/js/background.js b/ui/file_manager/gallery/js/background.js
|
| index 96a86daa4154eec4478d0acd8d6dd790136b0b82..4572bce59591038e4eef2f03d4bc3ae30e986529 100644
|
| --- a/ui/file_manager/gallery/js/background.js
|
| +++ b/ui/file_manager/gallery/js/background.js
|
| @@ -4,44 +4,144 @@
|
|
|
| 'use strict';
|
|
|
| -var stringData = new Promise(function(fulfill) {
|
| - chrome.fileBrowserPrivate.getStrings(function(stringData) {
|
| - loadTimeData.data = stringData;
|
| - fulfill(stringData);
|
| +/**
|
| + * @param {Object.<string, string>} stringData String data.
|
| + * @param {VolumeManager} volumeManager Volume manager.
|
| + */
|
| +function BackgroundComponents(stringData, volumeManager) {
|
| + /**
|
| + * String data.
|
| + * @type {Object.<string, string>}
|
| + */
|
| + this.stringData = stringData;
|
| +
|
| + /**
|
| + * Volume manager.
|
| + * @type {VolumeManager}
|
| + */
|
| + this.volumeManager = volumeManager;
|
| +
|
| + Object.freeze(this);
|
| +}
|
| +
|
| +/**
|
| + * Loads background component.
|
| + * @return {Promise} Promise fulfilled with BackgroundComponents.
|
| + */
|
| +BackgroundComponents.load = function() {
|
| + var stringDataPromise = new Promise(function(fulfill) {
|
| + chrome.fileBrowserPrivate.getStrings(function(stringData) {
|
| + loadTimeData.data = stringData;
|
| + fulfill(stringData);
|
| + });
|
| });
|
| -});
|
|
|
| -// VolumeManager should be obtained after stringData initialized.
|
| -var volumeManager = stringData.then(function() {
|
| - return new Promise(function(fulfill) {
|
| - VolumeManager.getInstance(fulfill);
|
| + // VolumeManager should be obtained after stringData initialized.
|
| + var volumeManagerPromise = stringDataPromise.then(function() {
|
| + return new Promise(function(fulfill) {
|
| + VolumeManager.getInstance(fulfill);
|
| + });
|
| });
|
| -});
|
|
|
| -var backgroundComponent = Promise.all([stringData, volumeManager]).
|
| - then(function(args) {
|
| - return {
|
| - stringData: args[0],
|
| - volumeManager: args[1]
|
| - };
|
| + return Promise.all([stringDataPromise, volumeManagerPromise]).then(
|
| + function(args) {
|
| + return new BackgroundComponents(args[0], args[1]);
|
| + });
|
| +};
|
| +
|
| +/**
|
| + * Promise to be fulfilled with singleton instance of background components.
|
| + * @type {Promise}
|
| + */
|
| +var backgroundComponentsPromise = BackgroundComponents.load();
|
| +
|
| +/**
|
| + * Resolves file system names and obtains entries.
|
| + * @param {Array.<FileEntry>} entries Names of isolated file system.
|
| + * @return {Promise} Promise to be fulfilled with an entry array.
|
| + */
|
| +function resolveEntries(entries) {
|
| + return new Promise(function(fulfill, reject) {
|
| + chrome.fileBrowserPrivate.resolveIsolatedEntries(entries,
|
| + function(externalEntries) {
|
| + if (!chrome.runtime.lastError)
|
| + fulfill(externalEntries);
|
| + else
|
| + reject(chrome.runtime.lastError);
|
| + });
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Obtains child entries.
|
| + * @param {DirectoryEntry} entry Directory entry.
|
| + * @return {Promise} Promise to be fulfilled with child entries.
|
| + */
|
| +function getChildren(entry) {
|
| + var reader = entry.createReader();
|
| + var readEntries = function() {
|
| + return new Promise(reader.readEntries.bind(reader)).then(function(entries) {
|
| + if (entries.length === 0)
|
| + return [];
|
| + return readEntries().then(function(nextEntries) {
|
| + return entries.concat(nextEntries);
|
| + });
|
| });
|
| + };
|
| + return readEntries();
|
| +}
|
|
|
| chrome.app.runtime.onLaunched.addListener(function(launchData) {
|
| // Skip if files are not selected.
|
| if (!launchData || !launchData.items || launchData.items.length == 0)
|
| return;
|
|
|
| + // Obtains entries in non-isolated file systems.
|
| + // The entries in launchData are stored in the isolated file system.
|
| + // We need to map the isolated entries to the normal entries to retrieve their
|
| + // parent directory.
|
| + var isolatedEntries = launchData.items.map(function(item) {
|
| + return item.entry;
|
| + });
|
| + var selectedEntriesPromise = backgroundComponentsPromise.then(function() {
|
| + return resolveEntries(isolatedEntries);
|
| + });
|
| +
|
| + // If only 1 entry is selected, retrieve entries in the same directory.
|
| + // Otherwise, just use the selectedEntries as an entry set.
|
| + var allEntriesPromise = selectedEntriesPromise.then(function(entries) {
|
| + if (entries.length === 1) {
|
| + var parent = new Promise(entries[0].getParent.bind(entries[0]));
|
| + return parent.then(getChildren).then(function(entries) {
|
| + return entries.filter(FileType.isImageOrVideo);
|
| + });
|
| + } else {
|
| + return entries;
|
| + }
|
| + });
|
| +
|
| + // Store the selected and all entries to the launchData.
|
| + launchData.entriesPromise = Promise.all([selectedEntriesPromise,
|
| + allEntriesPromise]).then(
|
| + function(args) {
|
| + return Object.freeze({
|
| + selectedEntries: args[0],
|
| + allEntries: args[1]
|
| + });
|
| + });
|
| +
|
| // Open application window.
|
| chrome.app.window.create(
|
| 'gallery.html',
|
| {
|
| - id: 'video',
|
| + id: 'gallery',
|
| minWidth: 160,
|
| minHeight: 100,
|
| frame: 'none'
|
| },
|
| function(appWindow) {
|
| appWindow.contentWindow.launchData = launchData;
|
| - appWindow.contentWindow.backgroundComponent = backgroundComponent;
|
| + appWindow.contentWindow.backgroundComponentsPromise =
|
| + backgroundComponentsPromise;
|
| });
|
| });
|
|
|