summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-28 06:40:32 +0000
committersatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-28 06:40:32 +0000
commit6bef62500d72324cc06201adf4d7058555e57371 (patch)
tree765a67a7fee8fec7eb9ed98412e3eb554f588e42
parent5c738341ccfbdde425a2893f0dd5d4b26f3b3bf3 (diff)
downloadchromium_src-6bef62500d72324cc06201adf4d7058555e57371.zip
chromium_src-6bef62500d72324cc06201adf4d7058555e57371.tar.gz
chromium_src-6bef62500d72324cc06201adf4d7058555e57371.tar.bz2
Add logic to save input method preference based on user clicks.
Along the way, add some sanity check code in language_options_list.js to filter bad language codes, just in case. TEST=manually BUG=chromium-os:4573 Review URL: http://codereview.chromium.org/3051013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53915 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/resources/options/chromeos_language_list.js28
-rw-r--r--chrome/browser/resources/options/chromeos_language_options.js91
2 files changed, 114 insertions, 5 deletions
diff --git a/chrome/browser/resources/options/chromeos_language_list.js b/chrome/browser/resources/options/chromeos_language_list.js
index e78e029..a4f7972 100644
--- a/chrome/browser/resources/options/chromeos_language_list.js
+++ b/chrome/browser/resources/options/chromeos_language_list.js
@@ -43,16 +43,18 @@ cr.define('options.language', function() {
* @private
*/
handlePrefChange_: function(e) {
- this.load_(e.value);
+ var languageCodesInCsv = e.value;
+ var languageCodes = this.filterBadLanguageCodes_(
+ languageCodesInCsv.split(','));
+ this.load_(languageCodes);
},
/**
* Loads given language list.
- * @param {string} languageCodesInCsv A CSV string of language codes.
+ * @param {Array} languageCodes List of language codes.
* @private
*/
- load_: function(languageCodesInCsv) {
- var languageCodes = languageCodesInCsv.split(',');
+ load_: function(languageCodes) {
this.dataModel = new ArrayDataModel(languageCodes);
// Select the first item if it's not empty.
// TODO(satorux): Switch to a single item selection model that does
@@ -68,6 +70,24 @@ cr.define('options.language', function() {
// Encode the language codes into a CSV string.
Preferences.setStringPref(this.pref, this.dataModel.slice().join(','));
},
+
+ /**
+ * Filters bad language codes in case bad language codes are
+ * stored in the preference.
+ * @param {Array} languageCodes List of language codes.
+ * @private
+ */
+ filterBadLanguageCodes_: function(languageCodes) {
+ var filteredLanguageCodes = [];
+ for (var i = 0; i < languageCodes.length; i++) {
+ // Check if the translation for the language code is
+ // present. Otherwise, skip it.
+ if (localStrings.getString(languageCodes[i])) {
+ filteredLanguageCodes.push(languageCodes[i]);
+ }
+ }
+ return filteredLanguageCodes;
+ },
};
return {
diff --git a/chrome/browser/resources/options/chromeos_language_options.js b/chrome/browser/resources/options/chromeos_language_options.js
index a746ffe..372a546 100644
--- a/chrome/browser/resources/options/chromeos_language_options.js
+++ b/chrome/browser/resources/options/chromeos_language_options.js
@@ -40,6 +40,10 @@ LanguageOptions.prototype = {
},
languageListInitalized_: false,
+ // The preference is a CSV string that describes preload engines
+ // (i.e. active input methods).
+ preloadEnginesPref: 'settings.language.preload_engines',
+ preloadEngines_: [],
/**
* Initializes the input method list.
@@ -57,7 +61,9 @@ LanguageOptions.prototype = {
var input = document.createElement('input');
input.type = 'checkbox';
input.inputMethodId = inputMethod.id;
-
+ // Listen to user clicks.
+ input.addEventListener('click',
+ cr.bind(this.handleCheckboxClick_, this));
var label = document.createElement('label');
label.appendChild(input);
label.appendChild(document.createTextNode(inputMethod.displayName));
@@ -66,6 +72,9 @@ LanguageOptions.prototype = {
inputMethodList.appendChild(label);
}
+ // Listen to pref change once the input method list is initialized.
+ Preferences.getInstance().addEventListener(this.preloadEnginesPref,
+ cr.bind(this.handlePreloadEnginesPrefChange_, this));
},
/**
@@ -112,5 +121,85 @@ LanguageOptions.prototype = {
labels[i].style.display = 'none';
}
}
+ },
+
+ /**
+ * Handles preloadEnginesPref change.
+ * @param {Event} e Change event.
+ * @private
+ */
+ handlePreloadEnginesPrefChange_: function(e) {
+ this.preloadEngines_ = this.filterBadPreloadEngines_(e.value.split(','));
+ this.updateCheckboxesFromPreloadEngines_();
+ },
+
+ /**
+ * Handles input method checkbox's click event.
+ * @param {Event} e Click event.
+ * @private
+ */
+ handleCheckboxClick_ : function(e) {
+ this.updatePreloadEnginesFromCheckboxes_();
+ Preferences.setStringPref(this.preloadEnginesPref,
+ this.preloadEngines_.join(','));
+ },
+
+ /**
+ * Updates the checkboxes in the input method list from the preload
+ * engines preference.
+ * @private
+ */
+ updateCheckboxesFromPreloadEngines_: function() {
+ // Convert the list into a dictonary for simpler lookup.
+ var dictionary = {};
+ for (var i = 0; i < this.preloadEngines_.length; i++) {
+ dictionary[this.preloadEngines_[i]] = true;
+ }
+
+ var inputMethodList = $('language-options-input-method-list');
+ var checkboxes = inputMethodList.querySelectorAll('input');
+ for (var i = 0; i < checkboxes.length; i++) {
+ checkboxes[i].checked = (checkboxes[i].inputMethodId in dictionary);
+ }
+ },
+
+ /**
+ * Updates the preload engines preference from the checkboxes in the
+ * input method list.
+ * @private
+ */
+ updatePreloadEnginesFromCheckboxes_: function() {
+ this.preloadEngines_ = [];
+ var inputMethodList = $('language-options-input-method-list');
+ var checkboxes = inputMethodList.querySelectorAll('input');
+ for (var i = 0; i < checkboxes.length; i++) {
+ if (checkboxes[i].checked) {
+ this.preloadEngines_.push(checkboxes[i].inputMethodId);
+ }
+ }
+ },
+
+ /**
+ * Filters bad preload engines in case bad preload engines are
+ * stored in the preference.
+ * @param {Array} preloadEngines List of preload engines.
+ * @private
+ */
+ filterBadPreloadEngines_: function(preloadEngines) {
+ // Convert the list into a dictonary for simpler lookup.
+ var dictionary = {};
+ for (var i = 0; i < templateData.inputMethodList.length; i++) {
+ dictionary[templateData.inputMethodList[i].id] = true;
+ }
+
+ var filteredPreloadEngines = [];
+ for (var i = 0; i < preloadEngines.length; i++) {
+ // Check if the preload engine is present in the
+ // dictionary. Otherwise, skip it.
+ if (preloadEngines[i] in dictionary) {
+ filteredPreloadEngines.push(preloadEngines[i]);
+ }
+ }
+ return filteredPreloadEngines;
}
};