summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/new_new_tab.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/resources/new_new_tab.js')
-rw-r--r--chrome/browser/resources/new_new_tab.js127
1 files changed, 91 insertions, 36 deletions
diff --git a/chrome/browser/resources/new_new_tab.js b/chrome/browser/resources/new_new_tab.js
index a5e7b76..2637b44 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,58 @@ 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) + ')';
+
+ 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(', ') + ')';
+ maxiview.style.WebkitMaskImage = gradient;
+}
+
+function getColorStopString(height, color) {
+ return "color-stop(" + height + ", " + color + ")";
+}
+
window.addEventListener('resize', handleWindowResize);
var sectionToElementMap;
@@ -242,13 +279,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 +316,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 +391,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 +432,11 @@ function syncMessageChanged(newMessage) {
el.addEventListener('click', syncSectionLinkClicked);
}
el.textContent = newMessage.linktext;
- syncStatusElement.appendChild(el);
+ content.appendChild(el);
fixLinkUnderline(el);
}
+
+ layoutSections();
}
/**
@@ -720,7 +775,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 +795,7 @@ $('main').addEventListener('click', function(e) {
}
p = p.parentNode;
- if (p.hasAttribute('noexpand')) {
+ if (!getSectionMaxiview(p)) {
return;
}
@@ -1003,8 +1058,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);