| OLD | NEW |
| 1 <html> | 1 <html> |
| 2 <head> | 2 <head> |
| 3 <script src="jstemplate_compiled.js" type="text/javascript"></script> | 3 <script src="jstemplate_compiled.js" type="text/javascript"></script> |
| 4 <script> | 4 <script src="tabs_api.js"></script> |
| 5 | |
| 6 tabs = {}; | |
| 7 tabIds = []; | |
| 8 | |
| 9 focusedWindowId = undefined; | |
| 10 currentWindowId = undefined; | |
| 11 | |
| 12 function bootStrap() { | |
| 13 chrome.windows.getCurrent(function(currentWindow) { | |
| 14 currentWindowId = currentWindow.id; | |
| 15 chrome.windows.getLastFocused(function(focusedWindow) { | |
| 16 focusedWindowId = focusedWindow.id; | |
| 17 loadWindowList(); | |
| 18 }); | |
| 19 }); | |
| 20 } | |
| 21 | |
| 22 function isInt(i) { | |
| 23 return (typeof i == "number") && !(i % 1) && !isNaN(i); | |
| 24 } | |
| 25 | |
| 26 function loadWindowList() { | |
| 27 chrome.windows.getAll({ populate: true }, function(windowList) { | |
| 28 tabs = {}; | |
| 29 tabIds = []; | |
| 30 for (var i = 0; i < windowList.length; i++) { | |
| 31 windowList[i].current = (windowList[i].id == currentWindowId); | |
| 32 windowList[i].focused = (windowList[i].id == focusedWindowId); | |
| 33 | |
| 34 for (var j = 0; j < windowList[i].tabs.length; j++) { | |
| 35 tabIds[tabIds.length] = windowList[i].tabs[j].id; | |
| 36 tabs[windowList[i].tabs[j].id] = windowList[i].tabs[j]; | |
| 37 } | |
| 38 } | |
| 39 | |
| 40 var input = new JsExprContext(windowList); | |
| 41 var output = document.getElementById('windowList'); | |
| 42 jstProcess(input, output); | |
| 43 }); | |
| 44 } | |
| 45 | |
| 46 function updateTabData(id) { | |
| 47 var retval = { | |
| 48 url: document.getElementById('url_' + id).value, | |
| 49 selected: document.getElementById('selected_' + id).value ? true : false | |
| 50 } | |
| 51 | |
| 52 return retval; | |
| 53 } | |
| 54 | |
| 55 function updateTab(id){ | |
| 56 try { | |
| 57 chrome.tabs.update(id, updateTabData(id)); | |
| 58 } catch (e) { | |
| 59 alert(e); | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 function moveTabData(id) { | |
| 64 return { | |
| 65 'index': parseInt(document.getElementById('index_' + id).value), | |
| 66 'windowId': parseInt(document.getElementById('windowId_' + id).value) | |
| 67 } | |
| 68 } | |
| 69 function moveTab(id) { | |
| 70 try { | |
| 71 chrome.tabs.move(id, moveTabData(id)); | |
| 72 } catch (e) { | |
| 73 alert(e); | |
| 74 } | |
| 75 } | |
| 76 | |
| 77 function createTabData(id) { | |
| 78 return { | |
| 79 'index': parseInt(document.getElementById('index_' + id).value), | |
| 80 'windowId': parseInt(document.getElementById('windowId_' + id).value), | |
| 81 'index': parseInt(document.getElementById('index_' + id).value), | |
| 82 'url': document.getElementById('url_' + id).value, | |
| 83 'selected': document.getElementById('selected_' + id).value ? true : false | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 function createTab() { | |
| 88 var args = createTabData('new') | |
| 89 | |
| 90 if (!isInt(args.windowId)) | |
| 91 delete args.windowId; | |
| 92 if (!isInt(args.index)) | |
| 93 delete args.index; | |
| 94 | |
| 95 try { | |
| 96 chrome.tabs.create(args); | |
| 97 } catch (e) { | |
| 98 alert(e); | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 function updateAll() { | |
| 103 try { | |
| 104 for (var i = 0; i < tabIds.length; i++) { | |
| 105 chrome.tabs.update(tabIds[i], updateTabData(tabIds[i])); | |
| 106 } | |
| 107 } catch(e) { | |
| 108 alert(e); | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 function moveAll() { | |
| 113 appendToLog('moving all'); | |
| 114 try { | |
| 115 for (var i = 0; i < tabIds.length; i++) { | |
| 116 chrome.tabs.move(tabIds[i], moveTabData(tabIds[i])); | |
| 117 } | |
| 118 } catch(e) { | |
| 119 alert(e); | |
| 120 } | |
| 121 } | |
| 122 | |
| 123 function removeTab(tabId) { | |
| 124 try { | |
| 125 chrome.tabs.remove(tabId, function() { | |
| 126 appendToLog('tab: ' + tabId + ' removed.'); | |
| 127 }); | |
| 128 } catch (e) { | |
| 129 alert(e); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 function appendToLog(logLine) { | |
| 134 document.getElementById('log') | |
| 135 .appendChild(document.createElement('div')) | |
| 136 .innerText = "> " + logLine; | |
| 137 } | |
| 138 | |
| 139 function clearLog() { | |
| 140 document.getElementById('log').innerText = ''; | |
| 141 } | |
| 142 | |
| 143 chrome.windows.onCreated.addListener(function(createInfo) { | |
| 144 appendToLog('windows.onCreated -- window: ' + createInfo.id); | |
| 145 loadWindowList(); | |
| 146 }); | |
| 147 | |
| 148 chrome.windows.onFocusChanged.addListener(function(windowId) { | |
| 149 focusedWindowId = windowId; | |
| 150 appendToLog('windows.onFocusChanged -- window: ' + windowId); | |
| 151 loadWindowList(); | |
| 152 }); | |
| 153 | |
| 154 chrome.windows.onRemoved.addListener(function(windowId) { | |
| 155 appendToLog('windows.onRemoved -- window: ' + windowId); | |
| 156 loadWindowList(); | |
| 157 }); | |
| 158 | |
| 159 chrome.tabs.onCreated.addListener(function(tab) { | |
| 160 appendToLog('tabs.onCreated -- window: ' + tab.windowId + ' tab: ' + tab.id +
' title: ' + tab.title + ' index ' + tab.index + ' url ' + tab.url); | |
| 161 loadWindowList(); | |
| 162 }); | |
| 163 | |
| 164 chrome.tabs.onAttached.addListener(function(tabId, props) { | |
| 165 appendToLog('tabs.onAttached -- window: ' + props.newWindowId + ' tab: ' + tab
Id + ' index ' + props.newPosition); | |
| 166 loadWindowList(); | |
| 167 }); | |
| 168 | |
| 169 chrome.tabs.onMoved.addListener(function(tabId, props) { | |
| 170 appendToLog('tabs.onMoved -- window: ' + props.windowId + ' tab: ' + tabId + '
from ' + props.fromIndex + ' to ' + props.toIndex); | |
| 171 loadWindowList(); | |
| 172 }); | |
| 173 | |
| 174 function refreshTab(tabId) { | |
| 175 chrome.tabs.get(tabId, function(tab) { | |
| 176 var input = new JsExprContext(tab); | |
| 177 var output = document.getElementById('tab_' + tab.id); | |
| 178 jstProcess(input, output); | |
| 179 appendToLog('tab refreshed -- tabId: ' + tab.id + ' url: ' + tab.url); | |
| 180 }); | |
| 181 } | |
| 182 | |
| 183 chrome.tabs.onUpdated.addListener(function(tabId, props) { | |
| 184 appendToLog('tabs.onUpdated -- tab: ' + tabId + ' status ' + props.status + '
url ' + props.url); | |
| 185 refreshTab(tabId); | |
| 186 }); | |
| 187 | |
| 188 chrome.tabs.onDetached.addListener(function(tabId, props) { | |
| 189 appendToLog('tabs.onDetached -- window: ' + props.oldWindowId + ' tab: ' + tab
Id + ' index ' + props.oldPosition); | |
| 190 loadWindowList(); | |
| 191 }); | |
| 192 | |
| 193 chrome.tabs.onSelectionChanged.addListener(function(tabId, props) { | |
| 194 appendToLog('tabs.onSelectionChanged -- window: ' + props.windowId + ' tab: '
+ tabId); | |
| 195 loadWindowList(); | |
| 196 }); | |
| 197 | |
| 198 chrome.tabs.onRemoved.addListener(function(tabId) { | |
| 199 appendToLog('tabs.onRemoved -- tab: ' + tabId); | |
| 200 loadWindowList(); | |
| 201 }); | |
| 202 | |
| 203 function createWindow() { | |
| 204 var args = { | |
| 205 'left': parseInt(document.getElementById('new_window_left').value), | |
| 206 'top': parseInt(document.getElementById('new_window_top').value), | |
| 207 'width': parseInt(document.getElementById('new_window_width').value), | |
| 208 'height': parseInt(document.getElementById('new_window_height').value), | |
| 209 'url': document.getElementById('new_window_url').value | |
| 210 } | |
| 211 | |
| 212 if (!isInt(args.left)) | |
| 213 delete args.left; | |
| 214 if (!isInt(args.top)) | |
| 215 delete args.top; | |
| 216 if (!isInt(args.width)) | |
| 217 delete args.width; | |
| 218 if (!isInt(args.height)) | |
| 219 delete args.height; | |
| 220 if (!args.url) | |
| 221 delete args.url; | |
| 222 | |
| 223 try { | |
| 224 chrome.windows.create(args); | |
| 225 } catch(e) { | |
| 226 alert(e); | |
| 227 } | |
| 228 } | |
| 229 | |
| 230 function refreshWindow(windowId) { | |
| 231 chrome.windows.get(windowId, function(window) { | |
| 232 chrome.tabs.getAllInWindow(window.id, function(tabList) { | |
| 233 window.tabs = tabList; | |
| 234 var input = new JsExprContext(window); | |
| 235 var output = document.getElementById('window_' + window.id); | |
| 236 jstProcess(input, output); | |
| 237 appendToLog('window refreshed -- windowId: ' + window.id + ' tab count:' +
window.tabs.length); | |
| 238 }); | |
| 239 }); | |
| 240 } | |
| 241 | |
| 242 function updateWindowData(id) { | |
| 243 var retval = { | |
| 244 left: parseInt(document.getElementById('left_' + id).value), | |
| 245 top: parseInt(document.getElementById('top_' + id).value), | |
| 246 width: parseInt(document.getElementById('width_' + id).value), | |
| 247 height: parseInt(document.getElementById('height_' + id).value) | |
| 248 } | |
| 249 if (!isInt(retval.left)) | |
| 250 delete retval.left; | |
| 251 if (!isInt(retval.top)) | |
| 252 delete retval.top; | |
| 253 if (!isInt(retval.width)) | |
| 254 delete retval.width; | |
| 255 if (!isInt(retval.height)) | |
| 256 delete retval.height; | |
| 257 | |
| 258 return retval; | |
| 259 } | |
| 260 | |
| 261 function updateWindow(id){ | |
| 262 try { | |
| 263 chrome.windows.update(id, updateWindowData(id)); | |
| 264 } catch (e) { | |
| 265 alert(e); | |
| 266 } | |
| 267 } | |
| 268 | |
| 269 function removeWindow(windowId) { | |
| 270 try { | |
| 271 chrome.windows.remove(windowId, function() { | |
| 272 appendToLog('window: ' + windowId + ' removed.'); | |
| 273 }); | |
| 274 } catch (e) { | |
| 275 alert(e); | |
| 276 } | |
| 277 } | |
| 278 | |
| 279 function refreshSelectedTab(windowId) { | |
| 280 chrome.tabs.getSelected(windowId, function(tab) { | |
| 281 var input = new JsExprContext(tab); | |
| 282 var output = document.getElementById('tab_' + tab.id); | |
| 283 jstProcess(input, output); | |
| 284 appendToLog('selected tab refreshed -- tabId: ' + tab.id + ' url:' + tab.url
); | |
| 285 }); | |
| 286 } | |
| 287 | |
| 288 </script> | |
| 289 </head> | 5 </head> |
| 290 <body onload="bootStrap();"> | 6 <body> |
| 291 <div id="windowList"> | 7 <div id="windowList"> |
| 292 <div style="background-color: #AAEEEE; margin: 4px; padding: 8px; margin:
20px" jsselect="$this" | 8 <div style="background-color: #AAEEEE; margin: 4px; padding: 8px; margin:
20px" jsselect="$this" |
| 293 jsvalues="id:'window_' + id"> | 9 jsvalues="id:'window_' + id"> |
| 294 <div style="font-style: italic; width: 80px; display: inline-block"> | 10 <div style="font-style: italic; width: 80px; display: inline-block"> |
| 295 Window: <span jscontent="id"></span> | 11 Window: <span jscontent="id"></span> |
| 296 </div> | 12 </div> |
| 297 <div style="display: inline-block"> | 13 <div style="display: inline-block"> |
| 298 left: <input style="width: 60px" type="text" jsvalues="value:$this.lef
t;id:'left_' + id" /> | 14 left: <input style="width: 60px" type="text" jsvalues="value:$this.lef
t;id:'left_' + id" /> |
| 299 top: <input style="width: 60px" type="text" jsvalues="value:$this.top;
id:'top_' + id" /> | 15 top: <input style="width: 60px" type="text" jsvalues="value:$this.top;
id:'top_' + id" /> |
| 300 width: <input style="width: 60px" type="text" jsvalues="value:$this.wi
dth;id:'width_' + id" /> | 16 width: <input style="width: 60px" type="text" jsvalues="value:$this.wi
dth;id:'width_' + id" /> |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 <button onclick="loadWindowList();">Refresh</button> | 96 <button onclick="loadWindowList();">Refresh</button> |
| 381 <button onclick="updateAll();">Update All</button> | 97 <button onclick="updateAll();">Update All</button> |
| 382 <button onclick="moveAll();">Move All</button> | 98 <button onclick="moveAll();">Move All</button> |
| 383 <button onclick="clearLog();">-->Clear Log</button> | 99 <button onclick="clearLog();">-->Clear Log</button> |
| 384 <button onclick="chrome.windows.create();">New Window</button> | 100 <button onclick="chrome.windows.create();">New Window</button> |
| 385 </div> | 101 </div> |
| 386 <div id="log" style="background-color: #EEAAEE; margin: 20px; padding: 8px"> | 102 <div id="log" style="background-color: #EEAAEE; margin: 20px; padding: 8px"> |
| 387 </div> | 103 </div> |
| 388 </body> | 104 </body> |
| 389 </html> | 105 </html> |
| OLD | NEW |