15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Javascript for omnibox.html, served from chrome://omnibox/
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is used to debug omnibox ranking.  The user enters some text
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * into a box, submits it, and then sees lots of debug information
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from the autocompleter that shows what omnibox would do with that
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The simple object defined in this javascript file listens for
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * certain events on omnibox.html, sends (when appropriate) the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input text to C++ code to start the omnibox autcomplete controller
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * working, and listens from callbacks from the C++ code saying that
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * results are available.  When results (possibly intermediate ones)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are available, the Javascript formats them and displays them.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('omniboxDebug', function() {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'use strict';
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Register our event handlers.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function initialize() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('omnibox-input-form').addEventListener(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'submit', startOmniboxQuery, false);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    $('prevent-inline-autocomplete').addEventListener(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'change', startOmniboxQuery);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    $('prefer-keyword').addEventListener('change', startOmniboxQuery);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('show-details').addEventListener('change', refresh);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('show-incomplete-results').addEventListener('change', refresh);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('show-all-providers').addEventListener('change', refresh);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {Array.<Object>} an array of all autocomplete results we've seen
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     for this query.  We append to this list once for every call to
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     handleNewAutocompleteResult.  For details on the structure of
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     the object inside, see the comments by addResultToOutput.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var progressiveAutocompleteResults = [];
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {number} the value for cursor position we sent with the most
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     recent request.  We need to remember this in order to display it
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     in the output; otherwise it's hard or impossible to determine
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     from screen captures or print-to-PDFs.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var cursorPositionUsed = -1;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Extracts the input text from the text field and sends it to the
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * C++ portion of chrome to handle.  The C++ code will iteratively
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * call handleNewAutocompleteResult as results come in.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function startOmniboxQuery(event) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // First, clear the results of past calls (if any).
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    progressiveAutocompleteResults = [];
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Then, call chrome with a four-element list:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // - first element: the value in the text box
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // - second element: the location of the cursor in the text box
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // - third element: the value of prevent-inline-autocomplete
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // - forth element: the value of prefer-keyword
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cursorPositionUsed = $('input-text').selectionEnd;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome.send('startOmniboxQuery', [
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        $('input-text').value,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cursorPositionUsed,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        $('prevent-inline-autocomplete').checked,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        $('prefer-keyword').checked]);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel the submit action.  i.e., don't submit the form.  (We handle
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // display the results solely with Javascript.)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.preventDefault();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Returns a simple object with information about how to display an
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * autocomplete result data field.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} header the label for the top of the column/table.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} urlLabelForHeader the URL that the header should point
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     to (if non-empty).
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} propertyName the name of the property in the autocomplete
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     result record that we lookup.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {boolean} displayAlways whether the property should be displayed
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     regardless of whether we're in detailed more.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} tooltip a description of the property that will be
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     presented as a tooltip when the mouse is hovered over the column title.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function PresentationInfoRecord(header, url, propertyName, displayAlways,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  tooltip) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.header = header;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.urlLabelForHeader = url;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.propertyName = propertyName;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.displayAlways = displayAlways;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.tooltip = tooltip;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * A constant that's used to decide what autocomplete result
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * properties to output in what order.  This is an array of
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * PresentationInfoRecord() objects; for details see that
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * function.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {Array.<Object>}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var PROPERTY_OUTPUT_ORDER = [
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Provider', '', 'provider_name', true,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The AutocompleteProvider suggesting this result.'),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Type', '', 'type', true,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The type of the result.'),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Relevance', '', 'relevance', true,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The result score. Higher is more relevant.'),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Contents', '', 'contents', true,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The text that is presented identifying the result.'),
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    new PresentationInfoRecord(
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'Can Be Default', '', 'allowed_to_be_default_match', false,
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'A green checkmark indicates that the result can be the default ' +
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'match (i.e., can be the match that pressing enter in the omnibox ' +
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'navigates to).'),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Starred', '', 'starred', false,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'A green checkmark indicates that the result has been bookmarked.'),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'HWYT', '', 'is_history_what_you_typed_match', false,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'A green checkmark indicates that the result is an History What You ' +
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Typed Match'),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Description', '', 'description', false,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The page title of the result.'),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('URL', '', 'destination_url', true,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The URL for the result.'),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Fill Into Edit', '', 'fill_into_edit', false,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'The text shown in the omnibox when the result is selected.'),
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        'Inline Autocompletion', '', 'inline_autocompletion', false,
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        'The text shown in the omnibox as a blue highlight selection ' +
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        'following the cursor, if this match is shown inline.'),
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Del', '', 'deletable', false,
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'A green checkmark indicates that the result can be deleted from ' +
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'the visit history.'),
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord('Prev', '', 'from_previous', false, ''),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Tran',
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'http://code.google.com/codesearch#OAMlx_jo-ck/src/content/public/' +
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'common/page_transition_types.h&exact_package=chromium&l=24',
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'transition', false,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'How the user got to the result.'),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Done', '', 'provider_done', false,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'A green checkmark indicates that the provider is done looking for ' +
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'more results.'),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Template URL', '', 'template_url', false, ''),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'Associated Keyword', '', 'associated_keyword', false,
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'If non-empty, a "press tab to search" hint will be shown and will ' +
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'engage this keyword.'),
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new PresentationInfoRecord(
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'Keyword', '', 'keyword', false,
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'The keyword of the search engine to be used.'),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PresentationInfoRecord(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Additional Info', '', 'additional_info', false,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Provider-specific information about the result.')
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ];
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Returns an HTML Element of type table row that contains the
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * headers we'll use for labeling the columns.  If we're in
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * detailed_mode, we use all the headers.  If not, we only use ones
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * marked displayAlways.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function createAutocompleteResultTableHeader() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var row = document.createElement('tr');
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var inDetailedMode = $('show-details').checked;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < PROPERTY_OUTPUT_ORDER.length; i++) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (inDetailedMode || PROPERTY_OUTPUT_ORDER[i].displayAlways) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var headerCell = document.createElement('th');
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (PROPERTY_OUTPUT_ORDER[i].urlLabelForHeader != '') {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Wrap header text in URL.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var linkNode = document.createElement('a');
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          linkNode.href = PROPERTY_OUTPUT_ORDER[i].urlLabelForHeader;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          linkNode.textContent = PROPERTY_OUTPUT_ORDER[i].header;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          headerCell.appendChild(linkNode);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Output header text without a URL.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          headerCell.textContent = PROPERTY_OUTPUT_ORDER[i].header;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          headerCell.className = 'table-header';
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          headerCell.title = PROPERTY_OUTPUT_ORDER[i].tooltip;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        row.appendChild(headerCell);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return row;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object} autocompleteSuggestion the particular autocomplete
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     suggestion we're in the process of displaying.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} propertyName the particular property of the autocomplete
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     suggestion that should go in this cell.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {HTMLTableCellElement} that contains the value within this
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     autocompleteSuggestion associated with propertyName.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function createCellForPropertyAndRemoveProperty(autocompleteSuggestion,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  propertyName) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cell = document.createElement('td');
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (propertyName in autocompleteSuggestion) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (propertyName == 'additional_info') {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // |additional_info| embeds a two-column table of provider-specific data
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // within this cell.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var additionalInfoTable = document.createElement('table');
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (var additionalInfoKey in autocompleteSuggestion[propertyName]) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var additionalInfoRow = document.createElement('tr');
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Set the title (name of property) cell text.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var propertyCell = document.createElement('td');
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          propertyCell.textContent = additionalInfoKey + ':';
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          propertyCell.className = 'additional-info-property';
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          additionalInfoRow.appendChild(propertyCell);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Set the value of the property cell text.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var valueCell = document.createElement('td');
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          valueCell.textContent =
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              autocompleteSuggestion[propertyName][additionalInfoKey];
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          valueCell.className = 'additional-info-value';
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          additionalInfoRow.appendChild(valueCell);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          additionalInfoTable.appendChild(additionalInfoRow);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cell.appendChild(additionalInfoTable);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (typeof autocompleteSuggestion[propertyName] == 'boolean') {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // If this is a boolean, display a checkmark or an X instead of
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // the strings true or false.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (autocompleteSuggestion[propertyName]) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.className = 'check-mark';
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.textContent = '✔';
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.className = 'x-mark';
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.textContent = '✗';
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var text = String(autocompleteSuggestion[propertyName]);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // If it's a URL wrap it in an href.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var re = /^(http|https|ftp|chrome|file):\/\//;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (re.test(text)) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var aCell = document.createElement('a');
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aCell.textContent = text;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aCell.href = text;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.appendChild(aCell);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // All other data types (integer, strings, etc.) display their
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // normal toString() output.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cell.textContent = autocompleteSuggestion[propertyName];
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }  // else: if propertyName is undefined, we leave the cell blank
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cell;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Called by C++ code when we get an update from the
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * AutocompleteController.  We simply append the result to
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * progressiveAutocompleteResults and refresh the page.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleNewAutocompleteResult(result) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    progressiveAutocompleteResults.push(result);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    refresh();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Appends some human-readable information about the provided
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * autocomplete result to the HTML node with id omnibox-debug-text.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The current human-readable form is a few lines about general
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * autocomplete result statistics followed by a table with one line
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * for each autocomplete match.  The input parameter result is a
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * complex Object with lots of information about various
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * autocomplete matches.  Here's an example of what it looks like:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * <pre>
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * {@code
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   'done': false,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   'time_since_omnibox_started_ms': 15,
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *   'host': 'mai',
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *   'is_typed_host': false,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   'combined_results' : {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     'num_items': 4,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     'item_0': {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       'destination_url': 'http://mail.google.com',
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       'provider_name': 'HistoryURL',
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       'relevance': 1410,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       ...
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     'item_1: {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       ...
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     ...
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   'results_by_provider': {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     'HistoryURL' : {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       'num_items': 3,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *         ...
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     'Search' : {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       'num_items': 1,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *       ...
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     ...
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * </pre>
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * For more information on how the result is packed, see the
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * corresponding code in chrome/browser/ui/webui/omnibox_ui.cc
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function addResultToOutput(result) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var output = $('omnibox-debug-text');
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var inDetailedMode = $('show-details').checked;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var showIncompleteResults = $('show-incomplete-results').checked;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var showPerProviderResults = $('show-all-providers').checked;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Always output cursor position.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var p = document.createElement('p');
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    p.textContent = 'cursor position = ' + cursorPositionUsed;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output.appendChild(p);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Output the result-level features in detailed mode and in
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // show incomplete results mode.  We do the latter because without
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // these result-level features, one can't make sense of each
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // batch of results.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inDetailedMode || showIncompleteResults) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var p1 = document.createElement('p');
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p1.textContent = 'elapsed time = ' +
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          result.time_since_omnibox_started_ms + 'ms';
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output.appendChild(p1);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var p2 = document.createElement('p');
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p2.textContent = 'all providers done = ' + result.done;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output.appendChild(p2);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var p3 = document.createElement('p');
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p3.textContent = 'host = ' + result.host;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ('is_typed_host' in result) {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Only output the is_typed_host information if available.  (It may
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // be missing if the history database lookup failed.)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        p3.textContent = p3.textContent + ' has is_typed_host = ' +
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            result.is_typed_host;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      output.appendChild(p3);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Combined results go after the lines below.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var group = document.createElement('a');
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.className = 'group-separator';
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.textContent = 'Combined results.';
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.appendChild(group);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add combined/merged result table.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var p = document.createElement('p');
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p.appendChild(addResultTableToOutput(result.combined_results));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.appendChild(p);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move forward only if you want to display per provider results.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!showPerProviderResults) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Individual results go after the lines below.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var group = document.createElement('a');
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.className = 'group-separator';
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.textContent = 'Results for individual providers.';
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.appendChild(group);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add the per-provider result tables with labels. We do not append the
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // combined/merged result table since we already have the per provider
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // results.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var provider in result.results_by_provider) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var results = result.results_by_provider[provider];
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If we have no results we do not display anything.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (results.num_items == 0) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var p = document.createElement('p');
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p.appendChild(addResultTableToOutput(results));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output.appendChild(p);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object} result either the combined_results component of
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     the structure described in the comment by addResultToOutput()
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     above or one of the per-provider results in the structure.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     (Both have the same format).
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {HTMLTableCellElement} that is a user-readable HTML
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     representation of this object.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function addResultTableToOutput(result) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var inDetailedMode = $('show-details').checked;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a table to hold all the autocomplete items.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var table = document.createElement('table');
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    table.className = 'autocomplete-results-table';
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    table.appendChild(createAutocompleteResultTableHeader());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Loop over every autocomplete item and add it as a row in the table.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < result.num_items; i++) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var autocompleteSuggestion = result['item_' + i];
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var row = document.createElement('tr');
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Loop over all the columns/properties and output either them
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // all (if we're in detailed mode) or only the ones marked displayAlways.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Keep track of which properties we displayed.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var displayedProperties = {};
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var j = 0; j < PROPERTY_OUTPUT_ORDER.length; j++) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (inDetailedMode || PROPERTY_OUTPUT_ORDER[j].displayAlways) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          row.appendChild(createCellForPropertyAndRemoveProperty(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              autocompleteSuggestion, PROPERTY_OUTPUT_ORDER[j].propertyName));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          displayedProperties[PROPERTY_OUTPUT_ORDER[j].propertyName] = true;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Now, if we're in detailed mode, add all the properties that
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // haven't already been output.  (We know which properties have
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // already been output because we delete the property when we output
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // it.  The only way we have properties left at this point if
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // we're in detailed mode and we're getting back properties
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // not listed in PROPERTY_OUTPUT_ORDER.  Perhaps someone added
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // something to the C++ code but didn't bother to update this
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Javascript?  In any case, we want to display them.)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (inDetailedMode) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (var key in autocompleteSuggestion) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!displayedProperties[key]) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var cell = document.createElement('td');
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cell.textContent = key + '=' + autocompleteSuggestion[key];
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row.appendChild(cell);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      table.appendChild(row);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return table;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Repaints the page based on the contents of the array
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * progressiveAutocompleteResults, which represents consecutive
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * autocomplete results.  We only display the last (most recent)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * entry unless we're asked to display incomplete results.  For an
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * example of the output, play with chrome://omnibox/
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function refresh() {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Erase whatever is currently being displayed.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var output = $('omnibox-debug-text');
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.innerHTML = '';
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (progressiveAutocompleteResults.length > 0) {  // if we have results
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Display the results.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var showIncompleteResults = $('show-incomplete-results').checked;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startIndex = showIncompleteResults ? 0 :
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          progressiveAutocompleteResults.length - 1;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = startIndex; i < progressiveAutocompleteResults.length; i++) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addResultToOutput(progressiveAutocompleteResults[i]);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initialize: initialize,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startOmniboxQuery: startOmniboxQuery,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleNewAutocompleteResult: handleNewAutocompleteResult
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', omniboxDebug.initialize);
468