PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/addon-sdk/source/test/windows/test-firefox-windows.js

https://github.com/marcussaad/firefox
JavaScript | 362 lines | 280 code | 58 blank | 24 comment | 20 complexity | e580dcec014ebcba46a11aa0bd03b1a1 MD5 | raw file
Possible License(s): JSON, LGPL-2.1, AGPL-1.0, MPL-2.0-no-copyleft-exception, MPL-2.0, BSD-3-Clause, LGPL-3.0, BSD-2-Clause, MIT, Apache-2.0, GPL-2.0, 0BSD
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. 'use strict';
  5. const { Cc, Ci } = require('chrome');
  6. const { setTimeout } = require('sdk/timers');
  7. const { Loader } = require('sdk/test/loader');
  8. const wm = Cc['@mozilla.org/appshell/window-mediator;1'].
  9. getService(Ci.nsIWindowMediator);
  10. const { browserWindows } = require("sdk/windows");
  11. const tabs = require("tabs");
  12. // TEST: open & close window
  13. exports.testOpenAndCloseWindow = function(test) {
  14. test.waitUntilDone();
  15. test.assertEqual(browserWindows.length, 1, "Only one window open");
  16. browserWindows.open({
  17. url: "data:text/html;charset=utf-8,<title>windows API test</title>",
  18. onOpen: function(window) {
  19. test.assertEqual(this, browserWindows,
  20. "The 'this' object is the windows object.");
  21. test.assertEqual(window.tabs.length, 1, "Only one tab open");
  22. test.assertEqual(browserWindows.length, 2, "Two windows open");
  23. window.tabs.activeTab.on('ready', function onReady(tab) {
  24. tab.removeListener('ready', onReady);
  25. test.assert(window.title.indexOf("windows API test") != -1,
  26. "URL correctly loaded");
  27. window.close();
  28. });
  29. },
  30. onClose: function(window) {
  31. test.assertEqual(window.tabs.length, 0, "Tabs were cleared");
  32. test.assertEqual(browserWindows.length, 1, "Only one window open");
  33. test.done();
  34. }
  35. });
  36. };
  37. exports.testAutomaticDestroy = function(test) {
  38. test.waitUntilDone();
  39. let windows = browserWindows;
  40. // Create a second windows instance that we will unload
  41. let called = false;
  42. let loader = Loader(module);
  43. let windows2 = loader.require("sdk/windows").browserWindows;
  44. windows2.on("open", function() {
  45. called = true;
  46. });
  47. loader.unload();
  48. // Fire a windows event and check that this unloaded instance is inactive
  49. windows.open({
  50. url: "data:text/html;charset=utf-8,foo",
  51. onOpen: function(window) {
  52. setTimeout(function () {
  53. test.assert(!called,
  54. "Unloaded windows instance is destroyed and inactive");
  55. window.close(function () {
  56. test.done();
  57. });
  58. });
  59. }
  60. });
  61. };
  62. exports.testWindowTabsObject = function(test) {
  63. test.waitUntilDone();
  64. let count = 0;
  65. let window;
  66. function runTest() {
  67. if (++count != 2)
  68. return;
  69. test.assertEqual(window.tabs.length, 1, "Only 1 tab open");
  70. test.assertEqual(window.tabs.activeTab.title, "tab 1", "Correct active tab");
  71. window.tabs.open({
  72. url: "data:text/html;charset=utf-8,<title>tab 2</title>",
  73. inBackground: true,
  74. onReady: function onReady(newTab) {
  75. test.assertEqual(window.tabs.length, 2, "New tab open");
  76. test.assertEqual(newTab.title, "tab 2", "Correct new tab title");
  77. test.assertEqual(window.tabs.activeTab.title, "tab 1", "Correct active tab");
  78. let i = 1;
  79. for each (let tab in window.tabs)
  80. test.assertEqual(tab.title, "tab " + i++, "Correct title");
  81. window.close();
  82. }
  83. });
  84. }
  85. browserWindows.open({
  86. url: "data:text/html;charset=utf-8,<title>tab 1</title>",
  87. onActivate: function onOpen(win) {
  88. window = win;
  89. runTest();
  90. },
  91. onClose: function onClose(window) {
  92. test.assertEqual(window.tabs.length, 0, "No more tabs on closed window");
  93. test.done();
  94. }
  95. });
  96. tabs.once("ready", runTest);
  97. };
  98. exports.testOnOpenOnCloseListeners = function(test) {
  99. test.waitUntilDone();
  100. let windows = browserWindows;
  101. test.assertEqual(browserWindows.length, 1, "Only one window open");
  102. let received = {
  103. listener1: false,
  104. listener2: false,
  105. listener3: false,
  106. listener4: false
  107. }
  108. function listener1() {
  109. test.assertEqual(this, windows, "The 'this' object is the windows object.");
  110. if (received.listener1)
  111. test.fail("Event received twice");
  112. received.listener1 = true;
  113. }
  114. function listener2() {
  115. if (received.listener2)
  116. test.fail("Event received twice");
  117. received.listener2 = true;
  118. }
  119. function listener3() {
  120. test.assertEqual(this, windows, "The 'this' object is the windows object.");
  121. if (received.listener3)
  122. test.fail("Event received twice");
  123. received.listener3 = true;
  124. }
  125. function listener4() {
  126. if (received.listener4)
  127. test.fail("Event received twice");
  128. received.listener4 = true;
  129. }
  130. windows.on('open', listener1);
  131. windows.on('open', listener2);
  132. windows.on('close', listener3);
  133. windows.on('close', listener4);
  134. function verify() {
  135. test.assert(received.listener1, "onOpen handler called");
  136. test.assert(received.listener2, "onOpen handler called");
  137. test.assert(received.listener3, "onClose handler called");
  138. test.assert(received.listener4, "onClose handler called");
  139. windows.removeListener('open', listener1);
  140. windows.removeListener('open', listener2);
  141. windows.removeListener('close', listener3);
  142. windows.removeListener('close', listener4);
  143. test.done();
  144. }
  145. windows.open({
  146. url: "data:text/html;charset=utf-8,foo",
  147. onOpen: function(window) {
  148. window.close(verify);
  149. }
  150. });
  151. };
  152. exports.testActiveWindow = function(test) {
  153. const xulApp = require("sdk/system/xul-app");
  154. if (xulApp.versionInRange(xulApp.platformVersion, "1.9.2", "1.9.2.*")) {
  155. test.pass("This test is disabled on 3.6. For more information, see bug 598525");
  156. return;
  157. }
  158. let windows = browserWindows;
  159. // API window objects
  160. let window2, window3;
  161. // Raw window objects
  162. let rawWindow2, rawWindow3;
  163. test.waitUntilDone();
  164. let testSteps = [
  165. function() {
  166. test.assertEqual(windows.length, 3, "Correct number of browser windows");
  167. let count = 0;
  168. for (let window in windows)
  169. count++;
  170. test.assertEqual(count, 3, "Correct number of windows returned by iterator");
  171. rawWindow2.focus();
  172. continueAfterFocus(rawWindow2);
  173. },
  174. function() {
  175. nextStep();
  176. },
  177. function() {
  178. /**
  179. * Bug 614079: This test fails intermittently on some specific linux
  180. * environnements, without being able to reproduce it in same
  181. * distribution with same window manager.
  182. * Disable it until being able to reproduce it easily.
  183. // On linux, focus is not consistent, so we can't be sure
  184. // what window will be on top.
  185. // Here when we focus "non-browser" window,
  186. // Any Browser window may be selected as "active".
  187. test.assert(windows.activeWindow == window2 || windows.activeWindow == window3,
  188. "Non-browser windows aren't handled by this module");
  189. */
  190. window2.activate();
  191. continueAfterFocus(rawWindow2);
  192. },
  193. function() {
  194. test.assertEqual(windows.activeWindow.title, window2.title, "Correct active window - 2");
  195. window3.activate();
  196. continueAfterFocus(rawWindow3);
  197. },
  198. function() {
  199. test.assertEqual(windows.activeWindow.title, window3.title, "Correct active window - 3");
  200. finishTest();
  201. }
  202. ];
  203. windows.open({
  204. url: "data:text/html;charset=utf-8,<title>window 2</title>",
  205. onOpen: function(window) {
  206. window2 = window;
  207. rawWindow2 = wm.getMostRecentWindow("navigator:browser");
  208. windows.open({
  209. url: "data:text/html;charset=utf-8,<title>window 3</title>",
  210. onOpen: function(window) {
  211. window.tabs.activeTab.on('ready', function onReady() {
  212. window3 = window;
  213. rawWindow3 = wm.getMostRecentWindow("navigator:browser");
  214. nextStep()
  215. });
  216. }
  217. });
  218. }
  219. });
  220. function nextStep() {
  221. if (testSteps.length > 0)
  222. testSteps.shift()();
  223. }
  224. function continueAfterFocus(targetWindow) {
  225. // Based on SimpleTest.waitForFocus
  226. var fm = Cc["@mozilla.org/focus-manager;1"].
  227. getService(Ci.nsIFocusManager);
  228. var childTargetWindow = {};
  229. fm.getFocusedElementForWindow(targetWindow, true, childTargetWindow);
  230. childTargetWindow = childTargetWindow.value;
  231. var focusedChildWindow = {};
  232. if (fm.activeWindow) {
  233. fm.getFocusedElementForWindow(fm.activeWindow, true, focusedChildWindow);
  234. focusedChildWindow = focusedChildWindow.value;
  235. }
  236. var focused = (focusedChildWindow == childTargetWindow);
  237. if (focused) {
  238. nextStep();
  239. } else {
  240. childTargetWindow.addEventListener("focus", function focusListener() {
  241. childTargetWindow.removeEventListener("focus", focusListener, true);
  242. nextStep();
  243. }, true);
  244. }
  245. }
  246. function finishTest() {
  247. window3.close(function() {
  248. window2.close(function() {
  249. test.done();
  250. });
  251. });
  252. }
  253. };
  254. exports.testTrackWindows = function(test) {
  255. test.waitUntilDone();
  256. let windows = [];
  257. let actions = [];
  258. let expects = [
  259. "activate 0", "global activate 0", "deactivate 0", "global deactivate 0",
  260. "activate 1", "global activate 1", "deactivate 1", "global deactivate 1",
  261. "activate 2", "global activate 2"
  262. ];
  263. function shutdown(window) {
  264. if (this.length === 1) {
  265. test.assertEqual(actions.join(), expects.join(),
  266. "correct activate and deactivate sequence")
  267. test.done();
  268. }
  269. }
  270. function openWindow() {
  271. windows.push(browserWindows.open({
  272. url: "data:text/html;charset=utf-8,<i>testTrackWindows</i>",
  273. onActivate: function(window) {
  274. let index = windows.indexOf(window);
  275. actions.push("activate " + index);
  276. if (windows.length < 3)
  277. openWindow()
  278. else
  279. for each (let win in windows)
  280. win.close(shutdown)
  281. },
  282. onDeactivate: function(window) {
  283. let index = windows.indexOf(window);
  284. actions.push("deactivate " + index)
  285. }
  286. }));
  287. }
  288. browserWindows.on("activate", function (window) {
  289. let index = windows.indexOf(window);
  290. // only concerned with windows opened for this test
  291. if (index < 0)
  292. return;
  293. actions.push("global activate " + index)
  294. })
  295. browserWindows.on("deactivate", function (window) {
  296. let index = windows.indexOf(window);
  297. // only concerned with windows opened for this test
  298. if (index < 0)
  299. return;
  300. actions.push("global deactivate " + index)
  301. })
  302. openWindow();
  303. }