diff options
| author | bshe@chromium.org <bshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-17 15:18:09 +0000 | 
|---|---|---|
| committer | bshe@chromium.org <bshe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-17 15:18:09 +0000 | 
| commit | 032e2ee5d6e914ab7d783dd6c6a01fa6ad16b89e (patch) | |
| tree | b79bdf308db609082e604f09f774efd2f6e6d107 | |
| parent | 6cdaff796bcacf7c07b6ce6d07f4136843d12da6 (diff) | |
| download | chromium_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
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"; | 
