| // Copyright 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Redefine '$' here rather than including 'cr.js', since this is |
| // the only function needed. This allows this file to be loaded |
| // in a browser directly for layout and some testing purposes. |
| var $ = function(id) { return document.getElementById(id); }; |
| |
| /** |
| * WebUI for configuring instant.* preference values used by |
| * Chrome's instant search system. |
| */ |
| var instantConfig = (function() { |
| 'use strict'; |
| |
| /** List of fields used to dynamically build form. **/ |
| var FIELDS = [ |
| { |
| key: 'instant_ui.zero_suggest_url_prefix', |
| label: 'Prefix URL for the experimental Instant ZeroSuggest provider', |
| type: 'string', |
| size: 40, |
| units: '', |
| default: '' |
| }, |
| ]; |
| |
| /** |
| * Returns a DOM element of the given type and class name. |
| */ |
| function createElementWithClass(elementType, className) { |
| var element = document.createElement(elementType); |
| element.className = className; |
| return element; |
| } |
| |
| /** |
| * Dynamically builds web-form based on FIELDS list. |
| * @return {string} The form's HTML. |
| */ |
| function buildForm() { |
| var buf = []; |
| |
| for (var i = 0; i < FIELDS.length; i++) { |
| var field = FIELDS[i]; |
| |
| var row = createElementWithClass('div', 'row'); |
| row.id = ''; |
| |
| var label = createElementWithClass('label', 'row-label'); |
| label.setAttribute('for', field.key); |
| label.textContent = field.label; |
| row.appendChild(label); |
| |
| var input = createElementWithClass('input', 'row-input'); |
| input.type = field.type; |
| input.id = field.key; |
| input.title = "Default Value: " + field.default; |
| if (field.size) input.size = field.size; |
| input.min = field.min || 0; |
| if (field.max) input.max = field.max; |
| if (field.step) input.step = field.step; |
| row.appendChild(input); |
| |
| var units = createElementWithClass('div', 'row-units'); |
| if (field.units) units.innerHTML = field.units; |
| row.appendChild(units); |
| |
| $('instant-form').appendChild(row); |
| } |
| } |
| |
| /** |
| * Initialize the form by adding 'onChange' listeners to all fields. |
| */ |
| function initForm() { |
| for (var i = 0; i < FIELDS.length; i++) { |
| var field = FIELDS[i]; |
| $(field.key).onchange = (function(key) { |
| setPreferenceValue(key); |
| }).bind(null, field.key); |
| } |
| } |
| |
| /** |
| * Request a preference setting's value. |
| * This method is asynchronous; the result is provided by a call to |
| * getPreferenceValueResult. |
| * @param {string} prefName The name of the preference value being requested. |
| */ |
| function getPreferenceValue(prefName) { |
| chrome.send('getPreferenceValue', [prefName]); |
| } |
| |
| /** |
| * Handle callback from call to getPreferenceValue. |
| * @param {string} prefName The name of the requested preference value. |
| * @param {value} value The current value associated with prefName. |
| */ |
| function getPreferenceValueResult(prefName, value) { |
| if ($(prefName).type == 'checkbox') |
| $(prefName).checked = value; |
| else |
| $(prefName).value = value; |
| } |
| |
| /** |
| * Set a preference setting's value stored in the element with prefName. |
| * @param {string} prefName The name of the preference value being set. |
| */ |
| function setPreferenceValue(prefName) { |
| var value; |
| if ($(prefName).type == 'checkbox') |
| value = $(prefName).checked; |
| else if ($(prefName).type == 'number') |
| value = parseFloat($(prefName).value); |
| else |
| value = $(prefName).value; |
| chrome.send('setPreferenceValue', [prefName, value]); |
| } |
| |
| /** |
| * Saves data back into Chrome preferences. |
| */ |
| function onSave() { |
| for (var i = 0; i < FIELDS.length; i++) { |
| var field = FIELDS[i]; |
| setPreferenceValue(field.key); |
| } |
| return false; |
| } |
| |
| /** |
| * Request debug info. |
| * The method is asynchronous, results being provided via getDebugInfoResult. |
| */ |
| function getDebugInfo() { |
| chrome.send('getDebugInfo'); |
| } |
| |
| /** |
| * Handles callback from getDebugInfo. |
| * @param {Object} info The debug info. |
| */ |
| function getDebugInfoResult(info) { |
| for (var i = 0; i < info.entries.length; ++i) { |
| var entry = info.entries[i]; |
| var row = createElementWithClass('p', 'debug'); |
| row.appendChild(createElementWithClass('span', 'timestamp')).textContent = |
| entry.time; |
| row.appendChild(document.createElement('span')).textContent = entry.text; |
| $('instant-debug-info').appendChild(row); |
| } |
| } |
| |
| /** |
| * Resets list of debug events. |
| */ |
| function clearDebugInfo() { |
| $('instant-debug-info').innerHTML = ''; |
| chrome.send('clearDebugInfo'); |
| } |
| |
| function loadForm() { |
| for (var i = 0; i < FIELDS.length; i++) |
| getPreferenceValue(FIELDS[i].key); |
| } |
| |
| /** |
| * Build and initialize the configuration form. |
| */ |
| function initialize() { |
| buildForm(); |
| loadForm(); |
| initForm(); |
| getDebugInfo(); |
| |
| $('save-button').onclick = onSave.bind(this); |
| $('clear-button').onclick = clearDebugInfo.bind(this); |
| } |
| |
| return { |
| initialize: initialize, |
| getDebugInfoResult: getDebugInfoResult, |
| getPreferenceValueResult: getPreferenceValueResult |
| }; |
| })(); |
| |
| document.addEventListener('DOMContentLoaded', instantConfig.initialize); |