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

Side by Side Diff: chrome/browser/chromeos/login/user_image_loader.cc

Issue 11968044: Fix login visual hitch on chromebook (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/login/user_image_loader.h" 5 #include "chrome/browser/chromeos/login/user_image_loader.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/threading/worker_pool.h"
12 #include "chrome/browser/chromeos/login/helper.h" 13 #include "chrome/browser/chromeos/login/helper.h"
13 #include "chrome/browser/chromeos/login/user_image.h" 14 #include "chrome/browser/chromeos/login/user_image.h"
14 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
15 #include "skia/ext/image_operations.h" 16 #include "skia/ext/image_operations.h"
16 #include "third_party/skia/include/core/SkBitmap.h" 17 #include "third_party/skia/include/core/SkBitmap.h"
17 #include "ui/gfx/codec/png_codec.h" 18 #include "ui/gfx/codec/png_codec.h"
18 #include "ui/gfx/skbitmap_operations.h" 19 #include "ui/gfx/skbitmap_operations.h"
19 20
20 using content::BrowserThread; 21 using content::BrowserThread;
21 22
22 namespace chromeos { 23 namespace chromeos {
23 24
25 // static
26 const char* UserImageLoader::kUserImageLoaderTokenName = "user-image-loader";
27
24 UserImageLoader::ImageInfo::ImageInfo(int size, 28 UserImageLoader::ImageInfo::ImageInfo(int size,
25 const LoadedCallback& loaded_cb) 29 const LoadedCallback& loaded_cb)
26 : size(size), 30 : size(size),
27 loaded_cb(loaded_cb) { 31 loaded_cb(loaded_cb) {
28 } 32 }
29 33
30 UserImageLoader::ImageInfo::~ImageInfo() { 34 UserImageLoader::ImageInfo::~ImageInfo() {
31 } 35 }
32 36
33 UserImageLoader::UserImageLoader(ImageDecoder::ImageCodec image_codec) 37 UserImageLoader::UserImageLoader(ImageDecoder::ImageCodec image_codec)
34 : target_message_loop_(NULL), 38 : target_message_loop_(NULL),
35 image_codec_(image_codec) { 39 image_codec_(image_codec) {
40 sequence_token_ =
41 BrowserThread::GetBlockingPool()->
42 GetNamedSequenceToken(kUserImageLoaderTokenName);
Nikita (slow) 2013/01/18 16:40:13 This does mean that there would no 2 image loading
Joao da Silva 2013/01/18 17:24:58 AFAICT the ImageDecoder spawns a utility process t
Nikita (slow) 2013/01/18 17:41:45 My point was that first it will load image using t
36 } 43 }
37 44
38 UserImageLoader::~UserImageLoader() { 45 UserImageLoader::~UserImageLoader() {
39 } 46 }
40 47
41 void UserImageLoader::Start(const std::string& filepath, 48 void UserImageLoader::Start(const std::string& filepath,
42 int size, 49 int size,
43 const LoadedCallback& loaded_cb) { 50 const LoadedCallback& loaded_cb) {
44 target_message_loop_ = MessageLoop::current(); 51 target_message_loop_ = MessageLoop::current();
45 52
46 ImageInfo image_info(size, loaded_cb); 53 ImageInfo image_info(size, loaded_cb);
47 BrowserThread::PostTask( 54 scoped_refptr<base::SequencedTaskRunner> task_runner =
48 BrowserThread::FILE, FROM_HERE, 55 BrowserThread::GetBlockingPool()->
56 GetSequencedTaskRunnerWithShutdownBehavior(
57 sequence_token_, base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
58 task_runner->PostTask(
59 FROM_HERE,
49 base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info)); 60 base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info));
50 } 61 }
51 62
52 void UserImageLoader::LoadImage(const std::string& filepath, 63 void UserImageLoader::LoadImage(const std::string& filepath,
53 const ImageInfo& image_info) { 64 const ImageInfo& image_info) {
54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 65 DCHECK(BrowserThread::GetBlockingPool()->
66 IsRunningSequenceOnCurrentThread(sequence_token_));
55 67
56 std::string image_data; 68 std::string image_data;
57 file_util::ReadFileToString(FilePath(filepath), &image_data); 69 file_util::ReadFileToString(FilePath(filepath), &image_data);
58 70
59 scoped_refptr<ImageDecoder> image_decoder = 71 scoped_refptr<ImageDecoder> image_decoder =
60 new ImageDecoder(this, image_data, image_codec_); 72 new ImageDecoder(this, image_data, image_codec_);
61 image_info_map_.insert(std::make_pair(image_decoder.get(), image_info)); 73 image_info_map_.insert(std::make_pair(image_decoder.get(), image_info));
62 image_decoder->Start(); 74 image_decoder->Start(kUserImageLoaderTokenName);
Joao da Silva 2013/01/18 17:24:58 The current task_runner could be passed instead of
63 } 75 }
64 76
65 void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, 77 void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder,
66 const SkBitmap& decoded_image) { 78 const SkBitmap& decoded_image) {
67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 79 DCHECK(BrowserThread::GetBlockingPool()->
80 IsRunningSequenceOnCurrentThread(sequence_token_));
68 81
69 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); 82 ImageInfoMap::iterator info_it = image_info_map_.find(decoder);
70 if (info_it == image_info_map_.end()) { 83 if (info_it == image_info_map_.end()) {
71 NOTREACHED(); 84 NOTREACHED();
72 return; 85 return;
73 } 86 }
74 87
75 const ImageInfo& image_info = info_it->second; 88 const ImageInfo& image_info = info_it->second;
76 SkBitmap final_image = decoded_image; 89 SkBitmap final_image = decoded_image;
77 90
(...skipping 21 matching lines...) Expand all
99 if (image_codec_ == ImageDecoder::ROBUST_JPEG_CODEC) 112 if (image_codec_ == ImageDecoder::ROBUST_JPEG_CODEC)
100 user_image.MarkAsSafe(); 113 user_image.MarkAsSafe();
101 target_message_loop_->PostTask( 114 target_message_loop_->PostTask(
102 FROM_HERE, 115 FROM_HERE,
103 base::Bind(image_info.loaded_cb, user_image)); 116 base::Bind(image_info.loaded_cb, user_image));
104 117
105 image_info_map_.erase(info_it); 118 image_info_map_.erase(info_it);
106 } 119 }
107 120
108 void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) { 121 void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) {
109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 122 DCHECK(BrowserThread::GetBlockingPool()->
123 IsRunningSequenceOnCurrentThread(sequence_token_));
110 124
111 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); 125 ImageInfoMap::iterator info_it = image_info_map_.find(decoder);
112 if (info_it == image_info_map_.end()) { 126 if (info_it == image_info_map_.end()) {
113 NOTREACHED(); 127 NOTREACHED();
114 return; 128 return;
115 } 129 }
116 130
117 const ImageInfo& image_info = info_it->second; 131 const ImageInfo& image_info = info_it->second;
118 target_message_loop_->PostTask( 132 target_message_loop_->PostTask(
119 FROM_HERE, 133 FROM_HERE,
120 base::Bind(image_info.loaded_cb, UserImage())); 134 base::Bind(image_info.loaded_cb, UserImage()));
121 image_info_map_.erase(decoder); 135 image_info_map_.erase(decoder);
122 } 136 }
123 137
124 } // namespace chromeos 138 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698