| 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 cr.define('ntp', function() { | 5 cr.define('ntp', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 var APP_LAUNCH = { | 8 var APP_LAUNCH = { |
| 9 // The histogram buckets (keep in sync with extension_constants.h). | 9 // The histogram buckets (keep in sync with extension_constants.h). |
| 10 NTP_APPS_MAXIMIZED: 0, | 10 NTP_APPS_MAXIMIZED: 0, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 cr.addSingletonGetter(AppContextMenu); | 38 cr.addSingletonGetter(AppContextMenu); |
| 39 | 39 |
| 40 AppContextMenu.prototype = { | 40 AppContextMenu.prototype = { |
| 41 initialize: function() { | 41 initialize: function() { |
| 42 var menu = new cr.ui.Menu; | 42 var menu = new cr.ui.Menu; |
| 43 cr.ui.decorate(menu, cr.ui.Menu); | 43 cr.ui.decorate(menu, cr.ui.Menu); |
| 44 menu.classList.add('app-context-menu'); | 44 menu.classList.add('app-context-menu'); |
| 45 this.menu = menu; | 45 this.menu = menu; |
| 46 | 46 |
| 47 this.launch_ = this.appendMenuItem_(); | 47 this.launch_ = this.appendMenuItem_(); |
| 48 this.launch_.addEventListener('activate', this.onLaunch_.bind(this)); | 48 this.launch_.addEventListener('activate', this.onActivate_.bind(this)); |
| 49 | 49 |
| 50 menu.appendChild(cr.ui.MenuItem.createSeparator()); | 50 menu.appendChild(cr.ui.MenuItem.createSeparator()); |
| 51 this.launchRegularTab_ = this.appendMenuItem_('applaunchtyperegular'); | 51 this.launchRegularTab_ = this.appendMenuItem_('applaunchtyperegular'); |
| 52 this.launchPinnedTab_ = this.appendMenuItem_('applaunchtypepinned'); | 52 this.launchPinnedTab_ = this.appendMenuItem_('applaunchtypepinned'); |
| 53 if (loadTimeData.getBoolean('canHostedAppsOpenInWindows')) | 53 if (loadTimeData.getBoolean('canHostedAppsOpenInWindows')) |
| 54 this.launchNewWindow_ = this.appendMenuItem_('applaunchtypewindow'); | 54 this.launchNewWindow_ = this.appendMenuItem_('applaunchtypewindow'); |
| 55 this.launchFullscreen_ = this.appendMenuItem_('applaunchtypefullscreen'); | 55 this.launchFullscreen_ = this.appendMenuItem_('applaunchtypefullscreen'); |
| 56 | 56 |
| 57 var self = this; | 57 var self = this; |
| 58 this.forAllLaunchTypes_(function(launchTypeButton, id) { | 58 this.forAllLaunchTypes_(function(launchTypeButton, id) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 88 'activate', this.onCreateShortcut_.bind(this)); | 88 'activate', this.onCreateShortcut_.bind(this)); |
| 89 } | 89 } |
| 90 | 90 |
| 91 document.body.appendChild(menu); | 91 document.body.appendChild(menu); |
| 92 }, | 92 }, |
| 93 | 93 |
| 94 /** | 94 /** |
| 95 * Appends a menu item to |this.menu|. | 95 * Appends a menu item to |this.menu|. |
| 96 * @param {string=} opt_textId If defined, the ID for the localized string | 96 * @param {string=} opt_textId If defined, the ID for the localized string |
| 97 * that acts as the item's label. | 97 * that acts as the item's label. |
| 98 * @private |
| 98 */ | 99 */ |
| 99 appendMenuItem_: function(opt_textId) { | 100 appendMenuItem_: function(opt_textId) { |
| 100 var button = cr.doc.createElement('button'); | 101 var button = cr.doc.createElement('button'); |
| 101 this.menu.appendChild(button); | 102 this.menu.appendChild(button); |
| 102 cr.ui.decorate(button, cr.ui.MenuItem); | 103 cr.ui.decorate(button, cr.ui.MenuItem); |
| 103 if (opt_textId) | 104 if (opt_textId) |
| 104 button.textContent = loadTimeData.getString(opt_textId); | 105 button.textContent = loadTimeData.getString(opt_textId); |
| 105 return button; | 106 return button; |
| 106 }, | 107 }, |
| 107 | 108 |
| 108 /** | 109 /** |
| 109 * Iterates over all the launch type menu items. | 110 * Iterates over all the launch type menu items. |
| 110 * @param {function(cr.ui.MenuItem, number)} f The function to call for each | 111 * @param {function(cr.ui.MenuItem, number)} f The function to call for each |
| 111 * menu item. The parameters to the function include the menu item and | 112 * menu item. The parameters to the function include the menu item and |
| 112 * the associated launch ID. | 113 * the associated launch ID. |
| 114 * @private |
| 113 */ | 115 */ |
| 114 forAllLaunchTypes_: function(f) { | 116 forAllLaunchTypes_: function(f) { |
| 115 // Order matters: index matches launchType id. | 117 // Order matters: index matches launchType id. |
| 116 var launchTypes = [this.launchPinnedTab_, | 118 var launchTypes = [this.launchPinnedTab_, |
| 117 this.launchRegularTab_, | 119 this.launchRegularTab_, |
| 118 this.launchFullscreen_, | 120 this.launchFullscreen_, |
| 119 this.launchNewWindow_]; | 121 this.launchNewWindow_]; |
| 120 | 122 |
| 121 for (var i = 0; i < launchTypes.length; ++i) { | 123 for (var i = 0; i < launchTypes.length; ++i) { |
| 122 if (!launchTypes[i]) | 124 if (!launchTypes[i]) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 | 165 |
| 164 if (cr.isMac) { | 166 if (cr.isMac) { |
| 165 // On Windows and Linux, these should always be visible. On ChromeOS, | 167 // On Windows and Linux, these should always be visible. On ChromeOS, |
| 166 // they are never created. On Mac, shortcuts can only be created for | 168 // they are never created. On Mac, shortcuts can only be created for |
| 167 // new-style packaged apps, so hide the menu item. | 169 // new-style packaged apps, so hide the menu item. |
| 168 this.createShortcutSeparator_.hidden = this.createShortcut_.hidden = | 170 this.createShortcutSeparator_.hidden = this.createShortcut_.hidden = |
| 169 !app.appData.packagedApp; | 171 !app.appData.packagedApp; |
| 170 } | 172 } |
| 171 }, | 173 }, |
| 172 | 174 |
| 175 /** @private */ |
| 176 onActivate_: function() { |
| 177 chrome.send('launchApp', [this.app_.appId, APP_LAUNCH.NTP_APPS_MENU]); |
| 178 }, |
| 179 |
| 173 /** | 180 /** |
| 174 * Handlers for menu item activation. | 181 * @param {Event} e |
| 175 * @param {Event} e The activation event. | |
| 176 * @private | 182 * @private |
| 177 */ | 183 */ |
| 178 onLaunch_: function(e) { | |
| 179 chrome.send('launchApp', [this.app_.appId, APP_LAUNCH.NTP_APPS_MENU]); | |
| 180 }, | |
| 181 onLaunchTypeChanged_: function(e) { | 184 onLaunchTypeChanged_: function(e) { |
| 182 var pressed = e.currentTarget; | 185 var pressed = e.currentTarget; |
| 183 var app = this.app_; | 186 var app = this.app_; |
| 184 var targetLaunchType = pressed; | 187 var targetLaunchType = pressed; |
| 185 // When bookmark apps are enabled, hosted apps can only toggle between | 188 // When bookmark apps are enabled, hosted apps can only toggle between |
| 186 // open as window and open as tab. | 189 // open as window and open as tab. |
| 187 if (loadTimeData.getBoolean('enableNewBookmarkApps')) { | 190 if (loadTimeData.getBoolean('enableNewBookmarkApps')) { |
| 188 targetLaunchType = this.launchNewWindow_.checked ? | 191 targetLaunchType = this.launchNewWindow_.checked ? |
| 189 this.launchRegularTab_ : this.launchNewWindow_; | 192 this.launchRegularTab_ : this.launchNewWindow_; |
| 190 } | 193 } |
| 191 this.forAllLaunchTypes_(function(launchTypeButton, id) { | 194 this.forAllLaunchTypes_(function(launchTypeButton, id) { |
| 192 if (launchTypeButton == targetLaunchType) { | 195 if (launchTypeButton == targetLaunchType) { |
| 193 chrome.send('setLaunchType', [app.appId, id]); | 196 chrome.send('setLaunchType', [app.appId, id]); |
| 194 // Manually update the launch type. We will only get | 197 // Manually update the launch type. We will only get |
| 195 // appsPrefChangeCallback calls after changes to other NTP instances. | 198 // appsPrefChangeCallback calls after changes to other NTP instances. |
| 196 app.appData.launch_type = id; | 199 app.appData.launch_type = id; |
| 197 } | 200 } |
| 198 }); | 201 }); |
| 199 }, | 202 }, |
| 200 onShowOptions_: function(e) { | 203 |
| 204 /** @private */ |
| 205 onShowOptions_: function() { |
| 201 window.location = this.app_.appData.optionsUrl; | 206 window.location = this.app_.appData.optionsUrl; |
| 202 }, | 207 }, |
| 203 onShowDetails_: function(e) { | 208 |
| 209 /** @private */ |
| 210 onShowDetails_: function() { |
| 204 var url = this.app_.appData.detailsUrl; | 211 var url = this.app_.appData.detailsUrl; |
| 205 url = appendParam(url, 'utm_source', 'chrome-ntp-launcher'); | 212 url = appendParam(url, 'utm_source', 'chrome-ntp-launcher'); |
| 206 window.location = url; | 213 window.location = url; |
| 207 }, | 214 }, |
| 208 onUninstall_: function(e) { | 215 |
| 216 /** @private */ |
| 217 onUninstall_: function() { |
| 209 chrome.send('uninstallApp', [this.app_.appData.id]); | 218 chrome.send('uninstallApp', [this.app_.appData.id]); |
| 210 }, | 219 }, |
| 211 onCreateShortcut_: function(e) { | 220 |
| 221 /** @private */ |
| 222 onCreateShortcut_: function() { |
| 212 chrome.send('createAppShortcut', [this.app_.appData.id]); | 223 chrome.send('createAppShortcut', [this.app_.appData.id]); |
| 213 }, | 224 }, |
| 214 onShowAppInfo_: function(e) { | 225 |
| 226 /** @private */ |
| 227 onShowAppInfo_: function() { |
| 215 chrome.send('showAppInfo', [this.app_.appData.id]); | 228 chrome.send('showAppInfo', [this.app_.appData.id]); |
| 216 } | 229 } |
| 217 }; | 230 }; |
| 218 | 231 |
| 219 /** | 232 /** |
| 220 * Creates a new App object. | 233 * Creates a new App object. |
| 221 * @param {Object} appData The data object that describes the app. | 234 * @param {Object} appData The data object that describes the app. |
| 222 * @constructor | 235 * @constructor |
| 223 * @extends {HTMLDivElement} | 236 * @extends {HTMLDivElement} |
| 224 */ | 237 */ |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 setBounds: function(size, x, y) { | 354 setBounds: function(size, x, y) { |
| 342 var imgSize = size * APP_IMG_SIZE_FRACTION; | 355 var imgSize = size * APP_IMG_SIZE_FRACTION; |
| 343 this.appImgContainer_.style.width = this.appImgContainer_.style.height = | 356 this.appImgContainer_.style.width = this.appImgContainer_.style.height = |
| 344 toCssPx(imgSize); | 357 toCssPx(imgSize); |
| 345 this.style.width = this.style.height = toCssPx(size); | 358 this.style.width = this.style.height = toCssPx(size); |
| 346 this.style.left = toCssPx(x); | 359 this.style.left = toCssPx(x); |
| 347 this.style.right = toCssPx(x); | 360 this.style.right = toCssPx(x); |
| 348 this.style.top = toCssPx(y); | 361 this.style.top = toCssPx(y); |
| 349 }, | 362 }, |
| 350 | 363 |
| 351 onBlur_: function(e) { | 364 /** @private */ |
| 365 onBlur_: function() { |
| 352 this.classList.remove('click-focus'); | 366 this.classList.remove('click-focus'); |
| 353 this.appContents_.classList.remove('suppress-active'); | 367 this.appContents_.classList.remove('suppress-active'); |
| 354 }, | 368 }, |
| 355 | 369 |
| 356 /** | 370 /** |
| 357 * Invoked when an app is clicked. | 371 * Invoked when an app is clicked. |
| 358 * @param {Event} e The click/auxclick event. | 372 * @param {Event} e The click/auxclick event. |
| 359 * @private | 373 * @private |
| 360 */ | 374 */ |
| 361 onClick_: function(e) { | 375 onClick_: function(e) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 385 } | 399 } |
| 386 }, | 400 }, |
| 387 | 401 |
| 388 /** | 402 /** |
| 389 * Adds a node to the list of targets that will launch the app. This list | 403 * Adds a node to the list of targets that will launch the app. This list |
| 390 * is also used in onMousedown to determine whether the app contents should | 404 * is also used in onMousedown to determine whether the app contents should |
| 391 * be shown as active (if we don't do this, then clicking anywhere in | 405 * be shown as active (if we don't do this, then clicking anywhere in |
| 392 * appContents, even a part that is outside the ideally clickable region, | 406 * appContents, even a part that is outside the ideally clickable region, |
| 393 * will cause the app icon to look active). | 407 * will cause the app icon to look active). |
| 394 * @param {HTMLElement} node The node that should be clickable. | 408 * @param {HTMLElement} node The node that should be clickable. |
| 409 * @private |
| 395 */ | 410 */ |
| 396 addLaunchClickTarget_: function(node) { | 411 addLaunchClickTarget_: function(node) { |
| 397 node.classList.add('launch-click-target'); | 412 node.classList.add('launch-click-target'); |
| 398 node.addEventListener('click', this.onClick_.bind(this)); | 413 node.addEventListener('click', this.onClick_.bind(this)); |
| 399 node.addEventListener('auxclick', this.onClick_.bind(this)); | 414 node.addEventListener('auxclick', this.onClick_.bind(this)); |
| 400 }, | 415 }, |
| 401 | 416 |
| 402 /** | 417 /** |
| 403 * Handler for mousedown on the App. Adds a class that allows us to | 418 * Handler for mousedown on the App. Adds a class that allows us to |
| 404 * not display as :active for right clicks (specifically, don't pulse on | 419 * not display as :active for right clicks (specifically, don't pulse on |
| 405 * these occasions). Also, we don't pulse for clicks that aren't within the | 420 * these occasions). Also, we don't pulse for clicks that aren't within the |
| 406 * clickable regions. | 421 * clickable regions. |
| 407 * @param {Event} e The mousedown event. | 422 * @param {Event} e The mousedown event. |
| 423 * @private |
| 408 */ | 424 */ |
| 409 onMousedown_: function(e) { | 425 onMousedown_: function(e) { |
| 410 // If the current platform uses middle click to autoscroll and this | 426 // If the current platform uses middle click to autoscroll and this |
| 411 // mousedown isn't handled, onClick_() will never fire. crbug.com/142939 | 427 // mousedown isn't handled, onClick_() will never fire. crbug.com/142939 |
| 412 if (e.button == 1) | 428 if (e.button == 1) |
| 413 e.preventDefault(); | 429 e.preventDefault(); |
| 414 | 430 |
| 415 if (e.button == 2 || | 431 if (e.button == 2 || |
| 416 !findAncestorByClass(/** @type {Element} */(e.target), | 432 !findAncestorByClass(/** @type {Element} */(e.target), |
| 417 'launch-click-target')) { | 433 'launch-click-target')) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 435 this.loadIcon(); | 451 this.loadIcon(); |
| 436 }, | 452 }, |
| 437 | 453 |
| 438 /** | 454 /** |
| 439 * The data and preferences for this app. | 455 * The data and preferences for this app. |
| 440 * @type {Object} | 456 * @type {Object} |
| 441 */ | 457 */ |
| 442 set appData(data) { this.appData_ = data; }, | 458 set appData(data) { this.appData_ = data; }, |
| 443 get appData() { return this.appData_; }, | 459 get appData() { return this.appData_; }, |
| 444 | 460 |
| 461 /** @type {string} */ |
| 445 get appId() { return this.appData_.id; }, | 462 get appId() { return this.appData_.id; }, |
| 446 | 463 |
| 447 /** | 464 /** |
| 448 * Returns a pointer to the context menu for this app. All apps share the | 465 * Returns a pointer to the context menu for this app. All apps share the |
| 449 * singleton AppContextMenu. This function is called by the | 466 * singleton AppContextMenu. This function is called by the |
| 450 * ContextMenuHandler in response to the 'contextmenu' event. | 467 * ContextMenuHandler in response to the 'contextmenu' event. |
| 451 * @type {cr.ui.Menu} | 468 * @type {cr.ui.Menu} |
| 452 */ | 469 */ |
| 453 get contextMenu() { | 470 get contextMenu() { |
| 454 var menu = AppContextMenu.getInstance(); | 471 var menu = AppContextMenu.getInstance(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 } | 572 } |
| 556 | 573 |
| 557 this.addTileAt(new App(appData), index, animate); | 574 this.addTileAt(new App(appData), index, animate); |
| 558 }, | 575 }, |
| 559 | 576 |
| 560 /** | 577 /** |
| 561 * Handler for 'cardselected' event, fired when |this| is selected. The | 578 * Handler for 'cardselected' event, fired when |this| is selected. The |
| 562 * first time this is called, we load all the app icons. | 579 * first time this is called, we load all the app icons. |
| 563 * @private | 580 * @private |
| 564 */ | 581 */ |
| 565 onCardSelected_: function(e) { | 582 onCardSelected_: function() { |
| 566 var apps = this.querySelectorAll('.app.icon-loading'); | 583 var apps = this.querySelectorAll('.app.icon-loading'); |
| 567 for (var i = 0; i < apps.length; i++) { | 584 for (var i = 0; i < apps.length; i++) { |
| 568 apps[i].loadIcon(); | 585 apps[i].loadIcon(); |
| 569 } | 586 } |
| 570 }, | 587 }, |
| 571 | 588 |
| 572 /** | 589 /** |
| 573 * Handler for tile additions to this page. | 590 * Handler for tile additions to this page. |
| 574 * @param {Event} e The tilePage:tile_added event. | 591 * @param {Event} e The tilePage:tile_added event. |
| 592 * @private |
| 575 */ | 593 */ |
| 576 onTileAdded_: function(e) { | 594 onTileAdded_: function(e) { |
| 577 assert(e.currentTarget == this); | 595 assert(e.currentTarget == this); |
| 578 assert(e.addedTile.firstChild instanceof App); | 596 assert(e.addedTile.firstChild instanceof App); |
| 579 if (this.classList.contains('selected-card')) | 597 if (this.classList.contains('selected-card')) |
| 580 e.addedTile.firstChild.loadIcon(); | 598 e.addedTile.firstChild.loadIcon(); |
| 581 }, | 599 }, |
| 582 | 600 |
| 583 /** | 601 /** |
| 584 * A handler for when the apps page is scrolled (then we need to reposition | 602 * A handler for when the apps page is scrolled (then we need to reposition |
| 585 * the bubbles. | 603 * the bubbles. |
| 586 * @private | 604 * @private |
| 587 */ | 605 */ |
| 588 onScroll_: function(e) { | 606 onScroll_: function() { |
| 589 if (!this.selected) | 607 if (!this.selected) |
| 590 return; | 608 return; |
| 591 for (var i = 0; i < this.tileElements_.length; i++) { | 609 for (var i = 0; i < this.tileElements_.length; i++) { |
| 592 var app = this.tileElements_[i].firstChild; | 610 var app = this.tileElements_[i].firstChild; |
| 593 assert(app instanceof App); | 611 assert(app instanceof App); |
| 594 } | 612 } |
| 595 }, | 613 }, |
| 596 | 614 |
| 597 /** @override */ | 615 /** @override */ |
| 598 doDragOver: function(e) { | 616 doDragOver: function(e) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 chrome.send('launchApp', [appId, APP_LAUNCH.NTP_APP_RE_ENABLE]); | 745 chrome.send('launchApp', [appId, APP_LAUNCH.NTP_APP_RE_ENABLE]); |
| 728 } | 746 } |
| 729 | 747 |
| 730 return { | 748 return { |
| 731 APP_LAUNCH: APP_LAUNCH, | 749 APP_LAUNCH: APP_LAUNCH, |
| 732 App: App, | 750 App: App, |
| 733 AppsPage: AppsPage, | 751 AppsPage: AppsPage, |
| 734 launchAppAfterEnable: launchAppAfterEnable, | 752 launchAppAfterEnable: launchAppAfterEnable, |
| 735 }; | 753 }; |
| 736 }); | 754 }); |
| OLD | NEW |