15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/user_image_source.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user_image/default_user_images.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "grit/ui_chromeos_resources.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "net/base/escape.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/url_parse.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parses the user image URL, which looks like
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// "chrome://userimage/user@host?key1=value1&...&key_n=value_n",
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// to user email.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParseRequest(const GURL& url,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  std::string* email) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(url.is_valid());
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  *email = net::UnescapeURLComponent(url.path().substr(1),
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    (net::UnescapeRule::URL_SPECIAL_CHARS |
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                     net::UnescapeRule::SPACES));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::RefCountedMemory* UserImageSource::GetUserImage(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& email,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ScaleFactor scale_factor) const {
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const user_manager::User* user =
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->FindUser(email);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (user) {
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (user->has_raw_image()) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new base::RefCountedBytes(user->raw_image());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (user->image_is_stub()) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ResourceBundle::GetSharedInstance().
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LoadDataResourceBytesForScale(IDR_PROFILE_PICTURE_LOADING,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        scale_factor);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (user->HasDefaultImage()) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ResourceBundle::GetSharedInstance().
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LoadDataResourceBytesForScale(
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              user_manager::kDefaultImageResourceIDs[user->image_index()],
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              scale_factor);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "User with custom image missing raw data";
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ResourceBundle::GetSharedInstance().
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadDataResourceBytesForScale(IDR_LOGIN_DEFAULT_USER, scale_factor);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserImageSource::UserImageSource() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UserImageSource::~UserImageSource() {}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string UserImageSource::GetSource() const {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return chrome::kChromeUIUserImageHost;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserImageSource::StartDataRequest(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& path,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int render_process_id,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::URLDataSource::GotDataCallback& callback) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string email;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(chrome::kChromeUIUserImageURL + path);
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ParseRequest(url, &email);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callback.Run(GetUserImage(email, ui::SCALE_FACTOR_100P));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string UserImageSource::GetMimeType(const std::string& path) const {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to explicitly return a mime type, otherwise if the user tries to
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // drag the image they get no extension.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "image/png";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
91