| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 // Redefine '$' here rather than including 'cr.js', since this is | 5 // Redefine '$' here rather than including util.js, since this is the only |
| 6 // the only function needed. This allows this file to be loaded | 6 // function needed. |
| 7 // in a browser directly for layout and some testing purposes. | |
| 8 var $ = function(id) { return document.getElementById(id); }; | 7 var $ = function(id) { return document.getElementById(id); }; |
| 9 | 8 |
| 10 /** | 9 /** |
| 11 * WebUI for configuring instant.* preference values used by | 10 * WebUI for displaying Instant debug event information. |
| 12 * Chrome's instant search system. | |
| 13 */ | 11 */ |
| 14 var instantConfig = (function() { | 12 var instantConfig = (function() { |
| 15 'use strict'; | 13 'use strict'; |
| 16 | 14 |
| 17 /** List of fields used to dynamically build form. **/ | |
| 18 var FIELDS = [ | |
| 19 { | |
| 20 key: 'instant_ui.zero_suggest_url_prefix', | |
| 21 label: 'Prefix URL for the experimental Instant ZeroSuggest provider', | |
| 22 type: 'string', | |
| 23 size: 40, | |
| 24 units: '', | |
| 25 default: '' | |
| 26 }, | |
| 27 ]; | |
| 28 | |
| 29 /** | 15 /** |
| 30 * Returns a DOM element of the given type and class name. | 16 * Request debug events; results arrive asynchronously via setDebugEvents(). |
| 31 */ | 17 */ |
| 32 function createElementWithClass(elementType, className) { | 18 function getDebugEvents() { |
| 33 var element = document.createElement(elementType); | 19 chrome.send('getDebugEvents'); |
| 34 element.className = className; | |
| 35 return element; | |
| 36 } | 20 } |
| 37 | 21 |
| 38 /** | 22 /** |
| 39 * Dynamically builds web-form based on FIELDS list. | 23 * Handles callback from getDebugEvents(). |
| 40 * @return {string} The form's HTML. | 24 * @param {Array} events A list of debug events. |
| 41 */ | 25 */ |
| 42 function buildForm() { | 26 function setDebugEvents(events) { |
| 43 var buf = []; | 27 var debugEvents = $('debug-events'); |
| 44 | 28 |
| 45 for (var i = 0; i < FIELDS.length; i++) { | 29 for (var i = 0; i < events.length; ++i) { |
| 46 var field = FIELDS[i]; | 30 var event = document.createElement('p'); |
| 47 | 31 |
| 48 var row = createElementWithClass('div', 'row'); | 32 var time = document.createElement('span'); |
| 49 row.id = ''; | 33 time.className = 'time'; |
| 34 time.textContent = events[i].time; |
| 35 event.appendChild(time); |
| 50 | 36 |
| 51 var label = createElementWithClass('label', 'row-label'); | 37 var text = document.createElement('span'); |
| 52 label.setAttribute('for', field.key); | 38 text.textContent = events[i].text; |
| 53 label.textContent = field.label; | 39 event.appendChild(text); |
| 54 row.appendChild(label); | |
| 55 | 40 |
| 56 var input = createElementWithClass('input', 'row-input'); | 41 debugEvents.appendChild(event); |
| 57 input.type = field.type; | |
| 58 input.id = field.key; | |
| 59 input.title = "Default Value: " + field.default; | |
| 60 if (field.size) input.size = field.size; | |
| 61 input.min = field.min || 0; | |
| 62 if (field.max) input.max = field.max; | |
| 63 if (field.step) input.step = field.step; | |
| 64 row.appendChild(input); | |
| 65 | |
| 66 var units = createElementWithClass('div', 'row-units'); | |
| 67 if (field.units) units.innerHTML = field.units; | |
| 68 row.appendChild(units); | |
| 69 | |
| 70 $('instant-form').appendChild(row); | |
| 71 } | 42 } |
| 72 } | 43 } |
| 73 | 44 |
| 74 /** | 45 /** |
| 75 * Initialize the form by adding 'onChange' listeners to all fields. | 46 * Resets the list of debug events. |
| 76 */ | 47 */ |
| 77 function initForm() { | 48 function clearDebugEvents() { |
| 78 for (var i = 0; i < FIELDS.length; i++) { | 49 $('debug-events').innerHTML = ''; |
| 79 var field = FIELDS[i]; | 50 chrome.send('clearDebugEvents'); |
| 80 $(field.key).onchange = (function(key) { | |
| 81 setPreferenceValue(key); | |
| 82 }).bind(null, field.key); | |
| 83 } | |
| 84 } | 51 } |
| 85 | 52 |
| 86 /** | |
| 87 * Request a preference setting's value. | |
| 88 * This method is asynchronous; the result is provided by a call to | |
| 89 * getPreferenceValueResult. | |
| 90 * @param {string} prefName The name of the preference value being requested. | |
| 91 */ | |
| 92 function getPreferenceValue(prefName) { | |
| 93 chrome.send('getPreferenceValue', [prefName]); | |
| 94 } | |
| 95 | |
| 96 /** | |
| 97 * Handle callback from call to getPreferenceValue. | |
| 98 * @param {string} prefName The name of the requested preference value. | |
| 99 * @param {value} value The current value associated with prefName. | |
| 100 */ | |
| 101 function getPreferenceValueResult(prefName, value) { | |
| 102 if ($(prefName).type == 'checkbox') | |
| 103 $(prefName).checked = value; | |
| 104 else | |
| 105 $(prefName).value = value; | |
| 106 } | |
| 107 | |
| 108 /** | |
| 109 * Set a preference setting's value stored in the element with prefName. | |
| 110 * @param {string} prefName The name of the preference value being set. | |
| 111 */ | |
| 112 function setPreferenceValue(prefName) { | |
| 113 var value; | |
| 114 if ($(prefName).type == 'checkbox') | |
| 115 value = $(prefName).checked; | |
| 116 else if ($(prefName).type == 'number') | |
| 117 value = parseFloat($(prefName).value); | |
| 118 else | |
| 119 value = $(prefName).value; | |
| 120 chrome.send('setPreferenceValue', [prefName, value]); | |
| 121 } | |
| 122 | |
| 123 /** | |
| 124 * Saves data back into Chrome preferences. | |
| 125 */ | |
| 126 function onSave() { | |
| 127 for (var i = 0; i < FIELDS.length; i++) { | |
| 128 var field = FIELDS[i]; | |
| 129 setPreferenceValue(field.key); | |
| 130 } | |
| 131 return false; | |
| 132 } | |
| 133 | |
| 134 /** | |
| 135 * Request debug info. | |
| 136 * The method is asynchronous, results being provided via getDebugInfoResult. | |
| 137 */ | |
| 138 function getDebugInfo() { | |
| 139 chrome.send('getDebugInfo'); | |
| 140 } | |
| 141 | |
| 142 /** | |
| 143 * Handles callback from getDebugInfo. | |
| 144 * @param {Object} info The debug info. | |
| 145 */ | |
| 146 function getDebugInfoResult(info) { | |
| 147 for (var i = 0; i < info.entries.length; ++i) { | |
| 148 var entry = info.entries[i]; | |
| 149 var row = createElementWithClass('p', 'debug'); | |
| 150 row.appendChild(createElementWithClass('span', 'timestamp')).textContent = | |
| 151 entry.time; | |
| 152 row.appendChild(document.createElement('span')).textContent = entry.text; | |
| 153 $('instant-debug-info').appendChild(row); | |
| 154 } | |
| 155 } | |
| 156 | |
| 157 /** | |
| 158 * Resets list of debug events. | |
| 159 */ | |
| 160 function clearDebugInfo() { | |
| 161 $('instant-debug-info').innerHTML = ''; | |
| 162 chrome.send('clearDebugInfo'); | |
| 163 } | |
| 164 | |
| 165 function loadForm() { | |
| 166 for (var i = 0; i < FIELDS.length; i++) | |
| 167 getPreferenceValue(FIELDS[i].key); | |
| 168 } | |
| 169 | |
| 170 /** | |
| 171 * Build and initialize the configuration form. | |
| 172 */ | |
| 173 function initialize() { | 53 function initialize() { |
| 174 buildForm(); | 54 $('clear-debug-events').onclick = clearDebugEvents.bind(this); |
| 175 loadForm(); | 55 getDebugEvents(); |
| 176 initForm(); | |
| 177 getDebugInfo(); | |
| 178 | |
| 179 $('save-button').onclick = onSave.bind(this); | |
| 180 $('clear-button').onclick = clearDebugInfo.bind(this); | |
| 181 } | 56 } |
| 182 | 57 |
| 183 return { | 58 return { |
| 184 initialize: initialize, | 59 initialize: initialize, |
| 185 getDebugInfoResult: getDebugInfoResult, | 60 setDebugEvents: setDebugEvents, |
| 186 getPreferenceValueResult: getPreferenceValueResult | |
| 187 }; | 61 }; |
| 188 })(); | 62 })(); |
| 189 | 63 |
| 190 document.addEventListener('DOMContentLoaded', instantConfig.initialize); | 64 document.addEventListener('DOMContentLoaded', instantConfig.initialize); |
| OLD | NEW |