Home | History | Annotate | Download | only in ntp4
      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
      3 // found in the LICENSE file.
      4 
      5 /**
      6  * @fileoverview The recently closed menu: button, model data, and menu.
      7  */
      8 
      9 cr.define('ntp', function() {
     10   'use strict';
     11 
     12   /**
     13    * Returns the text used for a recently closed window.
     14    * @param {number} numTabs Number of tabs in the window.
     15    * @return {string} The text to use.
     16    */
     17   function formatTabsText(numTabs) {
     18     if (numTabs == 1)
     19       return loadTimeData.getString('closedwindowsingle');
     20     return loadTimeData.getStringF('closedwindowmultiple', numTabs);
     21   }
     22 
     23   var Menu = cr.ui.Menu;
     24   var MenuItem = cr.ui.MenuItem;
     25   var MenuButton = cr.ui.MenuButton;
     26   var RecentMenuButton = cr.ui.define('button');
     27 
     28   RecentMenuButton.prototype = {
     29     __proto__: MenuButton.prototype,
     30 
     31     decorate: function() {
     32       MenuButton.prototype.decorate.call(this);
     33       this.menu = new Menu;
     34       cr.ui.decorate(this.menu, Menu);
     35       this.menu.classList.add('footer-menu');
     36       document.body.appendChild(this.menu);
     37 
     38       this.needsRebuild_ = true;
     39       this.anchorType = cr.ui.AnchorType.ABOVE;
     40       this.invertLeftRight = true;
     41     },
     42 
     43     /**
     44      * Shows the menu, first rebuilding it if necessary.
     45      * TODO(estade): the right of the menu should align with the right of the
     46      * button.
     47      * @override
     48      */
     49     showMenu: function(shouldSetFocus) {
     50       if (this.needsRebuild_) {
     51         this.menu.textContent = '';
     52         this.dataItems_.forEach(this.addItem_, this);
     53         this.needsRebuild_ = false;
     54       }
     55 
     56       MenuButton.prototype.showMenu.apply(this, arguments);
     57     },
     58 
     59     /**
     60      * Sets the menu model data.
     61      * @param {Array} dataItems Array of objects that describe the apps.
     62      */
     63     set dataItems(dataItems) {
     64       this.dataItems_ = dataItems;
     65       this.needsRebuild_ = true;
     66       this.hidden = !dataItems.length;
     67     },
     68 
     69     /**
     70      * Adds an app to the menu.
     71      * @param {Object} data An object encapsulating all data about the app.
     72      * @private
     73      */
     74     addItem_: function(data) {
     75       var isWindow = data.type == 'window';
     76       var a = this.ownerDocument.createElement('a');
     77       a.className = 'footer-menu-item';
     78       if (isWindow) {
     79         a.href = '';
     80         a.classList.add('recent-window');
     81         a.textContent = formatTabsText(data.tabs.length);
     82         a.title = data.tabs.map(function(tab) { return tab.title; }).join('\n');
     83       } else {
     84         a.href = data.url;
     85         a.style.backgroundImage = getFaviconImageSet(data.url);
     86         a.textContent = data.title;
     87       }
     88 
     89       function onActivated(e) {
     90         ntp.logTimeToClick('RecentlyClosed');
     91         chrome.send('recordAppLaunchByURL',
     92                     [encodeURIComponent(data.url),
     93                      ntp.APP_LAUNCH.NTP_RECENTLY_CLOSED]);
     94         var index = Array.prototype.indexOf.call(a.parentNode.children, a);
     95         var orig = e.originalEvent;
     96         var button = 0;
     97         if (orig instanceof MouseEvent)
     98           button = orig.button;
     99         var params = [data.sessionId,
    100                       index,
    101                       button,
    102                       orig.altKey,
    103                       orig.ctrlKey,
    104                       orig.metaKey,
    105                       orig.shiftKey];
    106         chrome.send('reopenTab', params);
    107 
    108         e.preventDefault();
    109         e.stopPropagation();
    110       }
    111       a.addEventListener('activate', onActivated);
    112       a.addEventListener('click', function(e) { e.preventDefault(); });
    113 
    114       this.menu.appendChild(a);
    115       cr.ui.decorate(a, MenuItem);
    116     },
    117   };
    118 
    119   return {
    120     RecentMenuButton: RecentMenuButton,
    121   };
    122 });
    123