Index: chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js |
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js |
index c8696a65fae22dd457c0f7d1137627805defb1e0..0d498d6fd5ffb617a6cee70e0be332d0b1c4b262 100644 |
--- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js |
+++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js |
@@ -20,8 +20,8 @@ function WallpaperManager(dialogDom) { |
this.butterBar_ = new ButterBar(this.dialogDom_); |
this.customWallpaperData_ = null; |
this.currentWallpaper_ = null; |
+ this.wallpaperRequest_ = null; |
this.fetchManifest_(); |
- this.initDom_(); |
} |
// Anonymous 'namespace'. |
@@ -64,51 +64,86 @@ function WallpaperManager(dialogDom) { |
}; |
/** |
- * Parses a string as manifest(JSON). Sets manifest to an empty object if a |
- * parsing exception is catched. |
- * @param {string} response The string to parse as JSON. |
- */ |
- WallpaperManager.prototype.parseManifest_ = function(response) { |
- try { |
- this.manifest_ = JSON.parse(response); |
- } catch (e) { |
- this.butterBar_.showError_('Failed to parse manifest.'); |
- this.manifest_ = {}; |
- } |
- }; |
- |
- /** |
* Requests wallpaper manifest file from server. |
*/ |
WallpaperManager.prototype.fetchManifest_ = function() { |
- var xhr = new XMLHttpRequest(); |
var locale = navigator.language; |
var urls = [ |
ManifestBaseURL + locale + '.json', |
// Fallback url. Use 'en' locale by default. |
ManifestBaseURL + 'en.json']; |
- for (var i = 0; i < urls.length; i++) { |
- xhr.open('GET', urls[i], false); |
+ var asyncFetchManifestFromUrls = function(urls, func, successCallback, |
+ failureCallback) { |
+ var index = 0; |
+ var loop = { |
+ next: function() { |
+ if (index < urls.length) { |
+ func(loop, urls[index]); |
+ index++; |
+ } else { |
+ failure(); |
+ } |
+ }, |
+ |
+ success: function(response) { |
+ successCallback(response); |
+ }, |
+ |
+ failure: function() { |
+ failureCallback(); |
+ } |
+ }; |
+ loop.next(); |
+ }; |
+ |
+ var fetchManifestAsync = function(loop, url) { |
+ var xhr = new XMLHttpRequest(); |
+ xhr.open('GET', url, true); |
try { |
xhr.send(null); |
- // TODO(bshe): We should save the downloaded manifest to local disk. |
- // Other components may want to use it (i.e. screen saver). |
- if (xhr.status === 200) { |
- this.parseManifest_(xhr.responseText); |
- return; |
- } |
+ xhr.addEventListener('load', function(e) { |
flackr
2012/11/13 22:22:31
Reading the XHR documentation it seems like 'load'
bshe
2012/11/15 00:17:57
Done. I used loadend event.
On 2012/11/13 22:22:3
|
+ // TODO(bshe): We should save the downloaded manifest to local disk. |
+ // Other components may want to use it (e.g. screen saver). |
+ if (xhr.status === 200) { |
flackr
2012/11/13 22:22:31
nit: braces not needed anymore on this if since th
bshe
2012/11/15 00:17:57
Done.
|
+ loop.success(xhr.responseText); |
+ } else { |
+ loop.next(); |
+ } |
+ }); |
} catch (e) { |
- this.manifest_ = {}; |
- this.butterBar_.showError_(str('connectionFailed')); |
- return; |
+ loop.failure(); |
} |
+ }; |
+ |
+ asyncFetchManifestFromUrls(urls, fetchManifestAsync, |
+ this.onLoadManifestSuccess_.bind(this), |
+ this.onLoadManifestFailed_.bind(this)); |
+ }; |
+ |
+ /** |
+ * Parses a string as manifest(JSON). Sets manifest to an empty object if a |
+ * parsing exception is catched. Called after manifest is successfully loaded. |
+ * @param {string} response The string to parse as JSON. |
+ */ |
+ WallpaperManager.prototype.onLoadManifestSuccess_ = function(response) { |
+ try { |
+ this.manifest_ = JSON.parse(response); |
+ } catch (e) { |
+ this.butterBar_.showError_('Failed to parse manifest.'); |
flackr
2012/11/13 22:22:31
This isn't a localized string, and the message is
bshe
2012/11/15 00:17:57
Done.
On 2012/11/13 22:22:31, flackr wrote:
|
+ this.manifest_ = {}; |
} |
- this.manifest_ = {}; |
- this.butterBar_.showError_(str('connectionFailed')); |
+ this.initDom_(); |
+ }; |
+ // Sets manifest to an empty object and shows connection error. Called after |
+ // manifest failed to load. |
+ WallpaperManager.prototype.onLoadManifestFailed_ = function() { |
// TODO(bshe): Fall back to saved manifest if there is a problem fetching |
// manifest from server. |
+ this.manifest_ = {}; |
+ this.butterBar_.showError_(str('connectionFailed')); |
+ this.initDom_(); |
}; |
/** |