| 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 ae5ed8081937a149dfbb2799814d8bc0282d2405..3203297ae8a5917bd77862261a45fca541d6b2ba 100644
|
| --- a/ui/file_manager/gallery/js/background.js
|
| +++ b/ui/file_manager/gallery/js/background.js
|
| @@ -3,172 +3,132 @@
|
| // found in the LICENSE file.
|
|
|
| /**
|
| - * @param {!Object.<string, string>} stringData String data.
|
| - * @param {!VolumeManager} volumeManager Volume manager.
|
| - * @constructor
|
| - * @struct
|
| + * Configuration of the Gallery window.
|
| + * @const
|
| + * @type {Object}
|
| */
|
| -function BackgroundComponents(stringData, volumeManager) {
|
| - /**
|
| - * String data.
|
| - * @type {!Object.<string, string>}
|
| - */
|
| - this.stringData = stringData;
|
| -
|
| - /**
|
| - * Volume manager.
|
| - * @type {!VolumeManager}
|
| - */
|
| - this.volumeManager = volumeManager;
|
| -}
|
| +var windowCreateOptions = {
|
| + id: 'gallery',
|
| + innerBounds: {
|
| + minWidth: 820,
|
| + minHeight: 554
|
| + },
|
| + frame: 'none'
|
| +};
|
|
|
| /**
|
| - * Loads background component.
|
| - * @return {!Promise} Promise fulfilled with BackgroundComponents.
|
| + * Backgound object. This is necessary for AppWindowWrapper.
|
| + * @type {!BackgroundBase}
|
| */
|
| -BackgroundComponents.load = function() {
|
| - var stringDataPromise = new Promise(function(fulfill) {
|
| - chrome.fileManagerPrivate.getStrings(function(stringData) {
|
| - loadTimeData.data = stringData;
|
| - fulfill(stringData);
|
| - });
|
| - });
|
| +var background = new BackgroundBase();
|
|
|
| - // VolumeManager should be obtained after stringData initialized.
|
| - var volumeManagerPromise = stringDataPromise.then(function() {
|
| - return new Promise(function(fulfill) {
|
| - VolumeManager.getInstance(fulfill);
|
| - });
|
| - });
|
|
|
| - return Promise.all([stringDataPromise, volumeManagerPromise]).then(
|
| - function(args) {
|
| - return new BackgroundComponents(args[0], args[1]);
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * 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.fileManagerPrivate.resolveIsolatedEntries(
|
| - entries, function(externalEntries) {
|
| - if (!chrome.runtime.lastError)
|
| - fulfill(externalEntries);
|
| - else
|
| - reject(chrome.runtime.lastError);
|
| - });
|
| +// Initializes the strings. This needs for the volume manager.
|
| +var loadTimeDataPromise = new Promise(function(fulfill, reject) {
|
| + chrome.fileManagerPrivate.getStrings(function(stringData) {
|
| + loadTimeData.data = stringData;
|
| + fulfill(true);
|
| });
|
| -}
|
| +});
|
|
|
| -/**
|
| - * Promise to be fulfilled with singleton instance of background components.
|
| - * @type {Promise}
|
| - */
|
| -var backgroundComponentsPromise = null;
|
| +// Initializes the volume manager. This needs for isolated entries.
|
| +var volumeManagerPromise = new Promise(function(fulfill, reject) {
|
| + VolumeManager.getInstance(fulfill);
|
| +});
|
|
|
| /**
|
| - * Promise to be fulfilled with single application window.
|
| - * This can be null when the window is not opened.
|
| - * @type {Promise}
|
| + * Queue to serialize initialization.
|
| + * @type {!Promise}
|
| */
|
| -var appWindowPromise = null;
|
| +window.initializePromise = Promise.all([loadTimeDataPromise,
|
| + volumeManagerPromise]);
|
|
|
| -/**
|
| - * Promise to be fulfilled with entries that are used for reopening the
|
| - * application window.
|
| - * @type {Promise}
|
| - */
|
| -var reopenEntriesPromise = null;
|
| +// Registers the handlers.
|
| +chrome.app.runtime.onLaunched.addListener(onLaunched);
|
|
|
| /**
|
| - * Launches the application with entries.
|
| + * Called when an app is launched.
|
| *
|
| - * @param {!Promise} selectedEntriesPromise Promise to be fulfilled with the
|
| - * entries that are stored in the external file system (not in the isolated
|
| - * file system).
|
| - * @return {!Promise} Promise to be fulfilled after the application is launched.
|
| + * @param {!Object} launchData Launch data. See the manual of chrome.app.runtime
|
| + * .onLaunched for detail.
|
| */
|
| -function launch(selectedEntriesPromise) {
|
| - // If there is the previous window, close the window.
|
| - if (appWindowPromise) {
|
| - reopenEntriesPromise = selectedEntriesPromise;
|
| - appWindowPromise.then(function(appWindow) {
|
| - appWindow.close();
|
| - });
|
| - return Promise.reject('The window has already opened.');
|
| - }
|
| - reopenEntriesPromise = null;
|
| -
|
| - // Create a new window.
|
| - appWindowPromise = new Promise(function(fulfill) {
|
| - chrome.app.window.create(
|
| - 'gallery.html',
|
| - {
|
| - id: 'gallery',
|
| - innerBounds: {
|
| - minWidth: 820,
|
| - minHeight: 544
|
| - },
|
| - frame: 'none'
|
| - },
|
| - function(appWindow) {
|
| - appWindow.contentWindow.addEventListener(
|
| - 'load', fulfill.bind(null, appWindow));
|
| - appWindow.onClosed.addListener(function() {
|
| - appWindowPromise = null;
|
| - if (reopenEntriesPromise) {
|
| - // TODO(hirono): This is workaround for crbug.com/442217. Remove
|
| - // this after fixing it.
|
| - setTimeout(function() {
|
| - if (reopenEntriesPromise)
|
| - launch(reopenEntriesPromise);
|
| - }, 500);
|
| - }
|
| - });
|
| - });
|
| - });
|
| +function onLaunched(launchData) {
|
| + // Skip if files are not selected.
|
| + if (!launchData || !launchData.items || launchData.items.length == 0)
|
| + return;
|
|
|
| - // Initialize the window document.
|
| - return Promise.all([
|
| - appWindowPromise,
|
| - backgroundComponentsPromise
|
| - ]).then(function(args) {
|
| - var appWindow = /** @type {!chrome.app.window.AppWindow} */ (args[0]);
|
| - var galleryWindow = /** @type {!GalleryWindow} */ (appWindow.contentWindow);
|
| - galleryWindow.initialize(args[1]);
|
| - return selectedEntriesPromise.then(function(entries) {
|
| - galleryWindow.loadEntries(entries);
|
| + window.initializePromise.then(function() {
|
| + var isolatedEntries = launchData.items.map(function(item) {
|
| + return item.entry;
|
| });
|
| - });
|
| -}
|
| -
|
| -// If the script is loaded from unit test, chrome.app.runtime is not defined.
|
| -// In this case, does not run the initialization code for the application.
|
| -if (chrome.app.runtime) {
|
| - backgroundComponentsPromise = BackgroundComponents.load();
|
| - 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);
|
| - });
|
| + chrome.fileManagerPrivate.resolveIsolatedEntries(
|
| + isolatedEntries,
|
| + function(externalEntries) {
|
| + var urls = util.entriesToURLs(externalEntries);
|
| + openGalleryWindow(urls, false);
|
| + });
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Returns a function to generate an ID for window.
|
| + * @type {function():string} Function which returns an unique id.
|
| + */
|
| +var generateWindowId = (function() {
|
| + var seq = 0;
|
| + return function() {
|
| + return 'GALLERY_' + seq++;
|
| + };
|
| +})();
|
|
|
| - launch(selectedEntriesPromise).catch(function(error) {
|
| - console.error(error.stack || error);
|
| +/**
|
| + * Opens gallery window.
|
| + * @param {!Array.<string>} urls List of URL to show.
|
| + * @param {boolean} reopen True if reopen, false otherwise.
|
| + * @return {!Promise} Promise to be fulfilled on success, or rejected on error.
|
| + */
|
| +function openGalleryWindow(urls, reopen) {
|
| + return new Promise(function(fulfill, reject) {
|
| + util.URLsToEntries(urls).then(function(result) {
|
| + fulfill(util.entriesToURLs(result.entries));
|
| + }).catch(reject);
|
| + }).then(function(urls) {
|
| + if (urls.length === 0)
|
| + return Promise.reject('No file to open.');
|
| +
|
| + var windowId = generateWindowId();
|
| +
|
| + // Opens a window.
|
| + return new Promise(function(fulfill, reject) {
|
| + var gallery = new AppWindowWrapper('gallery.html',
|
| + windowId,
|
| + windowCreateOptions);
|
| +
|
| + gallery.launch(
|
| + {urls: urls},
|
| + reopen,
|
| + fulfill.bind(null, gallery));
|
| + }).then(function(gallery) {
|
| + var galleryDocument = gallery.rawAppWindow.contentWindow.document;
|
| + if (galleryDocument.readyState == 'complete')
|
| + return gallery;
|
| +
|
| + return new Promise(function(fulfill, reject) {
|
| + galleryDocument.addEventListener(
|
| + 'DOMContentLoaded', fulfill.bind(null, gallery));
|
| + });
|
| });
|
| + }).then(function(gallery) {
|
| + gallery.rawAppWindow.focus();
|
| + return gallery.rawAppWindow;
|
| + }).catch(function(error) {
|
| + console.error('Launch failed' + error.stack || error);
|
| + return Promise.reject(error);
|
| });
|
| }
|
|
|
|
|