OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 cr.define('options', function() { | 5 cr.define('options', function() { |
6 const OptionsPage = options.OptionsPage; | 6 const OptionsPage = options.OptionsPage; |
7 | 7 |
8 /** | 8 /** |
9 * Encapsulated handling of a search bubble. | 9 * Encapsulated handling of a search bubble. |
10 * @constructor | 10 * @constructor |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 /** | 101 /** |
102 * Encapsulated handling of the search page. | 102 * Encapsulated handling of the search page. |
103 * @constructor | 103 * @constructor |
104 */ | 104 */ |
105 function SearchPage() { | 105 function SearchPage() { |
106 OptionsPage.call(this, 'search', templateData.searchPageTabTitle, | 106 OptionsPage.call(this, 'search', templateData.searchPageTabTitle, |
107 'searchPage'); | 107 'searchPage'); |
108 this.searchActive = false; | |
109 } | 108 } |
110 | 109 |
111 cr.addSingletonGetter(SearchPage); | 110 cr.addSingletonGetter(SearchPage); |
112 | 111 |
113 SearchPage.prototype = { | 112 SearchPage.prototype = { |
114 // Inherit SearchPage from OptionsPage. | 113 // Inherit SearchPage from OptionsPage. |
115 __proto__: OptionsPage.prototype, | 114 __proto__: OptionsPage.prototype, |
116 | 115 |
117 /** | 116 /** |
118 * Initialize the page. | 117 * Initialize the page. |
(...skipping 19 matching lines...) Expand all Loading... | |
138 self.tab.onclick = self.tab.onkeydown = self.tab.onkeypress = undefined; | 137 self.tab.onclick = self.tab.onkeydown = self.tab.onkeypress = undefined; |
139 self.tab.tabIndex = -1; | 138 self.tab.tabIndex = -1; |
140 self.tab.setAttribute('role', ''); | 139 self.tab.setAttribute('role', ''); |
141 | 140 |
142 // Don't allow the focus on the search navbar. http://crbug.com/77989 | 141 // Don't allow the focus on the search navbar. http://crbug.com/77989 |
143 self.tab.onfocus = self.tab.blur; | 142 self.tab.onfocus = self.tab.blur; |
144 | 143 |
145 // Handle search events. (No need to throttle, WebKit's search field | 144 // Handle search events. (No need to throttle, WebKit's search field |
146 // will do that automatically.) | 145 // will do that automatically.) |
147 searchField.onsearch = function(e) { | 146 searchField.onsearch = function(e) { |
148 self.setSearchText_(SearchPage.canonicalizeQuery(this.value)); | 147 self.setSearchText_(this.value); |
149 }; | 148 }; |
150 | 149 |
151 // We update the history stack every time the search field blurs. This way | 150 // We update the history stack every time the search field blurs. This way |
152 // we get a history entry for each search, roughly, but not each letter | 151 // we get a history entry for each search, roughly, but not each letter |
153 // typed. | 152 // typed. |
154 searchField.onblur = function(e) { | 153 searchField.onblur = function(e) { |
155 var query = SearchPage.canonicalizeQuery(searchField.value); | 154 var query = SearchPage.canonicalizeQuery(searchField.value); |
156 if (!query) | 155 if (!query) |
157 return; | 156 return; |
158 | 157 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 this.removeSearchBubbles_(); | 276 this.removeSearchBubbles_(); |
278 } | 277 } |
279 }, | 278 }, |
280 | 279 |
281 /** | 280 /** |
282 * Set the current search criteria. | 281 * Set the current search criteria. |
283 * @param {string} text Search text. | 282 * @param {string} text Search text. |
284 * @private | 283 * @private |
285 */ | 284 */ |
286 setSearchText_: function(text) { | 285 setSearchText_: function(text) { |
286 // Prevent recursive execution of this method. | |
287 if (this.insideSetSearchText_) return; | |
288 this.insideSetSearchText_ = true; | |
James Hawkins
2011/10/21 23:17:30
Declare and document this variable.
csilv
2011/10/22 00:08:37
I'm a little unclear. It is documented already on
James Hawkins
2011/10/22 00:19:33
Perhaps, but it is technically visible to other me
csilv
2011/10/22 01:58:15
Done.
| |
289 | |
290 // Cleanup the search query string. | |
291 text = SearchPage.canonicalizeQuery(text); | |
292 | |
293 // Notify listeners about the new search query, some pages may wish to | |
294 // show/hide elements based on the query. | |
295 var event = new cr.Event('searchChanged'); | |
296 event.searchText = text; | |
297 this.dispatchEvent(event); | |
298 | |
287 // Toggle the search page if necessary. | 299 // Toggle the search page if necessary. |
288 if (text.length) { | 300 if (text.length) { |
289 if (!this.searchActive_) | 301 if (!this.searchActive_) |
290 OptionsPage.navigateToPage(this.name); | 302 OptionsPage.navigateToPage(this.name); |
291 } else { | 303 } else { |
292 if (this.searchActive_) | 304 if (this.searchActive_) |
293 OptionsPage.showDefaultPage(); | 305 OptionsPage.showDefaultPage(); |
306 | |
307 this.insideSetSearchText_ = false; | |
294 return; | 308 return; |
295 } | 309 } |
296 | 310 |
297 var foundMatches = false; | 311 var foundMatches = false; |
298 var bubbleControls = []; | 312 var bubbleControls = []; |
299 | 313 |
300 // Remove any prior search results. | 314 // Remove any prior search results. |
301 this.unhighlightMatches_(); | 315 this.unhighlightMatches_(); |
302 this.removeSearchBubbles_(); | 316 this.removeSearchBubbles_(); |
303 | 317 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
374 // Configure elements on the search results page based on search results. | 388 // Configure elements on the search results page based on search results. |
375 if (foundMatches) | 389 if (foundMatches) |
376 $('searchPageNoMatches').classList.add('search-hidden'); | 390 $('searchPageNoMatches').classList.add('search-hidden'); |
377 else | 391 else |
378 $('searchPageNoMatches').classList.remove('search-hidden'); | 392 $('searchPageNoMatches').classList.remove('search-hidden'); |
379 | 393 |
380 // Create search balloons for sub-page results. | 394 // Create search balloons for sub-page results. |
381 length = bubbleControls.length; | 395 length = bubbleControls.length; |
382 for (var i = 0; i < length; i++) | 396 for (var i = 0; i < length; i++) |
383 this.createSearchBubble_(bubbleControls[i], text); | 397 this.createSearchBubble_(bubbleControls[i], text); |
398 | |
399 // Cleanup the recursion-prevention variable. | |
400 this.insideSetSearchText_ = false; | |
384 }, | 401 }, |
385 | 402 |
386 /** | 403 /** |
387 * Performs a string replacement based on a regex and replace string. | 404 * Performs a string replacement based on a regex and replace string. |
388 * @param {RegEx} regex A regular expression for finding search matches. | 405 * @param {RegEx} regex A regular expression for finding search matches. |
389 * @param {String} replace A string to apply the replace operation. | 406 * @param {String} replace A string to apply the replace operation. |
390 * @param {Element} element An HTML container element. | 407 * @param {Element} element An HTML container element. |
391 * @returns {Boolean} true if the element was changed. | 408 * @returns {Boolean} true if the element was changed. |
392 * @private | 409 * @private |
393 */ | 410 */ |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
565 // Trim beginning and ending whitespace. | 582 // Trim beginning and ending whitespace. |
566 return text.replace(/^\s+|\s+$/g, ''); | 583 return text.replace(/^\s+|\s+$/g, ''); |
567 }; | 584 }; |
568 | 585 |
569 // Export | 586 // Export |
570 return { | 587 return { |
571 SearchPage: SearchPage | 588 SearchPage: SearchPage |
572 }; | 589 }; |
573 | 590 |
574 }); | 591 }); |
OLD | NEW |