Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: components/sync_driver/resources/sync_search.js

Issue 2203673002: [Sync] Move //components/sync_driver to //components/sync/driver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sd-a
Patch Set: Full change rebased on static lib. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // require: cr.js
6
7 cr.define('chrome.sync', function() {
8 var currSearchId = 0;
9
10 var setQueryString = function(queryControl, query) {
11 queryControl.value = query;
12 };
13
14 var createDoQueryFunction = function(queryControl, submitControl, query) {
15 return function() {
16 setQueryString(queryControl, query);
17 submitControl.click();
18 };
19 };
20
21 /**
22 * Decorates the quick search controls
23 *
24 * @param {Array of DOM elements} quickLinkArray The <a> object which
25 * will be given a link to a quick filter option.
26 * @param {!HTMLInputElement} queryControl The <input> object of
27 * type=search where user's query is typed.
28 */
29 var decorateQuickQueryControls = function(quickLinkArray, submitControl,
30 queryControl) {
31 for (var index = 0; index < allLinks.length; ++index) {
32 var quickQuery = allLinks[index].getAttribute('data-query');
33 var quickQueryFunction = createDoQueryFunction(queryControl,
34 submitControl, quickQuery);
35 allLinks[index].addEventListener('click', quickQueryFunction);
36 }
37 };
38
39 /**
40 * Runs a search with the given query.
41 *
42 * @param {string} query The regex to do the search with.
43 * @param {function} callback The callback called with the search results;
44 * not called if doSearch() is called again while the search is running.
45 */
46 var doSearch = function(query, callback) {
47 var searchId = ++currSearchId;
48 try {
49 var regex = new RegExp(query);
50 chrome.sync.getAllNodes(function(node_map) {
51 // Put all nodes into one big list that ignores the type.
52 var nodes = node_map.
53 map(function(x) { return x.nodes; }).
54 reduce(function(a, b) { return a.concat(b); });
55
56 if (currSearchId != searchId) {
57 return;
58 }
59 callback(nodes.filter(function(elem) {
60 return regex.test(JSON.stringify(elem, null, 2));
61 }), null);
62 });
63 } catch (err) {
64 // Sometimes the provided regex is invalid. This and other errors will
65 // be caught and handled here.
66 callback([], err);
67 }
68 };
69
70 /**
71 * Decorates the various search controls.
72 *
73 * @param {!HTMLInputElement} queryControl The <input> object of
74 * type=search where the user's query is typed.
75 * @param {!HTMLButtonElement} submitControl The <button> object
76 * where the user can click to submit the query.
77 * @param {!HTMLElement} statusControl The <span> object display the
78 * search status.
79 * @param {!HTMLElement} listControl The <list> object which holds
80 * the list of returned results.
81 * @param {!HTMLPreElement} detailsControl The <pre> object which
82 * holds the details of the selected result.
83 */
84 function decorateSearchControls(queryControl, submitControl, statusControl,
85 resultsControl, detailsControl) {
86 var resultsDataModel = new cr.ui.ArrayDataModel([]);
87
88 var searchFunction = function() {
89 var query = queryControl.value;
90 statusControl.textContent = '';
91 resultsDataModel.splice(0, resultsDataModel.length);
92 if (!query) {
93 return;
94 }
95 statusControl.textContent = 'Searching for ' + query + '...';
96 queryControl.removeAttribute('error');
97 var timer = chrome.sync.makeTimer();
98 doSearch(query, function(nodes, error) {
99 if (error) {
100 statusControl.textContent = 'Error: ' + error;
101 queryControl.setAttribute('error', '');
102 } else {
103 statusControl.textContent =
104 'Found ' + nodes.length + ' nodes in ' +
105 timer.getElapsedSeconds() + 's';
106 queryControl.removeAttribute('error');
107
108 // TODO(akalin): Write a nicer list display.
109 for (var i = 0; i < nodes.length; ++i) {
110 nodes[i].toString = function() {
111 return this.NON_UNIQUE_NAME;
112 };
113 }
114 resultsDataModel.push.apply(resultsDataModel, nodes);
115 // Workaround for http://crbug.com/83452 .
116 resultsControl.redraw();
117 }
118 });
119 };
120
121 submitControl.addEventListener('click', searchFunction);
122 // Decorate search box.
123 queryControl.onsearch = searchFunction;
124 queryControl.value = '';
125
126 // Decorate results list.
127 cr.ui.List.decorate(resultsControl);
128 resultsControl.dataModel = resultsDataModel;
129 resultsControl.selectionModel.addEventListener('change', function(event) {
130 detailsControl.textContent = '';
131 var selected = resultsControl.selectedItem;
132 if (selected) {
133 detailsControl.textContent = JSON.stringify(selected, null, 2);
134 }
135 });
136 }
137
138 return {
139 decorateSearchControls: decorateSearchControls,
140 decorateQuickQueryControls: decorateQuickQueryControls
141 };
142 });
OLDNEW
« no previous file with comments | « components/sync_driver/resources/sync_search.css ('k') | components/sync_driver/resources/types.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698