1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var WallpaperUtil = {};
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Saves value to local storage that associates with key.
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} key The key that associates with value.
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} value The value to save to local storage.
11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * @param {boolen} sync True if the value is saved to sync storage.
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function=} opt_callback The callback on success, or on failure.
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)WallpaperUtil.saveToStorage = function(key, value, sync, opt_callback) {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var items = {};
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  items[key] = value;
17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (sync)
18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    Constants.WallpaperSyncStorage.set(items, opt_callback);
19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  else
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    Constants.WallpaperLocalStorage.set(items, opt_callback);
21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
22a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/**
24a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * Saves user's wallpaper infomation to local and sync storage. Note that local
25a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * value should be saved first.
26a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * @param {string} url The url address of wallpaper. For custom wallpaper, it is
27a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) *     the file name.
28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * @param {string} layout The wallpaper layout.
29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * @param {string} source The wallpaper source.
30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) */
31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)WallpaperUtil.saveWallpaperInfo = function(url, layout, source) {
32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  var wallpaperInfo = {
33a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      url: url,
34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      layout: layout,
35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      source: source
36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  WallpaperUtil.saveToStorage(Constants.AccessLocalWallpaperInfoKey,
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                              wallpaperInfo, false, function() {
39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    WallpaperUtil.saveToStorage(Constants.AccessSyncWallpaperInfoKey,
40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                wallpaperInfo, true);
41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  });
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Downloads resources from url. Calls onSuccess and opt_onFailure accordingly.
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} url The url address where we should fetch resources.
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} type The response type of XMLHttprequest.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} onSuccess The success callback. It must be called with
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     current XMLHttprequest object.
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} onFailure The failure callback.
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {XMLHttpRequest=} opt_xhr The XMLHttpRequest object.
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WallpaperUtil.fetchURL = function(url, type, onSuccess, onFailure, opt_xhr) {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var xhr;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (opt_xhr)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    xhr = opt_xhr;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    xhr = new XMLHttpRequest();
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  try {
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Do not use loadend here to handle both success and failure case. It gets
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // complicated with abortion. Unexpected error message may show up. See
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // http://crbug.com/242581.
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    xhr.addEventListener('load', function(e) {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.status == 200) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onSuccess(this);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onFailure();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    });
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    xhr.addEventListener('error', onFailure);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    xhr.open('GET', url, true);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    xhr.responseType = type;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    xhr.send(null);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } catch (e) {
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onFailure();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Sets wallpaper to online wallpaper specified by url and layout
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} url The url address where we should fetch resources.
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} layout The layout of online wallpaper.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} onSuccess The success callback.
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} onFailure The failure callback.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WallpaperUtil.setOnlineWallpaper = function(url, layout, onSuccess, onFailure) {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var self = this;
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  chrome.wallpaperPrivate.setWallpaperIfExists(url, layout, function(exists) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (exists) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      onSuccess();
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.fetchURL(url, 'arraybuffer', function(xhr) {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (xhr.response != null) {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        chrome.wallpaperPrivate.setWallpaper(xhr.response, layout, url,
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             onSuccess);
99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        self.saveWallpaperInfo(url, layout,
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                               Constants.WallpaperSourceEnum.Online);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onFailure();
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }, onFailure);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  });
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Runs chrome.test.sendMessage in test environment. Does nothing if running
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * in production environment.
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {string} message Test message to send.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWallpaperUtil.testSendMessage = function(message) {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var test = chrome.test || window.top.chrome.test;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (test)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.sendMessage(message);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
119