/modules/lib/tests/content-symbiont.test.js

https://github.com/kaiquewdev/chromeless · JavaScript · 152 lines · 138 code · 13 blank · 1 comment · 11 complexity · 94fb56d936629cf7c047a95b60ab2e4d MD5 · raw file

  1. "use strict";
  2. const { Cc, Ci } = require('chrome');
  3. const { Symbiont } = require('content/symbiont');
  4. const self = require("self");
  5. function makeWindow() {
  6. let content =
  7. '<?xml version="1.0"?>' +
  8. '<window ' +
  9. 'xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">' +
  10. '<iframe id="content" type="content"/>' +
  11. '</window>';
  12. var url = "data:application/vnd.mozilla.xul+xml," +
  13. encodeURIComponent(content);
  14. var features = ["chrome", "width=10", "height=10"];
  15. return Cc["@mozilla.org/embedcomp/window-watcher;1"].
  16. getService(Ci.nsIWindowWatcher).
  17. openWindow(null, url, null, features.join(","), null);
  18. }
  19. exports['test:constructing symbiont && validating API'] = function(test) {
  20. let window = makeWindow();
  21. window.addEventListener("load", function onLoad() {
  22. window.removeEventListener("load", onLoad, false);
  23. let frame = window.document.getElementById("content");
  24. // TODO: support arrays ??
  25. let contentScripts = ["1;", "2;"];
  26. let contentSymbiont = Symbiont({
  27. frame: frame,
  28. contentScriptFile: self.data.url("test-content-symbiont.js"),
  29. contentScript: contentScripts,
  30. contentScriptWhen: "start"
  31. });
  32. test.assertEqual(
  33. self.data.url("test-content-symbiont.js"),
  34. contentSymbiont.contentScriptFile,
  35. "There is one contentScriptFile, as specified in options."
  36. );
  37. test.assertEqual(
  38. contentScripts.length,
  39. contentSymbiont.contentScript.length,
  40. "There are two contentScripts, as specified in options."
  41. );
  42. test.assertEqual(
  43. contentScripts[0],
  44. contentSymbiont.contentScript[0],
  45. "There are two contentScripts, as specified in options."
  46. );
  47. test.assertEqual(
  48. contentScripts[1],
  49. contentSymbiont.contentScript[1],
  50. "There are two contentScripts, as specified in options."
  51. )
  52. test.assertEqual(
  53. contentSymbiont.contentScriptWhen,
  54. "start",
  55. "contentScriptWhen is as specified in options."
  56. );
  57. test.done();
  58. window.close();
  59. frame.setAttribute("src", "data:text/html,<html><body></body></html>");
  60. }, false);
  61. test.waitUntilDone();
  62. };
  63. exports["test:communication with worker global scope"] = function(test) {
  64. let window = makeWindow();
  65. let contentSymbiont;
  66. function onMessage1(message) {
  67. test.assertEqual(message, 1, "Program gets message via onMessage.");
  68. contentSymbiont.removeListener('message', onMessage1);
  69. contentSymbiont.on('message', onMessage2);
  70. contentSymbiont.postMessage(2);
  71. };
  72. function onMessage2(message) {
  73. if (5 == message) {
  74. test.done();
  75. } else {
  76. test.assertEqual(message, 3, "Program gets message via onMessage2.");
  77. contentSymbiont.postMessage(4)
  78. }
  79. }
  80. window.addEventListener("load", function onLoad() {
  81. window.removeEventListener("load", onLoad, false);
  82. let frame = window.document.getElementById("content");
  83. contentSymbiont = Symbiont({
  84. frame: frame,
  85. contentScript: 'new ' + function() {
  86. postMessage(1);
  87. onMessage = function onMessage(message) {
  88. if (message === 2)
  89. postMessage(3);
  90. if (message === 4)
  91. postMessage(5);
  92. };
  93. } + '()',
  94. onMessage: onMessage1
  95. });
  96. frame.setAttribute("src", "data:text/html,<html><body></body></html>");
  97. }, false);
  98. test.waitUntilDone();
  99. };
  100. exports['test:pageWorker'] = function(test) {
  101. test.waitUntilDone();
  102. let worker = Symbiont({
  103. contentURL: 'about:buildconfig',
  104. contentScript: 'new ' + function WorkerScope() {
  105. self.on('message', function(data) {
  106. if (data.valid)
  107. postMessage('bye!');
  108. })
  109. self.postMessage(window.location.toString());
  110. },
  111. onMessage: function(msg) {
  112. if (msg == 'bye!') {
  113. test.done()
  114. } else {
  115. test.assertEqual(
  116. worker.contentURL + '',
  117. msg
  118. );
  119. worker.postMessage({ valid: true });
  120. }
  121. }
  122. });
  123. };
  124. exports["test:document element present on 'start'"] = function(test) {
  125. test.waitUntilDone();
  126. let xulApp = require("xul-app");
  127. let worker = Symbiont({
  128. contentURL: "about:buildconfig",
  129. contentScript: "postMessage(!!document.documentElement)",
  130. contentScriptWhen: "start",
  131. onMessage: function(message) {
  132. if (xulApp.versionInRange(xulApp.platformVersion, "2.0b6", "*"))
  133. test.assert(message, "document element present on 'start'");
  134. else
  135. test.pass("document element not necessarily present on 'start'");
  136. test.done();
  137. }
  138. });
  139. };