Index: chrome/browser/resources/chromeos/wallpaper_manager/js/util.js |
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js |
index 397f1805e4acdc668b9bae7da94c74ff51d98b38..a4537080e49997a1ddcd41ceedb4c80cab0010b5 100644 |
--- a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js |
+++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js |
@@ -2,7 +2,175 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-var WallpaperUtil = {}; |
+var WallpaperUtil = { |
+ strings: null, // Object that contains all the flags |
+ syncFs: null // syncFileSystem handler |
+}; |
+ |
+/** |
+ * Run experimental features. |
+ * @param {function} callback The callback will be executed if 'isExperimental' |
+ * flag is set to true. |
+ */ |
+WallpaperUtil.enabledExperimentalFeatureCallback = function(callback) { |
+ if (WallpaperUtil.strings) { |
+ if (WallpaperUtil.strings.isExperimental) |
+ callback(); |
+ } else { |
+ chrome.wallpaperPrivate.getStrings(function(strings) { |
+ WallpaperUtil.strings = strings; |
+ if (WallpaperUtil.strings.isExperimental) |
+ callback(); |
+ }); |
+ } |
+}; |
+ |
+/** |
+ * Request a syncFileSystem handle and run callback on it. |
+ * @param {function} callback The callback to execute after syncFileSystem |
+ * handler is available. |
+ */ |
+WallpaperUtil.requestSyncFs = function(callback) { |
+ if (WallpaperUtil.syncFs) { |
+ callback(WallpaperUtil.syncFs); |
+ } else { |
+ chrome.syncFileSystem.requestFileSystem(function(fs) { |
+ WallpaperUtil.syncFs = fs; |
+ callback(WallpaperUtil.syncFs); |
+ }); |
+ } |
+}; |
+ |
+/** |
+ * Print error to console.error. |
+ * @param {Event} e The error will be printed to console.error. |
+ */ |
+// TODO(ranj): Handle different errors differently. |
+WallpaperUtil.onFileSystemError = function(e) { |
+ console.error(e); |
+}; |
+ |
+/** |
+ * Write jpeg/png file data into file entry. |
+ * @param {FileEntry} fileEntry The file entry that going to be writen. |
+ * @param {ArrayBuffer} wallpaperData Data for image file. |
+ * @param {function=} writeCallback The callback that will be executed after |
+ * writing data. |
+ */ |
+WallpaperUtil.writeFile = function(fileEntry, wallpaperData, writeCallback) { |
+ var uint8arr = new Uint8Array(wallpaperData); |
+ fileEntry.createWriter(function(fileWriter) { |
+ var blob = new Blob([new Int8Array(wallpaperData)]); |
+ fileWriter.write(blob); |
+ if (writeCallback) |
+ writeCallback(); |
+ }, WallpaperUtil.onFileSystemError); |
+}; |
+ |
+/** |
+ * Write jpeg/png file data into syncFileSystem. |
+ * @param {string} wallpaperFilename The filename that going to be writen. |
+ * @param {ArrayBuffer} wallpaperData Data for image file. |
+ * @param {function} onSuccess The callback that will be executed after. |
+ * writing data |
+ */ |
+WallpaperUtil.storePictureToSyncFileSystem = function( |
+ wallpaperFilename, wallpaperData, onSuccess) { |
+ var callback = function(fs) { |
+ fs.root.getFile(wallpaperFilename, |
+ {create: false}, |
+ function() { onSuccess();}, // already exists |
+ function(e) { // not exists, create |
+ fs.root.getFile(wallpaperFilename, {create: true}, |
+ function(fe) { |
+ WallpaperUtil.writeFile( |
+ fe, wallpaperData, onSuccess); |
+ }, |
+ WallpaperUtil.onFileSystemError); |
+ }); |
+ }; |
+ WallpaperUtil.requestSyncFs(callback); |
+}; |
+ |
+/** |
+ * Stores jpeg/png wallpaper into |localDir| in local file system. |
+ * @param {string} wallpaperFilename File name of wallpaper image. |
+ * @param {ArrayBuffer} wallpaperData The wallpaper data. |
+ * @param {string} saveDir The path to store wallpaper in local file system. |
+ */ |
+WallpaperUtil.storePictureToLocal = function(wallpaperFilename, wallpaperData, |
+ saveDir) { |
+ if (!wallpaperData) { |
+ console.error('wallpaperData is null'); |
+ return; |
+ } |
+ var getDirSuccess = function(dirEntry) { |
+ dirEntry.getFile(wallpaperFilename, |
+ {create: false}, |
+ function() {}, // already exists |
+ function(e) { // not exists, create |
+ dirEntry.getFile(wallpaperFilename, {create: true}, |
+ function(fe) { |
+ WallpaperUtil.writeFile(fe, |
+ wallpaperData); |
+ }, |
+ WallpaperUtil.onFileSystemError); |
+ }); |
+ }; |
+ window.webkitRequestFileSystem(window.PERSISTENT, 1024 * 1024 * 100, |
+ function(fs) { |
+ fs.root.getDirectory( |
+ saveDir, {create: true}, getDirSuccess, |
+ WallpaperUtil.onFileSystemError); |
+ }, |
+ WallpaperUtil.onFileSystemError); |
+}; |
+ |
+/** |
+ * Sets wallpaper from synced file system. |
+ * @param {string} wallpaperFilename File name used to set wallpaper. |
+ * @param {string} wallpaperLayout Layout used to set wallpaper. |
+ * @param {function=} onSuccess Callback if set successfully. |
+ */ |
+WallpaperUtil.setSyncCustomWallpaper = function( |
+ wallpaperFilename, wallpaperLayout, onSuccess) { |
+ var setWallpaperFromSyncCallback = function(fs) { |
+ if (!wallpaperFilename) { |
+ console.error('wallpaperFilename is not provided.'); |
+ return; |
+ } |
+ if (!wallpaperLayout) |
+ wallpaperLayout = 'CENTER_CROPPED'; |
+ fs.root.getFile(wallpaperFilename, {create: false}, function(fileEntry) { |
+ fileEntry.file(function(file) { |
+ var reader = new FileReader(); |
+ reader.onloadend = function() { |
+ chrome.wallpaperPrivate.setCustomWallpaper( |
+ reader.result, |
+ wallpaperLayout, |
+ true, |
+ wallpaperFilename, |
+ function(thumbnailData) { |
+ // TODO(ranj): Ignore 'canceledWallpaper' error. |
+ if (chrome.runtime.lastError) { |
+ console.error(chrome.runtime.lastError.message); |
+ return; |
+ } |
+ WallpaperUtil.storePictureToLocal(wallpaperFilename, |
+ reader.result, 'original'); |
+ WallpaperUtil.storePictureToLocal(wallpaperFilename, |
+ reader.result, 'thumbnail'); |
+ if (onSuccess) |
+ onSuccess(); |
+ }); |
+ }; |
+ reader.readAsArrayBuffer(file); |
+ }, WallpaperUtil.onFileSystemError); |
+ }, function(e) {} // fail to read file, expected due to download delay |
+ ); |
+ }; |
+ WallpaperUtil.requestSyncFs(setWallpaperFromSyncCallback); |
+}; |
/** |
* Saves value to local storage that associates with key. |