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

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc

Issue 10532048: [cros] Initial WebRTC-enabled implementation of user image picker on OOBE. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ImageDecoder leak. Created 8 years, 6 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/ui/webui/chromeos/login/user_image_screen_handler.h" 5 #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h"
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
11 #include "base/values.h" 12 #include "base/values.h"
12 #include "chrome/browser/chromeos/login/camera_detector.h" 13 #include "chrome/browser/chromeos/login/camera_detector.h"
13 #include "chrome/browser/chromeos/login/default_user_images.h" 14 #include "chrome/browser/chromeos/login/default_user_images.h"
14 #include "chrome/browser/chromeos/login/user.h" 15 #include "chrome/browser/chromeos/login/user.h"
15 #include "chrome/browser/chromeos/login/webui_login_display.h" 16 #include "chrome/browser/chromeos/login/webui_login_display.h"
16 #include "chrome/browser/chromeos/options/take_photo_dialog.h" 17 #include "chrome/browser/chromeos/options/take_photo_dialog.h"
17 #include "chrome/browser/ui/webui/web_ui_util.h" 18 #include "chrome/browser/ui/webui/web_ui_util.h"
19 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/url_constants.h" 20 #include "chrome/common/url_constants.h"
21 #include "googleurl/src/gurl.h"
19 #include "grit/generated_resources.h" 22 #include "grit/generated_resources.h"
23 #include "net/base/data_url.h"
20 #include "ui/base/l10n/l10n_util.h" 24 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/views/widget/widget.h" 25 #include "ui/views/widget/widget.h"
22 26
23 namespace { 27 namespace {
24 28
25 // UserImage screen ID. 29 // UserImage screen ID.
26 const char kUserImageScreen[] = "user-image"; 30 const char kUserImageScreen[] = "user-image";
27 31
28 } // namespace 32 } // namespace
29 33
30 namespace chromeos { 34 namespace chromeos {
31 35
32 UserImageScreenHandler::UserImageScreenHandler() 36 UserImageScreenHandler::UserImageScreenHandler()
33 : screen_(NULL), 37 : screen_(NULL),
34 show_on_init_(false), 38 show_on_init_(false),
35 selected_image_(User::kInvalidImageIndex), 39 selected_image_(User::kInvalidImageIndex),
40 accept_photo_after_decoding_(false),
36 user_photo_data_url_(chrome::kAboutBlankURL), 41 user_photo_data_url_(chrome::kAboutBlankURL),
37 profile_picture_data_url_(chrome::kAboutBlankURL), 42 profile_picture_data_url_(chrome::kAboutBlankURL),
38 profile_picture_absent_(false), 43 profile_picture_absent_(false),
39 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { 44 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
40 } 45 }
41 46
42 UserImageScreenHandler::~UserImageScreenHandler() { 47 UserImageScreenHandler::~UserImageScreenHandler() {
Nikita (slow) 2012/06/13 14:32:59 if (image_decoder_.get()) image_decoder_->set_d
Ivan Korotkov 2012/06/13 14:40:55 Done.
43 if (screen_) 48 if (screen_)
44 screen_->OnActorDestroyed(this); 49 screen_->OnActorDestroyed(this);
45 } 50 }
46 51
47 void UserImageScreenHandler::GetLocalizedStrings( 52 void UserImageScreenHandler::GetLocalizedStrings(
48 DictionaryValue *localized_strings) { 53 DictionaryValue *localized_strings) {
49 // TODO(ivankr): string should be renamed to something like 54 // TODO(ivankr): string should be renamed to something like
50 // IDS_USER_IMAGE_SCREEN_TITLE (currently used for Take Photo dialog). 55 // IDS_USER_IMAGE_SCREEN_TITLE (currently used for Take Photo dialog).
51 localized_strings->SetString("userImageScreenTitle", 56 localized_strings->SetString("userImageScreenTitle",
52 l10n_util::GetStringUTF16(IDS_OOBE_PICTURE)); 57 l10n_util::GetStringUTF16(IDS_OOBE_PICTURE));
53 localized_strings->SetString("userImageScreenDescription", 58 localized_strings->SetString("userImageScreenDescription",
54 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT)); 59 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT));
55 localized_strings->SetString("takePhoto", 60 localized_strings->SetString("takePhoto",
56 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO)); 61 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO));
57 localized_strings->SetString("profilePhoto", 62 localized_strings->SetString("profilePhoto",
58 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_PHOTO)); 63 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_PHOTO));
59 localized_strings->SetString("profilePhotoLoading", 64 localized_strings->SetString("profilePhotoLoading",
60 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO)); 65 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO));
61 localized_strings->SetString("okButtonText", 66 localized_strings->SetString("okButtonText",
62 l10n_util::GetStringUTF16(IDS_OK)); 67 l10n_util::GetStringUTF16(IDS_OK));
68 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
69 localized_strings->SetString("cameraType", "webrtc");
70 else
71 localized_strings->SetString("cameraType", "old");
63 } 72 }
64 73
65 void UserImageScreenHandler::Initialize() { 74 void UserImageScreenHandler::Initialize() {
66 ListValue image_urls; 75 ListValue image_urls;
67 for (int i = 0; i < kDefaultImagesCount; ++i) { 76 for (int i = 0; i < kDefaultImagesCount; ++i) {
68 image_urls.Append(new StringValue(GetDefaultImageUrl(i))); 77 image_urls.Append(new StringValue(GetDefaultImageUrl(i)));
69 } 78 }
70 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserImages", 79 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserImages",
71 image_urls); 80 image_urls);
72 81
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void UserImageScreenHandler::UpdateVideoFrame(const SkBitmap& frame) { 129 void UserImageScreenHandler::UpdateVideoFrame(const SkBitmap& frame) {
121 } 130 }
122 131
123 void UserImageScreenHandler::ShowCameraError() { 132 void UserImageScreenHandler::ShowCameraError() {
124 } 133 }
125 134
126 void UserImageScreenHandler::ShowCameraInitializing() { 135 void UserImageScreenHandler::ShowCameraInitializing() {
127 } 136 }
128 137
129 void UserImageScreenHandler::CheckCameraPresence() { 138 void UserImageScreenHandler::CheckCameraPresence() {
139 // For WebRTC, camera presence checked is done on JS side.
140 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
141 return;
130 CameraDetector::StartPresenceCheck( 142 CameraDetector::StartPresenceCheck(
131 base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone, 143 base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone,
132 weak_factory_.GetWeakPtr())); 144 weak_factory_.GetWeakPtr()));
133 } 145 }
134 146
135 bool UserImageScreenHandler::IsCapturing() const { 147 bool UserImageScreenHandler::IsCapturing() const {
136 return false; 148 return false;
137 } 149 }
138 150
139 void UserImageScreenHandler::RegisterMessages() { 151 void UserImageScreenHandler::RegisterMessages() {
140 web_ui()->RegisterMessageCallback("takePhoto", 152 web_ui()->RegisterMessageCallback("takePhoto",
141 base::Bind(&UserImageScreenHandler::HandleTakePhoto, 153 base::Bind(&UserImageScreenHandler::HandleTakePhoto,
142 base::Unretained(this))); 154 base::Unretained(this)));
155 web_ui()->RegisterMessageCallback("photoTaken",
156 base::Bind(&UserImageScreenHandler::HandlePhotoTaken,
157 base::Unretained(this)));
143 web_ui()->RegisterMessageCallback("selectImage", 158 web_ui()->RegisterMessageCallback("selectImage",
144 base::Bind(&UserImageScreenHandler::HandleSelectImage, 159 base::Bind(&UserImageScreenHandler::HandleSelectImage,
145 base::Unretained(this))); 160 base::Unretained(this)));
146 web_ui()->RegisterMessageCallback("onUserImageAccepted", 161 web_ui()->RegisterMessageCallback("onUserImageAccepted",
147 base::Bind(&UserImageScreenHandler::HandleImageAccepted, 162 base::Bind(&UserImageScreenHandler::HandleImageAccepted,
148 base::Unretained(this))); 163 base::Unretained(this)));
149 web_ui()->RegisterMessageCallback("onUserImageScreenShown", 164 web_ui()->RegisterMessageCallback("onUserImageScreenShown",
150 base::Bind(&UserImageScreenHandler::HandleScreenShown, 165 base::Bind(&UserImageScreenHandler::HandleScreenShown,
151 base::Unretained(this))); 166 base::Unretained(this)));
152 } 167 }
(...skipping 22 matching lines...) Expand all
175 190
176 void UserImageScreenHandler::OnPhotoAccepted(const gfx::ImageSkia& photo) { 191 void UserImageScreenHandler::OnPhotoAccepted(const gfx::ImageSkia& photo) {
177 user_photo_ = photo; 192 user_photo_ = photo;
178 user_photo_data_url_ = web_ui_util::GetImageDataUrl(user_photo_); 193 user_photo_data_url_ = web_ui_util::GetImageDataUrl(user_photo_);
179 selected_image_ = User::kExternalImageIndex; 194 selected_image_ = User::kExternalImageIndex;
180 base::StringValue data_url(user_photo_data_url_); 195 base::StringValue data_url(user_photo_data_url_);
181 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserPhoto", 196 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserPhoto",
182 data_url); 197 data_url);
183 } 198 }
184 199
200 void UserImageScreenHandler::HandlePhotoTaken(const base::ListValue* args) {
201 std::string image_url;
202 if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
203 NOTREACHED();
204 DCHECK(!image_url.empty());
205
206 std::string mime_type, charset, raw_data;
207 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
208 NOTREACHED();
209 DCHECK_EQ("image/png", mime_type);
210
211 user_photo_ = gfx::ImageSkia();
212 user_photo_data_url_ = image_url;
213
214 if (image_decoder_.get())
215 image_decoder_->set_delegate(NULL);
216 image_decoder_ = new ImageDecoder(this, raw_data);
217 image_decoder_->Start();
218 }
219
185 void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) { 220 void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) {
186 DCHECK(args && args->empty()); 221 DCHECK(args && args->empty());
187 views::Widget* window = views::Widget::CreateWindowWithParent( 222 views::Widget* window = views::Widget::CreateWindowWithParent(
188 new TakePhotoDialog(this), GetNativeWindow()); 223 new TakePhotoDialog(this), GetNativeWindow());
189 window->SetAlwaysOnTop(true); 224 window->SetAlwaysOnTop(true);
190 window->Show(); 225 window->Show();
191 } 226 }
192 227
193 void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) { 228 void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) {
194 std::string image_url; 229 std::string image_url;
195 if (!args || 230 if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
196 args->GetSize() != 1 ||
197 !args->GetString(0, &image_url)) {
198 NOTREACHED(); 231 NOTREACHED();
199 return;
200 }
201 if (image_url.empty()) 232 if (image_url.empty())
202 return; 233 return;
203 234
204 int user_image_index = User::kInvalidImageIndex; 235 int user_image_index = User::kInvalidImageIndex;
205 if (IsDefaultImageUrl(image_url, &user_image_index)) { 236 if (IsDefaultImageUrl(image_url, &user_image_index)) {
206 selected_image_ = user_image_index; 237 selected_image_ = user_image_index;
207 } else if (image_url == user_photo_data_url_) { 238 } else if (image_url == user_photo_data_url_) {
208 selected_image_ = User::kExternalImageIndex; 239 selected_image_ = User::kExternalImageIndex;
209 } else { 240 } else {
210 selected_image_ = User::kProfileImageIndex; 241 selected_image_ = User::kProfileImageIndex;
211 } 242 }
212 } 243 }
213 244
214 void UserImageScreenHandler::HandleImageAccepted(const base::ListValue* args) { 245 void UserImageScreenHandler::HandleImageAccepted(const base::ListValue* args) {
215 DCHECK(args && args->empty()); 246 DCHECK(args && args->empty());
216 if (!screen_) 247 if (!screen_)
217 return; 248 return;
218 switch (selected_image_) { 249 switch (selected_image_) {
219 case User::kExternalImageIndex: 250 case User::kExternalImageIndex:
220 screen_->OnPhotoTaken(user_photo_); 251 // Photo decoding may not have been finished yet.
252 if (user_photo_.empty())
253 accept_photo_after_decoding_ = true;
254 else
255 screen_->OnPhotoTaken(user_photo_);
221 break; 256 break;
222 257
223 case User::kProfileImageIndex: 258 case User::kProfileImageIndex:
224 screen_->OnProfileImageSelected(); 259 screen_->OnProfileImageSelected();
225 break; 260 break;
226 261
227 default: 262 default:
228 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); 263 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount);
229 screen_->OnDefaultImageSelected(selected_image_); 264 screen_->OnDefaultImageSelected(selected_image_);
230 } 265 }
231 } 266 }
232 267
233 void UserImageScreenHandler::HandleScreenShown(const base::ListValue* args) { 268 void UserImageScreenHandler::HandleScreenShown(const base::ListValue* args) {
234 DCHECK(args && args->empty()); 269 DCHECK(args && args->empty());
235 DCHECK(!screen_show_time_.is_null()); 270 DCHECK(!screen_show_time_.is_null());
236 271
237 base::TimeDelta delta = base::Time::Now() - screen_show_time_; 272 base::TimeDelta delta = base::Time::Now() - screen_show_time_;
238 VLOG(1) << "Screen load time: " << delta.InSecondsF(); 273 VLOG(1) << "Screen load time: " << delta.InSecondsF();
239 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta); 274 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta);
240 } 275 }
241 276
242 void UserImageScreenHandler::OnCameraPresenceCheckDone() { 277 void UserImageScreenHandler::OnCameraPresenceCheckDone() {
243 base::FundamentalValue present_value( 278 base::FundamentalValue present_value(
244 CameraDetector::camera_presence() == CameraDetector::kCameraPresent); 279 CameraDetector::camera_presence() == CameraDetector::kCameraPresent);
245 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setCameraPresent", 280 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setCameraPresent",
246 present_value); 281 present_value);
247 } 282 }
248 283
284 void UserImageScreenHandler::OnImageDecoded(const ImageDecoder* decoder,
285 const SkBitmap& decoded_image) {
286 DCHECK_EQ(image_decoder_.get(), decoder);
287 user_photo_ = gfx::ImageSkia(decoded_image);
288 image_decoder_.release();
Nikita (slow) 2012/06/13 14:32:59 image_decoder_ = NULL;
Ivan Korotkov 2012/06/13 14:40:55 Done.
289 if (screen_ && accept_photo_after_decoding_)
290 screen_->OnPhotoTaken(user_photo_);
291 }
292
293 void UserImageScreenHandler::OnDecodeImageFailed(const ImageDecoder* decoder) {
294 NOTREACHED() << "Failed to decode PNG image from WebUI";
295 }
296
249 } // namespace chromeos 297 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698