| OLD | NEW |
| 1 // Copyright (c) 2010 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 function $(id) { | 5 function $(id) { |
| 6 return document.getElementById(id); | 6 return document.getElementById(id); |
| 7 } | 7 } |
| 8 | 8 |
| 9 // Returns the largest size icon, or a default icon, for the given |app|. | 9 // Returns the largest size icon, or a default icon, for the given |app|. |
| 10 function getIconURL(app) { | 10 function getIconURL(app) { |
| 11 if (!app.icons || app.icons.length == 0) { | 11 if (!app.icons || app.icons.length == 0) { |
| 12 return chrome.extension.getURL("icon.png"); | 12 return chrome.extension.getURL('icon.png'); |
| 13 } | 13 } |
| 14 var largest = {size:0}; | 14 var largest = {size:0}; |
| 15 for (var i = 0; i < app.icons.length; i++) { | 15 for (var i = 0; i < app.icons.length; i++) { |
| 16 var icon = app.icons[i]; | 16 var icon = app.icons[i]; |
| 17 if (icon.size > largest.size) { | 17 if (icon.size > largest.size) { |
| 18 largest = icon; | 18 largest = icon; |
| 19 } | 19 } |
| 20 } | 20 } |
| 21 return largest.url; | 21 return largest.url; |
| 22 } | 22 } |
| 23 | 23 |
| 24 function launchApp(id) { | 24 function launchApp(id) { |
| 25 chrome.management.launchApp(id); | 25 chrome.management.launchApp(id); |
| 26 window.close(); // Only needed on OSX because of crbug.com/63594 | 26 window.close(); // Only needed on OSX because of crbug.com/63594 |
| 27 } | 27 } |
| 28 | 28 |
| 29 // Adds DOM nodes for |app| into |appsDiv|. | 29 // Adds DOM nodes for |app| into |appsDiv|. |
| 30 function addApp(appsDiv, app, selected) { | 30 function addApp(appsDiv, app, selected) { |
| 31 var div = document.createElement("div"); | 31 var div = document.createElement('div'); |
| 32 div.className = "app" + (selected ? " app_selected" : ""); | 32 div.className = 'app' + (selected ? ' app_selected' : ''); |
| 33 | 33 |
| 34 div.onclick = function() { | 34 div.onclick = function() { |
| 35 launchApp(app.id); | 35 launchApp(app.id); |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 var img = document.createElement("img"); | 38 var img = document.createElement('img'); |
| 39 img.src = getIconURL(app); | 39 img.src = getIconURL(app); |
| 40 div.appendChild(img); | 40 div.appendChild(img); |
| 41 | 41 |
| 42 var title = document.createElement("span"); | 42 var title = document.createElement('span'); |
| 43 title.className = "app_title"; | 43 title.className = 'app_title'; |
| 44 title.innerText = app.name; | 44 title.innerText = app.name; |
| 45 div.appendChild(title); | 45 div.appendChild(title); |
| 46 | 46 |
| 47 appsDiv.appendChild(div); | 47 appsDiv.appendChild(div); |
| 48 } | 48 } |
| 49 | 49 |
| 50 // The list of all apps & extensions. | 50 // The list of all apps & extensions. |
| 51 var completeList = []; | 51 var completeList = []; |
| 52 | 52 |
| 53 // A filtered list of apps we actually want to show. | 53 // A filtered list of apps we actually want to show. |
| 54 var appList = []; | 54 var appList = []; |
| 55 | 55 |
| 56 // The index of an app in |appList| that should be highlighted. | 56 // The index of an app in |appList| that should be highlighted. |
| 57 var selectedIndex = 0; | 57 var selectedIndex = 0; |
| 58 | 58 |
| 59 function reloadAppDisplay() { | 59 function reloadAppDisplay() { |
| 60 var appsDiv = $("apps"); | 60 var appsDiv = $('apps'); |
| 61 | 61 |
| 62 // Empty the current content. | 62 // Empty the current content. |
| 63 appsDiv.innerHTML = ""; | 63 appsDiv.innerHTML = ''; |
| 64 | 64 |
| 65 for (var i = 0; i < appList.length; i++) { | 65 for (var i = 0; i < appList.length; i++) { |
| 66 var item = appList[i]; | 66 var item = appList[i]; |
| 67 addApp(appsDiv, item, i == selectedIndex); | 67 addApp(appsDiv, item, i == selectedIndex); |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Puts only enabled apps from completeList into appList. | 71 // Puts only enabled apps from completeList into appList. |
| 72 function rebuildAppList(filter) { | 72 function rebuildAppList(filter) { |
| 73 selectedIndex = 0; | 73 selectedIndex = 0; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 // In order to keep the popup bubble from shrinking as your search narrows the | 88 // In order to keep the popup bubble from shrinking as your search narrows the |
| 89 // list of apps shown, we set an explicit width on the outermost div. | 89 // list of apps shown, we set an explicit width on the outermost div. |
| 90 var didSetExplicitWidth = false; | 90 var didSetExplicitWidth = false; |
| 91 | 91 |
| 92 function adjustWidthIfNeeded(filter) { | 92 function adjustWidthIfNeeded(filter) { |
| 93 if (filter.length > 0 && !didSetExplicitWidth) { | 93 if (filter.length > 0 && !didSetExplicitWidth) { |
| 94 // Set an explicit width, correcting for any scroll bar present. | 94 // Set an explicit width, correcting for any scroll bar present. |
| 95 var outer = $("outer"); | 95 var outer = $('outer'); |
| 96 var correction = window.innerWidth - document.documentElement.clientWidth; | 96 var correction = window.innerWidth - document.documentElement.clientWidth; |
| 97 var width = outer.offsetWidth; | 97 var width = outer.offsetWidth; |
| 98 $("spacer_dummy").style.width = width + correction + "px"; | 98 $('spacer_dummy').style.width = width + correction + 'px'; |
| 99 didSetExplicitWidth = true; | 99 didSetExplicitWidth = true; |
| 100 } | 100 } |
| 101 } | 101 } |
| 102 | 102 |
| 103 // Shows the list of apps based on the search box contents. | 103 // Shows the list of apps based on the search box contents. |
| 104 function onSearchInput() { | 104 function onSearchInput() { |
| 105 var filter = $("search").value; | 105 var filter = $('search').value; |
| 106 adjustWidthIfNeeded(filter); | 106 adjustWidthIfNeeded(filter); |
| 107 rebuildAppList(filter); | 107 rebuildAppList(filter); |
| 108 reloadAppDisplay(); | 108 reloadAppDisplay(); |
| 109 } | 109 } |
| 110 | 110 |
| 111 function compare(a, b) { | 111 function compare(a, b) { |
| 112 return (a > b) ? 1 : (a == b ? 0 : -1); | 112 return (a > b) ? 1 : (a == b ? 0 : -1); |
| 113 } | 113 } |
| 114 | 114 |
| 115 function compareByName(app1, app2) { | 115 function compareByName(app1, app2) { |
| 116 return compare(app1.name.toLowerCase(), app2.name.toLowerCase()); | 116 return compare(app1.name.toLowerCase(), app2.name.toLowerCase()); |
| 117 } | 117 } |
| 118 | 118 |
| 119 function onLoad() { | |
| 120 chrome.management.getAll(function(info) { | |
| 121 var appCount = 0; | |
| 122 for (var i = 0; i < info.length; i++) { | |
| 123 if (info[i].isApp) { | |
| 124 appCount++; | |
| 125 } | |
| 126 } | |
| 127 if (appCount == 0) { | |
| 128 $("search").style.display = "none"; | |
| 129 $("appstore_link").style.display = ""; | |
| 130 return; | |
| 131 } | |
| 132 completeList = info.sort(compareByName); | |
| 133 onSearchInput(); | |
| 134 }); | |
| 135 } | |
| 136 | |
| 137 // Changes the selected app in the list. | 119 // Changes the selected app in the list. |
| 138 function changeSelection(newIndex) { | 120 function changeSelection(newIndex) { |
| 139 if (newIndex >= 0 && newIndex <= appList.length - 1) { | 121 if (newIndex >= 0 && newIndex <= appList.length - 1) { |
| 140 selectedIndex = newIndex; | 122 selectedIndex = newIndex; |
| 141 reloadAppDisplay(); | 123 reloadAppDisplay(); |
| 142 | 124 |
| 143 var selected = document.getElementsByClassName("app_selected")[0]; | 125 var selected = document.getElementsByClassName('app_selected')[0]; |
| 144 var rect = selected.getBoundingClientRect(); | 126 var rect = selected.getBoundingClientRect(); |
| 145 if (newIndex == 0) { | 127 if (newIndex == 0) { |
| 146 window.scrollTo(0, 0); | 128 window.scrollTo(0, 0); |
| 147 } else if (newIndex == appList.length - 1) { | 129 } else if (newIndex == appList.length - 1) { |
| 148 window.scrollTo(0, document.height); | 130 window.scrollTo(0, document.height); |
| 149 } else if (rect.top < 0) { | 131 } else if (rect.top < 0) { |
| 150 window.scrollBy(0, rect.top); | 132 window.scrollBy(0, rect.top); |
| 151 } else if (rect.bottom > innerHeight) { | 133 } else if (rect.bottom > innerHeight) { |
| 152 window.scrollBy(0, rect.bottom - innerHeight); | 134 window.scrollBy(0, rect.bottom - innerHeight); |
| 153 } | 135 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 184 break; | 166 break; |
| 185 case keys.ENTER: | 167 case keys.ENTER: |
| 186 var app = appList[selectedIndex]; | 168 var app = appList[selectedIndex]; |
| 187 if (app) { | 169 if (app) { |
| 188 launchApp(app.id); | 170 launchApp(app.id); |
| 189 } | 171 } |
| 190 break; | 172 break; |
| 191 default: | 173 default: |
| 192 // Focus the search box and return true so you can just start typing even | 174 // Focus the search box and return true so you can just start typing even |
| 193 // when the search box isn't focused. | 175 // when the search box isn't focused. |
| 194 $("search").focus(); | 176 $('search').focus(); |
| 195 return true; | 177 return true; |
| 196 } | 178 } |
| 197 return false; | 179 return false; |
| 198 }; | 180 }; |
| 181 |
| 182 |
| 183 // Initalize the popup window. |
| 184 document.addEventListener('DOMContentLoaded', function () { |
| 185 chrome.management.getAll(function(info) { |
| 186 var appCount = 0; |
| 187 for (var i = 0; i < info.length; i++) { |
| 188 if (info[i].isApp) { |
| 189 appCount++; |
| 190 } |
| 191 } |
| 192 if (appCount == 0) { |
| 193 $('search').style.display = 'none'; |
| 194 $('appstore_link').style.display = ''; |
| 195 return; |
| 196 } |
| 197 completeList = info.sort(compareByName); |
| 198 onSearchInput(); |
| 199 }); |
| 200 |
| 201 $('search').addEventListener('input', onSearchInput); |
| 202 |
| 203 // Opens the webstore in a new tab. |
| 204 document.querySelector('#appstore_link button').addEventListener('click', |
| 205 function () { |
| 206 chrome.tabs.create({ |
| 207 'url':'https://chrome.google.com/webstore', |
| 208 'selected':true |
| 209 }); |
| 210 window.close(); |
| 211 }); |
| 212 }); |
| 213 |
| OLD | NEW |