OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview New tab page | 6 * @fileoverview New tab page |
7 * This is the main code for the new tab page. NewTabView manages page list, | 7 * This is the main code for the new tab page. NewTabView manages page list, |
8 * dot list and handles apps pages callbacks from backend. It also handles | 8 * dot list and handles apps pages callbacks from backend. It also handles |
9 * the layout of the Bottom Panel and the global UI states of the New Tab Page. | 9 * the layout of the Bottom Panel and the global UI states of the New Tab Page. |
10 */ | 10 */ |
(...skipping 19 matching lines...) Expand all Loading... |
30 * @type {number} | 30 * @type {number} |
31 * @const | 31 * @const |
32 */ | 32 */ |
33 var BOTTOM_PANEL_HORIZONTAL_MARGIN = 100; | 33 var BOTTOM_PANEL_HORIZONTAL_MARGIN = 100; |
34 | 34 |
35 /** | 35 /** |
36 * The height required to show the Bottom Panel. | 36 * The height required to show the Bottom Panel. |
37 * @type {number} | 37 * @type {number} |
38 * @const | 38 * @const |
39 */ | 39 */ |
40 var HEIGHT_FOR_BOTTOM_PANEL = 550; | 40 var HEIGHT_FOR_BOTTOM_PANEL = 558; |
41 | 41 |
42 /** | 42 /** |
43 * The Bottom Panel width required to show 6 cols of Tiles, which is used | 43 * The Bottom Panel width required to show 6 cols of Tiles, which is used |
44 * in the width computation. | 44 * in the width computation. |
45 * @type {number} | 45 * @type {number} |
46 * @const | 46 * @const |
47 */ | 47 */ |
48 var MAX_BOTTOM_PANEL_WIDTH = 920; | 48 var MAX_BOTTOM_PANEL_WIDTH = 920; |
49 | 49 |
50 /** | 50 /** |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 */ | 151 */ |
152 pageList: undefined, | 152 pageList: undefined, |
153 | 153 |
154 /** | 154 /** |
155 * A list of all 'tile-page' elements. | 155 * A list of all 'tile-page' elements. |
156 * @type {!NodeList|undefined} | 156 * @type {!NodeList|undefined} |
157 */ | 157 */ |
158 tilePages: undefined, | 158 tilePages: undefined, |
159 | 159 |
160 /** | 160 /** |
161 * The Apps page. | 161 * A list of all 'apps-page' elements. |
162 * @type {!Element|undefined} | 162 * @type {!NodeList|undefined} |
163 */ | 163 */ |
164 appsPage: undefined, | 164 appsPages: undefined, |
165 | 165 |
166 /** | 166 /** |
167 * The Most Visited page. | 167 * The Most Visited page. |
168 * @type {!Element|undefined} | 168 * @type {!Element|undefined} |
169 */ | 169 */ |
170 mostVisitedPage: undefined, | 170 mostVisitedPage: undefined, |
171 | 171 |
172 /** | 172 /** |
173 * The Recently Closed page. | 173 * The Recently Closed page. |
174 * @type {!Element|undefined} | 174 * @type {!Element|undefined} |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 this.dotList = dotList; | 222 this.dotList = dotList; |
223 cr.ui.decorate(this.dotList, ntp.DotList); | 223 cr.ui.decorate(this.dotList, ntp.DotList); |
224 | 224 |
225 this.shownPage = loadTimeData.getInteger('shown_page_type'); | 225 this.shownPage = loadTimeData.getInteger('shown_page_type'); |
226 this.shownPageIndex = loadTimeData.getInteger('shown_page_index'); | 226 this.shownPageIndex = loadTimeData.getInteger('shown_page_index'); |
227 | 227 |
228 if (loadTimeData.getBoolean('showApps')) { | 228 if (loadTimeData.getBoolean('showApps')) { |
229 // Request data on the apps so we can fill them in. | 229 // Request data on the apps so we can fill them in. |
230 // Note that this is kicked off asynchronously. 'getAppsCallback' will | 230 // Note that this is kicked off asynchronously. 'getAppsCallback' will |
231 // be invoked at some point after this function returns. | 231 // be invoked at some point after this function returns. |
232 chrome.send('getApps'); | 232 if (!ntp.ntp5) |
| 233 chrome.send('getApps'); |
233 } else if (this.shownPage == loadTimeData.getInteger('apps_page_id')) { | 234 } else if (this.shownPage == loadTimeData.getInteger('apps_page_id')) { |
234 // No apps page. | 235 // No apps page. |
235 this.setShownPage_( | 236 this.setShownPage_( |
236 loadTimeData.getInteger('most_visited_page_id'), 0); | 237 loadTimeData.getInteger('most_visited_page_id'), 0); |
237 } | 238 } |
238 | 239 |
239 this.tilePages = this.pageList.getElementsByClassName('tile-page'); | 240 this.tilePages = this.pageList.getElementsByClassName('tile-page'); |
| 241 this.appsPages = this.pageList.getElementsByClassName('apps-page'); |
240 | 242 |
241 // Initialize the cardSlider without any cards at the moment. | 243 // Initialize the cardSlider without any cards at the moment. |
242 this.sliderFrame = cardSliderFrame; | 244 this.sliderFrame = cardSliderFrame; |
243 this.cardSlider = new cr.ui.CardSlider(this.sliderFrame, this.pageList, | 245 this.cardSlider = new cr.ui.CardSlider(this.sliderFrame, this.pageList, |
244 this.sliderFrame.offsetWidth); | 246 this.sliderFrame.offsetWidth); |
245 | 247 |
246 var cardSlider = this.cardSlider; | 248 var cardSlider = this.cardSlider; |
247 this.cardSlider.initialize( | 249 this.cardSlider.initialize( |
248 loadTimeData.getBoolean('isSwipeTrackingFromScrollEventsEnabled')); | 250 loadTimeData.getBoolean('isSwipeTrackingFromScrollEventsEnabled')); |
249 | 251 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 } | 298 } |
297 | 299 |
298 // Remember special MostVisitedPage. | 300 // Remember special MostVisitedPage. |
299 if (typeof ntp.MostVisitedPage != 'undefined' && | 301 if (typeof ntp.MostVisitedPage != 'undefined' && |
300 page instanceof ntp.MostVisitedPage) { | 302 page instanceof ntp.MostVisitedPage) { |
301 assert(this.tilePages.length == 1, | 303 assert(this.tilePages.length == 1, |
302 'MostVisitedPage should be added as first tile page'); | 304 'MostVisitedPage should be added as first tile page'); |
303 this.mostVisitedPage = page; | 305 this.mostVisitedPage = page; |
304 } | 306 } |
305 | 307 |
306 if (typeof ntp.AppsPage != 'undefined' && | |
307 page instanceof ntp.AppsPage) { | |
308 this.appsPage = page; | |
309 } | |
310 | |
311 if (typeof ntp.RecentlyClosedPage != 'undefined' && | 308 if (typeof ntp.RecentlyClosedPage != 'undefined' && |
312 page instanceof ntp.RecentlyClosedPage) { | 309 page instanceof ntp.RecentlyClosedPage) { |
313 this.recentlyClosedPage = page; | 310 this.recentlyClosedPage = page; |
314 } | 311 } |
315 | 312 |
316 // Remember special OtherDevicesPage. | 313 // Remember special OtherDevicesPage. |
317 if (typeof ntp.OtherDevicesPage != 'undefined' && | 314 if (typeof ntp.OtherDevicesPage != 'undefined' && |
318 page instanceof ntp.OtherDevicesPage) { | 315 page instanceof ntp.OtherDevicesPage) { |
319 this.otherDevicesPage = page; | 316 this.otherDevicesPage = page; |
320 } | 317 } |
(...skipping 13 matching lines...) Expand all Loading... |
334 * @param {Object} appData The data for the app. This contains page and | 331 * @param {Object} appData The data for the app. This contains page and |
335 * position indices. | 332 * position indices. |
336 */ | 333 */ |
337 appMoved: function(appData) { | 334 appMoved: function(appData) { |
338 assert(loadTimeData.getBoolean('showApps')); | 335 assert(loadTimeData.getBoolean('showApps')); |
339 | 336 |
340 var app = $(appData.id); | 337 var app = $(appData.id); |
341 assert(app, 'trying to move an app that doesn\'t exist'); | 338 assert(app, 'trying to move an app that doesn\'t exist'); |
342 app.remove(false); | 339 app.remove(false); |
343 | 340 |
344 this.appsPage.insertApp(appData, false); | 341 this.appsPages[appData.page_index].insertApp(appData, false); |
345 }, | 342 }, |
346 | 343 |
347 /** | 344 /** |
348 * Called by chrome when an existing app has been disabled or | 345 * Called by chrome when an existing app has been disabled or |
349 * removed/uninstalled from chrome. | 346 * removed/uninstalled from chrome. |
350 * @param {Object} appData A data structure full of relevant information for | 347 * @param {Object} appData A data structure full of relevant information for |
351 * the app. | 348 * the app. |
352 * @param {boolean} isUninstall True if the app is being uninstalled; | 349 * @param {boolean} isUninstall True if the app is being uninstalled; |
353 * false if the app is being disabled. | 350 * false if the app is being disabled. |
354 * @param {boolean} fromPage True if the removal was from the current page. | 351 * @param {boolean} fromPage True if the removal was from the current page. |
(...skipping 30 matching lines...) Expand all Loading... |
385 * | 382 * |
386 * Note that calls to this function can occur at any time, not just in | 383 * Note that calls to this function can occur at any time, not just in |
387 * response to a getApps request. For example, when a user | 384 * response to a getApps request. For example, when a user |
388 * installs/uninstalls an app on another synchronized devices. | 385 * installs/uninstalls an app on another synchronized devices. |
389 * @param {Object} data An object with all the data on available | 386 * @param {Object} data An object with all the data on available |
390 * applications. | 387 * applications. |
391 */ | 388 */ |
392 getAppsCallback: function(data) { | 389 getAppsCallback: function(data) { |
393 assert(loadTimeData.getBoolean('showApps')); | 390 assert(loadTimeData.getBoolean('showApps')); |
394 | 391 |
395 var page = this.appsPage; | |
396 var state = page && page.getTileRepositioningState(); | |
397 if (state) { | |
398 if (state.isRemoving) | |
399 page.animateTileRemoval(state.index, data); | |
400 else | |
401 page.animateTileRestoration(state.index, data); | |
402 | |
403 page.resetTileRepositioningState(); | |
404 return; | |
405 } | |
406 | |
407 var startTime = Date.now(); | 392 var startTime = Date.now(); |
408 | 393 |
409 if (page) | 394 // Remember this to select the correct card when done rebuilding. |
410 page.removeAllTiles(); | 395 var prevCurrentCard = this.cardSlider.currentCard; |
| 396 |
| 397 // Make removal of pages and dots as quick as possible with less DOM |
| 398 // operations, reflows, or repaints. We set currentCard = 0 and remove |
| 399 // from the end to not encounter any auto-magic card selections in the |
| 400 // process and we hide the card slider throughout. |
| 401 this.cardSlider.currentCard = 0; |
| 402 |
| 403 // Clear any existing apps pages and dots. |
| 404 // TODO(rbyers): It might be nice to preserve animation of dots after an |
| 405 // uninstall. Could we re-use the existing page and dot elements? It |
| 406 // seems unfortunate to have Chrome send us the entire apps list after an |
| 407 // uninstall. |
| 408 while (this.appsPages.length > 0) |
| 409 this.removeTilePageAndDot_(this.appsPages[this.appsPages.length - 1]); |
411 | 410 |
412 // Get the array of apps and add any special synthesized entries | 411 // Get the array of apps and add any special synthesized entries |
413 var apps = data.apps; | 412 var apps = data.apps; |
414 | 413 |
| 414 // Get a list of page names |
| 415 var pageNames = data.appPageNames; |
| 416 |
415 // Sort by launch ordinal | 417 // Sort by launch ordinal |
416 apps.sort(function(a, b) { | 418 apps.sort(function(a, b) { |
417 return a.app_launch_ordinal > b.app_launch_ordinal ? 1 : | 419 return a.app_launch_ordinal > b.app_launch_ordinal ? 1 : |
418 a.app_launch_ordinal < b.app_launch_ordinal ? -1 : 0; | 420 a.app_launch_ordinal < b.app_launch_ordinal ? -1 : 0; |
419 }); | 421 }); |
420 | 422 |
421 // An app to animate (in case it was just installed). | 423 // An app to animate (in case it was just installed). |
422 var highlightApp; | 424 var highlightApp; |
423 | 425 |
| 426 // If there are any pages after the apps, add new pages before them. |
| 427 var lastAppsPage = (this.appsPages.length > 0) ? |
| 428 this.appsPages[this.appsPages.length - 1] : null; |
| 429 var lastAppsPageIndex = (lastAppsPage != null) ? |
| 430 Array.prototype.indexOf.call(this.tilePages, lastAppsPage) : -1; |
| 431 var nextPageAfterApps = lastAppsPageIndex != -1 ? |
| 432 this.tilePages[lastAppsPageIndex + 1] : null; |
| 433 |
424 // Add the apps, creating pages as necessary | 434 // Add the apps, creating pages as necessary |
425 this.appendTilePage(new ntp.AppsPage(), | |
426 loadTimeData.getString('appDefaultPageName')); | |
427 for (var i = 0; i < apps.length; i++) { | 435 for (var i = 0; i < apps.length; i++) { |
428 var app = apps[i]; | 436 var app = apps[i]; |
| 437 var pageIndex = app.page_index || 0; |
| 438 while (pageIndex >= this.appsPages.length) { |
| 439 var pageName = loadTimeData.getString('appDefaultPageName'); |
| 440 if (this.appsPages.length < pageNames.length) |
| 441 pageName = pageNames[this.appsPages.length]; |
| 442 |
| 443 var origPageCount = this.appsPages.length; |
| 444 this.appendTilePage(new ntp.AppsPage(), pageName, nextPageAfterApps); |
| 445 // Confirm that appsPages is a live object, updated when a new page is |
| 446 // added (otherwise we'd have an infinite loop) |
| 447 assert(this.appsPages.length == origPageCount + 1, |
| 448 'expected new page'); |
| 449 } |
| 450 |
429 if (app.id == this.highlightAppId) | 451 if (app.id == this.highlightAppId) |
430 highlightApp = app; | 452 highlightApp = app; |
431 else | 453 else |
432 this.appsPage.insertApp(app, false); | 454 this.appsPages[pageIndex].insertApp(app, false); |
433 } | 455 } |
434 | 456 |
| 457 this.cardSlider.currentCard = prevCurrentCard; |
| 458 |
435 if (highlightApp) | 459 if (highlightApp) |
436 this.appAdded(highlightApp, true); | 460 this.appAdded(highlightApp, true); |
437 | 461 |
438 logEvent('apps.layout: ' + (Date.now() - startTime)); | 462 logEvent('apps.layout: ' + (Date.now() - startTime)); |
439 | 463 |
440 // Tell the slider about the pages and mark the current page. | 464 // Tell the slider about the pages and mark the current page. |
441 this.updateSliderCards(); | 465 this.updateSliderCards(); |
| 466 this.cardSlider.currentCardValue.navigationDot.classList.add('selected'); |
442 | 467 |
443 if (!this.appsLoaded_) { | 468 if (!this.appsLoaded_) { |
444 this.appsLoaded_ = true; | 469 this.appsLoaded_ = true; |
445 cr.dispatchSimpleEvent(document, 'sectionready', true, true); | 470 cr.dispatchSimpleEvent(document, 'sectionready', true, true); |
446 } | 471 } |
447 }, | 472 }, |
448 | 473 |
449 /** | 474 /** |
450 * Called by chrome when a new app has been added to chrome or has been | 475 * Called by chrome when a new app has been added to chrome or has been |
451 * enabled if previously disabled. | 476 * enabled if previously disabled. |
452 * @param {Object} appData A data structure full of relevant information for | 477 * @param {Object} appData A data structure full of relevant information for |
453 * the app. | 478 * the app. |
454 * @param {boolean=} opt_highlight Whether the app about to be added should | 479 * @param {boolean=} opt_highlight Whether the app about to be added should |
455 * be highlighted. | 480 * be highlighted. |
456 */ | 481 */ |
457 appAdded: function(appData, opt_highlight) { | 482 appAdded: function(appData, opt_highlight) { |
458 assert(loadTimeData.getBoolean('showApps')); | 483 assert(loadTimeData.getBoolean('showApps')); |
459 | 484 |
460 if (appData.id == this.highlightAppId) { | 485 if (appData.id == this.highlightAppId) { |
461 opt_highlight = true; | 486 opt_highlight = true; |
462 this.highlightAppId = null; | 487 this.highlightAppId = null; |
463 } | 488 } |
464 | 489 |
465 var pageIndex = appData.page_index || 0; | 490 var pageIndex = appData.page_index || 0; |
466 | 491 |
| 492 if (pageIndex >= this.appsPages.length) { |
| 493 while (pageIndex >= this.appsPages.length) { |
| 494 this.appendTilePage(new ntp.AppsPage(), |
| 495 loadTimeData.getString('appDefaultPageName')); |
| 496 } |
| 497 this.updateSliderCards(); |
| 498 } |
| 499 |
| 500 var page = this.appsPages[pageIndex]; |
467 var app = $(appData.id); | 501 var app = $(appData.id); |
468 if (app) { | 502 if (app) { |
469 app.replaceAppData(appData); | 503 app.replaceAppData(appData); |
470 } else if (opt_highlight) { | 504 } else if (opt_highlight) { |
471 this.appsPage.insertAndHighlightApp(appData); | 505 page.insertAndHighlightApp(appData); |
472 this.setShownPage_(loadTimeData.getInteger('apps_page_id'), | 506 this.setShownPage_(loadTimeData.getInteger('apps_page_id'), |
473 appData.page_index); | 507 appData.page_index); |
474 } else { | 508 } else { |
475 this.appsPage.insertApp(appData, false); | 509 page.insertApp(appData, false); |
476 } | 510 } |
477 }, | 511 }, |
478 | 512 |
479 /** | 513 /** |
480 * Callback invoked by chrome whenever an app preference changes. | 514 * Callback invoked by chrome whenever an app preference changes. |
481 * @param {Object} data An object with all the data on available | 515 * @param {Object} data An object with all the data on available |
482 * applications. | 516 * applications. |
483 */ | 517 */ |
484 appsPrefChangedCallback: function(data) { | 518 appsPrefChangedCallback: function(data) { |
485 assert(loadTimeData.getBoolean('showApps')); | 519 assert(loadTimeData.getBoolean('showApps')); |
486 | 520 |
487 for (var i = 0; i < data.apps.length; ++i) { | 521 for (var i = 0; i < data.apps.length; ++i) { |
488 $(data.apps[i].id).appData = data.apps[i]; | 522 $(data.apps[i].id).appData = data.apps[i]; |
489 } | 523 } |
490 }, | 524 }, |
491 | 525 |
492 /** | 526 /** |
493 * Invoked whenever the pages in page-list have changed so that the | 527 * Invoked whenever the pages in page-list have changed so that the |
494 * CardSlider knows about the new elements. | 528 * CardSlider knows about the new elements. |
495 */ | 529 */ |
496 updateSliderCards: function() { | 530 updateSliderCards: function() { |
497 var pageNo = Math.max(0, Math.min(this.cardSlider.currentCard, | 531 var pageNo = Math.max(0, Math.min(this.cardSlider.currentCard, |
498 this.tilePages.length - 1)); | 532 this.tilePages.length - 1)); |
499 this.cardSlider.setCards(Array.prototype.slice.call(this.tilePages), | 533 this.cardSlider.setCards(Array.prototype.slice.call(this.tilePages), |
500 pageNo); | 534 pageNo); |
501 switch (this.shownPage) { | 535 |
502 case loadTimeData.getInteger('apps_page_id'): | 536 assert(this.mostVisitedPage, 'Most Visited Page not found'); |
503 this.cardSlider.selectCardByValue(this.appsPage); | 537 // NTP pages are not sticky anymore, so we should always select the Most |
504 break; | 538 // Visited page when loading the card slider. |
505 case loadTimeData.getInteger('most_visited_page_id'): | 539 this.cardSlider.selectCardByValue(this.mostVisitedPage); |
506 if (this.mostVisitedPage) | |
507 this.cardSlider.selectCardByValue(this.mostVisitedPage); | |
508 break; | |
509 } | |
510 }, | 540 }, |
511 | 541 |
512 /** | 542 /** |
| 543 * Returns the index of the given apps page. |
| 544 * @param {AppsPage} page The AppsPage we wish to find. |
| 545 * @return {number} The index of |page| or -1 if it is not in the |
| 546 * collection. |
| 547 */ |
| 548 getAppsPageIndex: function(page) { |
| 549 return Array.prototype.indexOf.call(this.appsPages, page); |
| 550 }, |
| 551 |
| 552 /** |
513 * Handler for cardSlider:card_changed events from this.cardSlider. | 553 * Handler for cardSlider:card_changed events from this.cardSlider. |
514 * @param {Event} e The cardSlider:card_changed event. | 554 * @param {Event} e The cardSlider:card_changed event. |
515 * @private | 555 * @private |
516 */ | 556 */ |
517 onCardChanged_: function(e) { | 557 onCardChanged_: function(e) { |
518 var page = e.cardSlider.currentCardValue; | 558 var page = e.cardSlider.currentCardValue; |
519 | 559 |
520 // Don't change shownPage until startup is done (and page changes actually | 560 // Don't change shownPage until startup is done (and page changes actually |
521 // reflect user actions). | 561 // reflect user actions). |
522 if (!this.isStartingUp_()) { | 562 if (!this.isStartingUp_()) { |
523 if (page.classList.contains('apps-page')) { | 563 if (page.classList.contains('apps-page')) { |
524 this.setShownPage_(loadTimeData.getInteger('apps_page_id'), 0); | 564 this.setShownPage_(loadTimeData.getInteger('apps_page_id'), |
| 565 this.getAppsPageIndex(page)); |
525 } else if (page.classList.contains('most-visited-page')) { | 566 } else if (page.classList.contains('most-visited-page')) { |
526 this.setShownPage_( | 567 this.setShownPage_( |
527 loadTimeData.getInteger('most_visited_page_id'), 0); | 568 loadTimeData.getInteger('most_visited_page_id'), 0); |
528 } else if (page.classList.contains('recently-closed-page')) { | 569 } else if (page.classList.contains('recently-closed-page')) { |
529 this.setShownPage_( | 570 this.setShownPage_( |
530 loadTimeData.getInteger('recently_closed_page_id'), 0); | 571 loadTimeData.getInteger('recently_closed_page_id'), 0); |
531 } else if (page.classList.contains('other-devices-page')) { | 572 } else if (page.classList.contains('other-devices-page')) { |
532 this.setShownPage_( | 573 this.setShownPage_( |
533 loadTimeData.getInteger('other_devices_page_id'), 0); | 574 loadTimeData.getInteger('other_devices_page_id'), 0); |
534 } else { | 575 } else { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 * selected TilePage. Alternatively, you can pass a specific TilePage in | 714 * selected TilePage. Alternatively, you can pass a specific TilePage in |
674 * the |opt_page| parameter, which is useful for initializing the layout | 715 * the |opt_page| parameter, which is useful for initializing the layout |
675 * of a recently created TilePage. | 716 * of a recently created TilePage. |
676 * | 717 * |
677 * The |NewTabView.layout| deals with the global layout state while the | 718 * The |NewTabView.layout| deals with the global layout state while the |
678 * |TilePage.layout| deals with the per-page layout state. A general rule | 719 * |TilePage.layout| deals with the per-page layout state. A general rule |
679 * would be: if you need to resize any element which is outside the | 720 * would be: if you need to resize any element which is outside the |
680 * card-slider-frame, it should be handled here in NewTabView. Otherwise, | 721 * card-slider-frame, it should be handled here in NewTabView. Otherwise, |
681 * it should be handled in TilePage. | 722 * it should be handled in TilePage. |
682 * | 723 * |
683 * @param {boolean=} opt_animate Whether the layout should be animated. | 724 * @param {boolean} opt_animate Whether the layout should be animated. |
684 * @param {ntp.TilePage=} opt_page Alternative TilePage to calculate layout. | 725 * @param {ntp.TilePage} opt_page Alternative TilePage to calculate layout. |
685 */ | 726 */ |
686 layout: function(opt_animate, opt_page) { | 727 layout: function(opt_animate, opt_page) { |
687 opt_animate = typeof opt_animate == 'undefined' ? false : opt_animate; | 728 opt_animate = typeof opt_animate == 'undefined' ? false : opt_animate; |
688 | 729 |
689 var viewHeight = cr.doc.documentElement.clientHeight; | 730 var viewHeight = cr.doc.documentElement.clientHeight; |
690 var isBottomPanelVisible = viewHeight >= HEIGHT_FOR_BOTTOM_PANEL; | 731 var isBottomPanelVisible = viewHeight >= HEIGHT_FOR_BOTTOM_PANEL; |
691 // Toggles the visibility of the Bottom Panel when there is (or there | 732 // Toggles the visibility of the Bottom Panel when there is (or there |
692 // is not) space to show the entire panel. | 733 // is not) space to show the entire panel. |
693 this.showBottomPanel_(isBottomPanelVisible); | 734 this.showBottomPanel_(isBottomPanelVisible); |
694 | 735 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 | 803 |
763 notificationContainer = getRequiredElement('notification-container'); | 804 notificationContainer = getRequiredElement('notification-container'); |
764 notificationContainer.addEventListener( | 805 notificationContainer.addEventListener( |
765 'webkitTransitionEnd', onNotificationTransitionEnd); | 806 'webkitTransitionEnd', onNotificationTransitionEnd); |
766 | 807 |
767 var mostVisited = new ntp.MostVisitedPage(); | 808 var mostVisited = new ntp.MostVisitedPage(); |
768 newTabView.appendTilePage(mostVisited, | 809 newTabView.appendTilePage(mostVisited, |
769 loadTimeData.getString('mostvisited')); | 810 loadTimeData.getString('mostvisited')); |
770 chrome.send('getMostVisited'); | 811 chrome.send('getMostVisited'); |
771 | 812 |
| 813 var recentlyClosed = new ntp.RecentlyClosedPage(); |
| 814 newTabView.appendTilePage(recentlyClosed, |
| 815 loadTimeData.getString('recentlyclosed')); |
| 816 chrome.send('getRecentlyClosedTabs'); |
| 817 |
| 818 var devices = new ntp.OtherDevicesPage(); |
| 819 newTabView.appendTilePage(devices, loadTimeData.getString('otherSessions')); |
| 820 chrome.send('getForeignSessions'); |
| 821 |
772 doWhenAllSectionsReady(function() { | 822 doWhenAllSectionsReady(function() { |
773 // Tell the slider about the pages. | 823 // Tell the slider about the pages. |
774 newTabView.updateSliderCards(); | 824 newTabView.updateSliderCards(); |
775 newTabView.onReady(); | 825 newTabView.onReady(); |
776 | |
777 // Restore the visibility only after calling updateSliderCards to avoid | 826 // Restore the visibility only after calling updateSliderCards to avoid |
778 // flickering, otherwise for a small fraction of a second the Page List is | 827 // flickering, otherwise for a small fraction of a second the Page List is |
779 // partially rendered. | 828 // partially rendered. |
780 $('bottom-panel').style.visibility = 'visible'; | 829 $('bottom-panel').style.visibility = 'visible'; |
781 | |
782 if (loadTimeData.valueExists('serverpromo')) { | 830 if (loadTimeData.valueExists('serverpromo')) { |
783 var promo = loadTimeData.getString('serverpromo'); | 831 var promo = loadTimeData.getString('serverpromo'); |
784 var tags = ['IMG']; | 832 var tags = ['IMG']; |
785 var attrs = { | 833 var attrs = { |
786 src: function(node, value) { | 834 src: function(node, value) { |
787 return node.tagName == 'IMG' && | 835 return node.tagName == 'IMG' && |
788 /^data\:image\/(?:png|gif|jpe?g)/.test(value); | 836 /^data\:image\/(?:png|gif|jpe?g)/.test(value); |
789 }, | 837 }, |
790 }; | 838 }; |
791 showNotification(parseHtmlSubset(promo, tags, attrs), [], function() { | 839 showNotification(parseHtmlSubset(promo, tags, attrs), [], function() { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 */ | 993 */ |
946 function onNotificationTransitionEnd(e) { | 994 function onNotificationTransitionEnd(e) { |
947 if (notificationContainer.classList.contains('inactive')) | 995 if (notificationContainer.classList.contains('inactive')) |
948 notificationContainer.hidden = true; | 996 notificationContainer.hidden = true; |
949 } | 997 } |
950 | 998 |
951 function setRecentlyClosedTabs(dataList) { | 999 function setRecentlyClosedTabs(dataList) { |
952 newTabView.recentlyClosedPage.setDataList(dataList); | 1000 newTabView.recentlyClosedPage.setDataList(dataList); |
953 } | 1001 } |
954 | 1002 |
955 function setMostVisitedPages(dataList, hasBlacklistedUrls) { | 1003 function setMostVisitedPages(data, hasBlacklistedUrls) { |
956 var page = newTabView.mostVisitedPage; | 1004 var page = newTabView.mostVisitedPage; |
957 var state = page.getTileRepositioningState(); | 1005 var state = page.getTileRepositioningState(); |
958 if (state) { | 1006 if (state) { |
959 if (state.isRemoving) | 1007 if (state.isRemoving) |
960 page.animateTileRemoval(state.index, dataList); | 1008 page.animateTileRemoval(state.index, data); |
961 else | 1009 else |
962 page.animateTileRestoration(state.index, dataList); | 1010 page.animateTileRestoration(state.index, data); |
963 | 1011 |
964 page.resetTileRepositioningState(); | 1012 page.resetTileRepositioningState(); |
965 } else { | 1013 } else { |
966 page.setDataList(dataList); | 1014 page.setDataList(data); |
967 cr.dispatchSimpleEvent(document, 'sectionready', true, true); | 1015 cr.dispatchSimpleEvent(document, 'sectionready', true, true); |
968 } | 1016 } |
969 } | 1017 } |
970 | 1018 |
971 function setForeignSessions(dataList, isTabSyncEnabled) { | 1019 function setForeignSessions(dataList, isTabSyncEnabled) { |
972 newTabView.otherDevicesPage.setDataList(dataList); | 1020 newTabView.otherDevicesPage.setDataList(dataList); |
973 } | 1021 } |
974 | 1022 |
975 function getThumbnailUrl(url) { | 1023 function getThumbnailUrl(url) { |
976 return 'chrome://thumb/' + url; | 1024 return 'chrome://thumb/' + url; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 } | 1062 } |
1015 | 1063 |
1016 function appsPrefChangeCallback() { | 1064 function appsPrefChangeCallback() { |
1017 return newTabView.appsPrefChangedCallback.apply(newTabView, arguments); | 1065 return newTabView.appsPrefChangedCallback.apply(newTabView, arguments); |
1018 } | 1066 } |
1019 | 1067 |
1020 function getAppsCallback() { | 1068 function getAppsCallback() { |
1021 return newTabView.getAppsCallback.apply(newTabView, arguments); | 1069 return newTabView.getAppsCallback.apply(newTabView, arguments); |
1022 } | 1070 } |
1023 | 1071 |
| 1072 function getAppsPageIndex() { |
| 1073 return newTabView.getAppsPageIndex.apply(newTabView, arguments); |
| 1074 } |
| 1075 |
1024 function getCardSlider() { | 1076 function getCardSlider() { |
1025 return newTabView.cardSlider; | 1077 return newTabView.cardSlider; |
1026 } | 1078 } |
1027 | 1079 |
1028 function setAppToBeHighlighted(appId) { | 1080 function setAppToBeHighlighted(appId) { |
1029 newTabView.highlightAppId = appId; | 1081 newTabView.highlightAppId = appId; |
1030 } | 1082 } |
1031 | 1083 |
1032 function layout(opt_animate) { | 1084 function layout(opt_animate) { |
1033 newTabView.layout(opt_animate); | 1085 newTabView.layout(opt_animate); |
1034 } | 1086 } |
1035 | 1087 |
1036 function getContentWidth() { | 1088 function getContentWidth() { |
1037 return newTabView.contentWidth; | 1089 return newTabView.contentWidth; |
1038 } | 1090 } |
1039 | 1091 |
1040 // Return an object with all the exports | 1092 // Return an object with all the exports |
1041 return { | 1093 return { |
1042 APP_LAUNCH: APP_LAUNCH, | 1094 APP_LAUNCH: APP_LAUNCH, |
1043 appAdded: appAdded, | 1095 appAdded: appAdded, |
1044 appMoved: appMoved, | 1096 appMoved: appMoved, |
1045 appRemoved: appRemoved, | 1097 appRemoved: appRemoved, |
1046 appsPrefChangeCallback: appsPrefChangeCallback, | 1098 appsPrefChangeCallback: appsPrefChangeCallback, |
1047 getAppsCallback: getAppsCallback, | 1099 getAppsCallback: getAppsCallback, |
| 1100 getAppsPageIndex: getAppsPageIndex, |
1048 getCardSlider: getCardSlider, | 1101 getCardSlider: getCardSlider, |
1049 getContentWidth: getContentWidth, | 1102 getContentWidth: getContentWidth, |
1050 getThumbnailUrl: getThumbnailUrl, | 1103 getThumbnailUrl: getThumbnailUrl, |
1051 incrementHoveredThumbnailCount: incrementHoveredThumbnailCount, | 1104 incrementHoveredThumbnailCount: incrementHoveredThumbnailCount, |
1052 layout: layout, | 1105 layout: layout, |
1053 logTimeToClickAndHoverCount: logTimeToClickAndHoverCount, | 1106 logTimeToClickAndHoverCount: logTimeToClickAndHoverCount, |
| 1107 // This property is being used to disable NTP5 features that are not ready |
| 1108 // yet. Right now this is being used just to disable Apps page. |
| 1109 // TODO(pedrosimonetti): Remove this property after porting Apps Page. |
| 1110 ntp5: true, |
1054 NtpFollowAction: NtpFollowAction, | 1111 NtpFollowAction: NtpFollowAction, |
1055 onLoad: onLoad, | 1112 onLoad: onLoad, |
1056 setAppToBeHighlighted: setAppToBeHighlighted, | 1113 setAppToBeHighlighted: setAppToBeHighlighted, |
1057 setBookmarkBarAttached: setBookmarkBarAttached, | 1114 setBookmarkBarAttached: setBookmarkBarAttached, |
1058 setForeignSessions: setForeignSessions, | 1115 setForeignSessions: setForeignSessions, |
1059 setMostVisitedPages: setMostVisitedPages, | 1116 setMostVisitedPages: setMostVisitedPages, |
1060 setRecentlyClosedTabs: setRecentlyClosedTabs, | 1117 setRecentlyClosedTabs: setRecentlyClosedTabs, |
1061 showNotification: showNotification, | 1118 showNotification: showNotification, |
1062 themeChanged: themeChanged, | 1119 themeChanged: themeChanged, |
1063 }; | 1120 }; |
1064 }); | 1121 }); |
1065 | 1122 |
1066 document.addEventListener('DOMContentLoaded', ntp.onLoad); | 1123 document.addEventListener('DOMContentLoaded', ntp.onLoad); |
1067 | 1124 |
1068 var toCssPx = cr.ui.toCssPx; | 1125 var toCssPx = cr.ui.toCssPx; |
OLD | NEW |