Chromium Code Reviews| Index: chrome/browser/resources/new_new_tab.js |
| diff --git a/chrome/browser/resources/new_new_tab.js b/chrome/browser/resources/new_new_tab.js |
| index a5e7b7647bd187d04aa359e2c52b5002dc64b3dd..defc8123b3e6d6c362a86d5594c43dee7fd2a389 100644 |
| --- a/chrome/browser/resources/new_new_tab.js |
| +++ b/chrome/browser/resources/new_new_tab.js |
| @@ -7,15 +7,22 @@ |
| var MAX_MINIVIEW_ITEMS = 15; |
| // Extra spacing at the top of the layout. |
| -var LAYOUT_SPACING_TOP = 5; |
| +var LAYOUT_SPACING_TOP = 25; |
| var loading = true; |
| function updateSimpleSection(id, section) { |
| - if (shownSections & section) |
| + var elm = $(id); |
| + var maxiview = getSectionMaxiview(elm); |
| + if (shownSections & section) { |
| $(id).classList.remove('hidden'); |
| - else |
| + if (maxiview) |
| + maxiview.classList.remove('hidden'); |
| + } else { |
| $(id).classList.add('hidden'); |
| + if (maxiview) |
| + maxiview.classList.add('hidden'); |
| + } |
| } |
| function recentlyClosedTabs(data) { |
| @@ -101,16 +108,13 @@ function SectionLayoutInfo(section) { |
| this.section = section; |
| this.header = section.getElementsByTagName('h2')[0]; |
| this.miniview = section.getElementsByClassName('miniview')[0]; |
| - this.maxiview = section.getElementsByClassName('maxiview')[0]; |
| - this.expanded = !section.classList.contains('hidden'); |
| - this.fixedHeight = this.header.offsetHeight; |
| + this.maxiview = getSectionMaxiview(section); |
| + this.expanded = this.maxiview && !section.classList.contains('hidden'); |
| + this.fixedHeight = this.section.offsetHeight; |
| this.scrollingHeight = 0; |
| - if (this.expanded) { |
| + if (this.expanded) |
| this.scrollingHeight = this.maxiview.offsetHeight; |
| - } else if (this.miniview) { |
| - this.fixedHeight += this.miniview.offsetHeight; |
| - } |
| } |
| // Get all sections to be layed out. |
| @@ -209,25 +213,59 @@ function layoutSections() { |
| // Now position all the elements. |
| var y = LAYOUT_SPACING_TOP; |
| for (i = 0, section; section = sections[i]; i++) { |
| - section.header.style.top = y + 'px'; |
| - y += section.header.offsetHeight; |
| - |
| - if (section.miniview) { |
| - section.miniview.style.top = y + 'px'; |
| - if (section != expandedSection) { |
| - y += section.miniview.offsetHeight; |
| - } |
| - } |
| + section.section.style.top = y + 'px'; |
| + y += section.fixedHeight; |
| if (section.maxiview) { |
| section.maxiview.style.top = y + 'px'; |
| - if (section == expandedSection) { |
| - y += expandedSectionHeight; |
| - } |
| + |
| + if (section == expandedSection) |
| + updateMask(section.maxiview, expandedSectionHeight); |
| } |
| + |
| + if (section == expandedSection) |
| + y += expandedSectionHeight; |
| } |
| } |
| +function updateMask(maxiview, visibleHeightPx) { |
| + // We want to end up with 10px gradients at the top and bottom of |
| + // visibleHeight, but webkit-mask only supports expression in terms of |
| + // percentages. |
| + |
| + // We might not have enough room to do 10px gradients on each side. To get the |
| + // right effect, we don't want to make the gradients smaller, but make them |
| + // appear to mush into each other. |
| + var gradientHeightPx = Math.min(10, Math.floor(visibleHeightPx / 2)); |
| + var gradientDestination = "rgba(0,0,0," + (gradientHeightPx / 10) + ")"; |
|
arv (Not doing code reviews)
2010/09/03 00:24:22
s/"/'/
|
| + |
| + var bottomSpacing = 15; |
| + var first = parseFloat(maxiview.style.top) / window.innerHeight; |
| + var second = first + gradientHeightPx / window.innerHeight; |
| + var fourth = first + (visibleHeightPx - bottomSpacing) / window.innerHeight; |
| + var third = fourth - gradientHeightPx / window.innerHeight; |
| + |
| + var gradientArguments = [ |
| + "linear", |
| + "0 0", |
| + "0 100%", |
| + "from(transparent)", |
| + getColorStopString(first, "transparent"), |
| + getColorStopString(second, gradientDestination), |
| + getColorStopString(third, gradientDestination), |
| + getColorStopString(fourth, "transparent"), |
| + "to(transparent)" |
| + ]; |
| + |
| + var gradient = '-webkit-gradient(' + gradientArguments.join(', ') + ')'; |
| + console.log(gradient); |
|
arv (Not doing code reviews)
2010/09/03 00:24:22
can you remove this log?
|
| + maxiview.style.WebkitMaskImage = gradient; |
| +} |
| + |
| +function getColorStopString(height, color) { |
| + return "color-stop(" + height + ", " + color + ")"; |
| +} |
| + |
| window.addEventListener('resize', handleWindowResize); |
| var sectionToElementMap; |
| @@ -242,13 +280,22 @@ function getSectionElement(section) { |
| return sectionToElementMap[section]; |
| } |
| +function getSectionMaxiview(section) { |
| + return $(section.id + '-maxiview'); |
| +} |
| + |
| function showSection(section) { |
| if (!(section & shownSections)) { |
| shownSections |= section; |
| var el = getSectionElement(section); |
| - if (el) |
| + if (el) { |
| el.classList.remove('hidden'); |
| + var maxiview = getSectionMaxiview(el); |
| + if (maxiview) |
| + maxiview.classList.remove('hidden'); |
| + } |
| + |
| switch (section) { |
| case Section.THUMB: |
| mostVisited.visible = true; |
| @@ -270,8 +317,13 @@ function hideSection(section) { |
| } |
| var el = getSectionElement(section); |
| - if (el) |
| + if (el) { |
| el.classList.add('hidden'); |
| + |
| + var maxiview = getSectionMaxiview(el); |
| + if (maxiview) |
| + maxiview.classList.add('hidden'); |
| + } |
| } |
| } |
| @@ -340,31 +392,33 @@ function layoutRecentlyClosed() { |
| */ |
| function syncMessageChanged(newMessage) { |
| var syncStatusElement = $('sync-status'); |
| - var style = syncStatusElement.style; |
| // Hide the section if the message is emtpy. |
| if (!newMessage['syncsectionisvisible']) { |
| - style.display = 'none'; |
| + syncStatusElement.classList.add('disabled'); |
| return; |
| } |
| - style.display = 'block'; |
| + |
| + syncStatusElement.classList.remove('disabled'); |
| + |
| + var content = syncStatusElement.children[0]; |
| // Set the sync section background color based on the state. |
| if (newMessage.msgtype == 'error') { |
| - style.backgroundColor = 'tomato'; |
| + content.style.backgroundColor = 'tomato'; |
| } else { |
| - style.backgroundColor = ''; |
| + content.style.backgroundColor = ''; |
| } |
| // Set the text for the header and sync message. |
| - var titleElement = syncStatusElement.firstElementChild; |
| + var titleElement = content.firstElementChild; |
| titleElement.textContent = newMessage.title; |
| var messageElement = titleElement.nextElementSibling; |
| messageElement.textContent = newMessage.msg; |
| // Remove what comes after the message |
| while (messageElement.nextSibling) { |
| - syncStatusElement.removeChild(messageElement.nextSibling); |
| + content.removeChild(messageElement.nextSibling); |
| } |
| if (newMessage.linkisvisible) { |
| @@ -379,9 +433,11 @@ function syncMessageChanged(newMessage) { |
| el.addEventListener('click', syncSectionLinkClicked); |
| } |
| el.textContent = newMessage.linktext; |
| - syncStatusElement.appendChild(el); |
| + content.appendChild(el); |
| fixLinkUnderline(el); |
| } |
| + |
| + layoutSections(); |
| } |
| /** |
| @@ -720,7 +776,7 @@ OptionMenu.prototype = { |
| }; |
| var optionMenu = new OptionMenu( |
| - document.querySelector('#most-visited-section h2 .settings-wrapper'), |
| + document.querySelector('#most-visited h2 .settings-wrapper'), |
| $('option-menu')); |
| optionMenu.commands = { |
| 'clear-all-blacklisted' : function() { |
| @@ -740,7 +796,7 @@ $('main').addEventListener('click', function(e) { |
| } |
| p = p.parentNode; |
| - if (p.hasAttribute('noexpand')) { |
| + if (!getSectionMaxiview(p)) { |
| return; |
| } |
| @@ -1003,8 +1059,8 @@ function fixLinkUnderline(el) { |
| updateAttribution(); |
| var mostVisited = new MostVisited( |
| - $('most-visited'), |
| - document.querySelector('#most-visited-section .miniview'), |
| + $('most-visited-maxiview'), |
| + document.querySelector('#most-visited .miniview'), |
| useSmallGrid(), |
| shownSections & Section.THUMB); |