| Index: chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc
|
| diff --git a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc
|
| index f7f4fc06b5a7ee3d4308601eee97d0bd17f81120..17d190a7c43c2a374fda788c48b53eb6703eba05 100644
|
| --- a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc
|
| +++ b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +#include "base/command_line.h"
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/values.h"
|
| @@ -15,8 +16,11 @@
|
| #include "chrome/browser/chromeos/login/webui_login_display.h"
|
| #include "chrome/browser/chromeos/options/take_photo_dialog.h"
|
| #include "chrome/browser/ui/webui/web_ui_util.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/url_constants.h"
|
| +#include "googleurl/src/gurl.h"
|
| #include "grit/generated_resources.h"
|
| +#include "net/base/data_url.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/views/widget/widget.h"
|
|
|
| @@ -33,6 +37,7 @@ UserImageScreenHandler::UserImageScreenHandler()
|
| : screen_(NULL),
|
| show_on_init_(false),
|
| selected_image_(User::kInvalidImageIndex),
|
| + accept_photo_after_decoding_(false),
|
| user_photo_data_url_(chrome::kAboutBlankURL),
|
| profile_picture_data_url_(chrome::kAboutBlankURL),
|
| profile_picture_absent_(false),
|
| @@ -42,6 +47,8 @@ UserImageScreenHandler::UserImageScreenHandler()
|
| UserImageScreenHandler::~UserImageScreenHandler() {
|
| if (screen_)
|
| screen_->OnActorDestroyed(this);
|
| + if (image_decoder_.get())
|
| + image_decoder_->set_delegate(NULL);
|
| }
|
|
|
| void UserImageScreenHandler::GetLocalizedStrings(
|
| @@ -60,6 +67,10 @@ void UserImageScreenHandler::GetLocalizedStrings(
|
| l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO));
|
| localized_strings->SetString("okButtonText",
|
| l10n_util::GetStringUTF16(IDS_OK));
|
| + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
|
| + localized_strings->SetString("cameraType", "webrtc");
|
| + else
|
| + localized_strings->SetString("cameraType", "old");
|
| }
|
|
|
| void UserImageScreenHandler::Initialize() {
|
| @@ -127,6 +138,9 @@ void UserImageScreenHandler::ShowCameraInitializing() {
|
| }
|
|
|
| void UserImageScreenHandler::CheckCameraPresence() {
|
| + // For WebRTC, camera presence checked is done on JS side.
|
| + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
|
| + return;
|
| CameraDetector::StartPresenceCheck(
|
| base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone,
|
| weak_factory_.GetWeakPtr()));
|
| @@ -140,6 +154,9 @@ void UserImageScreenHandler::RegisterMessages() {
|
| web_ui()->RegisterMessageCallback("takePhoto",
|
| base::Bind(&UserImageScreenHandler::HandleTakePhoto,
|
| base::Unretained(this)));
|
| + web_ui()->RegisterMessageCallback("photoTaken",
|
| + base::Bind(&UserImageScreenHandler::HandlePhotoTaken,
|
| + base::Unretained(this)));
|
| web_ui()->RegisterMessageCallback("selectImage",
|
| base::Bind(&UserImageScreenHandler::HandleSelectImage,
|
| base::Unretained(this)));
|
| @@ -182,6 +199,26 @@ void UserImageScreenHandler::OnPhotoAccepted(const gfx::ImageSkia& photo) {
|
| data_url);
|
| }
|
|
|
| +void UserImageScreenHandler::HandlePhotoTaken(const base::ListValue* args) {
|
| + std::string image_url;
|
| + if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
|
| + NOTREACHED();
|
| + DCHECK(!image_url.empty());
|
| +
|
| + std::string mime_type, charset, raw_data;
|
| + if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
|
| + NOTREACHED();
|
| + DCHECK_EQ("image/png", mime_type);
|
| +
|
| + user_photo_ = gfx::ImageSkia();
|
| + user_photo_data_url_ = image_url;
|
| +
|
| + if (image_decoder_.get())
|
| + image_decoder_->set_delegate(NULL);
|
| + image_decoder_ = new ImageDecoder(this, raw_data);
|
| + image_decoder_->Start();
|
| +}
|
| +
|
| void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) {
|
| DCHECK(args && args->empty());
|
| views::Widget* window = views::Widget::CreateWindowWithParent(
|
| @@ -192,12 +229,8 @@ void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) {
|
|
|
| void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) {
|
| std::string image_url;
|
| - if (!args ||
|
| - args->GetSize() != 1 ||
|
| - !args->GetString(0, &image_url)) {
|
| + if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
|
| NOTREACHED();
|
| - return;
|
| - }
|
| if (image_url.empty())
|
| return;
|
|
|
| @@ -217,7 +250,11 @@ void UserImageScreenHandler::HandleImageAccepted(const base::ListValue* args) {
|
| return;
|
| switch (selected_image_) {
|
| case User::kExternalImageIndex:
|
| - screen_->OnPhotoTaken(user_photo_);
|
| + // Photo decoding may not have been finished yet.
|
| + if (user_photo_.empty())
|
| + accept_photo_after_decoding_ = true;
|
| + else
|
| + screen_->OnPhotoTaken(user_photo_);
|
| break;
|
|
|
| case User::kProfileImageIndex:
|
| @@ -246,4 +283,16 @@ void UserImageScreenHandler::OnCameraPresenceCheckDone() {
|
| present_value);
|
| }
|
|
|
| +void UserImageScreenHandler::OnImageDecoded(const ImageDecoder* decoder,
|
| + const SkBitmap& decoded_image) {
|
| + DCHECK_EQ(image_decoder_.get(), decoder);
|
| + user_photo_ = gfx::ImageSkia(decoded_image);
|
| + if (screen_ && accept_photo_after_decoding_)
|
| + screen_->OnPhotoTaken(user_photo_);
|
| +}
|
| +
|
| +void UserImageScreenHandler::OnDecodeImageFailed(const ImageDecoder* decoder) {
|
| + NOTREACHED() << "Failed to decode PNG image from WebUI";
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|