Add new certificateProvider extension API.
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / login / oobe_screen_oauth_enrollment.js
blob902e02626ec97b97c2d40f380c9b1903bcdeec67
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 login.createScreen('OAuthEnrollmentScreen', 'oauth-enrollment', function() {
6   /** @const */ var STEP_SIGNIN = 'signin';
7   /** @const */ var STEP_WORKING = 'working';
8   /** @const */ var STEP_ATTRIBUTE_PROMPT = 'attribute-prompt';
9   /** @const */ var STEP_ERROR = 'error';
10   /** @const */ var STEP_SUCCESS = 'success';
12   /* TODO(dzhioev): define this step on C++ side.
13   /** @const */ var STEP_ATTRIBUTE_PROMPT_ERROR = 'attribute-prompt-error';
15   /** @const */ var HELP_TOPIC_ENROLLMENT = 4631259;
17   return {
18     EXTERNAL_API: [
19       'showStep',
20       'showError',
21       'doReload',
22       'showAttributePromptStep',
23     ],
25     /**
26      * Authenticator object that wraps GAIA webview.
27      */
28     authenticator_: null,
30     /**
31      * The current step. This is the last value passed to showStep().
32      */
33     currentStep_: null,
35     /**
36      * We block esc, back button and cancel button until gaia is loaded to
37      * prevent multiple cancel events.
38      */
39     isCancelDisabled_: null,
41     get isCancelDisabled() { return this.isCancelDisabled_ },
42     set isCancelDisabled(disabled) {
43       if (disabled == this.isCancelDisabled)
44         return;
45       this.isCancelDisabled_ = disabled;
46     },
48     /** @override */
49     decorate: function() {
50       var webview = document.createElement('webview');
51       webview.id = webview.name = 'oauth-enroll-auth-view';
52       $('oauth-enroll-auth-view-container').appendChild(webview);
53       this.authenticator_ = new cr.login.Authenticator(webview);
55       this.authenticator_.addEventListener('ready',
56           (function() {
57             if (this.currentStep_ != STEP_SIGNIN)
58               return;
59             this.isCancelDisabled = false;
60             chrome.send('frameLoadingCompleted', [0]);
61           }).bind(this));
63       this.authenticator_.addEventListener('authCompleted',
64           (function(e) {
65             var detail = e.detail;
66             if (!detail.email || !detail.authCode) {
67               this.showError(
68                   loadTimeData.getString('fatalEnrollmentError'),
69                   false);
70               return;
71             }
72             chrome.send('oauthEnrollCompleteLogin', [detail.email,
73                                                      detail.authCode]);
74           }).bind(this));
76       this.authenticator_.addEventListener('authFlowChange',
77           (function(e) {
78             var isSAML = this.authenticator_.authFlow ==
79                              cr.login.Authenticator.AuthFlow.SAML;
80             if (isSAML) {
81               $('oauth-saml-notice-message').textContent =
82                   loadTimeData.getStringF('samlNotice',
83                                           this.authenticator_.authDomain);
84             }
85             this.classList.toggle('saml', isSAML);
86             if (Oobe.getInstance().currentScreen == this)
87               Oobe.getInstance().updateScreenSize(this);
88           }).bind(this));
90       this.authenticator_.addEventListener('backButton',
91           (function(e) {
92             $('oauth-enroll-back-button').hidden = !e.detail;
93             $('oauth-enroll-auth-view').focus();
94           }).bind(this));
96       this.authenticator_.insecureContentBlockedCallback =
97           (function(url) {
98             this.showError(
99                 loadTimeData.getStringF('insecureURLEnrollmentError', url),
100                 false);
101           }).bind(this);
103       this.authenticator_.missingGaiaInfoCallback =
104           (function() {
105             this.showError(
106                 loadTimeData.getString('fatalEnrollmentError'),
107                 false);
108           }).bind(this);
110       $('oauth-enroll-error-card').addEventListener('buttonclick',
111                                                     this.doRetry_.bind(this));
112       function doneCallback() {
113         chrome.send('oauthEnrollClose', ['done']);
114       };
116       $('oauth-enroll-attribute-prompt-error-card').addEventListener(
117           'buttonclick', doneCallback);
118       $('oauth-enroll-success-card').addEventListener(
119           'buttonclick', doneCallback);
121       $('oauth-enroll-cancel-button').addEventListener('click',
122                                                        this.cancel.bind(this));
123       $('oauth-enroll-refresh-button').addEventListener('click',
124                                                         this.cancel.bind(this));
126       $('oauth-enroll-back-button').addEventListener('click',
127           (function(e) {
128             $('oauth-enroll-back-button').hidden = true;
129             $('oauth-enroll-auth-view').back();
130             e.preventDefault();
131           }).bind(this));
133       $('oauth-enroll-attribute-prompt-card').addEventListener('submit',
134           this.onAttributesSubmitted.bind(this));
136       $('oauth-enroll-learn-more-link').addEventListener('click',
137           function(event) {
138             chrome.send('oauthEnrollOnLearnMore');
139           });
141       $('oauth-enroll-skip-button').addEventListener('click',
142           this.onSkipButtonClicked.bind(this));
143     },
145     /**
146      * Header text of the screen.
147      * @type {string}
148      */
149     get header() {
150       return loadTimeData.getString('oauthEnrollScreenTitle');
151     },
153     /**
154      * Buttons in oobe wizard's button strip.
155      * @type {array} Array of Buttons.
156      */
157     get buttons() {
158       var buttons = [];
159       var ownerDocument = this.ownerDocument;
161       function makeButton(id, classes, label, handler) {
162         var button = ownerDocument.createElement('button');
163         button.id = id;
164         button.classList.add('oauth-enroll-button');
165         button.classList.add.apply(button.classList, classes);
166         button.textContent = label;
167         button.addEventListener('click', handler);
168         buttons.push(button);
169       }
171       return buttons;
172     },
174     /**
175      * Event handler that is invoked just before the frame is shown.
176      * @param {Object} data Screen init payload, contains the signin frame
177      * URL.
178      */
179     onBeforeShow: function(data) {
180       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ENROLLMENT;
181       $('inner-container').classList.add('new-gaia-flow');
182       var gaiaParams = {};
183       gaiaParams.gaiaUrl = data.gaiaUrl;
184       gaiaParams.clientId = data.clientId;
185       gaiaParams.gaiaPath = 'embedded/setup/chromeos';
186       gaiaParams.isNewGaiaFlowChromeOS = true;
187       gaiaParams.needPassword = false;
188       if (data.management_domain) {
189         gaiaParams.enterpriseDomain = data.management_domain;
190         gaiaParams.emailDomain = data.management_domain;
191       }
192       gaiaParams.flow = data.flow;
193       this.authenticator_.load(cr.login.Authenticator.AuthMode.DEFAULT,
194                                gaiaParams);
196       var modes = ['manual', 'forced', 'recovery'];
197       for (var i = 0; i < modes.length; ++i) {
198         this.classList.toggle('mode-' + modes[i],
199                               data.enrollment_mode == modes[i]);
200       }
201       this.isCancelDisabled = true;
202       this.showStep(STEP_SIGNIN);
203     },
205     onBeforeHide: function() {
206       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN;
207     },
209     /**
210      * Shows attribute-prompt step with pre-filled asset ID and
211      * location.
212      */
213     showAttributePromptStep: function(annotated_asset_id, annotated_location) {
214       $('oauth-enroll-asset-id').value = annotated_asset_id;
215       $('oauth-enroll-location').value = annotated_location;
216       $('oauth-enroll-back-button').hidden = true;
218       this.showStep(STEP_ATTRIBUTE_PROMPT);
219     },
221     /**
222      * Cancels enrollment and drops the user back to the login screen.
223      */
224     cancel: function() {
225       if (this.isCancelDisabled)
226         return;
227       this.isCancelDisabled = true;
228       chrome.send('oauthEnrollClose', ['cancel']);
229     },
231     /**
232      * Switches between the different steps in the enrollment flow.
233      * @param {string} step the steps to show, one of "signin", "working",
234      * "attribute-prompt", "error", "success".
235      */
236     showStep: function(step) {
237       this.classList.toggle('oauth-enroll-state-' + this.currentStep_, false);
238       this.classList.toggle('oauth-enroll-state-' + step, true);
240       if (step == STEP_SIGNIN) {
241         $('oauth-enroll-auth-view').focus();
242       } else if (step == STEP_ERROR) {
243         $('oauth-enroll-error-card').submitButton.focus();
244       } else if (step == STEP_SUCCESS) {
245         $('oauth-enroll-success-card').submitButton.focus();
246       } else if (step == STEP_ATTRIBUTE_PROMPT) {
247         $('oauth-enroll-asset-id').focus();
248       } else if (step == STEP_ATTRIBUTE_PROMPT_ERROR) {
249         $('oauth-enroll-attribute-prompt-error-card').submitButton.focus();
250       }
251       this.currentStep_ = step;
252     },
254     /**
255      * Sets an error message and switches to the error screen.
256      * @param {string} message the error message.
257      * @param {boolean} retry whether the retry link should be shown.
258      */
259     showError: function(message, retry) {
260       if (this.currentStep_ == STEP_ATTRIBUTE_PROMPT) {
261         $('oauth-enroll-attribute-prompt-error-card').textContent = message;
262         this.showStep(STEP_ATTRIBUTE_PROMPT_ERROR);
263         return;
264       }
265       $('oauth-enroll-error-card').textContent = message;
266       $('oauth-enroll-error-card').buttonLabel =
267           retry ? loadTimeData.getString('oauthEnrollRetry') : '';
268       this.showStep(STEP_ERROR);
269     },
271     doReload: function() {
272       this.authenticator_.reload();
273     },
275     /**
276      * Retries the enrollment process after an error occurred in a previous
277      * attempt. This goes to the C++ side through |chrome| first to clean up the
278      * profile, so that the next attempt is performed with a clean state.
279      */
280     doRetry_: function() {
281       chrome.send('oauthEnrollRetry');
282     },
284     /**
285      * Skips the device attribute update,
286      * shows the successful enrollment step.
287      */
288     onSkipButtonClicked: function() {
289       this.showStep(STEP_SUCCESS);
290     },
292     /**
293      * Uploads the device attributes to server. This goes to C++ side through
294      * |chrome| and launches the device attribute update negotiation.
295      */
296     onAttributesSubmitted: function() {
297       chrome.send('oauthEnrollAttributes',
298                   [$('oauth-enroll-asset-id').value,
299                    $('oauth-enroll-location').value]);
300     }
301   };