| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {assert} from 'chrome://resources/js/assert.js'; |
| import {sendWithPromise} from 'chrome://resources/js/cr.js'; |
| |
| interface AutocompleteActionPredictorDb { |
| enabled: boolean; |
| db: Array<{ |
| user_text: string, |
| url: string, |
| hit_count: number, |
| miss_count: number, |
| confidence: number, |
| }>; |
| } |
| |
| /** |
| * Requests the database from the backend. |
| */ |
| function requestAutocompleteActionPredictorDb() { |
| sendWithPromise('requestAutocompleteActionPredictorDb') |
| .then(updateAutocompleteActionPredictorDb); |
| } |
| |
| /** |
| * Callback from backend with the database contents. Sets up some globals and |
| * calls to create the UI. |
| * @param database Information about |
| * AutocompleteActionPredictor including the database as a flattened list, |
| * a boolean indicating if the system is enabled and the current hit weight. |
| */ |
| function updateAutocompleteActionPredictorDb( |
| database: AutocompleteActionPredictorDb) { |
| const filter = document.body.querySelector<HTMLInputElement>('#filter'); |
| assert(filter); |
| filter.disabled = false; |
| filter.onchange = function() { |
| updateAutocompleteActionPredictorDbView(database); |
| }; |
| |
| updateAutocompleteActionPredictorDbView(database); |
| } |
| |
| /** |
| * Updates the table from the database. |
| * @param database Information about |
| * AutocompleteActionPredictor including the database as a flattened list, |
| * a boolean indicating if the system is enabled and the current hit weight. |
| */ |
| function updateAutocompleteActionPredictorDbView( |
| database: AutocompleteActionPredictorDb) { |
| const databaseSection = |
| document.body.querySelector<HTMLElement>('#databaseTableBody'); |
| assert(databaseSection); |
| const showEnabled = database.enabled && !!database.db; |
| |
| const enabledMode = document.body.querySelector<HTMLElement>( |
| '#autocompleteActionPredictorEnabledMode'); |
| const disabledMode = document.body.querySelector<HTMLElement>( |
| '#autocompleteActionPredictorDisabledMode'); |
| assert(enabledMode); |
| assert(disabledMode); |
| enabledMode.hidden = !showEnabled; |
| disabledMode.hidden = showEnabled; |
| |
| if (!showEnabled) { |
| return; |
| } |
| |
| const filter = document.body.querySelector<HTMLInputElement>('#filter'); |
| assert(filter); |
| |
| // Clear any previous list. |
| databaseSection.textContent = ''; |
| |
| for (let i = 0; i < database.db.length; ++i) { |
| const entry = database.db[i]!; |
| |
| if (!filter.checked || entry.confidence > 0) { |
| const row = document.createElement('tr'); |
| |
| // These values should be synchronized with the values in |
| // chrome/browser/predictors/autocomplete_action_predictor.cc. |
| // TODO(crbug.com/326277753): Avoid hard-coding the values here. |
| let cssClass = 'action-none'; |
| if (entry.confidence >= 0.3) { |
| cssClass = 'action-preconnect'; |
| } |
| if (entry.confidence >= 0.5) { |
| cssClass = 'action-prerender'; |
| } |
| row.classList.add(cssClass); |
| |
| row.appendChild(document.createElement('td')).textContent = |
| entry.user_text; |
| row.appendChild(document.createElement('td')).textContent = entry.url; |
| row.appendChild(document.createElement('td')).textContent = |
| entry.hit_count.toString(); |
| row.appendChild(document.createElement('td')).textContent = |
| entry.miss_count.toString(); |
| row.appendChild(document.createElement('td')).textContent = |
| entry.confidence.toString(); |
| |
| databaseSection.appendChild(row); |
| } |
| } |
| const banner = document.body.querySelector<HTMLElement>('#countBanner'); |
| assert(banner); |
| banner.textContent = 'Entries: ' + databaseSection.children.length; |
| } |
| |
| document.addEventListener( |
| 'DOMContentLoaded', requestAutocompleteActionPredictorDb); |