// 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);