Chromium Code Reviews| 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('ntp4', function() { | 5 cr.define('ntp4', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 var TilePage = ntp4.TilePage; | 8 var TilePage = ntp4.TilePage; |
| 9 | 9 |
| 10 /** | 10 /** |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 assert(this.tile); | 38 assert(this.tile); |
| 39 return this.tile.index; | 39 return this.tile.index; |
| 40 }, | 40 }, |
| 41 | 41 |
| 42 /** | 42 /** |
| 43 * Clears the DOM hierarchy for this node, setting it back to the default | 43 * Clears the DOM hierarchy for this node, setting it back to the default |
| 44 * for a blank thumbnail. | 44 * for a blank thumbnail. |
| 45 */ | 45 */ |
| 46 reset: function() { | 46 reset: function() { |
| 47 this.className = 'most-visited filler real'; | 47 this.className = 'most-visited filler real'; |
| 48 // TODO(estade): why do we need edit-mode-border? | |
| 49 this.innerHTML = | 48 this.innerHTML = |
| 50 '<div class="edit-mode-border fills-parent">' + | 49 '<span class="thumbnail-wrapper fills-parent">' + |
| 51 '<div class="edit-bar-wrapper">' + | 50 '<div class="close-button"></div>' + |
| 52 '<div class="edit-bar">' + | 51 '<span class="thumbnail fills-parent">' + |
| 53 '<div class="pin"></div>' + | 52 // thumbnail-shield provides a gradient fade effect. |
| 54 '<div class="spacer"></div>' + | 53 '<div class="thumbnail-shield fills-parent"></div>' + |
| 55 '<div class="remove"></div>' + | |
| 56 '</div>' + | |
| 57 '</div>' + | |
| 58 '<span class="thumbnail-wrapper fills-parent">' + | |
| 59 '<span class="thumbnail fills-parent">' + | |
| 60 // thumbnail-shield provides a gradient fade effect. | |
| 61 '<div class="thumbnail-shield fills-parent"></div>' + | |
| 62 '</span>' + | |
| 63 '<span class="favicon"></span>' + | |
| 64 '</span>' + | 54 '</span>' + |
| 65 '<div class="color-stripe"></div>' + | 55 '<span class="favicon"></span>' + |
| 66 '<span class="title"></span>' + | 56 '</span>' + |
| 67 '</div>'; | 57 '<div class="color-stripe"></div>' + |
| 58 '<span class="title"></span>'; | |
| 68 | 59 |
| 69 this.tabIndex = -1; | 60 this.tabIndex = -1; |
| 70 this.data_ = null; | 61 this.data_ = null; |
| 71 this.removeAttribute('id'); | 62 this.removeAttribute('id'); |
| 72 }, | 63 }, |
| 73 | 64 |
| 74 /** | 65 /** |
| 75 * Update the appearance of this tile according to |data|. | 66 * Update the appearance of this tile according to |data|. |
| 76 * @param {Object} data A dictionary of relevant data for the page. | 67 * @param {Object} data A dictionary of relevant data for the page. |
| 77 */ | 68 */ |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 100 | 91 |
| 101 var title = this.querySelector('.title'); | 92 var title = this.querySelector('.title'); |
| 102 title.textContent = data.title; | 93 title.textContent = data.title; |
| 103 title.dir = data.direction; | 94 title.dir = data.direction; |
| 104 | 95 |
| 105 var thumbnailUrl = data.thumbnailUrl || 'chrome://thumb/' + data.url; | 96 var thumbnailUrl = data.thumbnailUrl || 'chrome://thumb/' + data.url; |
| 106 this.querySelector('.thumbnail').style.backgroundImage = | 97 this.querySelector('.thumbnail').style.backgroundImage = |
| 107 url(thumbnailUrl); | 98 url(thumbnailUrl); |
| 108 | 99 |
| 109 this.href = data.url; | 100 this.href = data.url; |
| 110 | |
| 111 this.updatePinnedState_(); | |
| 112 }, | 101 }, |
| 113 | 102 |
| 114 /** | 103 /** |
| 115 * Sets the color of the favicon dominant color bar. | 104 * Sets the color of the favicon dominant color bar. |
| 116 * @param {string} color The css-parsable value for the color. | 105 * @param {string} color The css-parsable value for the color. |
| 117 */ | 106 */ |
| 118 setStripeColor: function(color) { | 107 setStripeColor: function(color) { |
| 119 this.querySelector('.color-stripe').style.backgroundColor = color; | 108 this.querySelector('.color-stripe').style.backgroundColor = color; |
| 120 }, | 109 }, |
| 121 | 110 |
| 122 /** | 111 /** |
| 123 * Handles a click on the tile. | 112 * Handles a click on the tile. |
| 124 * @param {Event} e The click event. | 113 * @param {Event} e The click event. |
| 125 */ | 114 */ |
| 126 handleClick_: function(e) { | 115 handleClick_: function(e) { |
| 127 var target = e.target; | 116 if (e.target.classList.contains('close-button')) { |
| 128 | 117 this.blacklist_(); |
| 129 // Don't navigate on edit bar clicks. | |
| 130 if (this.querySelector('.edit-bar').contains(target)) | |
| 131 e.preventDefault(); | 118 e.preventDefault(); |
| 132 | |
| 133 if (target.classList.contains('pin')) { | |
| 134 this.setPinned_(!this.data_.pinned); | |
| 135 } else if (target.classList.contains('remove')) { | |
| 136 this.blacklist_(); | |
| 137 } else { | 119 } else { |
| 138 chrome.send('recordInHistogram', ['NTP_MostVisited', this.index, 8]); | 120 chrome.send('recordInHistogram', ['NTP_MostVisited', this.index, 8]); |
| 139 } | 121 } |
| 140 }, | 122 }, |
| 141 | 123 |
| 142 /** | 124 /** |
| 143 * Allow blacklisting most visited site using the keyboard. | 125 * Allow blacklisting most visited site using the keyboard. |
| 144 */ | 126 */ |
| 145 handleKeyDown_: function(e) { | 127 handleKeyDown_: function(e) { |
| 146 if (!IS_MAC && e.keyCode == 46 || // Del | 128 if (!IS_MAC && e.keyCode == 46 || // Del |
| 147 IS_MAC && e.metaKey && e.keyCode == 8) { // Cmd + Backspace | 129 IS_MAC && e.metaKey && e.keyCode == 8) { // Cmd + Backspace |
| 148 this.blacklist_(); | 130 this.blacklist_(); |
| 149 } | 131 } |
| 150 }, | 132 }, |
| 151 | 133 |
| 152 /** | 134 /** |
| 153 * Changes the visual state of the page and updates the model. | |
| 154 */ | |
| 155 setPinned_: function(pinned) { | |
| 156 var data = this.data_; | |
| 157 data.pinned = pinned; | |
| 158 if (data.pinned) { | |
| 159 chrome.send('addPinnedURL', [ | |
| 160 data.url, | |
| 161 data.title, | |
| 162 data.faviconUrl || '', | |
| 163 data.thumbnailUrl || '', | |
| 164 // TODO(estade): should not need to convert index to string. | |
| 165 String(this.index) | |
| 166 ]); | |
| 167 } else { | |
| 168 chrome.send('removePinnedURL', [data.url]); | |
| 169 } | |
| 170 | |
| 171 this.updatePinnedState_(); | |
| 172 }, | |
| 173 | |
| 174 /** | |
| 175 * Updates the DOM for the current pinned state. | |
| 176 */ | |
| 177 updatePinnedState_: function() { | |
| 178 if (this.data_.pinned) { | |
| 179 this.classList.add('pinned'); | |
| 180 this.querySelector('.pin').title = templateData.unpinthumbnailtooltip; | |
| 181 } else { | |
| 182 this.classList.remove('pinned'); | |
| 183 this.querySelector('.pin').title = templateData.pinthumbnailtooltip; | |
| 184 } | |
| 185 }, | |
| 186 | |
| 187 /** | |
| 188 * Permanently removes a page from Most Visited. | 135 * Permanently removes a page from Most Visited. |
| 189 */ | 136 */ |
| 190 blacklist_: function() { | 137 blacklist_: function() { |
| 191 this.showUndoNotification_(); | 138 this.showUndoNotification_(); |
| 192 chrome.send('blacklistURLFromMostVisited', [this.data_.url]); | 139 chrome.send('blacklistURLFromMostVisited', [this.data_.url]); |
| 193 this.reset(); | 140 this.reset(); |
| 194 chrome.send('getMostVisited'); | 141 chrome.send('getMostVisited'); |
| 195 }, | 142 }, |
| 196 | 143 |
| 197 showUndoNotification_: function() { | 144 showUndoNotification_: function() { |
| 198 var data = this.data_; | 145 var data = this.data_; |
| 199 var pinned = data.pinned; | |
| 200 var self = this; | 146 var self = this; |
| 201 var doUndo = function () { | 147 var doUndo = function () { |
| 202 chrome.send('removeURLsFromMostVisitedBlacklist', [data.url]); | 148 chrome.send('removeURLsFromMostVisitedBlacklist', [data.url]); |
| 203 self.updateForData(data); | 149 self.updateForData(data); |
| 204 self.setPinned_(data.pinned); | |
| 205 // chrome.send('getMostVisited'); | |
| 206 } | 150 } |
| 207 | 151 |
| 208 var undo = { | 152 var undo = { |
| 209 action: doUndo, | 153 action: doUndo, |
| 210 text: templateData.undothumbnailremove, | 154 text: templateData.undothumbnailremove, |
| 211 } | 155 } |
| 212 | 156 |
| 213 var undoAll = { | 157 var undoAll = { |
| 214 action: function() { | 158 action: function() { |
| 215 chrome.send('clearMostVisitedURLsBlacklist', []); | 159 chrome.send('clearMostVisitedURLsBlacklist', []); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 245 // TODO(estade): Change these to real values. | 189 // TODO(estade): Change these to real values. |
| 246 // The smallest a tile can be. | 190 // The smallest a tile can be. |
| 247 minTileWidth: 200, | 191 minTileWidth: 200, |
| 248 // The biggest a tile can be. | 192 // The biggest a tile can be. |
| 249 maxTileWidth: 240, | 193 maxTileWidth: 240, |
| 250 }; | 194 }; |
| 251 TilePage.initGridValues(mostVisitedPageGridValues); | 195 TilePage.initGridValues(mostVisitedPageGridValues); |
| 252 | 196 |
| 253 /** | 197 /** |
| 254 * Calculates the height for a Most Visited tile for a given width. The size | 198 * Calculates the height for a Most Visited tile for a given width. The size |
| 255 * is based on the thumbnail, which should have a 212:132 ratio (the rest of | 199 * is based on the thumbnail, which should have a 212:132 ratio. |
| 256 * the arithmetic accounts for padding). | |
| 257 * @return {number} The height. | 200 * @return {number} The height. |
| 258 */ | 201 */ |
| 259 function heightForWidth(width) { | 202 function heightForWidth(width) { |
| 260 return (width - 2) * 132 / 212 + 48; | 203 // The 2s are for borders, the 23 is for the title. |
| 204 return (width - 2) * 132 / 212 + 2 + 23; | |
| 261 } | 205 } |
| 262 | 206 |
| 263 var THUMBNAIL_COUNT = 8; | 207 var THUMBNAIL_COUNT = 8; |
| 264 | 208 |
| 265 /** | 209 /** |
| 266 * Creates a new MostVisitedPage object. | 210 * Creates a new MostVisitedPage object. |
| 267 * @constructor | 211 * @constructor |
| 268 * @extends {TilePage} | 212 * @extends {TilePage} |
| 269 */ | 213 */ |
| 270 function MostVisitedPage() { | 214 function MostVisitedPage() { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 this.data_ = data.slice(0, THUMBNAIL_COUNT); | 268 this.data_ = data.slice(0, THUMBNAIL_COUNT); |
| 325 } else { | 269 } else { |
| 326 this.data_ = refreshData(this.data_, data); | 270 this.data_ = refreshData(this.data_, data); |
| 327 } | 271 } |
| 328 | 272 |
| 329 this.updateTiles_(); | 273 this.updateTiles_(); |
| 330 }, | 274 }, |
| 331 | 275 |
| 332 /** @inheritDoc */ | 276 /** @inheritDoc */ |
| 333 shouldAcceptDrag: function(dataTransfer) { | 277 shouldAcceptDrag: function(dataTransfer) { |
| 334 return this.contains(ntp4.getCurrentlyDraggingTile()); | 278 return false; |
| 335 }, | 279 }, |
| 336 | 280 |
| 337 /** @inheritDoc */ | 281 /** @inheritDoc */ |
| 338 heightForWidth: heightForWidth, | 282 heightForWidth: heightForWidth, |
| 339 }; | 283 }; |
| 340 | 284 |
| 341 /** | 285 /** |
| 342 * We've gotten additional Most Visited data. Update our old data with the | 286 * We've gotten additional Most Visited data. Update our old data with the |
| 343 * new data. The ordering of the new data is not important, except when a | 287 * new data. The ordering of the new data is not important, except when a |
| 344 * page is pinned. Thus we try to minimize re-ordering. | 288 * page is pinned. Thus we try to minimize re-ordering. |
|
csilv
2011/07/12 21:31:09
nit: remove reference to a pinned item in the comm
| |
| 345 * @param {Object} oldData The current Most Visited page list. | 289 * @param {Object} oldData The current Most Visited page list. |
| 346 * @param {Object} newData The new Most Visited page list. | 290 * @param {Object} newData The new Most Visited page list. |
| 347 * @return The merged page list that should replace the current page list. | 291 * @return The merged page list that should replace the current page list. |
| 348 */ | 292 */ |
| 349 function refreshData(oldData, newData) { | 293 function refreshData(oldData, newData) { |
| 350 oldData = oldData.slice(0, THUMBNAIL_COUNT); | 294 oldData = oldData.slice(0, THUMBNAIL_COUNT); |
| 351 newData = newData.slice(0, THUMBNAIL_COUNT); | 295 newData = newData.slice(0, THUMBNAIL_COUNT); |
| 352 | 296 |
| 353 // Copy over pinned sites directly. | 297 // Copy over pinned sites directly. |
|
csilv
2011/07/12 21:31:09
This block is obsolete.
Evan Stade
2011/07/12 21:47:29
it doesn't do any harm so I left it there for now.
| |
| 354 for (var j = 0; j < newData.length; j++) { | 298 for (var j = 0; j < newData.length; j++) { |
| 355 if (newData[j].pinned) { | 299 if (newData[j].pinned) { |
| 356 oldData[j] = newData[j]; | 300 oldData[j] = newData[j]; |
| 357 // Mark the entry as 'updated' so we don't try to update again. | 301 // Mark the entry as 'updated' so we don't try to update again. |
| 358 oldData[j].updated = true; | 302 oldData[j].updated = true; |
| 359 // Mark the newData page as 'used' so we don't try to re-use it. | 303 // Mark the newData page as 'used' so we don't try to re-use it. |
| 360 newData[j].used = true; | 304 newData[j].used = true; |
| 361 } | 305 } |
| 362 } | 306 } |
| 363 | 307 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 414 if (tile) | 358 if (tile) |
| 415 tile.setStripeColor(color); | 359 tile.setStripeColor(color); |
| 416 }; | 360 }; |
| 417 | 361 |
| 418 return { | 362 return { |
| 419 MostVisitedPage: MostVisitedPage, | 363 MostVisitedPage: MostVisitedPage, |
| 420 refreshData: refreshData, | 364 refreshData: refreshData, |
| 421 setFaviconDominantColor: setFaviconDominantColor, | 365 setFaviconDominantColor: setFaviconDominantColor, |
| 422 }; | 366 }; |
| 423 }); | 367 }); |
| OLD | NEW |