| Index: chrome/browser/resources/settings/search_settings.js
|
| diff --git a/chrome/browser/resources/settings/search_settings.js b/chrome/browser/resources/settings/search_settings.js
|
| index 3a74f2854c07c184ffdbff4c9531e5a7a69d2f54..65c2cc6226ce9752a776f97be33c5f0fafa7251d 100644
|
| --- a/chrome/browser/resources/settings/search_settings.js
|
| +++ b/chrome/browser/resources/settings/search_settings.js
|
| @@ -260,45 +260,43 @@ cr.define('settings', function() {
|
| highlightAssociatedControl_(associatedControl, rawQuery);
|
| }
|
|
|
| - /**
|
| - * @constructor
|
| - *
|
| - * @param {!settings.SearchRequest} request
|
| - * @param {!Node} node
|
| - */
|
| - function Task(request, node) {
|
| - /** @protected {!settings.SearchRequest} */
|
| - this.request = request;
|
| + /** @abstract */
|
| + class Task {
|
| + /**
|
| + * @param {!settings.SearchRequest} request
|
| + * @param {!Node} node
|
| + */
|
| + constructor(request, node) {
|
| + /** @protected {!settings.SearchRequest} */
|
| + this.request = request;
|
|
|
| - /** @protected {!Node} */
|
| - this.node = node;
|
| - }
|
| + /** @protected {!Node} */
|
| + this.node = node;
|
| + }
|
|
|
| - Task.prototype = {
|
| /**
|
| * @abstract
|
| * @return {!Promise}
|
| */
|
| - exec: function() {},
|
| - };
|
| -
|
| - /**
|
| - * A task that takes a <template is="dom-if">...</template> node corresponding
|
| - * to a setting subpage and renders it. A SearchAndHighlightTask is posted for
|
| - * the newly rendered subtree, once rendering is done.
|
| - * @constructor
|
| - * @extends {Task}
|
| - *
|
| - * @param {!settings.SearchRequest} request
|
| - * @param {!Node} node
|
| - */
|
| - function RenderTask(request, node) {
|
| - Task.call(this, request, node);
|
| + exec() {}
|
| }
|
|
|
| - RenderTask.prototype = {
|
| + class RenderTask extends Task {
|
| + /**
|
| + * A task that takes a <template is="dom-if">...</template> node
|
| + * corresponding to a setting subpage and renders it. A
|
| + * SearchAndHighlightTask is posted for the newly rendered subtree, once
|
| + * rendering is done.
|
| + *
|
| + * @param {!settings.SearchRequest} request
|
| + * @param {!Node} node
|
| + */
|
| + constructor(request, node) {
|
| + super(request, node);
|
| + }
|
| +
|
| /** @override */
|
| - exec: function() {
|
| + exec() {
|
| var routePath = this.node.getAttribute('route-path');
|
| var subpageTemplate =
|
| this.node['_content'].querySelector('settings-subpage');
|
| @@ -318,43 +316,37 @@ cr.define('settings', function() {
|
| resolve();
|
| }.bind(this));
|
| }.bind(this));
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * @constructor
|
| - * @extends {Task}
|
| - *
|
| - * @param {!settings.SearchRequest} request
|
| - * @param {!Node} node
|
| - */
|
| - function SearchAndHighlightTask(request, node) {
|
| - Task.call(this, request, node);
|
| + }
|
| }
|
|
|
| - SearchAndHighlightTask.prototype = {
|
| + class SearchAndHighlightTask extends Task {
|
| + /**
|
| + * @param {!settings.SearchRequest} request
|
| + * @param {!Node} node
|
| + */
|
| + constructor(request, node) {
|
| + super(request, node);
|
| + }
|
| +
|
| /** @override */
|
| - exec: function() {
|
| + exec() {
|
| var foundMatches = findAndHighlightMatches_(this.request, this.node);
|
| this.request.updateMatches(foundMatches);
|
| return Promise.resolve();
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * @constructor
|
| - * @extends {Task}
|
| - *
|
| - * @param {!settings.SearchRequest} request
|
| - * @param {!Node} page
|
| - */
|
| - function TopLevelSearchTask(request, page) {
|
| - Task.call(this, request, page);
|
| + }
|
| }
|
|
|
| - TopLevelSearchTask.prototype = {
|
| + class TopLevelSearchTask extends Task {
|
| + /**
|
| + * @param {!settings.SearchRequest} request
|
| + * @param {!Node} page
|
| + */
|
| + constructor(request, page) {
|
| + super(request, page);
|
| + }
|
| +
|
| /** @override */
|
| - exec: function() {
|
| + exec() {
|
| findAndRemoveHighlights_(this.node);
|
|
|
| var shouldSearch = this.request.regExp !== null;
|
| @@ -365,91 +357,88 @@ cr.define('settings', function() {
|
| }
|
|
|
| return Promise.resolve();
|
| - },
|
| + }
|
|
|
| /**
|
| * @param {boolean} visible
|
| * @private
|
| */
|
| - setSectionsVisibility_: function(visible) {
|
| + setSectionsVisibility_(visible) {
|
| var sections = this.node.querySelectorAll('settings-section');
|
|
|
| for (var i = 0; i < sections.length; i++)
|
| sections[i].hiddenBySearch = !visible;
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * @constructor
|
| - * @param {!settings.SearchRequest} request
|
| - */
|
| - function TaskQueue(request) {
|
| - /** @private {!settings.SearchRequest} */
|
| - this.request_ = request;
|
| -
|
| - /**
|
| - * @private {{
|
| - * high: !Array<!Task>,
|
| - * middle: !Array<!Task>,
|
| - * low: !Array<!Task>
|
| - * }}
|
| - */
|
| - this.queues_;
|
| - this.reset();
|
| -
|
| - /** @private {?Function} */
|
| - this.onEmptyCallback_ = null;
|
| -
|
| - /**
|
| - * Whether a task is currently running.
|
| - * @private {boolean}
|
| - */
|
| - this.running_ = false;
|
| + }
|
| }
|
|
|
| - TaskQueue.prototype = {
|
| + class TaskQueue {
|
| + /** @param {!settings.SearchRequest} request */
|
| + constructor(request) {
|
| + /** @private {!settings.SearchRequest} */
|
| + this.request_ = request;
|
| +
|
| + /**
|
| + * @private {{
|
| + * high: !Array<!Task>,
|
| + * middle: !Array<!Task>,
|
| + * low: !Array<!Task>
|
| + * }}
|
| + */
|
| + this.queues_;
|
| + this.reset();
|
| +
|
| + /** @private {?Function} */
|
| + this.onEmptyCallback_ = null;
|
| +
|
| + /**
|
| + * Whether a task is currently running.
|
| + * @private {boolean}
|
| + */
|
| + this.running_ = false;
|
| + }
|
| +
|
| /** Drops all tasks. */
|
| - reset: function() {
|
| + reset() {
|
| this.queues_ = {high: [], middle: [], low: []};
|
| - },
|
| + }
|
|
|
| /** @param {!TopLevelSearchTask} task */
|
| - addTopLevelSearchTask: function(task) {
|
| + addTopLevelSearchTask(task) {
|
| this.queues_.high.push(task);
|
| this.consumePending_();
|
| - },
|
| + }
|
|
|
| /** @param {!SearchAndHighlightTask} task */
|
| - addSearchAndHighlightTask: function(task) {
|
| + addSearchAndHighlightTask(task) {
|
| this.queues_.middle.push(task);
|
| this.consumePending_();
|
| - },
|
| + }
|
|
|
| /** @param {!RenderTask} task */
|
| - addRenderTask: function(task) {
|
| + addRenderTask(task) {
|
| this.queues_.low.push(task);
|
| this.consumePending_();
|
| - },
|
| + }
|
|
|
| /**
|
| * Registers a callback to be called every time the queue becomes empty.
|
| * @param {function():void} onEmptyCallback
|
| */
|
| - onEmpty: function(onEmptyCallback) {
|
| + onEmpty(onEmptyCallback) {
|
| this.onEmptyCallback_ = onEmptyCallback;
|
| - },
|
| + }
|
|
|
| /**
|
| * @return {!Task|undefined}
|
| * @private
|
| */
|
| - popNextTask_: function() {
|
| + popNextTask_() {
|
| return this.queues_.high.shift() || this.queues_.middle.shift() ||
|
| this.queues_.low.shift();
|
| - },
|
| + }
|
|
|
| /** @private */
|
| - consumePending_: function() {
|
| + consumePending_() {
|
| if (this.running_)
|
| return;
|
|
|
| @@ -475,125 +464,116 @@ cr.define('settings', function() {
|
| }.bind(this));
|
| return;
|
| }
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * @constructor
|
| - *
|
| - * @param {string} rawQuery
|
| - * @param {!HTMLElement} root
|
| - */
|
| - var SearchRequest = function(rawQuery, root) {
|
| - /** @private {string} */
|
| - this.rawQuery_ = rawQuery;
|
| -
|
| - /** @private {!HTMLElement} */
|
| - this.root_ = root;
|
| -
|
| - /** @type {?RegExp} */
|
| - this.regExp = this.generateRegExp_();
|
| + }
|
| + }
|
|
|
| + class SearchRequest {
|
| /**
|
| - * Whether this request was canceled before completing.
|
| - * @type {boolean}
|
| + * @param {string} rawQuery
|
| + * @param {!HTMLElement} root
|
| */
|
| - this.canceled = false;
|
| + constructor(rawQuery, root) {
|
| + /** @private {string} */
|
| + this.rawQuery_ = rawQuery;
|
|
|
| - /** @private {boolean} */
|
| - this.foundMatches_ = false;
|
| + /** @private {!HTMLElement} */
|
| + this.root_ = root;
|
|
|
| - /** @type {!PromiseResolver} */
|
| - this.resolver = new PromiseResolver();
|
| + /** @type {?RegExp} */
|
| + this.regExp = this.generateRegExp_();
|
|
|
| - /** @private {!TaskQueue} */
|
| - this.queue_ = new TaskQueue(this);
|
| - this.queue_.onEmpty(function() {
|
| - this.resolver.resolve(this);
|
| - }.bind(this));
|
| - };
|
| + /**
|
| + * Whether this request was canceled before completing.
|
| + * @type {boolean}
|
| + */
|
| + this.canceled = false;
|
| +
|
| + /** @private {boolean} */
|
| + this.foundMatches_ = false;
|
|
|
| - /** @private {!RegExp} */
|
| - SearchRequest.SANITIZE_REGEX_ = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
| + /** @type {!PromiseResolver} */
|
| + this.resolver = new PromiseResolver();
|
| +
|
| + /** @private {!TaskQueue} */
|
| + this.queue_ = new TaskQueue(this);
|
| + this.queue_.onEmpty(function() {
|
| + this.resolver.resolve(this);
|
| + }.bind(this));
|
| + }
|
|
|
| - SearchRequest.prototype = {
|
| /**
|
| * Fires this search request.
|
| */
|
| - start: function() {
|
| + start() {
|
| this.queue_.addTopLevelSearchTask(
|
| new TopLevelSearchTask(this, this.root_));
|
| - },
|
| + }
|
|
|
| /**
|
| * @return {?RegExp}
|
| * @private
|
| */
|
| - generateRegExp_: function() {
|
| + generateRegExp_() {
|
| var regExp = null;
|
|
|
| // Generate search text by escaping any characters that would be
|
| // problematic for regular expressions.
|
| - var searchText =
|
| - this.rawQuery_.trim().replace(SearchRequest.SANITIZE_REGEX_, '\\$&');
|
| + var searchText = this.rawQuery_.trim().replace(SANITIZE_REGEX, '\\$&');
|
| if (searchText.length > 0)
|
| regExp = new RegExp('(' + searchText + ')', 'i');
|
|
|
| return regExp;
|
| - },
|
| + }
|
|
|
| /**
|
| * @param {string} rawQuery
|
| * @return {boolean} Whether this SearchRequest refers to an identical
|
| * query.
|
| */
|
| - isSame: function(rawQuery) {
|
| + isSame(rawQuery) {
|
| return this.rawQuery_ == rawQuery;
|
| - },
|
| + }
|
|
|
| /**
|
| * Updates the result for this search request.
|
| * @param {boolean} found
|
| */
|
| - updateMatches: function(found) {
|
| + updateMatches(found) {
|
| this.foundMatches_ = this.foundMatches_ || found;
|
| - },
|
| + }
|
|
|
| /** @return {boolean} Whether any matches were found. */
|
| - didFindMatches: function() {
|
| + didFindMatches() {
|
| return this.foundMatches_;
|
| - },
|
| - };
|
| + }
|
| + }
|
|
|
| - /** @interface */
|
| - var SearchManager = function() {};
|
| + /** @const {!RegExp} */
|
| + var SANITIZE_REGEX = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
|
|
| - SearchManager.prototype = {
|
| + /** @interface */
|
| + class SearchManager {
|
| /**
|
| * @param {string} text The text to search for.
|
| * @param {!Node} page
|
| * @return {!Promise<!settings.SearchRequest>} A signal indicating that
|
| * searching finished.
|
| */
|
| - search: function(text, page) {}
|
| - };
|
| + search(text, page) {}
|
| + }
|
|
|
| - /**
|
| - * @constructor
|
| - * @implements {SearchManager}
|
| - */
|
| - var SearchManagerImpl = function() {
|
| - /** @private {!Set<!settings.SearchRequest>} */
|
| - this.activeRequests_ = new Set();
|
| + /** @implements {SearchManager} */
|
| + class SearchManagerImpl {
|
| + constructor() {
|
| + /** @private {!Set<!settings.SearchRequest>} */
|
| + this.activeRequests_ = new Set();
|
|
|
| - /** @private {?string} */
|
| - this.lastSearchedText_ = null;
|
| - };
|
| - cr.addSingletonGetter(SearchManagerImpl);
|
| + /** @private {?string} */
|
| + this.lastSearchedText_ = null;
|
| + }
|
|
|
| - SearchManagerImpl.prototype = {
|
| /** @override */
|
| - search: function(text, page) {
|
| + search(text, page) {
|
| // Cancel any pending requests if a request with different text is
|
| // submitted.
|
| if (text != this.lastSearchedText_) {
|
| @@ -613,8 +593,9 @@ cr.define('settings', function() {
|
| this.activeRequests_.delete(request);
|
| return request;
|
| }.bind(this));
|
| - },
|
| - };
|
| + }
|
| + }
|
| + cr.addSingletonGetter(SearchManagerImpl);
|
|
|
| /** @return {!SearchManager} */
|
| function getSearchManager() {
|
|
|