Index: chrome/browser/resources/local_ntp/local_ntp.js |
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js |
index f44c9836c9d7168323309a3239b197d25dfe7e69..cab6ad2e0ef974f5fdf9af67a05f3ea806bf8e87 100644 |
--- a/chrome/browser/resources/local_ntp/local_ntp.js |
+++ b/chrome/browser/resources/local_ntp/local_ntp.js |
@@ -40,6 +40,7 @@ var CLASSES = { |
HOVERED: 'hovered', |
PENDING_SUGGESTIONS_CONTAINER: 'pending-suggestions-container', |
PAGE: 'mv-page', // page tiles |
+ ROW: 'mv-row', // tile row |
SEARCH: 'search', |
SELECTED: 'selected', // a selected suggestion (if any) |
SUGGESTION: 'suggestion', |
@@ -129,13 +130,6 @@ var tiles = []; |
var lastBlacklistedTile = null; |
/** |
- * The index of the last blacklisted tile, if any. Used to determine where to |
- * re-insert a tile on undo. |
- * @type {number} |
- */ |
-var lastBlacklistedIndex = -1; |
- |
-/** |
* True if a page has been blacklisted and we're waiting on the |
* onmostvisitedchange callback. See onMostVisitedChange() for how this |
* is used. |
@@ -144,18 +138,11 @@ var lastBlacklistedIndex = -1; |
var isBlacklisting = false; |
/** |
- * True if a blacklist has been undone and we're waiting on the |
- * onmostvisitedchange callback. See onMostVisitedChange() for how this |
- * is used. |
- * @type {boolean} |
- */ |
-var isUndoing = false; |
- |
-/** |
- * Current number of tiles shown based on the window width, including filler. |
+ * Current number of tiles columns shown based on the window width, including |
+ * those that just contain filler. |
* @type {number} |
*/ |
-var numTilesShown = 0; |
+var numColumnsShown = 0; |
/** |
* The browser embeddedSearch.newTabPage object. |
@@ -183,13 +170,19 @@ var TILE_WIDTH = 160; |
* @type {number} |
* @const |
*/ |
-var MOST_VISITED_HEIGHT = 156; |
+var MOST_VISITED_HEIGHT = 296; |
+ |
+/** @type {number} @const */ |
+var MAX_NUM_TILES_TO_SHOW = 8; |
/** @type {number} @const */ |
-var MAX_NUM_TILES_TO_SHOW = 4; |
+var MIN_NUM_COLUMNS = 2; |
/** @type {number} @const */ |
-var MIN_NUM_TILES_TO_SHOW = 2; |
+var MAX_NUM_COLUMNS = 4; |
+ |
+/** @type {number} @const */ |
+var NUM_ROWS = 2; |
/** |
* Minimum total padding to give to the left and right of the most visited |
@@ -270,35 +263,13 @@ function onMostVisitedChange() { |
var pages = ntpApiHandle.mostVisited; |
if (isBlacklisting) { |
- // If this was called as a result of a blacklist, add a new replacement |
- // (possibly filler) tile at the end and trigger the blacklist animation. |
- var replacementTile = createTile(pages[MAX_NUM_TILES_TO_SHOW - 1]); |
- |
- tiles.push(replacementTile); |
- tilesContainer.appendChild(replacementTile.elem); |
- |
+ // Trigger the blacklist animation and re-render the tiles when it |
+ // completes. |
var lastBlacklistedTileElement = lastBlacklistedTile.elem; |
lastBlacklistedTileElement.addEventListener( |
'webkitTransitionEnd', blacklistAnimationDone); |
lastBlacklistedTileElement.classList.add(CLASSES.BLACKLIST); |
- // In order to animate the replacement tile sliding into place, it must |
- // be made visible. |
- updateTileVisibility(numTilesShown + 1); |
- |
- } else if (isUndoing) { |
- // If this was called as a result of an undo, re-insert the last blacklisted |
- // tile in its old location and trigger the undo animation. |
- tiles.splice( |
- lastBlacklistedIndex, 0, lastBlacklistedTile); |
- var lastBlacklistedTileElement = lastBlacklistedTile.elem; |
- tilesContainer.insertBefore( |
- lastBlacklistedTileElement, |
- tilesContainer.childNodes[lastBlacklistedIndex]); |
- lastBlacklistedTileElement.addEventListener( |
- 'webkitTransitionEnd', undoAnimationDone); |
- // Force the removal to happen synchronously. |
- lastBlacklistedTileElement.scrollTop; |
- lastBlacklistedTileElement.classList.remove(CLASSES.BLACKLIST); |
+ |
} else { |
// Otherwise render the tiles using the new data without animation. |
tiles = []; |
@@ -310,12 +281,17 @@ function onMostVisitedChange() { |
} |
/** |
- * Renders the current set of tiles without animation. |
+ * Renders the current set of tiles. |
*/ |
function renderTiles() { |
- removeChildren(tilesContainer); |
- for (var i = 0, length = tiles.length; i < length; ++i) { |
- tilesContainer.appendChild(tiles[i].elem); |
+ var rows = tilesContainer.children; |
+ for (var i = 0; i < rows.length; ++i) { |
+ removeChildren(rows[i]); |
+ } |
+ |
+ for (var i = 0, length = tiles.length; |
+ i < Math.min(length, numColumnsShown * NUM_ROWS); ++i) { |
+ rows[Math.floor(i / numColumnsShown)].appendChild(tiles[i].elem); |
} |
} |
@@ -396,19 +372,16 @@ function createTile(page) { |
* is blacklisted. |
* @param {number} rid The RID of the page being blacklisted. |
* @return {function(Event)} A function which handles the blacklisting of the |
- * page by displaying the notification, updating state variables, and |
- * notifying Chrome. |
+ * page by updating state variables and notifying Chrome. |
*/ |
function generateBlacklistFunction(rid) { |
return function(e) { |
// Prevent navigation when the page is being blacklisted. |
e.stopPropagation(); |
- showNotification(); |
isBlacklisting = true; |
tilesContainer.classList.add(CLASSES.HIDE_BLACKLIST_BUTTON); |
lastBlacklistedTile = getTileByRid(rid); |
- lastBlacklistedIndex = tiles.indexOf(lastBlacklistedTile); |
ntpApiHandle.deleteMostVisitedItem(rid); |
}; |
} |
@@ -431,16 +404,19 @@ function hideNotification() { |
} |
/** |
- * Handles the end of the blacklist animation by removing the blacklisted tile. |
+ * Handles the end of the blacklist animation by showing the notification and |
+ * re-rendering the new set of tiles. |
*/ |
function blacklistAnimationDone() { |
- tiles.splice(lastBlacklistedIndex, 1); |
- removeNode(lastBlacklistedTile.elem); |
- updateTileVisibility(numTilesShown); |
+ showNotification(); |
isBlacklisting = false; |
tilesContainer.classList.remove(CLASSES.HIDE_BLACKLIST_BUTTON); |
lastBlacklistedTile.elem.removeEventListener( |
'webkitTransitionEnd', blacklistAnimationDone); |
+ // Need to call explicitly to re-render the tiles, since the initial |
+ // onmostvisitedchange issued by the blacklist function only triggered |
+ // the animation. |
+ onMostVisitedChange(); |
} |
/** |
@@ -450,22 +426,8 @@ function blacklistAnimationDone() { |
function onUndo() { |
hideNotification(); |
var lastBlacklistedRID = lastBlacklistedTile.rid; |
- if (typeof lastBlacklistedRID != 'undefined') { |
- isUndoing = true; |
+ if (typeof lastBlacklistedRID != 'undefined') |
ntpApiHandle.undoMostVisitedDeletion(lastBlacklistedRID); |
- } |
-} |
- |
-/** |
- * Handles the end of the undo animation by removing the extraneous end tile. |
- */ |
-function undoAnimationDone() { |
- isUndoing = false; |
- tiles.splice(tiles.length - 1, 1); |
- removeNode(tilesContainer.lastElementChild); |
- updateTileVisibility(numTilesShown); |
- lastBlacklistedTile.elem.removeEventListener( |
- 'webkitTransitionEnd', undoAnimationDone); |
} |
/** |
@@ -479,7 +441,7 @@ function onRestoreAll() { |
/** |
* Handles a resize by vertically centering the most visited section |
- * and triggering the tile show/hide animation if necessary. |
+ * and re-rendering the tiles if the number of columns has changed. |
*/ |
function onResize() { |
// The Google page uses a fixed layout instead. |
@@ -489,23 +451,13 @@ function onResize() { |
Math.max(0, (clientHeight - MOST_VISITED_HEIGHT) / 2) + 'px'; |
} |
var clientWidth = document.documentElement.clientWidth; |
- var numTilesToShow = Math.floor( |
+ var numColumnsToShow = Math.floor( |
(clientWidth - MIN_TOTAL_HORIZONTAL_PADDING) / TILE_WIDTH); |
- numTilesToShow = Math.max(MIN_NUM_TILES_TO_SHOW, numTilesToShow); |
- if (numTilesToShow != numTilesShown) { |
- updateTileVisibility(numTilesToShow); |
- numTilesShown = numTilesToShow; |
- } |
-} |
- |
-/** |
- * Triggers an animation to show the first numTilesToShow tiles and hide the |
- * remaining. |
- * @param {number} numTilesToShow The number of tiles to show. |
- */ |
-function updateTileVisibility(numTilesToShow) { |
- for (var i = 0, length = tiles.length; i < length; ++i) { |
- tiles[i].elem.classList.toggle(CLASSES.HIDE_TILE, i >= numTilesToShow); |
+ numColumnsToShow = Math.max(MIN_NUM_COLUMNS, |
+ Math.min(MAX_NUM_COLUMNS, numColumnsToShow)); |
+ if (numColumnsToShow != numColumnsShown) { |
+ numColumnsShown = numColumnsToShow; |
+ renderTiles(); |
} |
} |
@@ -1400,6 +1352,12 @@ function init() { |
attribution = $(IDS.ATTRIBUTION); |
ntpContents = $(IDS.NTP_CONTENTS); |
+ for (var i = 0; i < NUM_ROWS; i++) { |
+ var row = document.createElement('div'); |
+ row.classList.add(CLASSES.ROW); |
+ tilesContainer.appendChild(row); |
+ } |
+ |
if (isGooglePage) { |
document.body.classList.add(CLASSES.GOOGLE_PAGE); |
var logo = document.createElement('div'); |
@@ -1459,11 +1417,6 @@ function init() { |
$qs('.' + CLASSES.PENDING_SUGGESTIONS_CONTAINER).dir = |
searchboxApiHandle.rtl ? 'rtl' : 'ltr'; |
- if (!document.webkitHidden) |
- window.addEventListener('resize', addDelayedTransitions); |
- else |
- document.addEventListener('webkitvisibilitychange', addDelayedTransitions); |
- |
if (fakebox) { |
// Listener for updating the fakebox focus. |
document.body.onclick = function(event) { |
@@ -1481,22 +1434,6 @@ function init() { |
} |
} |
-/** |
- * Applies webkit transitions to NTP elements which need to be delayed until |
- * after the page is made visible and any initial resize has occurred. This is |
- * to prevent animations from triggering when the NTP is shown. |
- */ |
-function addDelayedTransitions() { |
- if (fakebox) { |
- fakebox.style.webkitTransition = |
- '-webkit-transform 100ms linear, width 200ms ease'; |
- } |
- |
- tilesContainer.style.webkitTransition = 'width 200ms'; |
- window.removeEventListener('resize', addDelayedTransitions); |
- document.removeEventListener('webkitvisibilitychange', addDelayedTransitions); |
-} |
- |
document.addEventListener('DOMContentLoaded', init); |
window.addEventListener('message', handleMessage, false); |
window.addEventListener('blur', function() { |