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

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

Issue 7839013: ntp: speed up startup by deferring app icon loads (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 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/card_slider.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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 appContents.className = 'app-contents'; 182 appContents.className = 'app-contents';
183 183
184 var appImgContainer = this.ownerDocument.createElement('div'); 184 var appImgContainer = this.ownerDocument.createElement('div');
185 appImgContainer.className = 'app-img-container'; 185 appImgContainer.className = 'app-img-container';
186 this.appImgContainer_ = appImgContainer; 186 this.appImgContainer_ = appImgContainer;
187 187
188 if (!this.appData_.icon_big_exists && this.appData_.icon_small_exists) 188 if (!this.appData_.icon_big_exists && this.appData_.icon_small_exists)
189 this.useSmallIcon_ = true; 189 this.useSmallIcon_ = true;
190 190
191 var appImg = this.ownerDocument.createElement('img'); 191 var appImg = this.ownerDocument.createElement('img');
192 // This is temporary (setIcon_/loadIcon will overwrite it) but is visible
193 // before the page is shown (e.g. if switching from most visited to
194 // bookmarks).
195 appImg.src = 'chrome://theme/IDR_APP_DEFAULT_ICON';
192 this.appImg_ = appImg; 196 this.appImg_ = appImg;
193 this.setIcon(); 197 this.setIcon_();
194 appImgContainer.appendChild(appImg); 198 appImgContainer.appendChild(appImg);
195 199
196 if (this.useSmallIcon_) { 200 if (this.useSmallIcon_) {
197 var imgDiv = this.ownerDocument.createElement('div'); 201 var imgDiv = this.ownerDocument.createElement('div');
198 imgDiv.className = 'app-icon-div'; 202 imgDiv.className = 'app-icon-div';
199 imgDiv.appendChild(appImgContainer); 203 imgDiv.appendChild(appImgContainer);
200 imgDiv.addEventListener('click', this.onClick_.bind(this)); 204 imgDiv.addEventListener('click', this.onClick_.bind(this));
201 this.imgDiv_ = imgDiv; 205 this.imgDiv_ = imgDiv;
202 appContents.appendChild(imgDiv); 206 appContents.appendChild(imgDiv);
203 this.appImgContainer_.style.position = 'absolute'; 207 this.appImgContainer_.style.position = 'absolute';
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 * been uninstalled. 263 * been uninstalled.
260 */ 264 */
261 remove: function() { 265 remove: function() {
262 // Unset the ID immediately, because the app is already gone. But leave 266 // Unset the ID immediately, because the app is already gone. But leave
263 // the tile on the page as it animates out. 267 // the tile on the page as it animates out.
264 this.id = ''; 268 this.id = '';
265 this.tile.doRemove(); 269 this.tile.doRemove();
266 }, 270 },
267 271
268 /** 272 /**
269 * Set the app's icon image from the appData. 273 * Set the URL of the icon from |appData_|. This won't actually show the
274 * icon until loadIcon() is called (for performance reasons; we don't want
275 * to load icons until we have to).
270 * @private 276 * @private
271 */ 277 */
272 setIcon: function() { 278 setIcon_: function() {
273 this.appImg_.src = this.useSmallIcon_ ? this.appData_.icon_small : 279 var src = this.useSmallIcon_ ? this.appData_.icon_small :
274 this.appData_.icon_big; 280 this.appData_.icon_big;
275 if (!this.appData_.enabled || 281 if (!this.appData_.enabled ||
276 (!this.appData_.offline_enabled && !navigator.onLine)) { 282 (!this.appData_.offline_enabled && !navigator.onLine)) {
277 this.appImg_.src += '?grayscale=true'; 283 src += '?grayscale=true';
278 } 284 }
285
286 this.appImgSrc_ = src;
287 },
288
289 /**
290 * Shows the icon for the app. That is, it causes chrome to load the app
291 * icon resource.
292 */
293 loadIcon: function() {
294 if (this.appImgSrc_)
295 this.appImg_.src = this.appImgSrc_;
296 this.appImgSrc_ = null;
279 }, 297 },
280 298
281 // Shows a notification text below the app icon and stuffs the attributes 299 // Shows a notification text below the app icon and stuffs the attributes
282 // necessary to show the bubble when the user clicks on the notification 300 // necessary to show the bubble when the user clicks on the notification
283 // text. 301 // text.
284 setupNotification_: function(notification) { 302 setupNotification_: function(notification) {
285 // Remove the old notification from this node (if any). 303 // Remove the old notification from this node (if any).
286 for (var i = 0; i < this.childNodes.length; i++) { 304 if (this.appNotification_)
287 if (this.childNodes[i].classList.contains('app-notification')) { 305 this.appNotification_.parentNode.removeChild(this.appNotification_);
288 this.removeChild(this.childNodes[i]);
289 break;
290 }
291 }
292 306
293 if (notification) { 307 if (notification) {
294 // Add a new notification to this node. 308 // Add a new notification to this node.
295 var appNotification = this.ownerDocument.createElement('span'); 309 var appNotification = this.ownerDocument.createElement('span');
296 appNotification.className = 'app-notification'; 310 appNotification.className = 'app-notification';
297 appNotification.textContent = notification['title']; 311 appNotification.textContent = notification['title'];
298 appNotification.addEventListener('click', 312 appNotification.addEventListener('click',
299 this.onNotificationClick_.bind(this)); 313 this.onNotificationClick_.bind(this));
300 appNotification.notificationTitle = notification['title']; 314 appNotification.notificationTitle = notification['title'];
301 appNotification.notificationMessage = notification['body']; 315 appNotification.notificationMessage = notification['body'];
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 else 460 else
447 this.classList.remove('suppress-active'); 461 this.classList.remove('suppress-active');
448 }, 462 },
449 463
450 /** 464 /**
451 * Change the appData and update the appearance of the app. 465 * Change the appData and update the appearance of the app.
452 * @param {Object} appData The new data object that describes the app. 466 * @param {Object} appData The new data object that describes the app.
453 */ 467 */
454 replaceAppData: function(appData) { 468 replaceAppData: function(appData) {
455 this.appData_ = appData; 469 this.appData_ = appData;
456 this.setIcon(); 470 this.setIcon_();
471 this.loadIcon();
457 }, 472 },
458 473
459 /** 474 /**
460 * The data and preferences for this app. 475 * The data and preferences for this app.
461 * @type {Object} 476 * @type {Object}
462 */ 477 */
463 set appData(data) { 478 set appData(data) {
464 this.appData_ = data; 479 this.appData_ = data;
465 }, 480 },
466 get appData() { 481 get appData() {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 el.initialize(); 556 el.initialize();
542 557
543 return el; 558 return el;
544 } 559 }
545 560
546 AppsPage.prototype = { 561 AppsPage.prototype = {
547 __proto__: TilePage.prototype, 562 __proto__: TilePage.prototype,
548 563
549 initialize: function() { 564 initialize: function() {
550 this.classList.add('apps-page'); 565 this.classList.add('apps-page');
566
567 this.addEventListener('cardselected', this.onCardSelected_);
551 }, 568 },
552 569
553 /** 570 /**
554 * Creates an app DOM element and places it at the last position on the 571 * Creates an app DOM element and places it at the last position on the
555 * page. 572 * page.
556 * @param {Object} appData The data object that describes the app. 573 * @param {Object} appData The data object that describes the app.
557 * @param {?boolean} animate If true, the app tile plays an animation. 574 * @param {?boolean} animate If true, the app tile plays an animation.
558 */ 575 */
559 appendApp: function(appData, animate) { 576 appendApp: function(appData, animate) {
560 if (animate) { 577 if (animate) {
561 // Select the page and scroll all the way down so the animation is 578 // Select the page and scroll all the way down so the animation is
562 // visible. 579 // visible.
563 ntp4.getCardSlider().selectCardByValue(this); 580 ntp4.getCardSlider().selectCardByValue(this);
564 this.content_.scrollTop = this.content_.scrollHeight; 581 this.content_.scrollTop = this.content_.scrollHeight;
565 } 582 }
566 this.appendTile(new App(appData), animate); 583 this.appendTile(new App(appData), animate);
567 }, 584 },
568 585
586 /**
587 * Handler for 'cardselected' event, fired when |this| is selected. The
588 * first time this is called, we load all the app icons.
589 * @private
590 */
591 onCardSelected_: function(e) {
592 if (this.hasBeenSelected_)
593 return;
594 this.hasBeenSelected_ = true;
595
596 var apps = this.querySelectorAll('.app');
597 for (var i = 0; i < apps.length; i++) {
598 apps[i].loadIcon();
599 }
600 },
601
569 /** @inheritdoc */ 602 /** @inheritdoc */
570 doDragOver: function(e) { 603 doDragOver: function(e) {
571 var tile = ntp4.getCurrentlyDraggingTile(); 604 var tile = ntp4.getCurrentlyDraggingTile();
572 if (tile && !tile.querySelector('.app')) { 605 if (tile && !tile.querySelector('.app')) {
573 e.preventDefault(); 606 e.preventDefault();
574 this.setDropEffect(e.dataTransfer); 607 this.setDropEffect(e.dataTransfer);
575 } else { 608 } else {
576 TilePage.prototype.doDragOver.call(this, e); 609 TilePage.prototype.doDragOver.call(this, e);
577 } 610 }
578 }, 611 },
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 dataTransfer.dropEffect = 'copy'; 708 dataTransfer.dropEffect = 'copy';
676 }, 709 },
677 }; 710 };
678 711
679 AppsPage.setPromo = function(data) { 712 AppsPage.setPromo = function(data) {
680 var store = document.querySelector('.webstore'); 713 var store = document.querySelector('.webstore');
681 if (store) 714 if (store)
682 store.setAppsPromoData(data); 715 store.setAppsPromoData(data);
683 }; 716 };
684 717
685
686 /** 718 /**
687 * Callback invoked by chrome whenever an app preference changes. 719 * Callback invoked by chrome whenever an app preference changes.
688 * @param {Object} data An object with all the data on available 720 * @param {Object} data An object with all the data on available
689 * applications. 721 * applications.
690 */ 722 */
691 function appsPrefChangeCallback(data) { 723 function appsPrefChangeCallback(data) {
692 for (var i = 0; i < data.apps.length; ++i) { 724 for (var i = 0; i < data.apps.length; ++i) {
693 $(data.apps[i].id).appData = data.apps[i]; 725 $(data.apps[i].id).appData = data.apps[i];
694 } 726 }
695 } 727 }
(...skipping 18 matching lines...) Expand all
714 appsPrefChangeCallback: appsPrefChangeCallback, 746 appsPrefChangeCallback: appsPrefChangeCallback,
715 launchAppAfterEnable: launchAppAfterEnable, 747 launchAppAfterEnable: launchAppAfterEnable,
716 }; 748 };
717 }); 749 });
718 750
719 // TODO(estade): update the content handlers to use ntp namespace instead of 751 // TODO(estade): update the content handlers to use ntp namespace instead of
720 // making these global. 752 // making these global.
721 var appNotificationChanged = ntp4.appNotificationChanged; 753 var appNotificationChanged = ntp4.appNotificationChanged;
722 var appsPrefChangeCallback = ntp4.appsPrefChangeCallback; 754 var appsPrefChangeCallback = ntp4.appsPrefChangeCallback;
723 var launchAppAfterEnable = ntp4.launchAppAfterEnable; 755 var launchAppAfterEnable = ntp4.launchAppAfterEnable;
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/ntp4/card_slider.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698