Chromium Code Reviews| 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 fb8b873216619a004c19a623ce170a4cb6d0796b..3916221bf7040b28179e4501632c020b48b2ef69 100644 |
| --- a/chrome/browser/resources/local_ntp/local_ntp.js |
| +++ b/chrome/browser/resources/local_ntp/local_ntp.js |
| @@ -39,7 +39,6 @@ var CLASSES = { |
| NON_GOOGLE_PAGE: 'non-google-page', |
| PAGE: 'mv-page', // page tiles |
| PAGE_READY: 'mv-page-ready', // page tile when ready |
| - ROW: 'mv-row', // tile row |
| RTL: 'rtl', // Right-to-left language text. |
| THUMBNAIL: 'mv-thumb', |
| THUMBNAIL_MASK: 'mv-mask', |
| @@ -205,6 +204,13 @@ var fakeboxInputBehavior = NTP_DISPOSE_STATE.HIDE_FAKEBOX_AND_LOGO; |
| /** |
| + * A counter to control the visibility of tile elements. |
| + * @type {number} |
| + */ |
| +var tileVisibilityCounter = 0; |
|
beaudoin
2014/07/24 15:24:36
I'd prefer numHiddenTiles with a matching comment.
huangs
2014/07/24 19:33:11
Per discussion, numHiddenTiles will be off by one
|
| + |
| + |
| +/** |
| * Total tile width. Should be equal to mv-tile's width + 2 * border-width. |
| * @private {number} |
| * @const |
| @@ -329,6 +335,7 @@ function onThemeChange() { |
| document.body.classList.toggle(CLASSES.ALTERNATE_LOGO, info.alternateLogo); |
| updateThemeAttribution(info.attributionUrl); |
| setCustomThemeStyle(info); |
| + |
| renderTiles(); |
| } |
| @@ -432,22 +439,15 @@ function convertToRGBAColor(color) { |
| * Handles a new set of Most Visited page data. |
| */ |
| function onMostVisitedChange() { |
| - var pages = ntpApiHandle.mostVisited; |
| - |
| if (isBlacklisting) { |
| - // Trigger the blacklist animation and re-render the tiles when it |
| - // completes. |
| + // Trigger the blacklist animation. On completion, the handler will call |
| + // reloadAllTiles(). |
| var lastBlacklistedTileElement = lastBlacklistedTile.elem; |
| lastBlacklistedTileElement.addEventListener( |
| 'webkitTransitionEnd', blacklistAnimationDone); |
| lastBlacklistedTileElement.classList.add(CLASSES.BLACKLIST); |
|
Mathieu
2014/07/24 15:11:25
remove extra new line
huangs
2014/07/24 19:33:11
Done.
|
| } else { |
| - // Otherwise render the tiles using the new data without animation. |
| - tiles = []; |
| - for (var i = 0; i < MAX_NUM_TILES_TO_SHOW; ++i) { |
| - tiles.push(createTile(pages[i], i)); |
| - } |
| if (!userInitiatedMostVisitedChange) { |
| tilesContainer.hidden = true; |
| window.setTimeout(function() { |
| @@ -456,41 +456,61 @@ function onMostVisitedChange() { |
| } |
| }, MOST_VISITED_PAINT_TIMEOUT_MSEC); |
| } |
| - renderTiles(); |
| + reloadAllTiles(); |
| } |
| } |
| /** |
| - * Renders the current set of tiles. |
| + * Fetches new data, creates, and renders tiles. |
| + */ |
| +function reloadAllTiles() { |
| + var pages = ntpApiHandle.mostVisited; |
| + |
| + tiles = []; |
| + deltaMostVisitedVisibility(1); |
|
beaudoin
2014/07/24 15:24:36
I'd use just a ++ here and call the other
decre
huangs
2014/07/24 19:33:12
Changed to Barrier.
|
| + for (var i = 0; i < MAX_NUM_TILES_TO_SHOW; ++i) { |
| + tiles.push(createTile(pages[i], i)); |
| + } |
| + renderTiles(); |
| + deltaMostVisitedVisibility(-1); |
| +} |
| + |
| + |
| +/** |
| + * Adds the current list of tiles to DOM. |
| */ |
| function renderTiles() { |
| - var rows = tilesContainer.children; |
| - for (var i = 0; i < rows.length; ++i) { |
| - removeChildren(rows[i]); |
| + removeChildren(tilesContainer); |
| + var renderedList = tilesContainer.querySelectorAll('.mv-tile'); |
| + var size = Math.min(tiles.length, numColumnsShown * NUM_ROWS); |
| + for (var i = 0; i < size; ++i) { |
| + tilesContainer.appendChild(tiles[i].elem); |
| } |
| +} |
| + |
| - for (var i = 0, length = tiles.length; |
| - i < Math.min(length, numColumnsShown * NUM_ROWS); ++i) { |
| - rows[Math.floor(i / numColumnsShown)].appendChild(tiles[i].elem); |
| +/** |
| + * Shows or hides rendered tiles, depending on the number of columns shown. |
| + */ |
| +function showTiles() { |
| + var renderedList = tilesContainer.querySelectorAll('.mv-tile'); |
| + var numVisible = Math.min(tiles.length, numColumnsShown * NUM_ROWS); |
| + for (var i = 0; i < renderedList.length; ++i) { |
| + renderedList[i].style.display = i < numVisible ? 'inline-block' : 'none'; |
| } |
| } |
| /** |
| - * Shows most visited tiles if all child iframes are loaded, and hides them |
| + * Changes the visibility counter for most visited tiles by |delta|, and |
|
Mathieu
2014/07/24 15:11:25
*Most Visited
huangs
2014/07/24 19:33:11
Done.
|
| + * makes the tiles visible once the count decreases to 0. |
| * otherwise. |
|
Mathieu
2014/07/24 15:11:25
fix comment
huangs
2014/07/24 19:33:11
Done.
|
| + * @param {number} delta The amount to change counter by, usually 1 or -1. |
| */ |
| -function updateMostVisitedVisibility() { |
| - var iframes = tilesContainer.querySelectorAll('iframe'); |
| - var ready = true; |
| - for (var i = 0, numIframes = iframes.length; i < numIframes; i++) { |
| - if (iframes[i].hidden) { |
| - ready = false; |
| - break; |
| - } |
| - } |
| - if (ready) { |
| +function deltaMostVisitedVisibility(delta) { |
|
Mathieu
2014/07/24 15:11:25
As discussed offline, reconsider if this function
huangs
2014/07/24 19:33:11
This function is needed: in onMostVisitedChange(),
|
| + tileVisibilityCounter += delta; |
| + if (tileVisibilityCounter === 0) { |
| tilesContainer.hidden = false; |
| userInitiatedMostVisitedChange = false; |
| } |
| @@ -563,36 +583,36 @@ function createTile(page, position) { |
| // |
| // TODO(jered): Find and fix the root (probably Blink) bug. |
| - titleElement.src = getMostVisitedIframeUrl( |
| - MOST_VISITED_TITLE_IFRAME, rid, MOST_VISITED_COLOR, |
| - MOST_VISITED_FONT_FAMILY, MOST_VISITED_FONT_SIZE, position); |
| - |
| // Keep this id here. See comment above. |
| titleElement.id = 'title-' + rid; |
| + titleElement.className = CLASSES.TITLE; |
| titleElement.hidden = true; |
| + deltaMostVisitedVisibility(1); |
|
beaudoin
2014/07/24 15:24:36
++
huangs
2014/07/24 19:33:11
Acknowledged.
|
| titleElement.onload = function() { |
| titleElement.hidden = false; |
| - updateMostVisitedVisibility(); |
| + deltaMostVisitedVisibility(-1); |
|
beaudoin
2014/07/24 15:24:36
decrementNumberOfVisibleTiles();
huangs
2014/07/24 19:33:11
Acknowledged.
|
| }; |
| - titleElement.className = CLASSES.TITLE; |
| + titleElement.src = getMostVisitedIframeUrl( |
| + MOST_VISITED_TITLE_IFRAME, rid, MOST_VISITED_COLOR, |
| + MOST_VISITED_FONT_FAMILY, MOST_VISITED_FONT_SIZE, position); |
| tileElement.appendChild(titleElement); |
| // The iframe which renders either a thumbnail or domain element. |
| var thumbnailElement = document.createElement('iframe'); |
| thumbnailElement.tabIndex = '-1'; |
| - thumbnailElement.src = getMostVisitedIframeUrl( |
| - MOST_VISITED_THUMBNAIL_IFRAME, rid, MOST_VISITED_COLOR, |
| - MOST_VISITED_FONT_FAMILY, MOST_VISITED_FONT_SIZE, position); |
| - |
| // Keep this id here. See comment above. |
| thumbnailElement.id = 'thumb-' + rid; |
| + thumbnailElement.className = CLASSES.THUMBNAIL; |
| thumbnailElement.hidden = true; |
| + deltaMostVisitedVisibility(1); |
|
beaudoin
2014/07/24 15:24:37
Same.
huangs
2014/07/24 19:33:12
Acknowledged.
|
| thumbnailElement.onload = function() { |
| thumbnailElement.hidden = false; |
| tileElement.classList.add(CLASSES.PAGE_READY); |
| - updateMostVisitedVisibility(); |
| + deltaMostVisitedVisibility(-1); |
| }; |
| - thumbnailElement.className = CLASSES.THUMBNAIL; |
| + thumbnailElement.src = getMostVisitedIframeUrl( |
| + MOST_VISITED_THUMBNAIL_IFRAME, rid, MOST_VISITED_COLOR, |
| + MOST_VISITED_FONT_FAMILY, MOST_VISITED_FONT_SIZE, position); |
| tileElement.appendChild(thumbnailElement); |
| // A mask to darken the thumbnail on focus. |
| @@ -676,7 +696,7 @@ function blacklistAnimationDone() { |
| // Need to call explicitly to re-render the tiles, since the initial |
| // onmostvisitedchange issued by the blacklist function only triggered |
| // the animation. |
| - onMostVisitedChange(); |
| + reloadAllTiles(); |
| } |
| @@ -718,14 +738,14 @@ function onResize() { |
| var setWidths = function(tilesContainerWidth) { |
| tilesContainer.style.width = tilesContainerWidth + 'px'; |
| if (fakebox) |
| - fakebox.style.width = (tilesContainerWidth - 2) + 'px'; |
| + fakebox.style.width = (tilesContainerWidth - 22) + 'px'; |
| }; |
| if (innerWidth >= 820) |
| - setWidths(620); |
| + setWidths(640); |
| else if (innerWidth >= 660) |
| - setWidths(460); |
| + setWidths(480); |
| else |
| - setWidths(300); |
| + setWidths(320); |
| var tileRequiredWidth = TILE_WIDTH + TILE_MARGIN_START; |
| // Adds margin-start to the available width to compensate the extra margin |
| @@ -737,7 +757,7 @@ function onResize() { |
| Math.min(MAX_NUM_COLUMNS, numColumnsToShow)); |
| if (numColumnsToShow != numColumnsShown) { |
| numColumnsShown = numColumnsToShow; |
| - renderTiles(); |
| + showTiles(); |
| } |
| } |
| @@ -924,12 +944,6 @@ 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 (configData.isGooglePage) { |
| var logo = document.createElement('div'); |
| logo.id = IDS.LOGO; |
| @@ -939,7 +953,7 @@ function init() { |
| fakebox.innerHTML = |
| '<input id="' + IDS.FAKEBOX_INPUT + |
| '" autocomplete="off" tabindex="-1" aria-hidden="true">' + |
| - '<div id=cursor></div>'; |
| + '<div id="cursor"></div>'; |
| ntpContents.insertBefore(fakebox, ntpContents.firstChild); |
| ntpContents.insertBefore(logo, ntpContents.firstChild); |