PageRenderTime 131ms CodeModel.GetById 36ms RepoModel.GetById 0ms app.codeStats 1ms

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

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