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 3// found in the LICENSE file. 4 5/** 6 * @fileoverview The recently closed menu: button, model data, and menu. 7 */ 8 9cr.define('ntp4', function() { 10 'use strict'; 11 12 var localStrings = new LocalStrings(); 13 14 /** 15 * Returns the text used for a recently closed window. 16 * @param {number} numTabs Number of tabs in the window. 17 * @return {string} The text to use. 18 */ 19 function formatTabsText(numTabs) { 20 if (numTabs == 1) 21 return localStrings.getString('closedwindowsingle'); 22 return localStrings.getStringF('closedwindowmultiple', numTabs); 23 } 24 25 var Menu = cr.ui.Menu; 26 var MenuItem = cr.ui.MenuItem; 27 var MenuButton = cr.ui.MenuButton; 28 var RecentMenuButton = cr.ui.define('button'); 29 30 RecentMenuButton.prototype = { 31 __proto__: MenuButton.prototype, 32 33 decorate: function() { 34 MenuButton.prototype.decorate.call(this); 35 this.menu = new Menu; 36 cr.ui.decorate(this.menu, Menu); 37 this.menu.classList.add('recent-menu'); 38 document.body.appendChild(this.menu); 39 40 this.needsRebuild_ = true; 41 this.hidden = true; 42 }, 43 44 /** 45 * Shows the menu, first rebuilding it if necessary. 46 * TODO(estade): the right of the menu should align with the right of the 47 * button. 48 * @override 49 */ 50 showMenu: function() { 51 if (this.needsRebuild_) { 52 this.menu.textContent = ''; 53 this.dataItems_.forEach(this.addItem_, this); 54 this.needsRebuild_ = false; 55 } 56 57 MenuButton.prototype.showMenu.call(this); 58 }, 59 60 /** 61 * Sets the menu model data. 62 * @param {Array} dataItems Array of objects that describe the apps. 63 */ 64 set dataItems(dataItems) { 65 this.dataItems_ = dataItems; 66 this.needsRebuild_ = true; 67 this.hidden = dataItems.length == 0; 68 }, 69 70 /** 71 * Adds an app to the menu. 72 * @param {Object} data An object encapsulating all data about the app. 73 * @private 74 */ 75 addItem_: function(data) { 76 var isWindow = data.type == 'window'; 77 var a = this.ownerDocument.createElement('a'); 78 a.className = 'recent-menu-item'; 79 if (isWindow) { 80 a.href = ''; 81 a.classList.add('recent-window'); 82 a.textContent = formatTabsText(data.tabs.length); 83 } else { 84 a.href = data.url; 85 a.style.backgroundImage = 'url(chrome://favicon/' + data.url + ')'; 86 a.textContent = data.title; 87 // TODO(estade): add app ping url. 88 } 89 90 function onActivate(e) { 91 // TODO(estade): don't convert to string. 92 chrome.send('reopenTab', [String(data.sessionId)]); 93 e.preventDefault(); 94 } 95 a.addEventListener('activate', onActivate); 96 97 this.menu.appendChild(a); 98 cr.ui.decorate(a, MenuItem); 99 }, 100 }; 101 102 return { 103 RecentMenuButton: RecentMenuButton, 104 }; 105}); 106