<!DOCTYPE html> <html i18n-values=" dir:textdirection; bookmarkbarattached:bookmarkbarattached; hasattribution:hasattribution; anim:anim; syncispresent:syncispresent; customlogo:customlogo" install-animation-enabled="true"> <head> <meta charset="utf-8"> <title i18n-content="title"></title> <script src="shared/js/util.js"></script> <script> // Logging info for benchmarking purposes. var log = []; function logEvent(name, shouldLogTime) { if (shouldLogTime) { chrome.send('logEventTime', [name]); } log.push([name, Date.now()]); } logEvent('Tab.NewTabScriptStart', true); /** * Registers a callback function so that if the backend calls it too early it * will get delayed until DOMContentLoaded is fired. * @param {string} name The name of the global function that the backend calls. */ function registerCallback(name) { var f = function(var_args) { var args = Array.prototype.slice.call(arguments); // If we still have the temporary function we delay until the dom is ready. if (global[name] == f) { logEvent(name + ' is not yet ready. Waiting for DOMContentLoaded'); document.addEventListener('DOMContentLoaded', function() { logEvent('Calling the new ' + name); global[name].apply(null, args); }); } }; global[name] = f; } chrome.send('getMostVisited'); chrome.send('getRecentlyClosedTabs'); chrome.send('getForeignSessions'); chrome.send('getApps'); registerCallback('mostVisitedPages'); registerCallback('recentlyClosedTabs'); registerCallback('syncMessageChanged'); registerCallback('getAppsCallback'); registerCallback('setShownSections'); registerCallback('foreignSessions'); registerCallback('bookmarkBarDetached'); registerCallback('bookmarkBarAttached'); </script> <!-- template data placeholder --> <link rel="stylesheet" href="new_new_tab.css"> <link rel="stylesheet" href="ntp/most_visited.css"> <link rel="stylesheet" href="ntp/apps.css"> <link rel="stylesheet" href="shared/css/menu.css"> <script> /** * Bitmask for the different UI sections. * This matches the Section enum in ../webui/shown_sections_handler.h * @enum {number} */ var Section = { THUMB: 1 << 0, APPS: 1 << 6 }; // These are used to put sections into menu mode and are part of the // |shownSections| bitmask, but are not sections themselves. var MENU_THUMB = 1 << (0 + 16); var MENU_RECENT = 1 << (2 + 16); var MENU_APPS = 1 << (6 + 16); // TODO(aa): This state is duplicated. We keep this variable up to date, but we // also have the same information in the DOM. We can probably just have the DOM // be the truth and translate to and from the bitmask when needed. var shownSections = templateData['shown_sections']; // Until themes can clear the cache, force-reload the theme stylesheet. document.write('<link id="themecss" rel="stylesheet" ' + 'href="chrome://theme/css/newtab.css?' + Date.now() + '">'); function useSmallGrid() { return window.innerWidth <= 940; } function isRtl() { return templateData['textdirection'] == 'rtl'; } // Parse any name value pairs passed through the URL hash. var hashParams = (function() { var result = {}; if (location.hash.length) { location.hash.substr(1).split('&').forEach(function(pair) { pair = pair.split('='); if (pair.length != 2) { throw new Error('Unexpected hash value: ' + location.hash); } result[pair[0]] = pair[1]; }); } return result; })(); // Reflect the mode param as an attribute so we can use CSS attribute selectors // on it. if ('mode' in hashParams) { document.documentElement.setAttribute('mode', hashParams['mode']); } </script> </head> <body class="loading" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize"> <div id="attribution" class="attribution nolayout"> <div i18n-content="attributionintro"></div> <img id="attribution-img"> </div> <div id="main"> <div id="notification-container"> <div id="notification"> <div> </div> <div class="link"><div class="link-color" id="action-link"></div></div> <button id="notification-close"></button> </div> </div> <div id="login-container"> <span id="login-username"></span> </div> <div class="maxiview" id="apps-maxiview"> <div id="apps-promo"> <p id="apps-promo-heading"></p> <a class="g-button-basic" id="apps-promo-link" href=""></a><br> <button id="apps-promo-hide"></button> </div> <div id="apps-content"></div> </div> <div class="maxiview" id="most-visited-maxiview"></div> <div class="sections"> <!-- Start disabled. We only enable once we have installed default apps. --> <div id="apps" class="section disabled" section="APPS"> <h2> <img class="disclosure" img src="ntp/ntp_disclosure_triangle.png"> <div class="back"></div> <span i18n-content="apps"></span> <button class="section-close-button"></button> </h2> <div class="miniview"></div> </div> <div id="most-visited" class="section" section="THUMB"> <h2> <img class="disclosure" src="ntp/ntp_disclosure_triangle.png"> <div class="back"></div> <span i18n-content="mostvisited"></span> <button id="most-visited-settings" i18n-content="restorethumbnails"> </button> <button class="section-close-button"></button> </h2> <div class="miniview"></div> </div> <!-- Start this section disabled because it might not have data, and looks silly without any. --> <div id="recently-closed" class="section collapsed disabled" section="RECENT" noexpand="true"> <h2> <div class="back"></div> <span i18n-content="recentlyclosed"></span> <button class="section-close-button"></button> </h2> <div class="miniview"></div> </div> <!-- Start disabled until sync is enabled and foreign sessions are available. --> <div id="foreign-sessions" class="section collapsed disabled" section="SYNC"> <h2> <div class="back"></div> <span i18n-content="foreignsessions"></span> </h2> <div class="miniview"></div> </div> <div id="sync-status" class="section disabled"> <div> <h3></h3> <span></span> </div> </div> </div> <div id="closed-sections-bar"> <!-- The default visibility of these buttons needs to be the opposite of the default visibility of the corresponding sections. --> <button id="apps-button" menu="#apps-menu"> <span i18n-content="apps"></span> <img src="ntp/ntp_disclosure_triangle.png"> </button> <button id="most-visited-button" menu="#most-visited-menu"> <span i18n-content="mostvisited"></span> <img src="ntp/ntp_disclosure_triangle.png"> </button> <button id="recently-closed-button" menu="#recently-closed-menu"> <span i18n-content="recentlyclosed"></span> <img src="ntp/ntp_disclosure_triangle.png"> </button> </div> </div> <!-- main --> <div class="window-menu" id="window-tooltip"></div> <command id="clear-all-blacklisted" i18n-values=".label:restorethumbnails"> <command id="apps-launch-command"> <command id="apps-options-command" i18n-values=".label:appoptions"> <command id="apps-uninstall-command" i18n-values=".label:appuninstall"> <command id="apps-create-shortcut-command" i18n-values=".label:appcreateshortcut"> <command id="apps-launch-type-pinned" i18n-values=".label:applaunchtypepinned" launch-type="0"> <command id="apps-launch-type-regular" i18n-values=".label:applaunchtyperegular" launch-type="1"> <command id="apps-launch-type-window" i18n-values=".label:applaunchtypewindow" launch-type="3"> <command id="apps-launch-type-fullscreen" i18n-values=".label:applaunchtypefullscreen" launch-type="2"> <!-- These are populated dynamically --> <menu id="apps-menu"></menu> <menu id="most-visited-menu"></menu> <menu id="recently-closed-menu"></menu> <menu id="app-context-menu"> <button class="default" command="#apps-launch-command"></button> <hr> <button command="#apps-launch-type-regular" launch-type="1"></button> <button command="#apps-launch-type-pinned" launch-type="0"></button> <button id="apps-launch-type-window-menu-item" command="#apps-launch-type-window" launch-type="3"></button> <button command="#apps-launch-type-fullscreen" launch-type="2"></button> <hr> <button command="#apps-options-command"></button> <button command="#apps-uninstall-command"></button> <hr id="apps-create-shortcut-command-separator"> <button id="apps-create-shortcut-command-menu-item" command="#apps-create-shortcut-command"></button> </menu> </body> <script src="shared/js/i18n_template.js"></script> <script> i18nTemplate.process(document, templateData); </script> <script src="shared/js/local_strings.js"></script> <script src="shared/js/parse_html_subset.js"></script> <script src="shared/js/cr.js"></script> <script src="shared/js/event_tracker.js"></script> <script src="shared/js/cr/ui.js"></script> <script src="shared/js/cr/ui/command.js"></script> <script src="shared/js/cr/ui/menu_item.js"></script> <script src="shared/js/cr/ui/menu.js"></script> <script src="shared/js/cr/ui/position_util.js"></script> <script src="shared/js/cr/ui/menu_button.js"></script> <script src="shared/js/cr/ui/context_menu_button.js"></script> <script src="shared/js/cr/ui/context_menu_handler.js"></script> <script src="ntp/drag_drop_controller.js"></script> <script src="ntp/most_visited.js"></script> <script src="new_new_tab.js"></script> <script src="ntp/apps.js"></script> <script> cr.ui.decorate('menu', cr.ui.Menu); cr.ui.decorate('command', cr.ui.Command); cr.ui.decorate('button[menu]', cr.ui.MenuButton); if (cr.isChromeOS) $('closed-sections-bar').setAttribute('chromeos', true); initializeLogin(); initializeSection('apps', MENU_APPS, Section.APPS); initializeSection('most-visited', MENU_THUMB, Section.THUMB); initializeSection('recently-closed', MENU_RECENT); updateSimpleSection('apps', Section.APPS); updateSimpleSection('most-visited', Section.THUMB); var appsInitiallyMenu = shownSections & MENU_APPS; var mostVisitedInitiallyMenu = shownSections & MENU_THUMB; var recentlyClosedInitiallyMenu = shownSections & MENU_RECENT; setSectionMenuMode('apps', Section.APPS, appsInitiallyMenu, MENU_APPS); setSectionMenuMode('most-visited', Section.THUMB, mostVisitedInitiallyMenu, MENU_THUMB); setSectionMenuMode('recently-closed', undefined, recentlyClosedInitiallyMenu, MENU_RECENT); layoutSections(); </script> </html>