Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: chrome/browser/resources/ntp4/apps_page.js

Issue 8637001: [NTP4] Auto-deletion of empty apps panes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removing bits for refactor Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/resources/ntp4/nav_dot.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 cr.define('ntp4', function() { 5 cr.define('ntp4', function() {
6 'use strict'; 6 'use strict';
7 7
8 var localStrings = new LocalStrings; 8 var localStrings = new LocalStrings;
9 9
10 var APP_LAUNCH = { 10 var APP_LAUNCH = {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 268
269 /** 269 /**
270 * Sets the color of the favicon dominant color bar. 270 * Sets the color of the favicon dominant color bar.
271 * @param {string} color The css-parsable value for the color. 271 * @param {string} color The css-parsable value for the color.
272 */ 272 */
273 set stripeColor(color) { 273 set stripeColor(color) {
274 this.querySelector('.color-stripe').style.backgroundColor = color; 274 this.querySelector('.color-stripe').style.backgroundColor = color;
275 }, 275 },
276 276
277 /** 277 /**
278 * Removes the app tile from the page. Should be called after the app has
279 * been uninstalled.
280 */
281 remove: function() {
282 // Unset the ID immediately, because the app is already gone. But leave
283 // the tile on the page as it animates out.
284 this.id = '';
285 this.tile.doRemove();
286 },
287
288 /**
289 * Set the URL of the icon from |appData_|. This won't actually show the 278 * Set the URL of the icon from |appData_|. This won't actually show the
290 * icon until loadIcon() is called (for performance reasons; we don't want 279 * icon until loadIcon() is called (for performance reasons; we don't want
291 * to load icons until we have to). 280 * to load icons until we have to).
292 */ 281 */
293 setIcon: function() { 282 setIcon: function() {
294 var src = this.useSmallIcon_ ? this.appData_.icon_small : 283 var src = this.useSmallIcon_ ? this.appData_.icon_small :
295 this.appData_.icon_big; 284 this.appData_.icon_big;
296 if (!this.appData_.enabled || 285 if (!this.appData_.enabled ||
297 (!this.appData_.offline_enabled && !navigator.onLine)) { 286 (!this.appData_.offline_enabled && !navigator.onLine)) {
298 src += '?grayscale=true'; 287 src += '?grayscale=true';
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 // The padding between tiles, as a fraction of the tile width. 616 // The padding between tiles, as a fraction of the tile width.
628 tileSpacingFraction: 1 / 8, 617 tileSpacingFraction: 1 / 8,
629 }; 618 };
630 TilePage.initGridValues(appsPageGridValues); 619 TilePage.initGridValues(appsPageGridValues);
631 620
632 /** 621 /**
633 * Creates a new AppsPage object. 622 * Creates a new AppsPage object.
634 * @constructor 623 * @constructor
635 * @extends {TilePage} 624 * @extends {TilePage}
636 */ 625 */
637 function AppsPage() { 626 function AppsPage(ordinal) {
638 var el = new TilePage(appsPageGridValues); 627 var el = new TilePage(appsPageGridValues);
639 el.__proto__ = AppsPage.prototype; 628 el.__proto__ = AppsPage.prototype;
640 el.initialize(); 629 el.initialize(ordinal);
641 630
642 return el; 631 return el;
643 } 632 }
644 633
645 AppsPage.prototype = { 634 AppsPage.prototype = {
646 __proto__: TilePage.prototype, 635 __proto__: TilePage.prototype,
647 636
648 initialize: function() { 637 initialize: function(ordinal) {
638 this.ordinal_ = ordinal;
649 this.classList.add('apps-page'); 639 this.classList.add('apps-page');
650 640
651 this.addEventListener('cardselected', this.onCardSelected_); 641 this.addEventListener('cardselected', this.onCardSelected_);
652 // Add event listeners for two events, so we can temporarily suppress 642 // Add event listeners for two events, so we can temporarily suppress
653 // the app notification bubbles when the app card slides in and out of 643 // the app notification bubbles when the app card slides in and out of
654 // view. 644 // view.
655 this.addEventListener('carddeselected', this.onCardDeselected_); 645 this.addEventListener('carddeselected', this.onCardDeselected_);
656 this.addEventListener('cardSelectionCompleted', 646 this.addEventListener(cr.ui.CardSlider.EventType.CARD_CHANGE_ENDED,
657 this.onCardSelectionCompleted_); 647 this.onCardChangeEnded_);
648
649 this.addEventListener(TilePage.EventType.TILE_ADDED, this.onTileAdded_);
658 650
659 this.content_.addEventListener('scroll', this.onScroll_.bind(this)); 651 this.content_.addEventListener('scroll', this.onScroll_.bind(this));
660 }, 652 },
661 653
654 get ordinal() {
655 assert(typeof this.ordinal_ == 'string' && this.ordinal_);
656 return this.ordinal_;
657 },
658
659 set ordinal(ordinal) {
660 assert(typeof ordinal == 'string' && ordinal);
661 this.ordinal_ = ordinal;
662 },
663
662 /** 664 /**
663 * Creates an app DOM element and places it at the last position on the 665 * Creates an app DOM element and places it at the last position on the
664 * page. 666 * page.
665 * @param {Object} appData The data object that describes the app. 667 * @param {Object} appData The data object that describes the app.
666 * @param {?boolean} animate If true, the app tile plays an animation. 668 * @param {?boolean} animate If true, the app tile plays an animation.
667 */ 669 */
668 appendApp: function(appData, animate) { 670 appendApp: function(appData, animate) {
669 if (animate) { 671 if (animate) {
670 // Select the page and scroll all the way down so the animation is 672 // Select the page and scroll all the way down so the animation is
671 // visible. 673 // visible.
672 ntp4.getCardSlider().selectCardByValue(this); 674 ntp4.getCardSlider().selectCardByValue(this);
673 this.content_.scrollTop = this.content_.scrollHeight; 675 this.content_.scrollTop = this.content_.scrollHeight;
674 } 676 }
675 var app = new App(appData); 677 this.appendTile(new App(appData), animate);
676 if (this.classList.contains('selected-card'))
677 app.loadIcon();
678 this.appendTile(app, animate);
679 }, 678 },
680 679
681 /** 680 /**
682 * Handler for 'cardselected' event, fired when |this| is selected. The 681 * Handler for 'cardselected' event, fired when |this| is selected. The
683 * first time this is called, we load all the app icons. 682 * first time this is called, we load all the app icons.
684 * @private 683 * @private
685 */ 684 */
686 onCardSelected_: function(e) { 685 onCardSelected_: function(e) {
687 var apps = this.querySelectorAll('.app.icon-loading'); 686 var apps = this.querySelectorAll('.app.icon-loading');
688 for (var i = 0; i < apps.length; i++) { 687 for (var i = 0; i < apps.length; i++) {
689 apps[i].loadIcon(); 688 apps[i].loadIcon();
690 if (apps[i].currentBubbleShowing_) 689 if (apps[i].currentBubbleShowing_)
691 apps[i].currentBubbleShowing_.suppressed = false; 690 apps[i].currentBubbleShowing_.suppressed = false;
692 } 691 }
693 }, 692 },
694 693
695 /** 694 /**
696 * Handler for the 'cardSelectionCompleted' event, fired when the app card 695 * Handler for tile additions to this page.
697 * is done transitioning into view (and all the apps have repositioned). 696 * @param {Event} e The TILE_MOVED event.
697 */
698 onTileAdded_: function(e) {
699 assert(e.tilePage == this);
700 var tileContents = e.tilePage.tiles[e.tileIndex].firstChild;
701 assert(tileContents instanceof App);
702 if (e.tilePage.classList.contains('selected-card'))
703 tileContents.loadIcon();
704 },
705
706 /**
707 * Handler for the when this.cardSlider ends change its card. If animated,
708 * this happens when the -webkit-transition is done, otherwise happens
709 * immediately (but after CardSlider.EventType.CARD_CHANGED).
698 * @private 710 * @private
699 */ 711 */
700 onCardSelectionCompleted_: function(e) { 712 onCardChangeEnded: function(e) {
701 for (var i = 0; i < this.tileElements_.length; i++) { 713 for (var i = 0; i < this.tileElements_.length; i++) {
702 var app = this.tileElements_[i].firstChild; 714 var app = this.tileElements_[i].firstChild;
703 assert(app instanceof App); 715 assert(app instanceof App);
704 if (app.currentBubbleShowing_) 716 if (app.currentBubbleShowing_)
705 app.currentBubbleShowing_.suppressed = false; 717 app.currentBubbleShowing_.suppressed = false;
706 } 718 }
707 }, 719 },
708 720
709 /** 721 /**
710 * Handler for the 'carddeselected' event, fired when the user switches 722 * Handler for the 'carddeselected' event, fired when the user switches
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 (e.dataTransfer && e.dataTransfer.types.indexOf('url') != -1); 766 (e.dataTransfer && e.dataTransfer.types.indexOf('url') != -1);
755 }, 767 },
756 768
757 /** @inheritDoc */ 769 /** @inheritDoc */
758 addDragData: function(dataTransfer, index) { 770 addDragData: function(dataTransfer, index) {
759 var sourceId = -1; 771 var sourceId = -1;
760 var currentlyDraggingTile = ntp4.getCurrentlyDraggingTile(); 772 var currentlyDraggingTile = ntp4.getCurrentlyDraggingTile();
761 if (currentlyDraggingTile) { 773 if (currentlyDraggingTile) {
762 var tileContents = currentlyDraggingTile.firstChild; 774 var tileContents = currentlyDraggingTile.firstChild;
763 if (tileContents.classList.contains('app')) { 775 if (tileContents.classList.contains('app')) {
764 sourceId = currentlyDraggingTile.tilePage == this ? 776 var originalPage = currentlyDraggingTile.tilePage;
765 DRAG_SOURCE.SAME_APPS_PANE : DRAG_SOURCE.OTHER_APPS_PANE; 777 var samePageDrag = originalPage == this;
766 this.tileGrid_.insertBefore( 778 sourceId = samePageDrag ? DRAG_SOURCE.SAME_APPS_PANE :
767 currentlyDraggingTile, 779 DRAG_SOURCE.OTHER_APPS_PANE;
768 this.tileElements_[index]); 780 this.tileGrid_.insertBefore(currentlyDraggingTile,
781 this.tileElements_[index]);
769 this.tileMoved(currentlyDraggingTile); 782 this.tileMoved(currentlyDraggingTile);
783 if (!samePageDrag)
784 originalPage.fireRemovedEvent(true);
785 if (originalPage)
786 originalPage.cleanupDrag();
770 } else if (currentlyDraggingTile.querySelector('.most-visited')) { 787 } else if (currentlyDraggingTile.querySelector('.most-visited')) {
771 this.generateAppForLink(tileContents.data); 788 this.generateAppForLink(tileContents.data);
772 sourceId = DRAG_SOURCE.MOST_VISITED_PANE; 789 sourceId = DRAG_SOURCE.MOST_VISITED_PANE;
773 } 790 }
774 } else { 791 } else {
775 this.addOutsideData_(dataTransfer, index); 792 this.addOutsideData_(dataTransfer);
776 sourceId = DRAG_SOURCE.OUTSIDE_NTP; 793 sourceId = DRAG_SOURCE.OUTSIDE_NTP;
777 } 794 }
778 795
779 assert(sourceId != -1); 796 assert(sourceId != -1);
780 chrome.send('metricsHandler:recordInHistogram', 797 chrome.send('metricsHandler:recordInHistogram',
781 ['NewTabPage.AppsPageDragSource', sourceId, DRAG_SOURCE_LIMIT]); 798 ['NewTabPage.AppsPageDragSource', sourceId, DRAG_SOURCE_LIMIT]);
782 }, 799 },
783 800
784 /** 801 /**
785 * Adds drag data that has been dropped from a source that is not a tile. 802 * Adds drag data that has been dropped from a source that is not a tile.
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 appNotificationChanged: appNotificationChanged, 900 appNotificationChanged: appNotificationChanged,
884 AppsPage: AppsPage, 901 AppsPage: AppsPage,
885 launchAppAfterEnable: launchAppAfterEnable, 902 launchAppAfterEnable: launchAppAfterEnable,
886 }; 903 };
887 }); 904 });
888 905
889 // TODO(estade): update the content handlers to use ntp namespace instead of 906 // TODO(estade): update the content handlers to use ntp namespace instead of
890 // making these global. 907 // making these global.
891 var appNotificationChanged = ntp4.appNotificationChanged; 908 var appNotificationChanged = ntp4.appNotificationChanged;
892 var launchAppAfterEnable = ntp4.launchAppAfterEnable; 909 var launchAppAfterEnable = ntp4.launchAppAfterEnable;
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/ntp4/nav_dot.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698