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

Unified Diff: ui/file_manager/gallery/js/background.js

Issue 921043004: [Gallery app] Make the background page use BackgroundBase class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 5 years, 10 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/file_manager/file_manager/common/js/util.js ('k') | ui/file_manager/gallery/js/compiled_resources.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
});
}
« no previous file with comments | « ui/file_manager/file_manager/common/js/util.js ('k') | ui/file_manager/gallery/js/compiled_resources.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698