summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbshe@chromium.org <bshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-17 15:18:09 +0000
committerbshe@chromium.org <bshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-17 15:18:09 +0000
commit032e2ee5d6e914ab7d783dd6c6a01fa6ad16b89e (patch)
treeb79bdf308db609082e604f09f774efd2f6e6d107
parent6cdaff796bcacf7c07b6ce6d07f4136843d12da6 (diff)
downloadchromium_src-032e2ee5d6e914ab7d783dd6c6a01fa6ad16b89e.zip
chromium_src-032e2ee5d6e914ab7d783dd6c6a01fa6ad16b89e.tar.gz
chromium_src-032e2ee5d6e914ab7d783dd6c6a01fa6ad16b89e.tar.bz2
Use wallpaper from file system first. If not success, fall back to the wallpaper on server.
BUG=162638 Review URL: https://codereview.chromium.org/11569022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173467 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/extensions/wallpaper_private_api.cc95
-rw-r--r--chrome/browser/chromeos/extensions/wallpaper_private_api.h43
-rw-r--r--chrome/browser/extensions/extension_function_registry.cc1
-rw-r--r--chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js50
-rw-r--r--chrome/common/extensions/api/wallpaper_private.json22
-rw-r--r--chrome/test/data/extensions/api_test/wallpaper_manager/test.js12
6 files changed, 190 insertions, 33 deletions
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
index 901a199..7a59f3a 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
@@ -275,6 +275,14 @@ WallpaperFunctionBase::WallpaperFunctionBase() {
WallpaperFunctionBase::~WallpaperFunctionBase() {
}
+void WallpaperFunctionBase::StartDecode(const std::string& data) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (wallpaper_decoder_)
+ wallpaper_decoder_->Cancel();
+ wallpaper_decoder_ = new WallpaperDecoder(this);
+ wallpaper_decoder_->Start(data);
+}
+
void WallpaperFunctionBase::OnFailureOrCancel(const std::string& error) {
wallpaper_decoder_ = NULL;
if (!error.empty())
@@ -282,6 +290,83 @@ void WallpaperFunctionBase::OnFailureOrCancel(const std::string& error) {
SendResponse(false);
}
+WallpaperSetWallpaperIfExistFunction::WallpaperSetWallpaperIfExistFunction() {
+}
+
+WallpaperSetWallpaperIfExistFunction::~WallpaperSetWallpaperIfExistFunction() {
+}
+
+bool WallpaperSetWallpaperIfExistFunction::RunImpl() {
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_));
+ EXTENSION_FUNCTION_VALIDATE(!url_.empty());
+ std::string file_name = GURL(url_).ExtractFileName();
+
+ std::string layout_string;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &layout_string));
+ EXTENSION_FUNCTION_VALIDATE(!layout_string.empty());
+ layout_ = GetLayoutEnum(layout_string);
+
+ sequence_token_ = BrowserThread::GetBlockingPool()->
+ GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
+ scoped_refptr<base::SequencedTaskRunner> task_runner =
+ BrowserThread::GetBlockingPool()->
+ GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
+ base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
+
+ task_runner->PostTask(FROM_HERE,
+ base::Bind(
+ &WallpaperSetWallpaperIfExistFunction::ReadFileAndInitiateStartDecode,
+ this,
+ file_name));
+ return true;
+}
+
+void WallpaperSetWallpaperIfExistFunction::ReadFileAndInitiateStartDecode(
+ const std::string& file_name) {
+ DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
+ sequence_token_));
+ std::string data;
+ FilePath data_dir;
+
+ CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &data_dir));
+ FilePath file_path = data_dir.Append(file_name);
+
+ if (file_util::PathExists(file_path) &&
+ file_util::ReadFileToString(file_path, &data)) {
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&WallpaperSetWallpaperIfExistFunction::StartDecode, this,
+ data));
+ return;
+ }
+ std::string error = base::StringPrintf(
+ "Failed to set wallpaper %s from file system.", file_name.c_str());
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&WallpaperSetWallpaperIfExistFunction::OnFailureOrCancel,
+ this, error));
+}
+
+void WallpaperSetWallpaperIfExistFunction::OnWallpaperDecoded(
+ const gfx::ImageSkia& wallpaper) {
+ // Set wallpaper_decoder_ to null since the decoding already finished.
+ wallpaper_decoder_ = NULL;
+
+ chromeos::WallpaperManager* wallpaper_manager =
+ chromeos::WallpaperManager::Get();
+ wallpaper_manager->SetWallpaperFromImageSkia(wallpaper, layout_);
+ bool is_persistent =
+ !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
+ chromeos::WallpaperInfo info = {
+ url_,
+ layout_,
+ chromeos::User::ONLINE,
+ base::Time::Now().LocalMidnight()
+ };
+ std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
+ wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
+ SendResponse(true);
+}
+
WallpaperSetWallpaperFunction::WallpaperSetWallpaperFunction() {
}
@@ -304,10 +389,7 @@ bool WallpaperSetWallpaperFunction::RunImpl() {
email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
image_data_.assign(input->GetBuffer(), input->GetSize());
- if (wallpaper_decoder_)
- wallpaper_decoder_->Cancel();
- wallpaper_decoder_ = new WallpaperDecoder(this);
- wallpaper_decoder_->Start(image_data_);
+ StartDecode(image_data_);
return true;
}
@@ -404,10 +486,7 @@ bool WallpaperSetCustomWallpaperFunction::RunImpl() {
email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
image_data_.assign(input->GetBuffer(), input->GetSize());
- if (wallpaper_decoder_)
- wallpaper_decoder_->Cancel();
- wallpaper_decoder_ = new WallpaperDecoder(this);
- wallpaper_decoder_->Start(image_data_);
+ StartDecode(image_data_);
return true;
}
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.h b/chrome/browser/chromeos/extensions/wallpaper_private_api.h
index eff7d03..1ff3e35 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_private_api.h
+++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.h
@@ -38,6 +38,9 @@ class WallpaperFunctionBase : public AsyncExtensionFunction {
// Holds an instance of WallpaperDecoder.
static WallpaperDecoder* wallpaper_decoder_;
+ // Starts to decode |data|. Must run on UI thread.
+ void StartDecode(const std::string& data);
+
// Handles failure or cancel cases. Passes error message to Javascript side.
void OnFailureOrCancel(const std::string& error);
@@ -45,6 +48,37 @@ class WallpaperFunctionBase : public AsyncExtensionFunction {
virtual void OnWallpaperDecoded(const gfx::ImageSkia& wallpaper) = 0;
};
+class WallpaperSetWallpaperIfExistFunction : public WallpaperFunctionBase {
+ public:
+ DECLARE_EXTENSION_FUNCTION_NAME("wallpaperPrivate.setWallpaperIfExist");
+
+ WallpaperSetWallpaperIfExistFunction();
+
+ protected:
+ virtual ~WallpaperSetWallpaperIfExistFunction();
+
+ // AsyncExtensionFunction overrides.
+ virtual bool RunImpl() OVERRIDE;
+
+ private:
+ virtual void OnWallpaperDecoded(const gfx::ImageSkia& wallpaper) OVERRIDE;
+
+ // Reads file specified by |file_name|. If success, post a task to start
+ // decoding the file.
+ void ReadFileAndInitiateStartDecode(const std::string& file_name);
+
+ // High resolution wallpaper URL.
+ std::string url_;
+
+ // Layout of the downloaded wallpaper.
+ ash::WallpaperLayout layout_;
+
+ // Sequence token associated with wallpaper operations. Shared with
+ // WallpaperManager.
+ base::SequencedWorkerPool::SequenceToken sequence_token_;
+
+};
+
class WallpaperSetWallpaperFunction : public WallpaperFunctionBase {
public:
DECLARE_EXTENSION_FUNCTION_NAME("wallpaperPrivate.setWallpaper");
@@ -154,13 +188,12 @@ class WallpaperGetThumbnailFunction : public AsyncExtensionFunction {
// Failed to get thumbnail for |file_name|.
void Failure(const std::string& file_name);
- // Sets success field in the results to false. Called when the requested
- // thumbnail is not found or corrupted in thumbnail directory.
+ // Returns true to suppress javascript console error. Called when the
+ // requested thumbnail is not found or corrupted in thumbnail directory.
void FileNotLoaded();
- // Sets success field to true and data field to the loaded thumbnail binary
- // data in the results. Called when requested wallpaper thumbnail loaded
- // successfully.
+ // Sets data field to the loaded thumbnail binary data in the results. Called
+ // when requested wallpaper thumbnail loaded successfully.
void FileLoaded(const std::string& data);
// Gets thumbnail with |file_name| from thumbnail directory. If |file_name|
diff --git a/chrome/browser/extensions/extension_function_registry.cc b/chrome/browser/extensions/extension_function_registry.cc
index 197df79..9a1a210 100644
--- a/chrome/browser/extensions/extension_function_registry.cc
+++ b/chrome/browser/extensions/extension_function_registry.cc
@@ -396,6 +396,7 @@ void ExtensionFunctionRegistry::ResetFunctions() {
// WallpaperManagerPrivate functions.
RegisterFunction<WallpaperStringsFunction>();
+ RegisterFunction<WallpaperSetWallpaperIfExistFunction>();
RegisterFunction<WallpaperSetWallpaperFunction>();
RegisterFunction<WallpaperSetCustomWallpaperFunction>();
RegisterFunction<WallpaperMinimizeInactiveWindowsFunction>();
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 031d365..acbe0e9 100644
--- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
+++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
@@ -282,29 +282,39 @@ function WallpaperManager(dialogDom) {
if (selectedItem && selectedItem.dynamicURL &&
!this.wallpaperGrid_.inProgramSelection) {
var wallpaperURL = selectedItem.baseURL + HighResolutionSuffix;
-
- if (this.wallpaperRequest_)
- this.wallpaperRequest_.abort();
-
- this.wallpaperRequest_ = new XMLHttpRequest();
- this.wallpaperRequest_.open('GET', wallpaperURL, true);
- this.wallpaperRequest_.responseType = 'arraybuffer';
- this.wallpaperRequest_.send(null);
- this.butterBar_.setRequest(this.wallpaperRequest_);
var self = this;
- this.wallpaperRequest_.addEventListener('load', function(e) {
- if (self.wallpaperRequest_.status === 200) {
- var image = self.wallpaperRequest_.response;
- chrome.wallpaperPrivate.setWallpaper(image,
- selectedItem.layout,
- wallpaperURL,
- self.onFinished_.bind(self));
+
+ chrome.wallpaperPrivate.setWallpaperIfExist(wallpaperURL,
+ selectedItem.layout,
+ function() {
+ if (chrome.runtime.lastError == undefined) {
self.currentWallpaper_ = wallpaperURL;
- } else {
- self.butterBar_.showError_(str('downloadFailed'),
- {help_url: LEARN_MORE_URL});
+ return;
}
- self.wallpaperRequest_ = null;
+
+ // Falls back to request wallpaper from server.
+ if (self.wallpaperRequest_)
+ self.wallpaperRequest_.abort();
+
+ self.wallpaperRequest_ = new XMLHttpRequest();
+ self.wallpaperRequest_.open('GET', wallpaperURL, true);
+ self.wallpaperRequest_.responseType = 'arraybuffer';
+ self.wallpaperRequest_.send(null);
+ self.butterBar_.setRequest(self.wallpaperRequest_);
+ self.wallpaperRequest_.addEventListener('load', function(e) {
+ if (self.wallpaperRequest_.status === 200) {
+ var image = self.wallpaperRequest_.response;
+ chrome.wallpaperPrivate.setWallpaper(image,
+ selectedItem.layout,
+ wallpaperURL,
+ self.onFinished_.bind(self));
+ self.currentWallpaper_ = wallpaperURL;
+ } else {
+ self.butterBar_.showError_(str('downloadFailed'),
+ {help_url: LEARN_MORE_URL});
+ }
+ self.wallpaperRequest_ = null;
+ });
});
}
this.setWallpaperAttribution_(selectedItem);
diff --git a/chrome/common/extensions/api/wallpaper_private.json b/chrome/common/extensions/api/wallpaper_private.json
index ca0d054..042aecb 100644
--- a/chrome/common/extensions/api/wallpaper_private.json
+++ b/chrome/common/extensions/api/wallpaper_private.json
@@ -27,6 +27,28 @@
]
},
{
+ "name": "setWallpaperIfExist",
+ "type": "function",
+ "description": "Sets wallpaper if it exists in the local file system with specified layout",
+ "nodoc": "true",
+ "parameters": [
+ {
+ "type": "string",
+ "name": "url"
+ },
+ {
+ "type": "string",
+ "name": "layout",
+ "enum": [ "STRETCH", "CENTER", "CENTER_CROPPED"]
+ },
+ {
+ "type": "function",
+ "name": "callback",
+ "parameters": []
+ }
+ ]
+ },
+ {
"name": "setWallpaper",
"type": "function",
"description": "Sets wallpaper to the image from url with specified layout",
diff --git a/chrome/test/data/extensions/api_test/wallpaper_manager/test.js b/chrome/test/data/extensions/api_test/wallpaper_manager/test.js
index 0ef9076..c0bc95c 100644
--- a/chrome/test/data/extensions/api_test/wallpaper_manager/test.js
+++ b/chrome/test/data/extensions/api_test/wallpaper_manager/test.js
@@ -66,6 +66,18 @@ chrome.test.getConfig(function(config) {
}
});
},
+ function setWallpaperFromFileSystem() {
+ var url = "http://a.com:PORT/files/extensions/api_test" +
+ "/wallpaper_manager/test.jpg";
+ url = url.replace(/PORT/, config.testServer.port);
+ chrome.wallpaperPrivate.setWallpaperIfExist(url, 'CENTER_CROPPED',
+ pass(function() {
+ chrome.test.assertNoLastError();
+ chrome.wallpaperPrivate.setWallpaperIfExist(
+ 'http://dummyurl/test1.jpg', 'CENTER_CROPPED',
+ fail('Failed to set wallpaper test1.jpg from file system.'));
+ }));
+ },
function getAndSetThumbnail() {
var url = "http://a.com:PORT/files/extensions/api_test" +
"/wallpaper_manager/test.jpg";