| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 <html i18n-values=" | |
| 3 dir:textdirection; | |
| 4 bookmarkbarattached:bookmarkbarattached; | |
| 5 hasattribution:hasattribution; | |
| 6 anim:anim; | |
| 7 syncispresent:syncispresent; | |
| 8 customlogo:customlogo" | |
| 9 install-animation-enabled="true"> | |
| 10 <head> | |
| 11 <meta charset="utf-8"> | |
| 12 <title i18n-content="title"></title> | |
| 13 <script src="shared/js/util.js"></script> | |
| 14 <script> | |
| 15 // Logging info for benchmarking purposes. | |
| 16 var log = []; | |
| 17 function logEvent(name, shouldLogTime) { | |
| 18 if (shouldLogTime) { | |
| 19 chrome.send('metricsHandler:logEventTime', [name]); | |
| 20 } | |
| 21 log.push([name, Date.now()]); | |
| 22 } | |
| 23 logEvent('Tab.NewTabScriptStart', true); | |
| 24 | |
| 25 /** | |
| 26 * Registers a callback function so that if the backend calls it too early it | |
| 27 * will get delayed until DOMContentLoaded is fired. | |
| 28 * @param {string} name The name of the global function that the backend calls. | |
| 29 */ | |
| 30 function registerCallback(name) { | |
| 31 var f = function(var_args) { | |
| 32 var args = Array.prototype.slice.call(arguments); | |
| 33 // If we still have the temporary function we delay until the dom is ready. | |
| 34 if (global[name] == f) { | |
| 35 logEvent(name + ' is not yet ready. Waiting for DOMContentLoaded'); | |
| 36 document.addEventListener('DOMContentLoaded', function() { | |
| 37 logEvent('Calling the new ' + name); | |
| 38 global[name].apply(null, args); | |
| 39 }); | |
| 40 } | |
| 41 }; | |
| 42 global[name] = f; | |
| 43 } | |
| 44 | |
| 45 registerCallback('setMostVisitedPages'); | |
| 46 registerCallback('recentlyClosedTabs'); | |
| 47 registerCallback('syncMessageChanged'); | |
| 48 registerCallback('getAppsCallback'); | |
| 49 registerCallback('setShownSections'); | |
| 50 registerCallback('foreignSessions'); | |
| 51 registerCallback('bookmarkBarDetached'); | |
| 52 registerCallback('bookmarkBarAttached'); | |
| 53 | |
| 54 chrome.send('getMostVisited'); | |
| 55 chrome.send('getRecentlyClosedTabs'); | |
| 56 chrome.send('getForeignSessions'); | |
| 57 chrome.send('getApps'); | |
| 58 | |
| 59 </script> | |
| 60 <!-- template data placeholder --> | |
| 61 <link rel="stylesheet" href="new_tab.css"> | |
| 62 <link rel="stylesheet" href="ntp/most_visited.css"> | |
| 63 <link rel="stylesheet" href="ntp/apps.css"> | |
| 64 <link rel="stylesheet" href="shared/css/menu.css"> | |
| 65 <link rel="stylesheet" href="chrome://resources/css/throbber.css"> | |
| 66 <script> | |
| 67 | |
| 68 /** | |
| 69 * Bitmask for the different UI sections. | |
| 70 * This matches the Section enum in ../webui/shown_sections_handler.h | |
| 71 * @enum {number} | |
| 72 */ | |
| 73 var Section = { | |
| 74 THUMB: 1 << 0, | |
| 75 APPS: 1 << 6 | |
| 76 }; | |
| 77 | |
| 78 // These are used to put sections into menu mode and are part of the | |
| 79 // |shownSections| bitmask, but are not sections themselves. | |
| 80 var MENU_THUMB = 1 << (0 + 16); | |
| 81 var MENU_RECENT = 1 << (2 + 16); | |
| 82 var MENU_APPS = 1 << (6 + 16); | |
| 83 | |
| 84 // TODO(aa): This state is duplicated. We keep this variable up to date, but we | |
| 85 // also have the same information in the DOM. We can probably just have the DOM | |
| 86 // be the truth and translate to and from the bitmask when needed. | |
| 87 var shownSections = templateData['shown_sections']; | |
| 88 | |
| 89 // Until themes can clear the cache, force-reload the theme stylesheet. | |
| 90 document.write('<link id="themecss" rel="stylesheet" ' + | |
| 91 'href="chrome://theme/css/newtab.css?' + | |
| 92 Date.now() + '">'); | |
| 93 | |
| 94 function useSmallGrid() { | |
| 95 return window.innerWidth <= 940; | |
| 96 } | |
| 97 | |
| 98 function isRtl() { | |
| 99 return templateData['textdirection'] == 'rtl'; | |
| 100 } | |
| 101 | |
| 102 // Parse any name value pairs passed through the URL hash. | |
| 103 var hashParams = (function() { | |
| 104 var result = {}; | |
| 105 if (location.hash.length) { | |
| 106 location.hash.substr(1).split('&').forEach(function(pair) { | |
| 107 pair = pair.split('='); | |
| 108 if (pair.length != 2) { | |
| 109 throw new Error('Unexpected hash value: ' + location.hash); | |
| 110 } | |
| 111 | |
| 112 result[pair[0]] = pair[1]; | |
| 113 }); | |
| 114 } | |
| 115 return result; | |
| 116 })(); | |
| 117 | |
| 118 // Reflect the mode param as an attribute so we can use CSS attribute selectors | |
| 119 // on it. | |
| 120 if ('mode' in hashParams) { | |
| 121 document.documentElement.setAttribute('mode', hashParams['mode']); | |
| 122 } | |
| 123 | |
| 124 </script> | |
| 125 </head> | |
| 126 <body class="loading" | |
| 127 i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize"> | |
| 128 | |
| 129 <div id="attribution" class="attribution nolayout"> | |
| 130 <div i18n-content="attributionintro"></div> | |
| 131 <img id="attribution-img"> | |
| 132 </div> | |
| 133 | |
| 134 <div id="main"> | |
| 135 | |
| 136 <div id="notification-container"> | |
| 137 <div id="notification"> | |
| 138 <div> </div> | |
| 139 <div class="link"><div class="link-color" id="action-link"></div></div> | |
| 140 <button id="notification-close"><div></div></button> | |
| 141 </div> | |
| 142 </div> | |
| 143 | |
| 144 <div id="login-container"> | |
| 145 <span id="login-username"></span> | |
| 146 </div> | |
| 147 | |
| 148 <div class="maxiview" id="apps-maxiview"> | |
| 149 <div id="apps-promo"> | |
| 150 <p id="apps-promo-heading"></p> | |
| 151 <a class="g-button-basic" id="apps-promo-link" href=""></a><br> | |
| 152 <button id="apps-promo-hide"></button> | |
| 153 </div> | |
| 154 <div id="apps-content"></div> | |
| 155 <div id="app-notification-bubble" class="notification-bubble"> | |
| 156 <img id="app-notification-close" src="chrome://theme/IDR_CLOSE_BAR"> | |
| 157 <strong id="app-notification-title"></strong><br> | |
| 158 <span id="app-notification-message"></span><br><br> | |
| 159 <a id="app-notification-link"></a> | |
| 160 </div> | |
| 161 <div id="arrow-container" class="notification-bubble-closed"> | |
| 162 <div id="arrow-contents" class="arrow"></div> | |
| 163 <div id="arrow-border" class="arrow"></div> | |
| 164 <div id="arrow-shadow" class="arrow"></div> | |
| 165 </div> | |
| 166 </div> | |
| 167 <div class="maxiview" id="most-visited-maxiview"></div> | |
| 168 | |
| 169 <div class="sections"> | |
| 170 <!-- Start disabled. We only enable once we have installed default apps. --> | |
| 171 <div id="apps" class="section disabled" section="APPS"> | |
| 172 <h2> | |
| 173 <img class="disclosure" img src="ntp/ntp_disclosure_triangle.png"> | |
| 174 <div class="back"></div> | |
| 175 <span i18n-content="apps"></span> | |
| 176 <button class="section-close-button"></button> | |
| 177 </h2> | |
| 178 <div class="miniview"></div> | |
| 179 </div> | |
| 180 | |
| 181 <div id="most-visited" class="section" section="THUMB"> | |
| 182 <h2> | |
| 183 <img class="disclosure" src="ntp/ntp_disclosure_triangle.png"> | |
| 184 <div class="back"></div> | |
| 185 <span i18n-content="mostvisited"></span> | |
| 186 <button id="most-visited-settings" i18n-content="restorethumbnails"> | |
| 187 </button> | |
| 188 <button class="section-close-button"></button> | |
| 189 </h2> | |
| 190 <div class="miniview"></div> | |
| 191 </div> | |
| 192 | |
| 193 <!-- Start this section disabled because it might not have data, and looks | |
| 194 silly without any. --> | |
| 195 <div id="recently-closed" class="section collapsed disabled" | |
| 196 section="RECENT" noexpand="true"> | |
| 197 <h2> | |
| 198 <div class="back"></div> | |
| 199 <span i18n-content="recentlyclosed"></span> | |
| 200 <button class="section-close-button"></button> | |
| 201 </h2> | |
| 202 <div class="miniview"></div> | |
| 203 </div> | |
| 204 | |
| 205 <!-- Start disabled until sync is enabled and foreign sessions are | |
| 206 available. --> | |
| 207 <div id="foreign-sessions" class="section collapsed disabled" | |
| 208 section="SYNC"> | |
| 209 <h2> | |
| 210 <div class="back"></div> | |
| 211 <span i18n-content="foreignsessions"></span> | |
| 212 </h2> | |
| 213 <div class="miniview"></div> | |
| 214 </div> | |
| 215 | |
| 216 <div id="sync-status" class="section disabled"> | |
| 217 <div> | |
| 218 <h3></h3> | |
| 219 <span></span> | |
| 220 </div> | |
| 221 </div> | |
| 222 </div> | |
| 223 | |
| 224 <div id="closed-sections-bar"> | |
| 225 <!-- The default visibility of these buttons needs to be the opposite of the | |
| 226 default visibility of the corresponding sections. --> | |
| 227 <button id="apps-button" | |
| 228 menu="#apps-menu"> | |
| 229 <span i18n-content="apps"></span> | |
| 230 <img src="ntp/ntp_disclosure_triangle.png"> | |
| 231 </button> | |
| 232 <button id="most-visited-button" | |
| 233 menu="#most-visited-menu"> | |
| 234 <span i18n-content="mostvisited"></span> | |
| 235 <img src="ntp/ntp_disclosure_triangle.png"> | |
| 236 </button> | |
| 237 <button id="recently-closed-button" | |
| 238 menu="#recently-closed-menu"> | |
| 239 <span i18n-content="recentlyclosed"></span> | |
| 240 <img src="ntp/ntp_disclosure_triangle.png"> | |
| 241 </button> | |
| 242 </div> | |
| 243 </div> <!-- main --> | |
| 244 | |
| 245 <div class="window-menu" id="window-tooltip"></div> | |
| 246 | |
| 247 <command id="clear-all-blacklisted" i18n-values=".label:restorethumbnails"> | |
| 248 <command id="apps-launch-command"> | |
| 249 <command id="apps-options-command" i18n-values=".label:appoptions"> | |
| 250 <command id="apps-uninstall-command" i18n-values=".label:appuninstall"> | |
| 251 <command id="apps-create-shortcut-command" | |
| 252 i18n-values=".label:appcreateshortcut"> | |
| 253 <command id="apps-launch-type-pinned" i18n-values=".label:applaunchtypepinned" | |
| 254 launch-type="0"> | |
| 255 <command id="apps-launch-type-regular" i18n-values=".label:applaunchtyperegular" | |
| 256 launch-type="1"> | |
| 257 <command id="apps-launch-type-window" | |
| 258 i18n-values=".label:applaunchtypewindow" launch-type="3"> | |
| 259 <command id="apps-launch-type-fullscreen" | |
| 260 i18n-values=".label:applaunchtypefullscreen" launch-type="2"> | |
| 261 | |
| 262 <!-- These are populated dynamically --> | |
| 263 <menu id="apps-menu"></menu> | |
| 264 <menu id="most-visited-menu"></menu> | |
| 265 <menu id="recently-closed-menu"></menu> | |
| 266 | |
| 267 <menu id="app-context-menu"> | |
| 268 <button class="default" command="#apps-launch-command"></button> | |
| 269 <hr> | |
| 270 <button command="#apps-launch-type-regular" launch-type="1"></button> | |
| 271 <button command="#apps-launch-type-pinned" launch-type="0"></button> | |
| 272 <button id="apps-launch-type-window-menu-item" | |
| 273 command="#apps-launch-type-window" launch-type="3"></button> | |
| 274 <button command="#apps-launch-type-fullscreen" launch-type="2"></button> | |
| 275 <hr> | |
| 276 <button command="#apps-options-command"></button> | |
| 277 <button command="#apps-uninstall-command"></button> | |
| 278 <hr id="apps-create-shortcut-command-separator"> | |
| 279 <button id="apps-create-shortcut-command-menu-item" | |
| 280 command="#apps-create-shortcut-command"></button> | |
| 281 </menu> | |
| 282 | |
| 283 </body> | |
| 284 | |
| 285 <script src="shared/js/i18n_template.js"></script> | |
| 286 <script> | |
| 287 i18nTemplate.process(document, templateData); | |
| 288 </script> | |
| 289 <script src="shared/js/local_strings.js"></script> | |
| 290 <script src="shared/js/parse_html_subset.js"></script> | |
| 291 | |
| 292 <script src="shared/js/cr.js"></script> | |
| 293 <script src="shared/js/event_tracker.js"></script> | |
| 294 <script src="shared/js/cr/ui.js"></script> | |
| 295 <script src="shared/js/cr/ui/command.js"></script> | |
| 296 <script src="shared/js/cr/ui/menu_item.js"></script> | |
| 297 <script src="shared/js/cr/ui/menu.js"></script> | |
| 298 <script src="shared/js/cr/ui/position_util.js"></script> | |
| 299 <script src="shared/js/cr/ui/menu_button.js"></script> | |
| 300 <script src="shared/js/cr/ui/context_menu_button.js"></script> | |
| 301 <script src="shared/js/cr/ui/context_menu_handler.js"></script> | |
| 302 | |
| 303 <script src="ntp/drag_drop_controller.js"></script> | |
| 304 <script src="ntp/most_visited.js"></script> | |
| 305 <script src="new_tab.js"></script> | |
| 306 <script src="ntp/apps.js"></script> | |
| 307 | |
| 308 <script src="chrome://resources/js/cr/event_target.js"></script> | |
| 309 | |
| 310 <script> | |
| 311 cr.ui.decorate('menu', cr.ui.Menu); | |
| 312 cr.ui.decorate('command', cr.ui.Command); | |
| 313 cr.ui.decorate('button[menu]', cr.ui.MenuButton); | |
| 314 | |
| 315 if (cr.isChromeOS) | |
| 316 $('closed-sections-bar').setAttribute('chromeos', true); | |
| 317 | |
| 318 initializeLogin(); | |
| 319 | |
| 320 initializeSection('apps', MENU_APPS, Section.APPS); | |
| 321 initializeSection('most-visited', MENU_THUMB, Section.THUMB); | |
| 322 initializeSection('recently-closed', MENU_RECENT); | |
| 323 | |
| 324 updateSimpleSection('apps', Section.APPS); | |
| 325 updateSimpleSection('most-visited', Section.THUMB); | |
| 326 var appsInitiallyMenu = shownSections & MENU_APPS; | |
| 327 var mostVisitedInitiallyMenu = shownSections & MENU_THUMB; | |
| 328 var recentlyClosedInitiallyMenu = shownSections & MENU_RECENT; | |
| 329 setSectionMenuMode('apps', Section.APPS, appsInitiallyMenu, MENU_APPS); | |
| 330 setSectionMenuMode('most-visited', Section.THUMB, mostVisitedInitiallyMenu, | |
| 331 MENU_THUMB); | |
| 332 setSectionMenuMode('recently-closed', undefined, recentlyClosedInitiallyMenu, | |
| 333 MENU_RECENT); | |
| 334 | |
| 335 layoutSections(); | |
| 336 </script> | |
| 337 </html> | |
| OLD | NEW |