OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 cr.define('options', function() { | 5 cr.define('options', function() { |
6 const OptionsPage = options.OptionsPage; | 6 const OptionsPage = options.OptionsPage; |
7 const ArrayDataModel = cr.ui.ArrayDataModel; | 7 const ArrayDataModel = cr.ui.ArrayDataModel; |
8 | 8 |
9 // | 9 // |
10 // BrowserOptions class | 10 // BrowserOptions class |
11 // Encapsulated handling of browser options page. | 11 // Encapsulated handling of browser options page. |
12 // | 12 // |
13 function BrowserOptions() { | 13 function BrowserOptions() { |
14 OptionsPage.call(this, 'browser', | 14 OptionsPage.call(this, 'browser', |
15 templateData.browserPageTabTitle, | 15 templateData.browserPageTabTitle, |
16 'browserPage'); | 16 'browserPage'); |
17 if (cr.isChromeOS) { | |
James Hawkins
2012/01/11 16:33:29
Can this not be done in initializePage()?
csilv
2012/01/11 18:47:08
Done.
| |
18 // Username (canonical email) of the currently logged in user or | |
19 // |kGuestUser| if a guest session is active. | |
20 this.username_ = localStrings.getString('username'); | |
21 } | |
17 } | 22 } |
18 | 23 |
19 cr.addSingletonGetter(BrowserOptions); | 24 cr.addSingletonGetter(BrowserOptions); |
20 | 25 |
21 BrowserOptions.prototype = { | 26 BrowserOptions.prototype = { |
22 // Inherit BrowserOptions from OptionsPage. | 27 // Inherit BrowserOptions from OptionsPage. |
23 __proto__: options.OptionsPage.prototype, | 28 __proto__: options.OptionsPage.prototype, |
24 | 29 |
25 // State variables. | 30 // State variables. |
26 syncEnabled: false, | 31 syncEnabled: false, |
(...skipping 10 matching lines...) Expand all Loading... | |
37 // The cached value of the instant.confirm_dialog_shown preference. | 42 // The cached value of the instant.confirm_dialog_shown preference. |
38 instantConfirmDialogShown_: false, | 43 instantConfirmDialogShown_: false, |
39 | 44 |
40 /** | 45 /** |
41 * Initialize BrowserOptions page. | 46 * Initialize BrowserOptions page. |
42 */ | 47 */ |
43 initializePage: function() { | 48 initializePage: function() { |
44 // Call base class implementation to start preference initialization. | 49 // Call base class implementation to start preference initialization. |
45 OptionsPage.prototype.initializePage.call(this); | 50 OptionsPage.prototype.initializePage.call(this); |
46 | 51 |
47 // Sync. | 52 var self = this; |
53 | |
54 // Sync (Sign in) section. | |
48 $('sync-action-link').onclick = function(event) { | 55 $('sync-action-link').onclick = function(event) { |
49 SyncSetupOverlay.showErrorUI(); | 56 SyncSetupOverlay.showErrorUI(); |
50 }; | 57 }; |
51 $('start-stop-sync').onclick = function(event) { | 58 $('start-stop-sync').onclick = function(event) { |
52 if (self.syncSetupCompleted) | 59 if (self.syncSetupCompleted) |
53 SyncSetupOverlay.showStopSyncingUI(); | 60 SyncSetupOverlay.showStopSyncingUI(); |
54 else | 61 else |
55 SyncSetupOverlay.showSetupUI(); | 62 SyncSetupOverlay.showSetupUI(); |
56 }; | 63 }; |
57 $('customize-sync').onclick = function(event) { | 64 $('customize-sync').onclick = function(event) { |
58 SyncSetupOverlay.showSetupUI(); | 65 SyncSetupOverlay.showSetupUI(); |
59 }; | 66 }; |
60 | 67 |
61 // Wire up controls. | 68 // On Startup section. |
62 $('startupSetPages').onclick = function() { | 69 $('startupSetPages').onclick = function() { |
63 OptionsPage.navigateToPage('startup'); | 70 OptionsPage.navigateToPage('startup'); |
64 }; | 71 }; |
72 | |
73 // Appearance section. | |
James Hawkins
2012/01/11 16:33:29
Toolbar Appearance
| |
74 $('change-home-page').onclick = function(event) { | |
75 OptionsPage.navigateToPage('homePageOverlay'); | |
76 }; | |
77 $('themes-gallery').onclick = function(event) { | |
78 window.open(localStrings.getString('themesGalleryURL')); | |
79 }; | |
80 $('themes-reset').onclick = function(event) { | |
81 chrome.send('themesReset'); | |
82 }; | |
83 // Ensure that changes are committed when closing the page. | |
84 window.addEventListener('unload', function() { | |
85 if (document.activeElement == homepageField) | |
86 homepageField.blur(); | |
87 }); | |
88 | |
89 // Search section. | |
65 $('defaultSearchManageEnginesButton').onclick = function(event) { | 90 $('defaultSearchManageEnginesButton').onclick = function(event) { |
66 OptionsPage.navigateToPage('searchEngines'); | 91 OptionsPage.navigateToPage('searchEngines'); |
67 chrome.send('coreOptionsUserMetricsAction', | 92 chrome.send('coreOptionsUserMetricsAction', |
68 ['Options_ManageSearchEngines']); | 93 ['Options_ManageSearchEngines']); |
69 }; | 94 }; |
70 $('advancedOptionsButton').onclick = function(event) { | |
71 OptionsPage.navigateToPage('advanced'); | |
72 chrome.send('coreOptionsUserMetricsAction', | |
73 ['Options_OpenUnderTheHood']); | |
74 }; | |
75 $('defaultSearchEngine').onchange = this.setDefaultSearchEngine_; | 95 $('defaultSearchEngine').onchange = this.setDefaultSearchEngine_; |
76 $('change-home-page').onclick = function(event) { | |
77 OptionsPage.navigateToPage('homePageOverlay'); | |
78 }; | |
79 | |
80 var self = this; | |
81 $('instantEnabledCheckbox').customChangeHandler = function(event) { | 96 $('instantEnabledCheckbox').customChangeHandler = function(event) { |
82 if (this.checked) { | 97 if (this.checked) { |
83 if (self.instantConfirmDialogShown_) | 98 if (self.instantConfirmDialogShown_) |
84 chrome.send('enableInstant'); | 99 chrome.send('enableInstant'); |
85 else | 100 else |
86 OptionsPage.navigateToPage('instantConfirm'); | 101 OptionsPage.navigateToPage('instantConfirm'); |
87 } else { | 102 } else { |
88 chrome.send('disableInstant'); | 103 chrome.send('disableInstant'); |
89 } | 104 } |
90 return true; | 105 return true; |
91 }; | 106 }; |
92 | |
93 $('instantFieldTrialCheckbox').addEventListener('change', | 107 $('instantFieldTrialCheckbox').addEventListener('change', |
94 function(event) { | 108 function(event) { |
95 this.checked = true; | 109 this.checked = true; |
96 chrome.send('disableInstant'); | 110 chrome.send('disableInstant'); |
97 }); | 111 }); |
98 | |
99 Preferences.getInstance().addEventListener('instant.confirm_dialog_shown', | 112 Preferences.getInstance().addEventListener('instant.confirm_dialog_shown', |
100 this.onInstantConfirmDialogShownChanged_.bind(this)); | 113 this.onInstantConfirmDialogShownChanged_.bind(this)); |
101 | |
102 Preferences.getInstance().addEventListener('instant.enabled', | 114 Preferences.getInstance().addEventListener('instant.enabled', |
103 this.onInstantEnabledChanged_.bind(this)); | 115 this.onInstantEnabledChanged_.bind(this)); |
104 | 116 |
105 // Text fields may change widths when the window changes size, so make | 117 // Text fields may change widths when the window changes size, so make |
106 // sure the suggestion list stays in sync. | 118 // sure the suggestion list stays in sync. |
107 window.addEventListener('resize', function() { | 119 window.addEventListener('resize', function() { |
108 self.autocompleteList_.syncWidthToInput(); | 120 self.autocompleteList_.syncWidthToInput(); |
109 }); | 121 }); |
110 | 122 |
111 // Ensure that changes are committed when closing the page. | |
112 window.addEventListener('unload', function() { | |
113 if (document.activeElement == homepageField) | |
114 homepageField.blur(); | |
115 }); | |
116 | |
117 if (!cr.isChromeOS) { | |
118 $('defaultBrowserUseAsDefaultButton').onclick = function(event) { | |
119 chrome.send('becomeDefaultBrowser'); | |
120 }; | |
121 } | |
122 | |
123 // Check if we are in the guest mode. | |
124 if (cr.commandLine && cr.commandLine.options['--bwsi']) { | 123 if (cr.commandLine && cr.commandLine.options['--bwsi']) { |
125 // Hide the startup section. | 124 // Hide the startup section in Guest mode. |
126 $('startupSection').hidden = true; | 125 $('startupSection').hidden = true; |
127 } | 126 } |
128 | 127 |
129 var suggestionList = new options.AutocompleteList(); | 128 var suggestionList = new options.AutocompleteList(); |
130 suggestionList.autoExpands = true; | 129 suggestionList.autoExpands = true; |
131 suggestionList.suggestionUpdateRequestCallback = | 130 suggestionList.suggestionUpdateRequestCallback = |
132 this.requestAutocompleteSuggestions_.bind(this); | 131 this.requestAutocompleteSuggestions_.bind(this); |
133 $('main-content').appendChild(suggestionList); | 132 $('main-content').appendChild(suggestionList); |
134 this.autocompleteList_ = suggestionList; | 133 this.autocompleteList_ = suggestionList; |
134 | |
135 // Users section. | |
136 var profilesList = $('profiles-list'); | |
137 options.browser_options.ProfileList.decorate(profilesList); | |
138 profilesList.autoExpands = true; | |
139 | |
140 profilesList.onchange = self.setProfileViewButtonsStatus_; | |
141 $('profiles-create').onclick = function(event) { | |
142 chrome.send('createProfile'); | |
143 }; | |
144 $('profiles-manage').onclick = function(event) { | |
145 var selectedProfile = self.getSelectedProfileItem_(); | |
146 if (selectedProfile) | |
147 ManageProfileOverlay.showManageDialog(selectedProfile); | |
148 }; | |
149 $('profiles-delete').onclick = function(event) { | |
150 var selectedProfile = self.getSelectedProfileItem_(); | |
151 if (selectedProfile) | |
152 ManageProfileOverlay.showDeleteDialog(selectedProfile); | |
153 }; | |
154 | |
155 if (cr.isChromeOS) { | |
156 $('change-picture-button').onclick = function(event) { | |
157 OptionsPage.navigateToPage('changePicture'); | |
158 }; | |
159 this.updateAccountPicture_(); | |
160 | |
161 if (cr.commandLine && cr.commandLine.options['--bwsi']) { | |
162 // Disable the screen lock checkbox and change-picture-button in | |
163 // guest mode. | |
164 $('enable-screen-lock').disabled = true; | |
165 $('change-picture-button').disabled = true; | |
166 } | |
167 } else { | |
168 $('import-data').onclick = function(event) { | |
169 // Make sure that any previous import success message is hidden, and | |
170 // we're showing the UI to import further data. | |
171 $('import-data-configure').hidden = false; | |
172 $('import-data-success').hidden = true; | |
173 OptionsPage.navigateToPage('importData'); | |
174 chrome.send('coreOptionsUserMetricsAction', ['Import_ShowDlg']); | |
175 }; | |
176 | |
177 if ($('themes-GTK-button')) { | |
178 $('themes-GTK-button').onclick = function(event) { | |
179 chrome.send('themesSetGTK'); | |
180 }; | |
181 } | |
182 } | |
183 | |
184 // Default browser section. | |
185 if (!cr.isChromeOS) { | |
186 $('defaultBrowserUseAsDefaultButton').onclick = function(event) { | |
187 chrome.send('becomeDefaultBrowser'); | |
188 }; | |
189 } | |
190 | |
191 // Under the hood section. | |
192 $('advancedOptionsButton').onclick = function(event) { | |
193 OptionsPage.navigateToPage('advanced'); | |
194 chrome.send('coreOptionsUserMetricsAction', | |
195 ['Options_OpenUnderTheHood']); | |
196 }; | |
135 }, | 197 }, |
136 | 198 |
137 setSyncEnabled_: function(enabled) { | 199 setSyncEnabled_: function(enabled) { |
138 this.syncEnabled = enabled; | 200 this.syncEnabled = enabled; |
139 }, | 201 }, |
140 | 202 |
141 setAutoLoginVisible_ : function(visible) { | 203 setAutoLoginVisible_ : function(visible) { |
142 $('enable-auto-login-checkbox').hidden = !visible; | 204 $('enable-auto-login-checkbox').hidden = !visible; |
143 }, | 205 }, |
144 | 206 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
362 // TODO(tbreisacher): remove the duplication by refactoring | 424 // TODO(tbreisacher): remove the duplication by refactoring |
363 updateAutocompleteSuggestions_: function(suggestions) { | 425 updateAutocompleteSuggestions_: function(suggestions) { |
364 var list = this.autocompleteList_; | 426 var list = this.autocompleteList_; |
365 // If the trigger for this update was a value being selected from the | 427 // If the trigger for this update was a value being selected from the |
366 // current list, do nothing. | 428 // current list, do nothing. |
367 if (list.targetInput && list.selectedItem && | 429 if (list.targetInput && list.selectedItem && |
368 list.selectedItem['url'] == list.targetInput.value) | 430 list.selectedItem['url'] == list.targetInput.value) |
369 return; | 431 return; |
370 list.suggestions = suggestions; | 432 list.suggestions = suggestions; |
371 }, | 433 }, |
434 | |
435 /** | |
436 * Get the selected profile item from the profile list. This also works | |
437 * correctly if the list is not displayed. | |
438 * @return {Object} the profile item object, or null if nothing is selected. | |
439 * @private | |
440 */ | |
441 getSelectedProfileItem_: function() { | |
442 var profilesList = $('profiles-list'); | |
443 if (profilesList.hidden) { | |
444 if (profilesList.dataModel.length > 0) | |
445 return profilesList.dataModel.item(0); | |
446 } else { | |
447 return profilesList.selectedItem; | |
448 } | |
449 return null; | |
450 }, | |
451 | |
452 /** | |
453 * Helper function to set the status of profile view buttons to disabled or | |
454 * enabled, depending on the number of profiles and selection status of the | |
455 * profiles list. | |
456 */ | |
457 setProfileViewButtonsStatus_: function() { | |
458 var profilesList = $('profiles-list'); | |
459 var selectedProfile = profilesList.selectedItem; | |
460 var hasSelection = selectedProfile != null; | |
461 var hasSingleProfile = profilesList.dataModel.length == 1; | |
462 $('profiles-manage').disabled = !hasSelection || | |
463 !selectedProfile.isCurrentProfile; | |
464 $('profiles-delete').disabled = !hasSelection && !hasSingleProfile; | |
465 }, | |
466 | |
467 /** | |
468 * Display the correct dialog layout, depending on how many profiles are | |
469 * available. | |
470 * @param {number} numProfiles The number of profiles to display. | |
471 */ | |
472 setProfileViewSingle_: function(numProfiles) { | |
473 var hasSingleProfile = numProfiles == 1; | |
474 $('profiles-list').hidden = hasSingleProfile; | |
475 $('profiles-single-message').hidden = !hasSingleProfile; | |
476 $('profiles-manage').hidden = hasSingleProfile; | |
477 $('profiles-delete').textContent = hasSingleProfile ? | |
478 templateData.profilesDeleteSingle : | |
479 templateData.profilesDelete; | |
480 }, | |
481 | |
482 /** | |
483 * Adds all |profiles| to the list. | |
484 * @param {Array.<Object>} An array of profile info objects. | |
485 * each object is of the form: | |
486 * profileInfo = { | |
487 * name: "Profile Name", | |
488 * iconURL: "chrome://path/to/icon/image", | |
489 * filePath: "/path/to/profile/data/on/disk", | |
490 * isCurrentProfile: false | |
491 * }; | |
492 */ | |
493 setProfilesInfo_: function(profiles) { | |
494 this.setProfileViewSingle_(profiles.length); | |
495 // add it to the list, even if the list is hidden so we can access it | |
496 // later. | |
497 $('profiles-list').dataModel = new ArrayDataModel(profiles); | |
498 this.setProfileViewButtonsStatus_(); | |
499 }, | |
500 | |
501 setGtkThemeButtonEnabled_: function(enabled) { | |
502 if (!cr.isChromeOS && navigator.platform.match(/linux|BSD/i)) { | |
503 $('themes-GTK-button').disabled = !enabled; | |
504 } | |
505 }, | |
506 | |
507 setThemesResetButtonEnabled_: function(enabled) { | |
508 $('themes-reset').disabled = !enabled; | |
509 }, | |
510 | |
511 /** | |
512 * (Re)loads IMG element with current user account picture. | |
513 */ | |
514 updateAccountPicture_: function() { | |
515 $('account-picture').src = | |
516 'chrome://userimage/' + this.username_ + | |
517 '?id=' + (new Date()).getTime(); | |
518 }, | |
372 }; | 519 }; |
373 | 520 |
374 //Forward public APIs to private implementations. | 521 //Forward public APIs to private implementations. |
375 [ | 522 [ |
376 'getStartStopSyncButton', | 523 'getStartStopSyncButton', |
377 'hideSyncSection', | 524 'hideSyncSection', |
378 'setAutoLoginVisible', | 525 'setAutoLoginVisible', |
379 'setCustomizeSyncButtonEnabled', | 526 'setCustomizeSyncButtonEnabled', |
527 'setGtkThemeButtonEnabled', | |
528 'setInstantFieldTrialStatus', | |
529 'setProfilesInfo', | |
530 'setProfilesSectionVisible', | |
380 'setStartStopButtonEnabled', | 531 'setStartStopButtonEnabled', |
381 'setStartStopButtonLabel', | 532 'setStartStopButtonLabel', |
382 'setStartStopButtonVisible', | 533 'setStartStopButtonVisible', |
383 'setSyncActionLinkEnabled', | 534 'setSyncActionLinkEnabled', |
384 'setSyncActionLinkLabel', | 535 'setSyncActionLinkLabel', |
385 'setSyncEnabled', | 536 'setSyncEnabled', |
386 'setSyncSetupCompleted', | 537 'setSyncSetupCompleted', |
387 'setSyncStatus', | 538 'setSyncStatus', |
388 'setSyncStatusErrorVisible', | 539 'setSyncStatusErrorVisible', |
389 'setProfilesSectionVisible', | 540 'setThemesResetButtonEnabled', |
541 'updateAccountPicture', | |
542 'updateAutocompleteSuggestions', | |
390 'updateHomePageLabel', | 543 'updateHomePageLabel', |
391 'updateSearchEngines', | 544 'updateSearchEngines', |
392 'updateStartupPages', | 545 'updateStartupPages', |
393 'updateAutocompleteSuggestions', | |
394 'setInstantFieldTrialStatus', | |
395 ].forEach(function(name) { | 546 ].forEach(function(name) { |
396 BrowserOptions[name] = function(value) { | 547 BrowserOptions[name] = function(value) { |
397 return BrowserOptions.getInstance()[name + '_'](value); | 548 return BrowserOptions.getInstance()[name + '_'](value); |
398 }; | 549 }; |
399 }); | 550 }); |
400 | 551 |
401 BrowserOptions.updateDefaultBrowserState = function(statusString, isDefault, | 552 BrowserOptions.updateDefaultBrowserState = function(statusString, isDefault, |
402 canBeDefault) { | 553 canBeDefault) { |
403 if (!cr.isChromeOS) { | 554 if (!cr.isChromeOS) { |
404 BrowserOptions.getInstance().updateDefaultBrowserState_(statusString, | 555 BrowserOptions.getInstance().updateDefaultBrowserState_(statusString, |
405 isDefault, | 556 isDefault, |
406 canBeDefault); | 557 canBeDefault); |
407 } | 558 } |
408 }; | 559 }; |
409 | 560 |
561 if (cr.isChromeOS) { | |
562 /** | |
563 * Returns username (canonical email) of the user logged in (ChromeOS only). | |
564 * @return {string} user email. | |
565 */ | |
566 BrowserOptions.getLoggedInUsername = function() { | |
James Hawkins
2012/01/11 16:33:29
Ugh, this smells to me. I'm not going to ask you
csilv
2012/01/11 18:47:08
Done.
| |
567 return BrowserOptions.getInstance().username_; | |
568 }; | |
569 } | |
570 | |
410 // Export | 571 // Export |
411 return { | 572 return { |
412 BrowserOptions: BrowserOptions | 573 BrowserOptions: BrowserOptions |
413 }; | 574 }; |
414 | 575 |
415 }); | 576 }); |
OLD | NEW |