| Index: chrome/browser/ui/webui/chromeos/image_source.cc
|
| diff --git a/chrome/browser/ui/webui/chromeos/image_source.cc b/chrome/browser/ui/webui/chromeos/image_source.cc
|
| index 726e9f6e371ff133ecb85c3cd13edbcc3c20c635..84ddaeb8fbed010fb55b7eeaada6bb5de620e501 100644
|
| --- a/chrome/browser/ui/webui/chromeos/image_source.cc
|
| +++ b/chrome/browser/ui/webui/chromeos/image_source.cc
|
| @@ -21,9 +21,40 @@ namespace chromeos {
|
| namespace {
|
|
|
| const char* kWhitelistedFiles[] = {
|
| - "fcc/label.png"
|
| + "fcc/label.png"
|
| };
|
|
|
| +// Callback for user_manager::UserImageLoader.
|
| +void ImageLoaded(
|
| + const content::URLDataSource::GotDataCallback& got_data_callback,
|
| + const user_manager::UserImage& user_image) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + if (user_image.has_raw_image())
|
| + got_data_callback.Run(new base::RefCountedBytes(user_image.raw_image()));
|
| + else
|
| + got_data_callback.Run(NULL);
|
| +}
|
| +
|
| +// Looks for the image at |path| under the shared assets directory.
|
| +void StartOnBlockingPool(
|
| + const std::string& path,
|
| + scoped_refptr<UserImageLoader> image_loader,
|
| + const content::URLDataSource::GotDataCallback& got_data_callback,
|
| + scoped_refptr<base::MessageLoopProxy> message_loop_proxy) {
|
| + DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
|
| +
|
| + const base::FilePath asset_dir(FILE_PATH_LITERAL(chrome::kChromeOSAssetPath));
|
| + const base::FilePath image_path = asset_dir.AppendASCII(path);
|
| + if (base::PathExists(image_path)) {
|
| + image_loader->Start(image_path.value(), 0,
|
| + base::Bind(&ImageLoaded, got_data_callback));
|
| + } else {
|
| + message_loop_proxy->PostTask(FROM_HERE,
|
| + base::Bind(got_data_callback, nullptr));
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| ImageSource::ImageSource() : weak_factory_(this) {
|
| @@ -45,17 +76,24 @@ void ImageSource::StartDataRequest(
|
| const std::string& path,
|
| int render_process_id,
|
| int render_frame_id,
|
| - const content::URLDataSource::GotDataCallback& callback) {
|
| + const content::URLDataSource::GotDataCallback& got_data_callback) {
|
| if (!IsWhitelisted(path)) {
|
| - callback.Run(NULL);
|
| + got_data_callback.Run(NULL);
|
| return;
|
| }
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&ImageSource::StartOnFileThread,
|
| - weak_factory_.GetWeakPtr(),
|
| +
|
| + if (!image_loader_) {
|
| + image_loader_ = new UserImageLoader(ImageDecoder::DEFAULT_CODEC,
|
| + task_runner_);
|
| + }
|
| +
|
| + content::BrowserThread::GetBlockingPool()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&StartOnBlockingPool,
|
| path,
|
| - callback));
|
| + image_loader_,
|
| + got_data_callback,
|
| + base::MessageLoopProxy::current()));
|
| }
|
|
|
| std::string ImageSource::GetMimeType(const std::string& path) const {
|
| @@ -66,35 +104,6 @@ std::string ImageSource::GetMimeType(const std::string& path) const {
|
| return mime_type;
|
| }
|
|
|
| -void ImageSource::StartOnFileThread(
|
| - const std::string& path,
|
| - const content::URLDataSource::GotDataCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| -
|
| - base::FilePath file_path(chrome::kChromeOSAssetPath + path);
|
| - if (!base::PathExists(file_path)) {
|
| - callback.Run(NULL);
|
| - return;
|
| - }
|
| -
|
| - image_loader_ = new UserImageLoader(ImageDecoder::DEFAULT_CODEC,
|
| - task_runner_);
|
| - image_loader_->Start(file_path.value(),
|
| - 0,
|
| - base::Bind(&ImageSource::ImageLoaded,
|
| - weak_factory_.GetWeakPtr(),
|
| - callback));
|
| -}
|
| -
|
| -void ImageSource::ImageLoaded(
|
| - const content::URLDataSource::GotDataCallback& callback,
|
| - const user_manager::UserImage& user_image) const {
|
| - if (user_image.has_raw_image())
|
| - callback.Run(new base::RefCountedBytes(user_image.raw_image()));
|
| - else
|
| - callback.Run(NULL);
|
| -}
|
| -
|
| bool ImageSource::IsWhitelisted(const std::string& path) const {
|
| const char** end = kWhitelistedFiles + arraysize(kWhitelistedFiles);
|
| return std::find(kWhitelistedFiles, end, path) != end;
|
|
|