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