| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 Polymer({ | 5 cr.define('md_history', function() { |
| 6 is: 'history-item', | 6 var HistoryItem = Polymer({ |
| 7 is: 'history-item', |
| 7 | 8 |
| 8 properties: { | 9 properties: { |
| 9 // Underlying HistoryEntry data for this item. Contains read-only fields | 10 // Underlying HistoryEntry data for this item. Contains read-only fields |
| 10 // from the history backend, as well as fields computed by history-list. | 11 // from the history backend, as well as fields computed by history-list. |
| 11 item: { | 12 item: {type: Object, observer: 'showIcon_'}, |
| 12 type: Object, | 13 |
| 13 observer: 'showIcon_' | 14 // True if the website is a bookmarked page. |
| 15 starred: {type: Boolean, reflectToAttribute: true}, |
| 16 |
| 17 // Search term used to obtain this history-item. |
| 18 searchTerm: {type: String}, |
| 19 |
| 20 selected: {type: Boolean, notify: true}, |
| 21 |
| 22 isCardStart: {type: Boolean, reflectToAttribute: true}, |
| 23 |
| 24 isCardEnd: {type: Boolean, reflectToAttribute: true}, |
| 25 |
| 26 hasTimeGap: {type: Boolean}, |
| 27 |
| 28 numberOfItems: {type: Number} |
| 14 }, | 29 }, |
| 15 | 30 |
| 16 // True if the website is a bookmarked page. | 31 observers: ['setSearchedTextToBold_(item.title, searchTerm)'], |
| 17 starred: { | 32 |
| 18 type: Boolean, | 33 /** |
| 19 reflectToAttribute: true | 34 * When a history-item is selected the toolbar is notified and increases |
| 35 * or decreases its count of selected items accordingly. |
| 36 * @private |
| 37 */ |
| 38 onCheckboxSelected_: function() { |
| 39 this.fire('history-checkbox-select', { |
| 40 countAddition: this.$.checkbox.checked ? 1 : -1 |
| 41 }); |
| 20 }, | 42 }, |
| 21 | 43 |
| 22 // Search term used to obtain this history-item. | 44 /** |
| 23 searchTerm: { | 45 * Fires a custom event when the menu button is clicked. Sends the details |
| 24 type: String | 46 * of the history item and where the menu should appear. |
| 47 */ |
| 48 onMenuButtonTap_: function(e) { |
| 49 this.fire('toggle-menu', { |
| 50 target: Polymer.dom(e).localTarget, |
| 51 item: this.item, |
| 52 }); |
| 53 |
| 54 // Stops the 'tap' event from closing the menu when it opens. |
| 55 e.stopPropagation(); |
| 25 }, | 56 }, |
| 26 | 57 |
| 27 selected: { | 58 /** |
| 28 type: Boolean, | 59 * Set the favicon image, based on the URL of the history item. |
| 29 notify: true | 60 * @private |
| 61 */ |
| 62 showIcon_: function() { |
| 63 this.$.icon.style.backgroundImage = |
| 64 cr.icon.getFaviconImageSet(this.item.url); |
| 30 }, | 65 }, |
| 31 | 66 |
| 32 isCardStart: { | 67 /** |
| 33 type: Boolean, | 68 * Updates the page title. If the result was from a search, highlights any |
| 34 reflectToAttribute: true | 69 * occurrences of the search term in bold. |
| 70 * @private |
| 71 */ |
| 72 setSearchedTextToBold_: function() { |
| 73 var i = 0; |
| 74 var titleElem = this.$.title; |
| 75 var titleText = this.item.title; |
| 76 |
| 77 if (this.searchTerm == '' || this.searchTerm == null) { |
| 78 titleElem.textContent = titleText; |
| 79 return; |
| 80 } |
| 81 |
| 82 var re = new RegExp(quoteString(this.searchTerm), 'gim'); |
| 83 var match; |
| 84 titleElem.textContent = ''; |
| 85 while (match = re.exec(titleText)) { |
| 86 if (match.index > i) |
| 87 titleElem.appendChild(document.createTextNode( |
| 88 titleText.slice(i, match.index))); |
| 89 i = re.lastIndex; |
| 90 // Mark the highlighted text in bold. |
| 91 var b = document.createElement('b'); |
| 92 b.textContent = titleText.substring(match.index, i); |
| 93 titleElem.appendChild(b); |
| 94 } |
| 95 if (i < titleText.length) |
| 96 titleElem.appendChild( |
| 97 document.createTextNode(titleText.slice(i))); |
| 35 }, | 98 }, |
| 36 | 99 |
| 37 isCardEnd: { | 100 selectionNotAllowed_: function() { |
| 38 type: Boolean, | 101 return !loadTimeData.getBoolean('allowDeletingHistory'); |
| 39 reflectToAttribute: true | |
| 40 }, | 102 }, |
| 41 | 103 |
| 42 hasTimeGap: { | 104 /** |
| 43 type: Boolean | 105 * Generates the title for this history card. |
| 44 }, | 106 * @param {number} numberOfItems The number of items in the card. |
| 107 * @param {string} search The search term associated with these results. |
| 108 * @private |
| 109 */ |
| 110 cardTitle_: function(numberOfItems, historyDate, search) { |
| 111 if (!search) |
| 112 return this.item.dateRelativeDay; |
| 45 | 113 |
| 46 numberOfItems: { | 114 var resultId = numberOfItems == 1 ? 'searchResult' : 'searchResults'; |
| 47 type: Number | 115 return loadTimeData.getStringF('foundSearchResults', numberOfItems, |
| 116 loadTimeData.getString(resultId), search); |
| 48 } | 117 } |
| 49 }, | 118 }); |
| 50 | |
| 51 observers: [ | |
| 52 'setSearchedTextToBold_(item.title, searchTerm)' | |
| 53 ], | |
| 54 | 119 |
| 55 /** | 120 /** |
| 56 * When a history-item is selected the toolbar is notified and increases | 121 * Check whether the time difference between the given history item and the |
| 57 * or decreases its count of selected items accordingly. | 122 * next one is large enough for a spacer to be required. |
| 123 * @param {Array<HistoryEntry>} visits |
| 124 * @param {number} currentIndex |
| 125 * @param {string} searchedTerm |
| 126 * @return {boolean} Whether or not time gap separator is required. |
| 58 * @private | 127 * @private |
| 59 */ | 128 */ |
| 60 onCheckboxSelected_: function() { | 129 HistoryItem.needsTimeGap = function(visits, currentIndex, searchedTerm) { |
| 61 this.fire('history-checkbox-select', { | 130 if (currentIndex >= visits.length - 1 || visits.length == 0) |
| 62 countAddition: this.$.checkbox.checked ? 1 : -1 | 131 return false; |
| 63 }); | |
| 64 }, | |
| 65 | 132 |
| 66 /** | 133 var currentItem = visits[currentIndex]; |
| 67 * Fires a custom event when the menu button is clicked. Sends the details of | 134 var nextItem = visits[currentIndex + 1]; |
| 68 * the history item and where the menu should appear. | |
| 69 */ | |
| 70 onMenuButtonTap_: function(e) { | |
| 71 this.fire('toggle-menu', { | |
| 72 target: Polymer.dom(e).localTarget, | |
| 73 item: this.item, | |
| 74 }); | |
| 75 | 135 |
| 76 // Stops the 'tap' event from closing the menu when it opens. | 136 if (searchedTerm) |
| 77 e.stopPropagation(); | 137 return currentItem.dateShort != nextItem.dateShort; |
| 78 }, | |
| 79 | 138 |
| 80 /** | 139 return currentItem.time - nextItem.time > BROWSING_GAP_TIME && |
| 81 * Set the favicon image, based on the URL of the history item. | 140 currentItem.dateRelativeDay == nextItem.dateRelativeDay; |
| 82 * @private | 141 }; |
| 83 */ | |
| 84 showIcon_: function() { | |
| 85 this.$.icon.style.backgroundImage = | |
| 86 cr.icon.getFaviconImageSet(this.item.url); | |
| 87 }, | |
| 88 | 142 |
| 89 /** | 143 return { HistoryItem: HistoryItem }; |
| 90 * Updates the page title. If the result was from a search, highlights any | |
| 91 * occurrences of the search term in bold. | |
| 92 * @private | |
| 93 */ | |
| 94 setSearchedTextToBold_: function() { | |
| 95 var i = 0; | |
| 96 var titleElem = this.$.title; | |
| 97 var titleText = this.item.title; | |
| 98 | |
| 99 if (this.searchTerm == '' || this.searchTerm == null) { | |
| 100 titleElem.textContent = titleText; | |
| 101 return; | |
| 102 } | |
| 103 | |
| 104 var re = new RegExp(quoteString(this.searchTerm), 'gim'); | |
| 105 var match; | |
| 106 titleElem.textContent = ''; | |
| 107 while (match = re.exec(titleText)) { | |
| 108 if (match.index > i) | |
| 109 titleElem.appendChild(document.createTextNode( | |
| 110 titleText.slice(i, match.index))); | |
| 111 i = re.lastIndex; | |
| 112 // Mark the highlighted text in bold. | |
| 113 var b = document.createElement('b'); | |
| 114 b.textContent = titleText.substring(match.index, i); | |
| 115 titleElem.appendChild(b); | |
| 116 } | |
| 117 if (i < titleText.length) | |
| 118 titleElem.appendChild( | |
| 119 document.createTextNode(titleText.slice(i))); | |
| 120 }, | |
| 121 | |
| 122 selectionNotAllowed_: function() { | |
| 123 return !loadTimeData.getBoolean('allowDeletingHistory'); | |
| 124 }, | |
| 125 | |
| 126 /** | |
| 127 * Generates the title for this history card. | |
| 128 * @param {number} numberOfItems The number of items in the card. | |
| 129 * @param {string} search The search term associated with these results. | |
| 130 * @private | |
| 131 */ | |
| 132 cardTitle_: function(numberOfItems, historyDate, search) { | |
| 133 if (!search) | |
| 134 return this.item.dateRelativeDay; | |
| 135 | |
| 136 var resultId = numberOfItems == 1 ? 'searchResult' : 'searchResults'; | |
| 137 return loadTimeData.getStringF('foundSearchResults', numberOfItems, | |
| 138 loadTimeData.getString(resultId), search); | |
| 139 } | |
| 140 }); | 144 }); |
| OLD | NEW |