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

Unified 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: Revert ImageDecoder changes. 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« 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