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

Unified Diff: chrome/browser/chromeos/extensions/wallpaper_manager_api.cc

Issue 10754014: Wallpaper manager backend APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix a crash when try to cancel previous request which had finished. Add more error message. Created 8 years, 5 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
Index: chrome/browser/chromeos/extensions/wallpaper_manager_api.cc
diff --git a/chrome/browser/chromeos/extensions/wallpaper_manager_api.cc b/chrome/browser/chromeos/extensions/wallpaper_manager_api.cc
index 89cdcc3a7752beb64ccfeb283a2cb7652b684f47..79d138c8277fb66a3b5cf56dcf057d7ab6fe61c5 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_manager_api.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_manager_api.cc
@@ -6,9 +6,12 @@
#include "base/command_line.h"
#include "base/file_util.h"
+#include "base/json/json_writer.h"
#include "base/path_service.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/chromeos/login/wallpaper_manager.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -20,11 +23,62 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request_status.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
using content::BrowserThread;
const char kWallpaperManagerDomain[] = "obklkkbkpaoaejdabbfldmcfplpdgolj";
+namespace {
+
+std::string GetIDFromCode(WallpaperErrorCode code) {
+ switch (code) {
+ case HTTP_BAD_REQUEST:
+ return "HTTP_BAD_REQUEST";
+ case HTTP_UNAUTHORIZED:
+ return "HTTP_UNAUTHORIZED";
+ case HTTP_FORBIDDEN:
+ return "HTTP_FORBIDDEN";
+ case HTTP_NOT_FOUND:
+ return "HTTP_NOT_FOUND";
+ case HTTP_CONFLICT:
+ return "HTTP_CONFLICT";
+ case HTTP_LENGTH_REQUIRED:
+ return "HTTP_LENGTH_REQUIRED";
+ case HTTP_PRECONDITION:
+ return "HTTP_PRECONDITION";
+ case HTTP_INTERNAL_SERVER_ERROR:
+ return "HTTP_INTERNAL_SERVER_ERROR";
+ case HTTP_SERVICE_UNAVAILABLE:
+ return "HTTP_SERVICE_UNAVAILABLE";
+ case WALLPAPER_NO_CONNECTION:
+ return "WALLPAPER_NO_CONNECTION";
+ case WALLPAPER_FILE_ERROR:
+ return "WALLPAPER_FILE_ERROR";
+ default:
+ return "DOWNLOAD_DEFAULT_ERROR";
+ }
+}
+
+} // namespace
+
+namespace events {
+
+ const char kDownloadStartEvent[] =
+ "wallpaperManagerPrivate.onDownloadStart";
+ const char kDownloadProgressEvent[] =
+ "wallpaperManagerPrivate.onDownloadProgress";
+ const char kDownloadDoneEvent[] =
+ "wallpaperManagerPrivate.onDownloadDone";
+ const char kDownloadErrorEvent[] =
+ "wallpaperManagerPrivate.onDownloadError";
+
+} // namespace events
+
namespace wallpaper_manager_util {
void OpenWallpaperManager() {
@@ -49,9 +103,256 @@ void OpenWallpaperManager() {
application_launch::OpenApplication(params);
} else {
Browser* browser = browser::FindOrCreateTabbedBrowser(
- ProfileManager::GetDefaultProfileOrOffTheRecord());
+ ProfileManager::GetDefaultProfileOrOffTheRecord());
chrome::ShowSettingsSubPage(browser, "setWallpaper");
}
}
-} // namespace wallpaper_manager_util
+} //namespace wallpaper_manager_util
+
+bool WallpaperManagerStringsFunction::RunImpl() {
+ DictionaryValue* dict = new DictionaryValue();
+ SetResult(dict);
+
+#define SET_STRING(ns, id) \
+ dict->SetString(#id, l10n_util::GetStringUTF16(ns##_##id))
+ SET_STRING(IDS_WALLPAPER_MANAGER, SEARCH_TEXT_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, AUTHOR_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, CUSTOM_CATEGORY_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, SELECT_CUSTOM_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, POSITION_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, COLOR_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, PREVIEW_LABEL);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_BAD_REQUEST);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_UNAUTHORIZED);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_FORBIDDEN);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_NOT_FOUND);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_CONFLICT);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_LENGTH_REQUIRED);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_PRECONDITION);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_INTERNAL_SERVER_ERROR);
+ SET_STRING(IDS_WALLPAPER_MANAGER, HTTP_SERVICE_UNAVAILABLE);
+ SET_STRING(IDS_WALLPAPER_MANAGER, WALLPAPER_NO_CONNECTION);
+ SET_STRING(IDS_WALLPAPER_MANAGER, WALLPAPER_FILE_ERROR);
+ SET_STRING(IDS_WALLPAPER_MANAGER, DOWNLOAD_DEFAULT_ERROR);
+ SET_STRING(IDS_OPTIONS, SET_WALLPAPER_DAILY);
+#undef SET_STRING
+
+ ChromeURLDataManager::DataSource::SetFontAndTextDirection(dict);
+
+ return true;
+}
+
+// static
+WallpaperManagerSetWallpaperFunction::WallpaperFetcher*
+ WallpaperManagerSetWallpaperFunction::fetcher_;
+
+WallpaperManagerSetWallpaperFunction::WallpaperFetcher::WallpaperFetcher(
+ scoped_refptr<WallpaperManagerSetWallpaperFunction> function)
+ : function_(function) {
+}
+
+void WallpaperManagerSetWallpaperFunction::WallpaperFetcher::Cancel() {
+ fetcher_.reset();
+ delete this;
+}
+
+void WallpaperManagerSetWallpaperFunction::WallpaperFetcher::Start(
+ const GURL& wallpaper_url, const FilePath& file_path) {
+ fetcher_.reset(net::URLFetcher::Create(wallpaper_url,
+ net::URLFetcher::GET,
+ this));
+ fetcher_->SetRequestContext(
+ g_browser_process->system_request_context());
+
+ fetcher_->SaveResponseToFileAtPath(
+ file_path,
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
+ fetcher_->Start();
+}
+
+void WallpaperManagerSetWallpaperFunction::WallpaperFetcher::OnURLFetchComplete(
+ const net::URLFetcher* source) {
+ function_->OnDownloadComplete(source);
+ delete this;
+}
+
+void WallpaperManagerSetWallpaperFunction::WallpaperFetcher
+ ::OnURLFetchDownloadProgress(const net::URLFetcher* source,
+ int64 current,
+ int64 total) {
+ if (source == fetcher_.get())
+ function_->OnDownloadProgress(source, current, total);
+}
+
+WallpaperManagerSetWallpaperFunction::~WallpaperManagerSetWallpaperFunction() {
+}
+
+bool WallpaperManagerSetWallpaperFunction::RunImpl() {
+ // First param is url of the selected wallpaper.
+ std::string url;
+ if (!args_->GetString(0, &url) || url.empty())
+ return false;
+ // Second param is the default layout of the selected wallpaper.
+ std::string layout_string;
+ if (!args_->GetString(1, &layout_string) || layout_string.empty()) {
+ return false;
+ }
+ layout_ = ash::GetLayoutEnum(layout_string.c_str());
+
+ // Gets email address while at UI thread.
+ email_ = chromeos::UserManager::Get()->GetLoggedInUser().email();
+
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(
+ &WallpaperManagerSetWallpaperFunction::RequestOnFileThread,
+ this, url));
+ // Will finish asynchronously.
+ return true;
+}
+
+void WallpaperManagerSetWallpaperFunction::OnDownloadComplete(
+ const net::URLFetcher* source) {
+ WallpaperErrorCode code = GetErrorCode(source);
+ if (code != HTTP_SUCCESS) {
+ DispatchErrorEvent(code);
+ fetcher_ = NULL;
+ return;
+ }
+ FilePath temp_file;
+ if (code == HTTP_SUCCESS &&
+ !source->GetResponseAsFilePath(true, &temp_file)) {
+ code = WALLPAPER_FILE_ERROR;
+ DispatchErrorEvent(code);
+ fetcher_ = NULL;
+ return;
+ }
+
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ std::string(kWallpaperManagerDomain),
+ events::kDownloadDoneEvent,
+ "[]", profile_, GURL());
+
+ FilePath path = wallpaper_dir_.Append(
+ source->GetOriginalURL().ExtractFileName());
+
+ chromeos::WallpaperManager::Get()->SetWallpaperFromFile(email_,
+ path.value(),
+ layout_);
+
+ fetcher_ = NULL;
+}
+
+void WallpaperManagerSetWallpaperFunction::OnDownloadProgress(
+ const net::URLFetcher* source,
+ int64 current,
+ int64 total) {
+ if (current >= bytes_wallpaper_download_progress_last_reported_ +
+ kBytesWallpaperDownloadProgressReportInterval) {
+ bytes_wallpaper_download_progress_last_reported_ = current;
+ base::TimeDelta time_remaining;
+ if (current > 0) {
+ const base::TimeDelta diff =
+ base::TimeTicks::Now() - tick_wallpaper_download_start_;
+ time_remaining = diff*(total - current)/current;
+
+ DictionaryValue* dict = new DictionaryValue();
+ dict->SetInteger("remainingTime", time_remaining.InMilliseconds());
+ dict->SetDouble("progress", static_cast<double>(current) / total);
+ ListValue args;
+ args.Append(dict);
+ std::string json_args;
+ base::JSONWriter::Write(&args, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ std::string(kWallpaperManagerDomain),
+ events::kDownloadProgressEvent,
+ json_args, profile_, GURL());
+ }
+ }
+}
+
+void WallpaperManagerSetWallpaperFunction::RequestOnFileThread(
+ const std::string& source_url) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir_));
+
+ GURL wallpaper_url(source_url);
+ if (!file_util::DirectoryExists(wallpaper_dir_) &&
+ !file_util::CreateDirectory(wallpaper_dir_)) {
+ DispatchErrorEvent(WALLPAPER_FILE_ERROR);
+ return;
+ }
+
+ FilePath file_path = wallpaper_dir_.Append(wallpaper_url.ExtractFileName());
+
+ // If the wallpaper was already downloaded, use it immediately.
+ if (file_util::PathExists(file_path)) {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(
+ &WallpaperManagerSetWallpaperFunction::SetWallpaperOnUIThread,
+ this,
+ file_path));
+ return;
+ }
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(
+ &WallpaperManagerSetWallpaperFunction::SetupFetcherOnUIThread,
+ this,
+ wallpaper_url));
+}
+
+void WallpaperManagerSetWallpaperFunction::SetWallpaperOnUIThread(
+ const FilePath& file_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ chromeos::WallpaperManager::Get()->SetWallpaperFromFile(email_,
+ file_path.value(),
+ layout_);
+}
+
+void WallpaperManagerSetWallpaperFunction::SetupFetcherOnUIThread(
+ const GURL& wallpaper_url) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ tick_wallpaper_download_start_ = base::TimeTicks::Now();
+ bytes_wallpaper_download_progress_last_reported_ = 0;
+
+ if (fetcher_)
+ fetcher_->Cancel();
+ fetcher_ = new WallpaperFetcher(this);
+ FilePath file_path = wallpaper_dir_.Append(wallpaper_url.ExtractFileName());
+ fetcher_->Start(wallpaper_url, file_path);
+
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ std::string(kWallpaperManagerDomain),
+ events::kDownloadStartEvent,
+ "[]", profile_, GURL());
+}
+
+WallpaperErrorCode WallpaperManagerSetWallpaperFunction::GetErrorCode(
+ const net::URLFetcher* source) const {
+ WallpaperErrorCode code = static_cast<WallpaperErrorCode>(
+ source->GetResponseCode());
+ if (code == HTTP_SUCCESS && !source->GetStatus().is_success()) {
+ // If the HTTP response code is SUCCESS yet the URL request failed, it is
+ // likely that the failure is due to loss of connection.
+ code = WALLPAPER_NO_CONNECTION;
+ }
+ return code;
+}
+
+void WallpaperManagerSetWallpaperFunction::DispatchErrorEvent(
+ WallpaperErrorCode code) {
+ DictionaryValue* dict = new DictionaryValue();
+ dict->SetString("errorMessageID", GetIDFromCode(code));
+ ListValue args;
+ args.Append(dict);
+ std::string json_args;
+ base::JSONWriter::Write(&args, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ std::string(kWallpaperManagerDomain),
+ events::kDownloadErrorEvent,
+ json_args, profile_, GURL());
+}

Powered by Google App Engine
This is Rietveld 408576698