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

Side by Side Diff: chrome/browser/resources/options/sync_setup_overlay.js

Issue 7003007: Apply content-security-policy to the HTML options page. This is a (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 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
(Empty)
1 // Copyright (c) 2011 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.
4
5 cr.define('options', function() {
6 const OptionsPage = options.OptionsPage;
7
8 // Variable to track if a captcha challenge was issued. If this gets set to
9 // true, it stays that way until we are told about successful login from
10 // the browser. This means subsequent errors (like invalid password) are
11 // rendered in the captcha state, which is basically identical except we
12 // don't show the top error blurb "Error Signing in" or the "Create
13 // account" link.
14 var captchaChallengeActive_ = false;
15
16 // True if the synced account uses a custom passphrase.
17 var usePassphrase_ = false;
18
19 /**
20 * SyncSetupOverlay class
21 * Encapsulated handling of the 'Sync Setup' overlay page.
22 * @class
23 */
24 function SyncSetupOverlay() {
25 OptionsPage.call(this, 'syncSetup',
26 templateData.syncSetupOverlayTitle,
27 'sync-setup-overlay');
28 }
29
30 cr.addSingletonGetter(SyncSetupOverlay);
31
32 SyncSetupOverlay.prototype = {
33 __proto__: OptionsPage.prototype,
34
35 /**
36 * Initializes the page.
37 */
38 initializePage: function() {
39 OptionsPage.prototype.initializePage.call(this);
40
41 var acct_text = $('gaia-account-text');
42 var translated_text = acct_text.textContent;
43 var posGoogle = translated_text.indexOf('Google');
44 if (posGoogle != -1) {
45 var ltr = templateData['textdirection'] == 'ltr';
46 var googleIsAtEndOfSentence = posGoogle != 0;
47 if (googleIsAtEndOfSentence == ltr) {
48 // We're in ltr and in the translation the word 'Google' is AFTER the
49 // word 'Account' OR we're in rtl and 'Google' is BEFORE 'Account'.
50 var logo_td = $('gaia-logo');
51 logo_td.parentNode.appendChild(logo_td);
52 }
53 acct_text.textContent = translated_text.replace('Google','');
54 }
55
56 var self = this;
57 $('gaia-login-form').onsubmit = function() {
58 self.sendCredentialsAndClose_();
59 return false;
60 };
61 $('choose-data-types-form').onsubmit = function() {
62 self.sendConfiguration_();
63 return false;
64 };
65 $('google-option').onchange = $('explicit-option').onchange = function() {
66 self.onRadioChange_();
67 };
68 $('choose-datatypes-cancel').onclick = $('sync-setup-cancel').onclick =
69 $('confirm-everything-cancel').onclick = function() {
70 self.closeOverlay_();
71 };
72 $('customize-link').onclick = function() {
73 self.showCustomizePage_(false);
74 };
75 $('confirm-everything-ok').onclick = function() {
76 self.sendConfiguration_();
77 };
78 $('use-default-link').onclick = function() {
79 self.showSyncEverythingPage_();
80 };
81 $('cancel-no-button').onclick = function() {
82 self.hideCancelWarning_();
83 return false;
84 };
85 $('cancel-yes-button').onclick = function() {
86 chrome.send('PassphraseCancel', ['']);
87 return false;
88 };
89 $('passphrase-form').onsubmit = $('passphrase-ok').onclick = function() {
90 self.sendPassphraseAndClose_();
91 return false;
92 };
93 $('passphrase-cancel').onclick = function() {
94 self.showCancelWarning_();
95 return false;
96 };
97 },
98
99 closeOverlay_: function() {
100 OptionsPage.closeOverlay();
101 },
102
103 /** @inheritDoc */
104 didShowPage: function() {
105 chrome.send('didShowPage');
106 },
107
108 /** @inheritDoc */
109 didClosePage: function() {
110 chrome.send('didClosePage');
111 },
112
113 showCancelWarning_: function() {
114 $('cancel-warning-box').hidden = false;
115 $('passphrase-ok').disabled = true;
116 $('passphrase-cancel').disabled = true;
117 $('cancel-no-button').focus();
118 },
119
120 sendPassphraseAndClose_: function() {
121 var f = $('passphrase-form');
122 var result = JSON.stringify({"passphrase": f.passphrase.value});
123 chrome.send("Passphrase", [result]);
124 },
125
126 getRadioCheckedValue_: function() {
127 var f = $('choose-data-types-form');
128 for (var i = 0; i < f.option.length; ++i) {
129 if (f.option[i].checked) {
130 return f.option[i].value;
131 }
132 }
133
134 return undefined;
135 },
136
137 onRadioChange_: function() {
138 var visible = this.getRadioCheckedValue_() == "explicit";
139 $('sync-custom-passphrase').hidden = !visible;
140 },
141
142 checkAllDataTypeCheckboxes_: function() {
143 var checkboxes = document.getElementsByName("dataTypeCheckbox");
144 for (var i = 0; i < checkboxes.length; i++) {
145 // Only check the visible ones (since there's no way to uncheck
146 // the invisible ones).
147 if (checkboxes[i].parentElement.className == "sync-item-show") {
148 checkboxes[i].checked = true;
149 }
150 }
151 },
152
153 setDataTypeCheckboxesEnabled_: function(enabled) {
154 var checkboxes = document.getElementsByName("dataTypeCheckbox");
155 var labels = document.getElementsByName("dataTypeLabel");
156 for (var i = 0; i < checkboxes.length; i++) {
157 checkboxes[i].disabled = !enabled;
158 if (checkboxes[i].disabled) {
159 labels[i].className = "sync-label-inactive";
160 } else {
161 labels[i].className = "sync-label-active";
162 }
163 }
164 },
165
166 setCheckboxesToKeepEverythingSynced_: function(value) {
167 this.setDataTypeCheckboxesEnabled_(!value);
168 if (value)
169 this.checkAllDataTypeCheckboxes_();
170 },
171
172 // Returns true if at least one data type is enabled and no data types are
173 // checked. (If all data type checkboxes are disabled, it's because "keep
174 // everything synced" is checked.)
175 noDataTypesChecked_: function() {
176 var checkboxes = document.getElementsByName("dataTypeCheckbox");
177 var atLeastOneChecked = false;
178 var atLeastOneEnabled = false;
179 for (var i = 0; i < checkboxes.length; i++) {
180 if (!checkboxes[i].disabled &&
181 checkboxes[i].parentElement.className == "sync-item-show") {
182 atLeastOneEnabled = true;
183 if (checkboxes[i].checked) {
184 atLeastOneChecked = true;
185 }
186 }
187 }
188
189 return atLeastOneEnabled && !atLeastOneChecked;
190 },
191
192 checkPassphraseMatch_: function() {
193 var emptyError = $('empty-error');
194 var mismatchError = $('mismatch-error');
195 emptyError.style.display = "none";
196 mismatchError.style.display = "none";
197
198 var f = $('choose-data-types-form');
199 if (this.getRadioCheckedValue_() != "explicit" || f.option[0].disabled)
200 return true;
201
202 var customPassphrase = $('custom-passphrase');
203 if (customPassphrase.value.length == 0) {
204 emptyError.style.display = "block";
205 return false;
206 }
207
208 var confirmPassphrase = $('confirm-passphrase');
209 if (confirmPassphrase.value != customPassphrase.value) {
210 mismatchError.style.display = "block";
211 return false;
212 }
213
214 return true;
215 },
216
217 hideCancelWarning_: function() {
218 $('cancel-warning-box').hidden = true;
219 $('passphrase-ok').disabled = false;
220 $('passphrase-cancel').disabled = false;
221 },
222
223 sendConfiguration_: function() {
224 // Trying to submit, so hide previous errors.
225 $('aborted-text').className = "sync-error-hide";
226 $('error-text').className = "sync-error-hide";
227
228 if (this.noDataTypesChecked_()) {
229 $('error-text').className = "sync-error-show";
230 return;
231 }
232
233 var f = $('choose-data-types-form');
234 if (!this.checkPassphraseMatch_())
235 return;
236
237 var syncAll =
238 document.getElementById('sync-select-datatypes').selectedIndex == 0;
239
240 // These values need to be kept in sync with where they are read in
241 // SyncSetupFlow::GetDataTypeChoiceData().
242 var result = JSON.stringify({
243 "keepEverythingSynced": syncAll,
244 "syncBookmarks": syncAll || $('bookmarks-checkbox').checked,
245 "syncPreferences": syncAll || $('preferences-checkbox').checked,
246 "syncThemes": syncAll || $('themes-checkbox').checked,
247 "syncPasswords": syncAll || $('passwords-checkbox').checked,
248 "syncAutofill": syncAll || $('autofill-checkbox').checked,
249 "syncExtensions": syncAll || $('extensions-checkbox').checked,
250 "syncTypedUrls": syncAll || $('typed-urls-checkbox').checked,
251 "syncApps": syncAll || $('apps-checkbox').checked,
252 "syncSessions": syncAll || $('sessions-checkbox').checked,
253 "usePassphrase": (this.getRadioCheckedValue_() == 'explicit'),
254 "passphrase": $('custom-passphrase').value
255 });
256 chrome.send("Configure", [result]);
257 },
258
259 setChooseDataTypesCheckboxes_: function(args) {
260 // If this frame is on top, the focus should be on it, so pressing enter
261 // submits this form.
262 if (args.iframeToShow == 'configure') {
263 $('choose-datatypes-ok').focus();
264 }
265
266 var datatypeSelect = document.getElementById('sync-select-datatypes');
267 datatypeSelect.selectedIndex = args.keepEverythingSynced ? 0 : 1;
268
269 $('bookmarks-checkbox').checked = args.syncBookmarks;
270 $('preferences-checkbox').checked = args.syncPreferences;
271 $('themes-checkbox').checked = args.syncThemes;
272
273 if (args.passwordsRegistered) {
274 $('passwords-checkbox').checked = args.syncPasswords;
275 $('passwords-item').className = "sync-item-show";
276 } else {
277 $('passwords-item').className = "sync-item-hide";
278 }
279 if (args.autofillRegistered) {
280 $('autofill-checkbox').checked = args.syncAutofill;
281 $('autofill-item').className = "sync-item-show";
282 } else {
283 $('autofill-item').className = "sync-item-hide";
284 }
285 if (args.extensionsRegistered) {
286 $('extensions-checkbox').checked = args.syncExtensions;
287 $('extensions-item').className = "sync-item-show";
288 } else {
289 $('extensions-item').className = "sync-item-hide";
290 }
291 if (args.typedUrlsRegistered) {
292 $('typedUrls-checkbox').checked = args.syncTypedUrls;
293 $('omnibox-item').className = "sync-item-show";
294 } else {
295 $('omnibox-item').className = "sync-item-hide";
296 }
297 if (args.appsRegistered) {
298 $('apps-checkbox').checked = args.syncApps;
299 $('apps-item').className = "sync-item-show";
300 } else {
301 $('apps-item').className = "sync-item-hide";
302 }
303
304 this.setCheckboxesToKeepEverythingSynced_(args.keepEverythingSynced);
305 if (args.sessionsRegistered) {
306 $('sessions-checkbox').checked = args.syncSessions;
307 $('sessions-item').className = "sync-item-show";
308 } else {
309 $('sessions-item').className = "sync-item-hide";
310 }
311 },
312
313 setEncryptionCheckboxes_: function(args) {
314 if (args["usePassphrase"]) {
315 $('explicit-option').checked = true;
316
317 // The passphrase, once set, cannot be unset, but we show a reset link.
318 $('explicit-option').disabled = true;
319 $('google-option').disabled = true;
320 $('sync-custom-passphrase').hidden = true;
321 } else {
322 $('google-option').checked = true;
323 }
324 },
325
326 setErrorState_: function(args) {
327 if (!args.was_aborted)
328 return;
329
330 $('aborted-text').className = "sync-error-show";
331 $('choose-datatypes-ok').disabled = true;
332 },
333
334 setCheckboxesAndErrors_: function(args) {
335 this.setChooseDataTypesCheckboxes_(args);
336 this.setEncryptionCheckboxes_(args);
337 this.setErrorState_(args);
338 },
339
340 // Called once, when this html/js is loaded.
341 showConfigure_: function(args) {
342 var datatypeSelect = document.getElementById('sync-select-datatypes');
343 var self = this;
344 datatypeSelect.onchange = function() {
345 var syncAll = this.selectedIndex == 0;
346 self.setCheckboxesToKeepEverythingSynced_(syncAll);
347 };
348
349 $('sync-setup-configure').classList.remove('hidden');
350
351 if (args) {
352 this.setCheckboxesAndErrors_(args);
353
354 // Whether to display the 'Sync everything' confirmation page or the
355 // customize data types page.
356 var showSyncEverythingPage = args['showSyncEverythingPage'];
357 var keepEverythingSynced = args['keepEverythingSynced'];
358 this.usePassphrase_ = args['usePassphrase'];
359 if (showSyncEverythingPage == false ||
360 keepEverythingSynced == false || this.usePassphrase_) {
361 this.showCustomizePage_(keepEverythingSynced);
362 } else {
363 this.showSyncEverythingPage_();
364 }
365 }
366 },
367
368 showSyncEverythingPage_: function() {
369 $('confirm-sync-preferences').hidden = false;
370 $('customize-sync-preferences').hidden = true;
371
372 // Reset the selection to 'Sync everything'.
373 $('sync-select-datatypes').selectedIndex = 0;
374
375 // The default state is to sync everything.
376 this.setCheckboxesToKeepEverythingSynced_(true);
377
378 // If the account is not synced with a custom passphrase, reset the
379 // passphrase radio when switching to the 'Sync everything' page.
380 if (!this.usePassphrase_) {
381 $('google-option').checked = true;
382 $('sync-custom-passphrase').hidden = true;
383 }
384
385 $('confirm-everything-ok').focus();
386 },
387
388 showCustomizePage_: function(syncEverything) {
389 document.getElementById('confirm-sync-preferences').hidden = true;
390 document.getElementById('customize-sync-preferences').hidden = false;
391
392 // If the user has selected the 'Customize' page on initial set up, it's
393 // likely he intends to change the data types. Select the
394 // 'Choose data types' option in this case.
395 var index = syncEverything ? 0 : 1;
396 document.getElementById('sync-select-datatypes').selectedIndex = index;
397 this.setDataTypeCheckboxesEnabled_(!syncEverything);
398 $('choose-datatypes-ok').focus();
399 },
400
401 showSyncSetupPage_: function(page, args) {
402 if (page == 'settingUp') {
403 this.setThrobbersVisible_(true);
404 return;
405 } else {
406 this.setThrobbersVisible_(false);
407 }
408
409 // Hide an existing visible overlay.
410 var overlay = $('sync-setup-overlay');
411 for (var i = 0; i < overlay.children.length; i++)
412 overlay.children[i].classList.add('hidden');
413
414 if (page == 'login')
415 this.showGaiaLogin_(args);
416 else if (page == 'configure')
417 this.showConfigure_(args);
418 else if (page == 'passphrase')
419 this.showPassphrase_(args);
420 else if (page == 'done')
421 this.closeOverlay_();
422 },
423
424 setThrobbersVisible_: function(visible) {
425 var throbbers = document.getElementsByClassName("throbber");
426 for (var i = 0; i < throbbers.length; i++)
427 throbbers[i].style.visibility = visible ? "visible" : "hidden";
428 },
429
430 showPassphrase_: function(args) {
431 $('sync-setup-passphrase').classList.remove('hidden');
432
433 $('passphrase-rejected-body').style.display = "none";
434 $('normal-body').style.display = "none";
435 $('incorrect-passphrase').style.display = "none";
436
437 if (args["passphrase_creation_rejected"]) {
438 $('passphrase-rejected-body').style.display = "block";
439 } else {
440 $('normal-body').style.display = "block";
441 }
442
443 if (args["passphrase_setting_rejected"]) {
444 $('incorrect-passphrase').style.display = "block";
445 }
446
447 $('passphrase').focus();
448 },
449
450 setElementDisplay_: function(id, display) {
451 var d = document.getElementById(id);
452 if (d)
453 d.style.display = display;
454 },
455
456 loginSetFocus_: function() {
457 var email = $('gaia-email');
458 var passwd = $('gaia-passwd');
459 if (email && (email.value == null || email.value == "")) {
460 email.focus();
461 } else if (passwd) {
462 passwd.focus();
463 }
464 },
465
466 showAccessCodeRequired_: function() {
467 this.setElementDisplay_("password-row", "none");
468 this.setElementDisplay_("email-row", "none");
469 $('create-account-cell').style.visibility = "hidden";
470
471 this.setElementDisplay_("access-code-label-row", "table-row");
472 this.setElementDisplay_("access-code-input-row", "table-row");
473 this.setElementDisplay_("access-code-help-row", "table-row");
474 document.getElementById('access-code').disabled = false;
475 },
476
477 showCaptcha_: function(args) {
478 this.captchaChallengeActive_ = true;
479
480 // The captcha takes up lots of space, so make room.
481 this.setElementDisplay_("top-blurb", "none");
482 this.setElementDisplay_("top-blurb-error", "none");
483 this.setElementDisplay_("create-account-div", "none");
484 document.getElementById('create-account-cell').height = 0;
485
486 // It's showtime for the captcha now.
487 this.setElementDisplay_("captcha-div", "block");
488 document.getElementById('gaia-email').disabled = true;
489 document.getElementById('gaia-passwd').disabled = false;
490 document.getElementById('captcha-value').disabled = false;
491 document.getElementById('captcha-wrapper').style.backgroundImage =
492 url(args.captchaUrl);
493 },
494
495 showGaiaLogin_: function(args) {
496 $('sync-setup-login').classList.remove('hidden');
497
498 document.getElementById('gaia-email').disabled = false;
499 document.getElementById('gaia-passwd').disabled = false;
500
501 var f = $('gaia-login-form');
502 var email = $('gaia-email');
503 var passwd = $('gaia-passwd');
504 if (f) {
505 if (args.user != undefined) {
506 if (email.value != args.user)
507 passwd.value = ""; // Reset the password field
508 email.value = args.user;
509 }
510
511 if (!args.editable_user) {
512 email.style.display = 'none';
513 var span = document.getElementById('email-readonly');
514 span.appendChild(document.createTextNode(email.value));
515 span.style.display = 'inline';
516 this.setElementDisplay_("create-account-div", "none");
517 }
518
519 f.accessCode.disabled = true;
520 }
521
522 if (1 == args.error) {
523 var access_code = document.getElementById('access-code');
524 if (access_code.value && access_code.value != "") {
525 this.setElementDisplay_("errormsg-0-access-code", 'block');
526 this.showAccessCodeRequired_();
527 } else {
528 this.setElementDisplay_("errormsg-1-password", 'table-row');
529 }
530 this.setBlurbError_(args.error_message);
531 } else if (3 == args.error) {
532 this.setElementDisplay_("errormsg-0-connection", 'table-row');
533 this.setBlurbError_(args.error_message);
534 } else if (4 == args.error) {
535 this.showCaptcha_(args);
536 } else if (8 == args.error) {
537 this.showAccessCodeRequired_();
538 } else if (args.error_message) {
539 this.setBlurbError_(args.error_message);
540 }
541
542 $('sign-in').disabled = false;
543 $('sign-in').value = templateData['signin'];
544 this.loginSetFocus_();
545 },
546
547 resetErrorVisibility_: function() {
548 this.setElementDisplay_("errormsg-0-email", 'none');
549 this.setElementDisplay_("errormsg-0-password", 'none');
550 this.setElementDisplay_("errormsg-1-password", 'none');
551 this.setElementDisplay_("errormsg-0-connection", 'none');
552 this.setElementDisplay_("errormsg-0-access-code", 'none');
553 },
554
555 setBlurbError_: function(error_message) {
556 if (this.captchaChallengeActive_)
557 return; // No blurb in captcha challenge mode.
558
559 if (error_message) {
560 document.getElementById('error-signing-in').style.display = 'none';
561 document.getElementById('error-custom').style.display = 'inline';
562 document.getElementById('error-custom').textContent = error_message;
563 } else {
564 document.getElementById('error-signing-in').style.display = 'inline';
565 document.getElementById('error-custom').style.display = 'none';
566 }
567
568 $('top-blurb-error').style.visibility = "visible";
569 document.getElementById('gaia-email').disabled = false;
570 document.getElementById('gaia-passwd').disabled = false;
571 },
572
573 setErrorVisibility_: function() {
574 this.resetErrorVisibility_();
575 var f = $('gaia-login-form');
576 var email = $('gaia-email');
577 var passwd = $('gaia-passwd');
578 if (null == email.value || "" == email.value) {
579 this.setElementDisplay_("errormsg-0-email", 'table-row');
580 this.setBlurbError_();
581 return false;
582 }
583 if (null == passwd.value || "" == passwd.value) {
584 this.setElementDisplay_("errormsg-0-password", 'table-row');
585 this.setBlurbError_();
586 return false;
587 }
588 if (!f.accessCode.disabled && (null == f.accessCode.value ||
589 "" == f.accessCode.value)) {
590 this.setElementDisplay_("errormsg-0-password", 'table-row');
591 return false;
592 }
593 return true;
594 },
595
596 sendCredentialsAndClose_: function() {
597 if (!this.setErrorVisibility_()) {
598 return false;
599 }
600
601 $('gaia-email').disabled = true;
602 $('gaia-passwd').disabled = true;
603 $('captcha-value').disabled = true;
604 $('access-code').disabled = true;
605
606 $('logging-in-throbber').style.visibility = "visible";
607
608 var f = $('gaia-login-form');
609 var email = $('gaia-email');
610 var passwd = $('gaia-passwd');
611 var result = JSON.stringify({"user" : email.value,
612 "pass" : passwd.value,
613 "captcha" : f.captchaValue.value,
614 "access_code" : f.accessCode.value});
615 $('sign-in').disabled = true;
616 chrome.send("SubmitAuth", [result]);
617 },
618
619 showGaiaSuccessAndClose_: function() {
620 $('sign-in').value = localStrings.getString('loginSuccess');
621 setTimeout(this.closeOverlay_, 1600);
622 },
623
624 showSuccessAndSettingUp_: function() {
625 $('sign-in').value = localStrings.getString('settingUp');
626 },
627
628 /** @inheritDoc */
629 shouldClose: function() {
630 if (!$('cancel-warning-box').hidden) {
631 chrome.send('PassphraseCancel', ['']);
632 return true;
633 } else if (!$('sync-setup-passphrase').classList.contains('hidden')) {
634 // The Passphrase page is showing, and the use has pressed escape.
635 // Activate the cancel logic in this case.
636 this.showCancelWarning_();
637 return false;
638 }
639
640 return true;
641 },
642 };
643
644 SyncSetupOverlay.showSyncSetupPage = function(page, args) {
645 SyncSetupOverlay.getInstance().showSyncSetupPage_(page, args);
646 };
647
648 SyncSetupOverlay.showSuccessAndClose = function() {
649 SyncSetupOverlay.getInstance().showSuccessAndClose_();
650 };
651
652 SyncSetupOverlay.showSuccessAndSettingUp = function() {
653 SyncSetupOverlay.getInstance().showSuccessAndSettingUp_();
654 };
655
656 // Export
657 return {
658 SyncSetupOverlay: SyncSetupOverlay
659 };
660 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698