| OLD | NEW |
| (Empty) | |
| 1 // tabs api test |
| 2 // browser_tests.exe --gtest_filter=ExtensionApiTest.Tabs |
| 3 |
| 4 // We have a bunch of places where we need to remember some state from one |
| 5 // test (or setup code) to subsequent tests. |
| 6 var firstWindowId = null; |
| 7 var secondWindowId = null; |
| 8 var firstTabIndex = null; |
| 9 var testTabId = null; |
| 10 |
| 11 var moveWindow1 = null; |
| 12 var moveWindow2 = null; |
| 13 var moveTabIds = {}; |
| 14 |
| 15 var testCallback = chrome.test.testCallback; |
| 16 var assertEq = chrome.test.assertEq; |
| 17 var assertTrue = chrome.test.assertTrue; |
| 18 |
| 19 chrome.test.runTests([ |
| 20 function getSelected() { |
| 21 chrome.tabs.getSelected(null, testCallback(true, function(tab) { |
| 22 assertEq("about:blank", tab.url); |
| 23 assertEq("about:blank", tab.title); |
| 24 firstWindowId = tab.windowId; |
| 25 firstTabIndex = tab.index; |
| 26 })); |
| 27 }, |
| 28 |
| 29 function openNewTab() { |
| 30 // TODO(asargent) Add more tests for the following cases: |
| 31 // 1) two windows open. create tab in "other" window. |
| 32 // 2) don't pass windowId. confirm created in "this" window. |
| 33 // 3) pass index. confirm placed at correct index position. |
| 34 // 4) pass selected. confirm is selected. |
| 35 chrome.tabs.create({"windowId" : firstWindowId, "selected" : false}, |
| 36 testCallback(true, function(tab){ |
| 37 assertTrue(tab.index > firstTabIndex); |
| 38 assertEq(firstWindowId, tab.windowId); |
| 39 assertEq(false, tab.selected); |
| 40 assertEq("chrome://newtab/", tab.url); |
| 41 })); |
| 42 }, |
| 43 |
| 44 // Setup a new window for later tests, and open some tabs in the |
| 45 // first and second windows. |
| 46 function createWindow() { |
| 47 // TODO(asargent) Add more tests for: |
| 48 // 1) window sizing/positioning. |
| 49 // 2) passed url (relative & absolute) |
| 50 chrome.windows.create({}, testCallback(false, function(win) { |
| 51 assertTrue(win.id > 0); |
| 52 secondWindowId = win.id; |
| 53 chrome.tabs.create({"windowId" : firstWindowId, "url" : "chrome://a"}, |
| 54 testCallback(false, null)); |
| 55 chrome.tabs.create({"windowId" : secondWindowId, "url" : "chrome://b"}, |
| 56 testCallback(true, null)); |
| 57 })); |
| 58 }, |
| 59 |
| 60 function getAllFirstWindow() { |
| 61 // TODO(asargent) Add test for passing null for windowId - this should |
| 62 // default to the "current" window. |
| 63 chrome.tabs.getAllInWindow(firstWindowId, |
| 64 testCallback(true, function(tabs) { |
| 65 assertEq(3, tabs.length); |
| 66 for (var i = 0; i < tabs.length; i++) { |
| 67 assertEq(firstWindowId, tabs[i].windowId); |
| 68 assertEq(i, tabs[i].index); |
| 69 |
| 70 // The most recent tab should be selected |
| 71 assertEq((i == 2), tabs[i].selected); |
| 72 } |
| 73 assertEq("about:blank", tabs[0].url); |
| 74 assertEq("chrome://newtab/", tabs[1].url); |
| 75 assertEq("chrome://a/", tabs[2].url); |
| 76 testTabId = tabs[2].id; |
| 77 })); |
| 78 }, |
| 79 |
| 80 function getAllSecondWindow() { |
| 81 chrome.tabs.getAllInWindow(secondWindowId, |
| 82 testCallback(true, function(tabs) { |
| 83 assertEq(2, tabs.length); |
| 84 for (var i = 0; i < tabs.length; i++) { |
| 85 assertEq(secondWindowId, tabs[i].windowId); |
| 86 assertEq(i, tabs[i].index); |
| 87 } |
| 88 assertEq("chrome://newtab/", tabs[0].url); |
| 89 assertEq("chrome://b/", tabs[1].url); |
| 90 })); |
| 91 }, |
| 92 |
| 93 function update() { |
| 94 chrome.tabs.update(testTabId, {"selected":true, "url": "chrome://c"}, |
| 95 testCallback(false, function(){ |
| 96 chrome.tabs.getSelected(firstWindowId, testCallback(true, function(tab) { |
| 97 assertEq("chrome://c/", tab.url); |
| 98 assertEq(true, tab.selected); |
| 99 })); |
| 100 })); |
| 101 }, |
| 102 |
| 103 // Create 2 new windows, close existing windows. |
| 104 function moveTabsSetup1() { |
| 105 chrome.windows.create({}, testCallback(false, function(win) { |
| 106 moveWindow1 = win.id; |
| 107 })); |
| 108 chrome.windows.create({}, testCallback(false, function(win) { |
| 109 moveWindow2 = win.id; |
| 110 })); |
| 111 chrome.windows.remove(firstWindowId, testCallback(false, null)); |
| 112 chrome.windows.remove(secondWindowId, testCallback(true, null)); |
| 113 }, |
| 114 |
| 115 // Create a bunch of tabs and record the resulting ids. |
| 116 function moveTabsSetup2() { |
| 117 var letters = ['a', 'b', 'c', 'd', 'e']; |
| 118 for (var i in letters) { |
| 119 chrome.tabs.create({"windowId": moveWindow1, |
| 120 "url": "chrome://" + letters[i]}, |
| 121 testCallback(false, function(tab) { |
| 122 var letter = tab.url[tab.url.length-2]; |
| 123 moveTabIds[letter] = tab.id; |
| 124 if (tab.url == "chrome://e/") { |
| 125 chrome.test.succeed(); |
| 126 } |
| 127 })); |
| 128 } |
| 129 }, |
| 130 |
| 131 // Do a series of moves so that we get the following |
| 132 // |
| 133 // Before: |
| 134 // Window1: (newtab),a,b,c,d,e |
| 135 // Window2: (newtab) |
| 136 // |
| 137 // After: |
| 138 // Window1: (newtab),a,e,c |
| 139 // Window2: b,(newtab),d |
| 140 function moveTabs() { |
| 141 chrome.tabs.move(moveTabIds['b'], {"windowId": moveWindow2, "index": 0}, |
| 142 testCallback(false, null)); |
| 143 chrome.tabs.move(moveTabIds['e'], {"index": 2}, |
| 144 testCallback(false, null)); |
| 145 chrome.tabs.move(moveTabIds['d'], {"windowId": moveWindow2, "index": 2}, |
| 146 testCallback(true, null)); |
| 147 }, |
| 148 |
| 149 // Check that the tab/window state is what we expect after doing moves. |
| 150 function moveTabsCheck() { |
| 151 chrome.tabs.getAllInWindow(moveWindow1, testCallback(false, function(tabs) { |
| 152 assertEq(4, tabs.length); |
| 153 assertEq("chrome://newtab/", tabs[0].url); |
| 154 assertEq("chrome://a/", tabs[1].url); |
| 155 assertEq("chrome://e/", tabs[2].url); |
| 156 assertEq("chrome://c/", tabs[3].url); |
| 157 })); |
| 158 chrome.tabs.getAllInWindow(moveWindow2, testCallback(true, function(tabs) { |
| 159 assertEq(3, tabs.length); |
| 160 assertEq("chrome://b/", tabs[0].url); |
| 161 assertEq("chrome://newtab/", tabs[1].url); |
| 162 assertEq("chrome://d/", tabs[2].url); |
| 163 })); |
| 164 }, |
| 165 |
| 166 function remove() { |
| 167 chrome.tabs.remove(moveTabIds["d"], testCallback(false, function() { |
| 168 chrome.tabs.getAllInWindow(moveWindow2, |
| 169 testCallback(true, function(tabs) { |
| 170 assertEq(2, tabs.length); |
| 171 assertEq("chrome://b/", tabs[0].url); |
| 172 assertEq("chrome://newtab/", tabs[1].url); |
| 173 })); |
| 174 })); |
| 175 }, |
| 176 |
| 177 function detectLanguage() { |
| 178 chrome.tabs.getAllInWindow(moveWindow1, testCallback(false, function(tabs) { |
| 179 chrome.tabs.detectLanguage(tabs[0].id, testCallback(true, function(lang) { |
| 180 assertEq("en", lang); |
| 181 })); |
| 182 })); |
| 183 }, |
| 184 |
| 185 function captureVisibleTab() { |
| 186 // Grab an image for each of our two windows. |
| 187 var firstImage; |
| 188 var secondImage; |
| 189 chrome.tabs.captureVisibleTab(moveWindow1, |
| 190 testCallback(false, function(url) { |
| 191 assertEq("string", typeof(url)); |
| 192 assertTrue(url.length > 0); |
| 193 firstImage = url; |
| 194 })); |
| 195 chrome.tabs.captureVisibleTab(moveWindow2, |
| 196 testCallback(false, function(url) { |
| 197 assertEq("string", typeof(url)); |
| 198 assertTrue(url.length > 0); |
| 199 secondImage = url; |
| 200 assertTrue(firstImage != secondImage); |
| 201 })); |
| 202 |
| 203 // Now pass null for windowId - it should come back with something |
| 204 // equal to either the first or second window. This is nondeterministic |
| 205 // depending on whether you let chrome stay focused, or click |
| 206 // focus away (or are running on the try/build servers). |
| 207 chrome.tabs.captureVisibleTab(null, testCallback(true, function(url) { |
| 208 assertEq("string", typeof(url)); |
| 209 assertTrue(url.length > 0); |
| 210 assertTrue(url == firstImage || url == secondImage); |
| 211 })); |
| 212 }, |
| 213 |
| 214 function onCreated() { |
| 215 var callbackSuccess = false; |
| 216 var listener = function(tab) { |
| 217 assertEq("chrome://f/", tab.url); |
| 218 callbackSuccess = true; |
| 219 }; |
| 220 chrome.tabs.onCreated.addListener(listener); |
| 221 chrome.tabs.create({"windowId": moveWindow1, "url": "chrome://f", |
| 222 "selected": true}, testCallback(true, function(tab) { |
| 223 chrome.tabs.onCreated.removeListener(listener); |
| 224 assertTrue(callbackSuccess); |
| 225 })); |
| 226 }, |
| 227 |
| 228 function onUpdated() { |
| 229 var listener = function(tabid, info) { |
| 230 if (tabid != moveTabIds['a']) { |
| 231 return; // ignore updates for tabs we weren't interested in |
| 232 } |
| 233 if (info.status == "complete") { |
| 234 chrome.tabs.onUpdated.removeListener(listener); |
| 235 chrome.test.succeed(); |
| 236 } |
| 237 }; |
| 238 chrome.tabs.onUpdated.addListener(listener); |
| 239 chrome.tabs.update(moveTabIds['a'], {"url": "chrome://aa"}, |
| 240 testCallback(false, null)); |
| 241 }, |
| 242 |
| 243 function onMoved() { |
| 244 var listener = function(tabid, info) { |
| 245 chrome.tabs.onMoved.removeListener(listener); |
| 246 assertEq(moveTabIds['a'], tabid); |
| 247 chrome.test.succeed(); |
| 248 }; |
| 249 chrome.tabs.onMoved.addListener(listener); |
| 250 chrome.tabs.move(moveTabIds['a'], {"index": 0}, testCallback(false, null)); |
| 251 }, |
| 252 |
| 253 function onSelectionChanged() { |
| 254 var listener = function(tabid, info) { |
| 255 chrome.tabs.onSelectionChanged.removeListener(listener); |
| 256 assertEq(moveTabIds['c'], tabid); |
| 257 chrome.test.succeed(); |
| 258 }; |
| 259 chrome.tabs.onSelectionChanged.addListener(listener); |
| 260 chrome.tabs.update(moveTabIds['c'], {"selected": true}, |
| 261 testCallback(false, null)); |
| 262 }, |
| 263 |
| 264 function onRemoved() { |
| 265 var listener = function(tabid) { |
| 266 chrome.tabs.onRemoved.removeListener(listener); |
| 267 assertEq(moveTabIds['c'], tabid); |
| 268 chrome.test.succeed(); |
| 269 }; |
| 270 chrome.tabs.onRemoved.addListener(listener); |
| 271 chrome.tabs.remove(moveTabIds['c'], testCallback(false, null)); |
| 272 } |
| 273 |
| 274 // TODO(asargent) We still need to add tests for the following: |
| 275 // Methods: |
| 276 // -chrome.tabs.connect |
| 277 // Events: |
| 278 // -chrome.tabs.onAttached |
| 279 // -chrome.tabs.onDetched |
| 280 // |
| 281 // Also, it would be an improvement to check the captureVisibleTab results |
| 282 // against a known-good result. |
| 283 ]); |
| OLD | NEW |