| 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 c201dda05bb3340e319f85152aa2aa12bc320b43..b7e292accaabe82acb0f1b501a652d6a1f1ce26e 100644
|
| --- a/chrome/browser/resources/new_new_tab.js
|
| +++ b/chrome/browser/resources/new_new_tab.js
|
| @@ -9,6 +9,95 @@ var MAX_MINIVIEW_ITEMS = 15;
|
| // Extra spacing at the top of the layout.
|
| var LAYOUT_SPACING_TOP = 25;
|
|
|
| +function getSectionCloseButton(sectionId) {
|
| + return document.querySelector('#' + sectionId + ' .section-close-button');
|
| +}
|
| +
|
| +function getSectionMenuButton(sectionId) {
|
| + return $(sectionId + '-button');
|
| +}
|
| +
|
| +function getSectionMenuButtonTextId(sectionId) {
|
| + return sectionId.replace(/-/g, '');
|
| +}
|
| +
|
| +function setSectionVisible(sectionId, section, visible, hideMask) {
|
| + if (visible && !(shownSections & hideMask) ||
|
| + !visible && (shownSections & hideMask))
|
| + return;
|
| +
|
| + if (visible) {
|
| + // Because sections are collapsed when they are minimized, it is not
|
| + // necessary to restore the maxiview here. It will happen if the section
|
| + // header is clicked.
|
| + var el = $(sectionId);
|
| + el.classList.remove('disabled');
|
| + el = getSectionMenuButton(sectionId);
|
| + el.classList.add('disabled');
|
| + shownSections &= ~hideMask;
|
| + } else {
|
| + if (section) {
|
| + hideSection(section); // To hide the maxiview.
|
| + }
|
| + var el = $(sectionId);
|
| + el.classList.add('disabled');
|
| + el = getSectionMenuButton(sectionId);
|
| + el.classList.remove('disabled');
|
| + shownSections |= hideMask;
|
| + }
|
| + layoutSections();
|
| +}
|
| +
|
| +function clearClosedMenu(menu) {
|
| + menu.innerHTML = '';
|
| +}
|
| +
|
| +function addClosedMenuEntryWithLink(menu, a) {
|
| + var span = document.createElement('span');
|
| + a.className += ' item menuitem';
|
| + span.appendChild(a);
|
| + menu.appendChild(span);
|
| +}
|
| +
|
| +function addClosedMenuEntry(menu, url, title, imageUrl) {
|
| + var a = document.createElement('a');
|
| + a.href = url;
|
| + a.textContent = title;
|
| + a.style.backgroundImage = 'url(' + imageUrl + ')';
|
| + addClosedMenuEntryWithLink(menu, a);
|
| +}
|
| +
|
| +function addClosedMenuFooter(menu, sectionId, mask, opt_section) {
|
| + menu.appendChild(document.createElement('hr'));
|
| +
|
| + var span = document.createElement('span');
|
| + var a = span.appendChild(document.createElement('a'));
|
| + a.href = '';
|
| + a.textContent =
|
| + localStrings.getString(getSectionMenuButtonTextId(sectionId));
|
| + a.className = 'item';
|
| + a.addEventListener(
|
| + 'click',
|
| + function(e) {
|
| + getSectionMenuButton(sectionId).hideMenu();
|
| + e.preventDefault();
|
| + setSectionVisible(sectionId, opt_section, true, mask);
|
| + shownSections &= ~mask;
|
| + saveShownSections();
|
| + });
|
| + menu.appendChild(span);
|
| +}
|
| +
|
| +function initializeSection(sectionId, mask, opt_section) {
|
| + var button = getSectionCloseButton(sectionId);
|
| + button.addEventListener(
|
| + 'click',
|
| + function() {
|
| + setSectionVisible(sectionId, opt_section, false, mask);
|
| + saveShownSections();
|
| + });
|
| +}
|
| +
|
| function updateSimpleSection(id, section) {
|
| var elm = $(id);
|
| var maxiview = getSectionMaxiview(elm);
|
| @@ -38,10 +127,14 @@ function renderRecentlyClosed() {
|
| var recentElement = $('recently-closed');
|
| var parentEl = recentElement.lastElementChild;
|
| parentEl.textContent = '';
|
| + var recentMenu = $('recently-closed-menu');
|
| + clearClosedMenu(recentMenu);
|
|
|
| recentItems.forEach(function(item) {
|
| parentEl.appendChild(createRecentItem(item));
|
| + addRecentMenuItem(recentMenu, item);
|
| });
|
| + addClosedMenuFooter(recentMenu, 'recently-closed', MINIMIZED_RECENT);
|
|
|
| layoutRecentlyClosed();
|
| }
|
| @@ -70,6 +163,26 @@ function createRecentItem(data) {
|
| return wrapperEl;
|
| }
|
|
|
| +function addRecentMenuItem(menu, data) {
|
| + var isWindow = data.type == 'window';
|
| + var a = document.createElement('a');
|
| + if (isWindow) {
|
| + a.textContent = formatTabsText(data.tabs.length);
|
| + a.className = 'window'; // To get the icon from the CSS .window rule.
|
| + a.href = ''; // To make underline show up.
|
| + } else {
|
| + a.href = data.url;
|
| + a.style.backgroundImage = 'url(chrome://favicon/' + data.url + ')';
|
| + a.textContent = data.title;
|
| + }
|
| + function clickHandler(e) {
|
| + chrome.send('reopenTab', [String(data.sessionId)]);
|
| + e.preventDefault();
|
| + }
|
| + a.addEventListener('click', clickHandler);
|
| + addClosedMenuEntryWithLink(menu, a);
|
| +}
|
| +
|
| function saveShownSections() {
|
| chrome.send('setShownSections', [String(shownSections)]);
|
| }
|
| @@ -202,6 +315,9 @@ function layoutSections() {
|
| for (; section = sections[i]; i++) {
|
| footerHeight += section.fixedHeight;
|
| }
|
| + // Leave room for bottom bar if it's visible.
|
| + footerHeight += $('closed-sections-bar').offsetHeight;
|
| +
|
|
|
| // Determine the height to use for the expanded section. If there isn't enough
|
| // space to show the expanded section completely, this will be the available
|
| @@ -305,6 +421,7 @@ function getSectionMaxiview(section) {
|
| return $(section.id + '-maxiview');
|
| }
|
|
|
| +// You usually want to call |showOnlySection()| instead of this.
|
| function showSection(section) {
|
| if (!(section & shownSections)) {
|
| shownSections |= section;
|
| @@ -328,6 +445,17 @@ function showSection(section) {
|
| }
|
| }
|
|
|
| +// Show this section and hide all other sections - at most one section can
|
| +// be open at one time.
|
| +function showOnlySection(section) {
|
| + for (var p in Section) {
|
| + if (p == section)
|
| + showSection(Section[p]);
|
| + else
|
| + hideSection(Section[p]);
|
| + }
|
| +}
|
| +
|
| function hideSection(section) {
|
| if (section & shownSections) {
|
| shownSections &= ~section;
|
| @@ -374,6 +502,15 @@ function setShownSections(newShownSections) {
|
| else
|
| hideSection(Section[key]);
|
| }
|
| + setSectionVisible(
|
| + 'apps', Section.APPS,
|
| + !(newShownSections & MINIMIZED_APPS), MINIMIZED_APPS);
|
| + setSectionVisible(
|
| + 'most-visited', Section.THUMB,
|
| + !(newShownSections & MINIMIZED_THUMB), MINIMIZED_THUMB);
|
| + setSectionVisible(
|
| + 'recently-closed', undefined,
|
| + !(newShownSections & MINIMIZED_RECENT), MINIMIZED_RECENT);
|
| layoutSections();
|
| }
|
|
|
| @@ -386,7 +523,9 @@ function layoutRecentlyClosed() {
|
| updateMiniviewClipping(miniview);
|
|
|
| if (miniview.hasChildNodes()) {
|
| - recentElement.classList.remove('disabled');
|
| + if (!(shownSections & MINIMIZED_RECENT)) {
|
| + recentElement.classList.remove('disabled');
|
| + }
|
| } else {
|
| recentElement.classList.add('disabled');
|
| }
|
| @@ -685,12 +824,7 @@ function toggleSectionVisibilityAndAnimate(section) {
|
| if (shownSections & Section[section]) {
|
| hideSection(Section[section]);
|
| } else {
|
| - for (var p in Section) {
|
| - if (p == section)
|
| - showSection(Section[p]);
|
| - else
|
| - hideSection(Section[p]);
|
| - }
|
| + showOnlySection(section);
|
| }
|
| layoutSections();
|
| saveShownSections();
|
| @@ -928,6 +1062,7 @@ updateAttribution();
|
| var mostVisited = new MostVisited(
|
| $('most-visited-maxiview'),
|
| document.querySelector('#most-visited .miniview'),
|
| + $('most-visited-menu'),
|
| useSmallGrid(),
|
| shownSections & Section.THUMB);
|
|
|
|
|