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

Side by Side Diff: chrome/browser/resources/login/user_pod_row.js

Issue 398543002: Add language and keyboard layout pickers to public session pods (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 /** 5 /**
6 * @fileoverview User pod row implementation. 6 * @fileoverview User pod row implementation.
7 */ 7 */
8 8
9 cr.define('login', function() { 9 cr.define('login', function() {
10 /** 10 /**
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 * @const 43 * @const
44 */ 44 */
45 var MAX_NUMBER_OF_ROWS_UNDER_SIGNIN_BANNER = 2; 45 var MAX_NUMBER_OF_ROWS_UNDER_SIGNIN_BANNER = 2;
46 46
47 /** 47 /**
48 * Variables used for pod placement processing. Width and height should be 48 * Variables used for pod placement processing. Width and height should be
49 * synced with computed CSS sizes of pods. 49 * synced with computed CSS sizes of pods.
50 */ 50 */
51 var POD_WIDTH = 180; 51 var POD_WIDTH = 180;
52 var PUBLIC_EXPANDED_BASIC_WIDTH = 500; 52 var PUBLIC_EXPANDED_BASIC_WIDTH = 500;
53 var PUBLIC_EXPANDED_ADVANCED_WIDTH = 610;
53 var CROS_POD_HEIGHT = 213; 54 var CROS_POD_HEIGHT = 213;
54 var DESKTOP_POD_HEIGHT = 226; 55 var DESKTOP_POD_HEIGHT = 226;
55 var POD_ROW_PADDING = 10; 56 var POD_ROW_PADDING = 10;
56 var DESKTOP_ROW_PADDING = 15; 57 var DESKTOP_ROW_PADDING = 15;
57 58
58 /** 59 /**
59 * Minimal padding between user pod and virtual keyboard. 60 * Minimal padding between user pod and virtual keyboard.
60 * @type {number} 61 * @type {number}
61 * @const 62 * @const
62 */ 63 */
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 return this.classList.contains('expanded'); 990 return this.classList.contains('expanded');
990 }, 991 },
991 992
992 set expanded(expanded) { 993 set expanded(expanded) {
993 if (this.expanded == expanded) 994 if (this.expanded == expanded)
994 return; 995 return;
995 996
996 this.resetTabOrder(); 997 this.resetTabOrder();
997 this.classList.toggle('expanded', expanded); 998 this.classList.toggle('expanded', expanded);
998 if (expanded) { 999 if (expanded) {
999 var isDesktopUserManager = Oobe.getInstance().displayType ==
1000 DISPLAY_TYPE.DESKTOP_USER_MANAGER;
1001 var rowPadding = isDesktopUserManager ? DESKTOP_ROW_PADDING :
1002 POD_ROW_PADDING;
1003 this.usualLeft = this.left; 1000 this.usualLeft = this.left;
1004 this.usualTop = this.top; 1001 this.usualTop = this.top;
1005 if (this.left + PUBLIC_EXPANDED_BASIC_WIDTH > 1002 this.makeSpaceForExpandedPod_();
1006 $('pod-row').offsetWidth - rowPadding)
1007 this.left = $('pod-row').offsetWidth - rowPadding -
1008 PUBLIC_EXPANDED_BASIC_WIDTH;
1009 } else { 1003 } else {
1010 if (typeof(this.usualLeft) != 'undefined') 1004 if (typeof(this.usualLeft) != 'undefined')
1011 this.left = this.usualLeft; 1005 this.left = this.usualLeft;
1012 if (typeof(this.usualTop) != 'undefined') 1006 if (typeof(this.usualTop) != 'undefined')
1013 this.top = this.usualTop; 1007 this.top = this.usualTop;
1014 } 1008 }
1015 1009
1016 var self = this; 1010 var self = this;
1017 this.classList.add('animating'); 1011 this.classList.add('animating');
1018 this.addEventListener('webkitTransitionEnd', function f(e) { 1012 this.addEventListener('webkitTransitionEnd', function f(e) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 1048
1055 var learnMore = this.querySelector('.learn-more'); 1049 var learnMore = this.querySelector('.learn-more');
1056 learnMore.addEventListener('mousedown', stopEventPropagation); 1050 learnMore.addEventListener('mousedown', stopEventPropagation);
1057 learnMore.addEventListener('click', this.handleLearnMoreEvent); 1051 learnMore.addEventListener('click', this.handleLearnMoreEvent);
1058 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); 1052 learnMore.addEventListener('keydown', this.handleLearnMoreEvent);
1059 1053
1060 learnMore = this.querySelector('.expanded-pane-learn-more'); 1054 learnMore = this.querySelector('.expanded-pane-learn-more');
1061 learnMore.addEventListener('click', this.handleLearnMoreEvent); 1055 learnMore.addEventListener('click', this.handleLearnMoreEvent);
1062 learnMore.addEventListener('keydown', this.handleLearnMoreEvent); 1056 learnMore.addEventListener('keydown', this.handleLearnMoreEvent);
1063 1057
1058 var languageSelect = this.querySelector('.language-select');
1059 languageSelect.tabIndex = UserPodTabOrder.POD_INPUT;
1060 languageSelect.addEventListener('change', function() {
1061 chrome.send('getPublicSessionKeyboardLayouts', [
1062 this.user.username,
1063 languageSelect.options[languageSelect.selectedIndex].value]);
1064 }.bind(this));
1065
1066 this.querySelector('.keyboard-select').tabIndex =
1067 UserPodTabOrder.POD_INPUT;
1068
1069 var languageAndInput = this.querySelector('.language-and-input');
1070 languageAndInput.tabIndex = UserPodTabOrder.POD_INPUT;
1071 languageAndInput.addEventListener('click',
1072 this.transitionToAdvanced_.bind(this));
1073
1064 this.enterButtonElement.addEventListener('click', (function(e) { 1074 this.enterButtonElement.addEventListener('click', (function(e) {
1065 this.enterButtonElement.disabled = true; 1075 this.enterButtonElement.disabled = true;
1066 chrome.send('launchPublicAccount', [this.user.username]); 1076 chrome.send('launchPublicAccount', [this.user.username]);
1067 }).bind(this)); 1077 }).bind(this));
1068 }, 1078 },
1069 1079
1070 /** @override **/ 1080 /** @override **/
1081 initialize: function() {
1082 UserPod.prototype.initialize.call(this);
1083
1084 var id = this.user.username + '-language';
1085 this.querySelector('.language-select-label').htmlFor = id;
1086 var languageSelect = this.querySelector('.language-select');
1087 languageSelect.setAttribute('id', id);
1088 var list = this.user.initialLocales;
1089 languageSelect.innerHTML = '';
1090 var group = languageSelect;
1091 for (var i = 0; i < list.length; ++i) {
1092 var item = list[i];
1093 if (item.optionGroupName) {
1094 group = document.createElement('optgroup');
1095 group.label = item.optionGroupName;
1096 languageSelect.appendChild(group);
1097 } else {
1098 group.appendChild(
1099 new Option(item.title, item.value, item.selected, item.selected));
1100 }
1101 }
1102
1103 id = this.user.username + '-keyboard';
1104 this.querySelector('.keyboard-select-label').htmlFor = id;
1105 this.querySelector('.keyboard-select').setAttribute('id', id);
1106 this.populateKeyboardSelect_(this.user.initialKeyboardLayouts);
1107 },
1108
1109 /** @override **/
1071 update: function() { 1110 update: function() {
1072 UserPod.prototype.update.call(this); 1111 UserPod.prototype.update.call(this);
1073 this.querySelector('.expanded-pane-name').textContent = 1112 this.querySelector('.expanded-pane-name').textContent =
1074 this.user_.displayName; 1113 this.user_.displayName;
1075 this.querySelector('.info').textContent = 1114 this.querySelector('.info').textContent =
1076 loadTimeData.getStringF('publicAccountInfoFormat', 1115 loadTimeData.getStringF('publicAccountInfoFormat',
1077 this.user_.enterpriseDomain); 1116 this.user_.enterpriseDomain);
1078 }, 1117 },
1079 1118
1080 /** @override */ 1119 /** @override */
1081 focusInput: function() { 1120 focusInput: function() {
1082 // Move tabIndex from the whole pod to the main input. 1121 // Move tabIndex from the whole pod to the main input.
1083 this.tabIndex = -1; 1122 this.tabIndex = -1;
1084 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; 1123 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT;
1085 this.mainInput.focus(); 1124 this.mainInput.focus();
1086 }, 1125 },
1087 1126
1088 /** @override */ 1127 /** @override */
1089 reset: function(takeFocus) { 1128 reset: function(takeFocus) {
1090 if (!takeFocus) 1129 if (!takeFocus)
1091 this.expanded = false; 1130 this.expanded = false;
1092 this.enterButtonElement.disabled = false; 1131 this.enterButtonElement.disabled = false;
1093 UserPod.prototype.reset.call(this, takeFocus); 1132 UserPod.prototype.reset.call(this, takeFocus);
1094 }, 1133 },
1095 1134
1096 /** @override */ 1135 /** @override */
1097 activate: function(e) { 1136 activate: function(e) {
1098 this.expanded = true; 1137 if (!this.expanded) {
1099 this.focusInput(); 1138 this.expanded = true;
1139 this.focusInput();
1140 }
1100 return true; 1141 return true;
1101 }, 1142 },
1102 1143
1103 /** @override */ 1144 /** @override */
1104 handleClickOnPod_: function(e) { 1145 handleClickOnPod_: function(e) {
1105 if (this.parentNode.disabled) 1146 if (this.parentNode.disabled)
1106 return; 1147 return;
1107 1148
1108 this.parentNode.focusPod(this); 1149 this.parentNode.focusPod(this);
1109 this.parentNode.setActivatedPod(this, e); 1150 this.parentNode.setActivatedPod(this, e);
(...skipping 21 matching lines...) Expand all
1131 case 32: // Space. 1172 case 32: // Space.
1132 break; 1173 break;
1133 default: 1174 default:
1134 return; 1175 return;
1135 } 1176 }
1136 break; 1177 break;
1137 } 1178 }
1138 chrome.send('launchHelpApp', [HELP_TOPIC_PUBLIC_SESSION]); 1179 chrome.send('launchHelpApp', [HELP_TOPIC_PUBLIC_SESSION]);
1139 stopEventPropagation(event); 1180 stopEventPropagation(event);
1140 }, 1181 },
1182
1183 makeSpaceForExpandedPod_: function() {
1184 var width = this.classList.contains('advanced') ?
1185 PUBLIC_EXPANDED_ADVANCED_WIDTH : PUBLIC_EXPANDED_BASIC_WIDTH;
1186 var isDesktopUserManager = Oobe.getInstance().displayType ==
1187 DISPLAY_TYPE.DESKTOP_USER_MANAGER;
1188 var rowPadding = isDesktopUserManager ? DESKTOP_ROW_PADDING :
1189 POD_ROW_PADDING;
1190 if (this.left + width > $('pod-row').offsetWidth - rowPadding)
1191 this.left = $('pod-row').offsetWidth - rowPadding - width;
dzhioev (left Google) 2014/07/21 14:57:48 I can't find where you change 'left' back, when po
dzhioev (left Google) 2014/07/21 14:57:48 If we have a single public pod on screen, it is ex
bartfab (slow) 2014/07/21 16:50:04 I did not change the logic that makes space for ex
bartfab (slow) 2014/07/21 16:50:04 I did not change the logic that preserves the pod'
1192 },
1193
1194 /**
1195 * Transition the expanded pod from the basic to the advanced view.
1196 */
1197 transitionToAdvanced_: function() {
1198 var pod = this;
1199 var languageAndInputSection =
1200 this.querySelector('.language-and-input-section');
1201 this.classList.add('transitioning-to-advanced');
1202 setTimeout(function() {
1203 pod.classList.add('advanced');
1204 pod.makeSpaceForExpandedPod_();
1205 languageAndInputSection.addEventListener('webkitTransitionEnd',
dzhioev (left Google) 2014/07/21 14:57:48 Probably you want to add 'ensureTransitionEndEvent
bartfab (slow) 2014/07/21 16:50:04 Ugh. Is that a blink bug or by design? Either way
Nikita (slow) 2014/07/21 17:08:50 This is by design. https://developer.mozilla.org/e
1206 function observer() {
1207 languageAndInputSection.removeEventListener('webkitTransitionEnd',
1208 observer);
1209 pod.classList.remove('transitioning-to-advanced');
1210 pod.querySelector('.language-select').focus();
1211 });
1212 }, 0);
1213 },
1214
1215 /**
1216 * Populates the keyboard layout "select" element with a list of layouts.
1217 * @param {!Object} list List of available keyboard layouts
1218 */
1219 populateKeyboardSelect_: function(list) {
1220 var keyboardSelect = this.querySelector('.keyboard-select');
1221 keyboardSelect.innerHTML = '';
1222 for (var i = 0; i < list.length; ++i) {
1223 var item = list[i];
1224 keyboardSelect.appendChild(
1225 new Option(item.title, item.value, item.selected, item.selected));
1226 }
1227 }
1141 }; 1228 };
1142 1229
1143 /** 1230 /**
1144 * Creates a user pod to be used only in desktop chrome. 1231 * Creates a user pod to be used only in desktop chrome.
1145 * @constructor 1232 * @constructor
1146 * @extends {UserPod} 1233 * @extends {UserPod}
1147 */ 1234 */
1148 var DesktopUserPod = cr.ui.define(function() { 1235 var DesktopUserPod = cr.ui.define(function() {
1149 // Don't just instantiate a UserPod(), as this will call decorate() on the 1236 // Don't just instantiate a UserPod(), as this will call decorate() on the
1150 // parent object, and add duplicate event listeners. 1237 // parent object, and add duplicate event listeners.
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 /** @const */ var BUBBLE_OFFSET = 20; 1813 /** @const */ var BUBBLE_OFFSET = 20;
1727 /** @const */ var BUBBLE_PADDING = 8; 1814 /** @const */ var BUBBLE_PADDING = 8;
1728 $('bubble').showContentForElement(attachElement, 1815 $('bubble').showContentForElement(attachElement,
1729 cr.ui.Bubble.Attachment.RIGHT, 1816 cr.ui.Bubble.Attachment.RIGHT,
1730 bubbleContent, 1817 bubbleContent,
1731 BUBBLE_OFFSET, 1818 BUBBLE_OFFSET,
1732 BUBBLE_PADDING); 1819 BUBBLE_PADDING);
1733 }, 1820 },
1734 1821
1735 /** 1822 /**
1823 * Updates the list of available keyboard layouts for a public session pod.
1824 * @param {string} userID The user ID of the public session
1825 * @param {!Object} list List of available keyboard layouts
1826 */
1827 setPublicSessionKeyboardLayouts: function(userID, list) {
1828 var pod = this.getPodWithUsername_(userID);
1829 if (pod != null)
1830 pod.populateKeyboardSelect_(list);
1831 },
1832
1833 /**
1736 * Called when window was resized. 1834 * Called when window was resized.
1737 */ 1835 */
1738 onWindowResize: function() { 1836 onWindowResize: function() {
1739 var layout = this.calculateLayout_(); 1837 var layout = this.calculateLayout_();
1740 if (layout.columns != this.columns || layout.rows != this.rows) 1838 if (layout.columns != this.columns || layout.rows != this.rows)
1741 this.placePods_(); 1839 this.placePods_();
1742 1840
1743 if (Oobe.getInstance().virtualKeyboardShown) 1841 if (Oobe.getInstance().virtualKeyboardShown)
1744 this.scrollFocusedPodIntoView(); 1842 this.scrollFocusedPodIntoView();
1745 }, 1843 },
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
2293 if (this.podsWithPendingImages_.length == 0) { 2391 if (this.podsWithPendingImages_.length == 0) {
2294 this.classList.remove('images-loading'); 2392 this.classList.remove('images-loading');
2295 } 2393 }
2296 } 2394 }
2297 }; 2395 };
2298 2396
2299 return { 2397 return {
2300 PodRow: PodRow 2398 PodRow: PodRow
2301 }; 2399 };
2302 }); 2400 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698