diff options
author | ivankr@chromium.org <ivankr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-20 17:26:28 +0000 |
---|---|---|
committer | ivankr@chromium.org <ivankr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-20 17:26:28 +0000 |
commit | ede3378dd4740e0896150fc13e765dcff24f72e1 (patch) | |
tree | 69e3215053969463ae09fdc405aa68e316db1002 | |
parent | 3e2cb40f6c65a77d6ee2f2a9ba014f32a15d79af (diff) | |
download | chromium_src-ede3378dd4740e0896150fc13e765dcff24f72e1.zip chromium_src-ede3378dd4740e0896150fc13e765dcff24f72e1.tar.gz chromium_src-ede3378dd4740e0896150fc13e765dcff24f72e1.tar.bz2 |
[cros] In-Chrome camera presence check for avatar picker.
BUG=157387
TBR=sky
Review URL: https://chromiumcodereview.appspot.com/11416097
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168824 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/camera_detector.cc (renamed from chrome/browser/chromeos/login/camera_detector.cc) | 19 | ||||
-rw-r--r-- | chrome/browser/chromeos/camera_detector.h (renamed from chrome/browser/chromeos/login/camera_detector.h) | 10 | ||||
-rw-r--r-- | chrome/browser/resources/chromeos/login/oobe_screen_user_image.js | 34 | ||||
-rw-r--r-- | chrome/browser/resources/chromeos/user_images_grid.js | 85 | ||||
-rw-r--r-- | chrome/browser/resources/options/chromeos/change_picture_options.js | 19 | ||||
-rw-r--r-- | chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc | 15 | ||||
-rw-r--r-- | chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h | 3 | ||||
-rw-r--r-- | chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc | 34 | ||||
-rw-r--r-- | chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h | 3 | ||||
-rw-r--r-- | chrome/chrome_browser_chromeos.gypi | 4 |
10 files changed, 97 insertions, 129 deletions
diff --git a/chrome/browser/chromeos/login/camera_detector.cc b/chrome/browser/chromeos/camera_detector.cc index 4156c8e..f40acbf 100644 --- a/chrome/browser/chromeos/login/camera_detector.cc +++ b/chrome/browser/chromeos/camera_detector.cc @@ -2,16 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/login/camera_detector.h" +#include "chrome/browser/chromeos/camera_detector.h" #include "base/bind.h" #include "base/file_util.h" +#include "base/location.h" #include "base/string_split.h" #include "base/string_util.h" +#include "base/threading/worker_pool.h" #include "chrome/browser/chromeos/system/udev_info_provider.h" -#include "content/public/browser/browser_thread.h" - -using content::BrowserThread; namespace chromeos { @@ -34,22 +33,18 @@ CameraDetector::CameraPresence CameraDetector::camera_presence_ = bool CameraDetector::presence_check_in_progress_ = false; void CameraDetector::StartPresenceCheck(const base::Closure& check_done) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DVLOG(1) << "Starting camera presence check"; - if (!presence_check_in_progress_) { presence_check_in_progress_ = true; - BrowserThread::PostTaskAndReply( - BrowserThread::FILE, FROM_HERE, + base::WorkerPool::PostTaskAndReply( + FROM_HERE, base::Bind(&CameraDetector::CheckPresence), - check_done); + check_done, + /* task_is_slow= */ false); } } void CameraDetector::CheckPresence() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); - bool present = false; system::UdevInfoProvider* udev_info = system::UdevInfoProvider::GetInstance(); diff --git a/chrome/browser/chromeos/login/camera_detector.h b/chrome/browser/chromeos/camera_detector.h index e4ad563..6c1955b 100644 --- a/chrome/browser/chromeos/login/camera_detector.h +++ b/chrome/browser/chromeos/camera_detector.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_DETECTOR_H_ -#define CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_DETECTOR_H_ +#ifndef CHROME_BROWSER_CHROMEOS_CAMERA_DETECTOR_H_ +#define CHROME_BROWSER_CHROMEOS_CAMERA_DETECTOR_H_ #include "base/callback.h" @@ -26,11 +26,11 @@ class CameraDetector { // Checks asynchronously for camera device presence. Only one // presence check can be running at a time. Calls |check_done| - // on UI thread when the check has been completed. + // on current thread when the check has been completed. static void StartPresenceCheck(const base::Closure& check_done); private: - // Checks for camera presence. Runs of the FILE thread. + // Checks for camera presence. Runs on a worker pool. static void CheckPresence(); // Result of the last presence check. @@ -43,4 +43,4 @@ class CameraDetector { } // namespace chromeos -#endif // CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_DETECTOR_H_ +#endif // CHROME_BROWSER_CHROMEOS_CAMERA_DETECTOR_H_ diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_user_image.js b/chrome/browser/resources/chromeos/login/oobe_screen_user_image.js index 603911b..7bb3596 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screen_user_image.js +++ b/chrome/browser/resources/chromeos/login/oobe_screen_user_image.js @@ -98,9 +98,6 @@ cr.define('oobe', function() { this.profileImage_.type = 'profile'; this.profileImageLoading = true; - // Add camera stream element. - imageGrid.cameraImage = null; - $('take-photo').addEventListener( 'click', this.handleTakePhoto_.bind(this)); $('discard-photo').addEventListener( @@ -202,14 +199,11 @@ cr.define('oobe', function() { imageGrid.selectionType != e.oldSelectionType) { if (imageGrid.selectionType == 'camera') { // Programmatic selection of camera item is done in - // checkCameraPresence callback where streaming is started by itself. - imageGrid.checkCameraPresence( - function() { // When present. + // startCamera callback where streaming is started by itself. + imageGrid.startCamera( + function() { // Start capture if camera is still the selected item. return imageGrid.selectedItem == imageGrid.cameraImage; - }, - function() { // When absent. - return true; // Check again after some time. }); } else { imageGrid.stopCamera(); @@ -242,21 +236,6 @@ cr.define('oobe', function() { Oobe.getInstance().headerHidden = true; var imageGrid = $('user-image-grid'); imageGrid.updateAndFocus(); - if (PRESELECT_CAMERA) { - // Check for camera presence and select it, if present. - imageGrid.checkCameraPresence( - function() { // When present. - imageGrid.selectedItem = imageGrid.cameraImage; - return true; // Start capture if ready. - }, - function() { // When absent. - return true; // Check again after some time. - }); - } else { - // Check continuously for camera presence but don't select it. - imageGrid.checkCameraPresence(function() { return false; }, - function() { return true; }); - } chrome.send('onUserImageScreenShown'); }, @@ -296,6 +275,13 @@ cr.define('oobe', function() { }, /** + * @param {boolean} present Whether camera is detected. + */ + setCameraPresent_: function(present) { + $('user-image-grid').cameraPresent = present; + }, + + /** * Appends default images to the image grid. Should only be called once. * @param {Array.<{url: string, author: string, website: string}>} images * An array of default images data, including URL, author and website. diff --git a/chrome/browser/resources/chromeos/user_images_grid.js b/chrome/browser/resources/chromeos/user_images_grid.js index 30d103d..a36bc61 100644 --- a/chrome/browser/resources/chromeos/user_images_grid.js +++ b/chrome/browser/resources/chromeos/user_images_grid.js @@ -10,8 +10,7 @@ cr.define('options', function() { /** @const */ var ListSingleSelectionModel = cr.ui.ListSingleSelectionModel; /** - * Interval between consecutive camera presence checks in msec while camera is - * not present. + * Interval between consecutive camera presence checks in msec. * @const */ var CAMERA_CHECK_INTERVAL_MS = 3000; @@ -208,6 +207,20 @@ cr.define('options', function() { }, /** + * Start camera presence check. + * @private + */ + checkCameraPresence_: function() { + if (this.cameraPresentCheckTimer_) { + window.clearTimeout(this.cameraPresentCheckTimer_); + this.cameraPresentCheckTimer_ = null; + } + if (!this.cameraVideo_) + return; + chrome.send('checkCameraPresence'); + }, + + /** * Whether a camera is present or not. * @type {boolean} */ @@ -218,6 +231,10 @@ cr.define('options', function() { this.cameraPresent_ = value; if (this.cameraLive) this.cameraImage = null; + // Repeat the check after some time. + this.cameraPresentCheckTimer_ = window.setTimeout( + this.checkCameraPresence_.bind(this), + CAMERA_CHECK_INTERVAL_MS); }, /** @@ -231,37 +248,27 @@ cr.define('options', function() { set cameraOnline(value) { this.previewElement.classList[value ? 'add' : 'remove']('online'); if (value) { - this.cameraLiveCheckTimer_ = setInterval( + this.cameraLiveCheckTimer_ = window.setInterval( this.checkCameraLive_.bind(this), CAMERA_LIVENESS_CHECK_MS); } else if (this.cameraLiveCheckTimer_) { - clearInterval(this.cameraLiveCheckTimer_); + window.clearInterval(this.cameraLiveCheckTimer_); this.cameraLiveCheckTimer_ = null; } }, /** - * Start camera presence check. + * Tries to starts camera stream capture. * @param {function(): boolean} onAvailable Callback that is called if * camera is available. If it returns |true|, capture is started * immediately. - * @param {function(): boolean} onAbsent Callback that is called if camera - * is absent. If it returns |true|, camera is checked again after some - * delay. */ - checkCameraPresence: function(onAvailable, onAbsent) { - this.cameraOnline = false; - if (this.cameraPresentCheckTimer_) { - clearTimeout(this.cameraPresentCheckTimer_); - this.cameraPresentCheckTimer_ = null; - } - if (!this.cameraVideo_) - return; - this.cameraCheckInProgress_ = true; + startCamera: function(onAvailable, onAbsent) { + this.stopCamera(); + this.cameraStartInProgress_ = true; navigator.webkitGetUserMedia( {video: true}, this.handleCameraAvailable_.bind(this, onAvailable), - // Needs both arguments since it may call checkCameraPresence again. - this.handleCameraAbsent_.bind(this, onAvailable, onAbsent)); + this.handleCameraAbsent_.bind(this)); }, /** @@ -274,7 +281,7 @@ cr.define('options', function() { if (this.cameraStream_) this.cameraStream_.stop(); // Cancel any pending getUserMedia() checks. - this.cameraCheckInProgress_ = false; + this.cameraStartInProgress_ = false; }, /** @@ -285,36 +292,24 @@ cr.define('options', function() { * @private */ handleCameraAvailable_: function(onAvailable, stream) { - this.cameraPresent = true; - if (this.cameraCheckInProgress_ && onAvailable()) { + if (this.cameraStartInProgress_ && onAvailable()) { this.cameraVideo_.src = window.webkitURL.createObjectURL(stream); this.cameraStream_ = stream; } else { stream.stop(); } - this.cameraCheckInProgress_ = false; + this.cameraStartInProgress_ = false; }, /** * Handles camera check failure. - * @param {function(): boolean} onAvailable Callback that is called if - * camera is available in future re-checks. If it returns |true|, - * capture is started immediately. - * @param {function(): boolean} onAbsent Callback to call. If it returns - * |true|, camera is checked again after some delay. * @param {NavigatorUserMediaError=} err Error object. * @private */ - handleCameraAbsent_: function(onAvailable, onAbsent, err) { + handleCameraAbsent_: function(err) { this.cameraPresent = false; this.cameraOnline = false; - if (onAbsent()) { - // Repeat the check. - this.cameraPresentCheckTimer_ = setTimeout( - this.checkCameraPresence.bind(this, onAvailable, onAbsent), - CAMERA_CHECK_INTERVAL_MS); - } - this.cameraCheckInProgress_ = false; + this.cameraStartInProgress_ = false; }, /** @@ -343,9 +338,7 @@ cr.define('options', function() { checkCameraLive_: function() { if (new Date().getTime() - this.lastFrameTime_ > CAMERA_LIVENESS_CHECK_MS) { - // Continue checking for camera presence but don't start capture. - this.handleCameraAbsent_(function() { return false; }, - function() { return true; }); + this.cameraPresent = false; } }, @@ -480,13 +473,9 @@ cr.define('options', function() { this.cameraVideo_.addEventListener('timeupdate', this.handleVideoUpdate_.bind(this)); this.updatePreview_(); - this.checkCameraPresence( - function() { - return false; // Don't start streaming if camera is present. - }, - function() { - return false; // Don't retry if camera is absent. - }); + // Initialize camera state and check for its presence. + this.cameraLive = true; + this.cameraPresent = false; }, /** @@ -548,7 +537,7 @@ cr.define('options', function() { frameNo: 0, lastTimestamp: new Date().getTime() }; - captureData.timer = setInterval( + captureData.timer = window.setInterval( this.captureVideoFrame_.bind(this, captureData), 1000 / RECORD_FPS); }, @@ -613,7 +602,7 @@ cr.define('options', function() { data.ctx.translate(0, CAPTURE_SIZE.height); if (++data.frameNo == RECORD_FRAMES) { - clearTimeout(data.timer); + window.clearTimeout(data.timer); if (data.callback && typeof data.callback == 'function') data.callback(data.canvas.toDataURL('image/png')); } diff --git a/chrome/browser/resources/options/chromeos/change_picture_options.js b/chrome/browser/resources/options/chromeos/change_picture_options.js index 0287ab5..c788589 100644 --- a/chrome/browser/resources/options/chromeos/change_picture_options.js +++ b/chrome/browser/resources/options/chromeos/change_picture_options.js @@ -103,12 +103,9 @@ cr.define('options', function() { */ didShowPage: function() { var imageGrid = $('user-image-grid'); - imageGrid.updateAndFocus(); // Reset camera element. imageGrid.cameraImage = null; - // Check continuously for camera presence but don't select it. - imageGrid.checkCameraPresence(function() { return false; }, - function() { return true; }); + imageGrid.updateAndFocus(); chrome.send('onChangePicturePageShown'); }, @@ -179,13 +176,10 @@ cr.define('options', function() { if (!imageGrid.inProgramSelection && imageGrid.selectionType != e.oldSelectionType) { if (imageGrid.selectionType == 'camera') { - imageGrid.checkCameraPresence( - function() { // When present. + imageGrid.startCamera( + function() { // Start capture if camera is still the selected item. return imageGrid.selectedItem == imageGrid.cameraImage; - }, - function() { // When absent. - return true; // Check again after some time. }); } else { imageGrid.stopCamera(); @@ -260,6 +254,13 @@ cr.define('options', function() { }, /** + * @param {boolean} present Whether camera is detected. + */ + setCameraPresent_: function(present) { + $('user-image-grid').cameraPresent = present; + }, + + /** * Appends default images to the image grid. Should only be called once. * @param {Array.<{url: string, author: string, website: string}>} * imagesData An array of default images data, including URL, author and 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 29d9c5c..c9906f8 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 @@ -10,7 +10,7 @@ #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/values.h" -#include "chrome/browser/chromeos/login/camera_detector.h" +#include "chrome/browser/chromeos/camera_detector.h" #include "chrome/browser/chromeos/login/default_user_images.h" #include "chrome/browser/chromeos/login/user.h" #include "chrome/browser/chromeos/login/webui_login_display.h" @@ -117,13 +117,9 @@ void UserImageScreenHandler::SelectImage(int index) { } void UserImageScreenHandler::CheckCameraPresence() { - // For WebRTC, camera presence checked is done on JS side. -#if 0 - // TODO(ivankr): restore check on Chrome side. CameraDetector::StartPresenceCheck( base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone, weak_factory_.GetWeakPtr())); -#endif } void UserImageScreenHandler::RegisterMessages() { @@ -136,6 +132,9 @@ void UserImageScreenHandler::RegisterMessages() { web_ui()->RegisterMessageCallback("selectImage", base::Bind(&UserImageScreenHandler::HandleSelectImage, base::Unretained(this))); + web_ui()->RegisterMessageCallback("checkCameraPresence", + base::Bind(&UserImageScreenHandler::HandleCheckCameraPresence, + base::Unretained(this))); web_ui()->RegisterMessageCallback("onUserImageAccepted", base::Bind(&UserImageScreenHandler::HandleImageAccepted, base::Unretained(this))); @@ -213,6 +212,12 @@ void UserImageScreenHandler::HandlePhotoTaken(const base::ListValue* args) { image_decoder_->Start(); } +void UserImageScreenHandler::HandleCheckCameraPresence( + const base::ListValue* args) { + DCHECK(args->empty()); + CheckCameraPresence(); +} + void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) { std::string image_url; if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url)) diff --git a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h index 64f497f..e23ad003 100644 --- a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h @@ -59,6 +59,9 @@ class UserImageScreenHandler : public UserImageScreenActor, // Handles photo taken with WebRTC UI. void HandlePhotoTaken(const base::ListValue* args); + // Handles camera presence check request. + void HandleCheckCameraPresence(const base::ListValue* args); + // Handles clicking on default user image. void HandleSelectImage(const base::ListValue* args); diff --git a/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc index ac1be7e..b087b82 100644 --- a/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.cc @@ -12,7 +12,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "base/values.h" -#include "chrome/browser/chromeos/login/camera_detector.h" +#include "chrome/browser/chromeos/camera_detector.h" #include "chrome/browser/chromeos/login/default_user_images.h" #include "chrome/browser/chromeos/login/user_image.h" #include "chrome/browser/chromeos/login/user_image_manager.h" @@ -115,6 +115,9 @@ void ChangePictureOptionsHandler::RegisterMessages() { web_ui()->RegisterMessageCallback("photoTaken", base::Bind(&ChangePictureOptionsHandler::HandlePhotoTaken, base::Unretained(this))); + web_ui()->RegisterMessageCallback("checkCameraPresence", + base::Bind(&ChangePictureOptionsHandler::HandleCheckCameraPresence, + base::Unretained(this))); web_ui()->RegisterMessageCallback("onChangePicturePageShown", base::Bind(&ChangePictureOptionsHandler::HandlePageShown, base::Unretained(this))); @@ -189,33 +192,20 @@ void ChangePictureOptionsHandler::HandlePhotoTaken( image_decoder_->Start(); } +void ChangePictureOptionsHandler::HandleCheckCameraPresence( + const base::ListValue* args) { + DCHECK(args->empty()); + CheckCameraPresence(); +} + void ChangePictureOptionsHandler::HandlePageInitialized( const base::ListValue* args) { DCHECK(args && args->empty()); - -#if 0 - // TODO(ivankr): restore check on Chrome side. - // If no camera presence check has been performed in this session, - // start one now. - if (CameraDetector::camera_presence() == - CameraDetector::kCameraPresenceUnknown) { - CheckCameraPresence(); - } - - // While the check is in progress, use previous camera presence state and - // presume it is present if no check has been performed yet. - SetCameraPresent(CameraDetector::camera_presence() != - CameraDetector::kCameraAbsent); -#endif - SendDefaultImages(); } void ChangePictureOptionsHandler::HandlePageShown(const base::ListValue* args) { DCHECK(args && args->empty()); - // TODO(ivankr): If user opens settings and goes to Change Picture page right - // after the check started |HandlePageInitialized| has been completed, - // |CheckCameraPresence| will be called twice, should be throttled. CheckCameraPresence(); SendSelectedImage(); UpdateProfileImage(); @@ -381,13 +371,9 @@ void ChangePictureOptionsHandler::SetImageFromCamera( } void ChangePictureOptionsHandler::CheckCameraPresence() { - // For WebRTC, camera presence checked is done on JS side. -#if 0 - // TODO(ivankr): restore check on Chrome side. CameraDetector::StartPresenceCheck( base::Bind(&ChangePictureOptionsHandler::OnCameraPresenceCheckDone, weak_factory_.GetWeakPtr())); -#endif } void ChangePictureOptionsHandler::SetCameraPresent(bool present) { diff --git a/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h b/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h index e0dcde2..cec25ea 100644 --- a/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h +++ b/chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h @@ -66,6 +66,9 @@ class ChangePictureOptionsHandler : public ::options::OptionsPageUIHandler, // Handles photo taken with WebRTC UI. void HandlePhotoTaken(const base::ListValue* args); + // Handles camera presence check request. + void HandleCheckCameraPresence(const base::ListValue* args); + // Gets the list of available user images and sends it to the page. void HandleGetAvailableImages(const base::ListValue* args); diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 992e1a5..593127b 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi @@ -123,6 +123,8 @@ 'browser/chromeos/background/ash_user_wallpaper_delegate.h', 'browser/chromeos/boot_times_loader.cc', 'browser/chromeos/boot_times_loader.h', + 'browser/chromeos/camera_detector.cc', + 'browser/chromeos/camera_detector.h', 'browser/chromeos/choose_mobile_network_dialog.cc', 'browser/chromeos/choose_mobile_network_dialog.h', 'browser/chromeos/chrome_browser_main_chromeos.cc', @@ -357,8 +359,6 @@ 'browser/chromeos/login/base_login_display_host.cc', 'browser/chromeos/login/base_login_display_host.h', 'browser/chromeos/login/base_login_display_host.h', - 'browser/chromeos/login/camera_detector.cc', - 'browser/chromeos/login/camera_detector.h', 'browser/chromeos/login/captive_portal_view.cc', 'browser/chromeos/login/captive_portal_view.h', 'browser/chromeos/login/captive_portal_window_proxy.cc', |