How to use createWorker method in Cypress

Best JavaScript code snippet using cypress

test-content-proxy.js

Source:test-content-proxy.js Github

copy

Full Screen

...24          let helper = {25            xrayWindow: xrayWindow,26            rawWindow: rawWindow,27            createWorker: function (contentScript) {28              return createWorker(assert, xrayWindow, contentScript, helper.done);29            },30            done: function () {31              if (isDone)32                return;33              isDone = true;34              hiddenFrames.remove(hiddenFrame);35              done();36            }37          }38          callback(helper, assert);39        }40        hiddenFrame.element.addEventListener("DOMContentLoaded", onDOMReady, false);41        hiddenFrame.element.setAttribute("src", url);42      }43    }));44  };45}46function createWorker(assert, xrayWindow, contentScript, done) {47  // We have to use Sandboxed loader in order to get access to the private48  // unlock key `PRIVATE_KEY`. This key should not be used anywhere else.49  // See `PRIVATE_KEY` definition in worker.js50  let loader = Loader(module);51  let Worker = loader.require("sdk/content/worker").Worker;52  let key = loader.sandbox("sdk/content/worker").PRIVATE_KEY;53  let worker = Worker({54    exposeUnlockKey : USE_JS_PROXIES ? key : null,55    window: xrayWindow,56    contentScript: [57      'new ' + function () {58        assert = function assert(v, msg) {59          self.port.emit("assert", {assertion:v, msg:msg});60        }61        done = function done() {62          self.port.emit("done");63        }64      },65      contentScript66    ]67  });68  worker.port.on("done", done);69  worker.port.on("assert", function (data) {70    assert.ok(data.assertion, data.msg);71  });72  return worker;73}74/* Examples for the `createProxyTest` uses */75let html = "<script>var documentGlobal = true</script>";76exports["test Create Proxy Test"] = createProxyTest(html, function (helper, assert) {77  // You can get access to regular `test` object in second argument of78  // `createProxyTest` method:79  assert.ok(helper.rawWindow.documentGlobal,80              "You have access to a raw window reference via `helper.rawWindow`");81  assert.ok(!("documentGlobal" in helper.xrayWindow),82              "You have access to an XrayWrapper reference via `helper.xrayWindow`");83  // If you do not create a Worker, you have to call helper.done(),84  // in order to say when your test is finished85  helper.done();86});87exports["test Create Proxy Test With Worker"] = createProxyTest("", function (helper) {88  helper.createWorker(89    "new " + function WorkerScope() {90      assert(true, "You can do assertions in your content script");91      // And if you create a worker, you either have to call `done`92      // from content script or helper.done()93      done();94    }95  );96});97exports["test Create Proxy Test With Events"] = createProxyTest("", function (helper, assert) {98  let worker = helper.createWorker(99    "new " + function WorkerScope() {100      self.port.emit("foo");101    }102  );103  worker.port.on("foo", function () {104    assert.pass("You can use events");105    // And terminate your test with helper.done:106    helper.done();107  });108});109if (USE_JS_PROXIES) {110  // Verify that the attribute `exposeUnlockKey`, that allow this test111  // to identify proxies, works correctly.112  // See `PRIVATE_KEY` definition in worker.js113  exports["test Key Access"] = createProxyTest("", function(helper) {114    helper.createWorker(115      'new ' + function ContentScriptScope() {116        assert("UNWRAP_ACCESS_KEY" in window, "have access to `UNWRAP_ACCESS_KEY`");117        done();118      }119    );120  });121}122// Bug 714778: There was some issue around `toString` functions123//             that ended up being shared between content scripts124exports["test Shared To String Proxies"] = createProxyTest("", function(helper) {125  let worker = helper.createWorker(126    'new ' + function ContentScriptScope() {127      // We ensure that `toString` can't be modified so that nothing could128      // leak to/from the document and between content scripts129      // It only applies to JS proxies, there isn't any such issue with xrays.130      //document.location.toString = function foo() {};131      document.location.toString.foo = "bar";132      if ('UNWRAP_ACCESS_KEY' in window)133        assert(!("foo" in document.location.toString), "document.location.toString can't be modified");134      else135        assert("foo" in document.location.toString, "document.location.toString can be modified");136      assert(document.location.toString() == "data:text/html;charset=utf-8,",137             "First document.location.toString()");138      self.postMessage("next");139    }140  );141  worker.on("message", function () {142    helper.createWorker(143      'new ' + function ContentScriptScope2() {144        assert(!("foo" in document.location.toString),145               "document.location.toString is different for each content script");146        assert(document.location.toString() == "data:text/html;charset=utf-8,",147               "Second document.location.toString()");148        done();149      }150    );151  });152});153// Ensure that postMessage is working correctly across documents with an iframe154let html = '<iframe id="iframe" name="test" src="data:text/html;charset=utf-8," />';155exports["test postMessage"] = createProxyTest(html, function (helper, assert) {156  let ifWindow = helper.xrayWindow.document.getElementById("iframe").contentWindow;157  // Listen without proxies, to check that it will work in regular case158  // simulate listening from a web document.159  ifWindow.addEventListener("message", function listener(event) {160    ifWindow.removeEventListener("message", listener, false);161    // As we are in system principal, event is an XrayWrapper162    if (USE_JS_PROXIES) {163      assert.equal(event.source, ifWindow,164                       "event.source is the iframe window");165    }166    else {167      // JS proxies had different behavior than xrays, xrays use current168      // compartments when calling postMessage method. Whereas js proxies169      // was using postMessage method compartment, not the caller one.170      assert.equal(event.source, helper.xrayWindow,171                       "event.source is the top window");172    }173    assert.equal(event.origin, "null", "origin is null");174    assert.equal(event.data, "{\"foo\":\"bar\\n \\\"escaped\\\".\"}",175                     "message data is correct");176    helper.done();177  }, false);178  helper.createWorker(179    'new ' + function ContentScriptScope() {180      assert(postMessage === postMessage,181          "verify that we doesn't generate multiple functions for the same method");182      var json = JSON.stringify({foo : "bar\n \"escaped\"."});183      document.getElementById("iframe").contentWindow.postMessage(json, "*");184    }185  );186});187let html = '<input id="input2" type="checkbox" />';188exports["test Object Listener"] = createProxyTest(html, function (helper) {189  helper.createWorker(190    'new ' + function ContentScriptScope() {191      // Test objects being given as event listener192      let input = document.getElementById("input2");193      let myClickListener = {194        called: false,195        handleEvent: function(event) {196          assert(this === myClickListener, "`this` is the original object");197          assert(!this.called, "called only once");198          this.called = true;199          if ('UNWRAP_ACCESS_KEY' in window)200            assert(event.valueOf() !== event.valueOf(UNWRAP_ACCESS_KEY), "event is wrapped");201          assert(event.target, input, "event.target is the wrapped window");202          done();203        }204      };205      window.addEventListener("click", myClickListener, true);206      input.click();207      window.removeEventListener("click", myClickListener, true);208    }209  );210});211exports["test Object Listener 2"] = createProxyTest("", function (helper) {212  helper.createWorker(213    'new ' + function ContentScriptScope() {214      // Verify object as DOM event listener215      let myMessageListener = {216        called: false,217        handleEvent: function(event) {218          window.removeEventListener("message", myMessageListener, true);219          assert(this == myMessageListener, "`this` is the original object");220          assert(!this.called, "called only once");221          this.called = true;222          if ('UNWRAP_ACCESS_KEY' in window)223            assert(event.valueOf() !== event.valueOf(UNWRAP_ACCESS_KEY), "event is wrapped");224          assert(event.target == document.defaultView, "event.target is the wrapped window");225          assert(event.source == document.defaultView, "event.source is the wrapped window");226          assert(event.origin == "null", "origin is null");227          assert(event.data == "ok", "message data is correct");228          done();229        }230      };231      window.addEventListener("message", myMessageListener, true);232      document.defaultView.postMessage("ok", '*');233    }234  );235});236let html = '<input id="input" type="text" /><input id="input3" type="checkbox" />' +237             '<input id="input2" type="checkbox" />';238/* Disable test to keep tree green until Bug 756214 is fixed.239exports.testStringOverload = createProxyTest(html, function (helper, test) {240  // Proxy - toString error241  let originalString = "string";242  let p = Proxy.create({243    get: function(receiver, name) {244      if (name == "binded")245        return originalString.toString.bind(originalString);246      return originalString[name];247    }248  });249  assert.okRaises(function () {250    p.toString();251  },252  /String.prototype.toString called on incompatible Proxy/,253  "toString can't be called with this being the proxy");254  assert.equal(p.binded(), "string", "but it works if we bind this to the original string");255  helper.createWorker(256    'new ' + function ContentScriptScope() {257      // RightJS is hacking around String.prototype, and do similar thing:258      // Pass `this` from a String prototype method.259      // It is funny because typeof this == "object"!260      // So that when we pass `this` to a native method,261      // our proxy code can fail on another even more crazy thing.262      // See following test to see what fails around proxies.263      String.prototype.update = function () {264        assert(typeof this == "object", "in update, `this` is an object");265        assert(this.toString() == "input", "in update, `this.toString works");266        return document.querySelectorAll(this);267      };268      assert("input".update().length == 3, "String.prototype overload works");269      done();270    }271  );272});273*/274exports["test MozMatchedSelector"] = createProxyTest("", function (helper) {275  helper.createWorker(276    'new ' + function ContentScriptScope() {277      // Check mozMatchesSelector XrayWrappers bug:278      // mozMatchesSelector returns bad results when we are not calling it from the node itself279      // SEE BUG 658909: mozMatchesSelector returns incorrect results with XrayWrappers280      assert(document.createElement( "div" ).mozMatchesSelector("div"),281             "mozMatchesSelector works while being called from the node");282      assert(document.documentElement.mozMatchesSelector.call(283               document.createElement( "div" ),284               "div"285             ),286             "mozMatchesSelector works while being called from a " +287             "function reference to " +288             "document.documentElement.mozMatchesSelector.call");289      done();290    }291  );292});293exports["test Events Overload"] = createProxyTest("", function (helper) {294  helper.createWorker(295    'new ' + function ContentScriptScope() {296      // If we add a "____proxy" attribute on XrayWrappers in order to store297      // the related proxy to create an unique proxy for each wrapper;298      // we end up setting this attribute to prototype objects :x299      // And so, instances created with such prototype will be considered300      // as equal to the prototype ...301      //   // Internal method that return the proxy for a given XrayWrapper302      //   function proxify(obj) {303      //     if (obj._proxy) return obj._proxy;304      //     return obj._proxy = Proxy.create(...);305      //   }306      //307      //   // Get a proxy of an XrayWrapper prototype object308      //   let proto = proxify(xpcProto);309      //310      //   // Use this proxy as a prototype311      //   function Constr() {}312      //   Constr.proto = proto;313      //314      //   // Try to create an instance using this prototype315      //   let xpcInstance = new Constr();316      //   let wrapper = proxify(xpcInstance)317      //318      //   xpcProto._proxy = proto and as xpcInstance.__proto__ = xpcProto,319      //   xpcInstance._proxy = proto ... and profixy(xpcInstance) = proto :(320      //321      let proto = window.document.createEvent('HTMLEvents').__proto__;322      window.Event.prototype = proto;323      let event = document.createEvent('HTMLEvents');324      assert(event !== proto, "Event should not be equal to its prototype");325      event.initEvent('dataavailable', true, true);326      assert(event.type === 'dataavailable', "Events are working fine");327      done();328    }329  );330});331exports["test Nested Attributes"] = createProxyTest("", function (helper) {332  helper.createWorker(333    'new ' + function ContentScriptScope() {334      // XrayWrappers has a bug when you set an attribute on it,335      // in some cases, it creates an unnecessary wrapper that introduces336      // a different object that refers to the same original object337      // Check that our wrappers don't reproduce this bug338      // SEE BUG 658560: Fix identity problem with CrossOriginWrappers339      let o = {sandboxObject:true};340      window.nested = o;341      o.foo = true;342      assert(o === window.nested, "Nested attribute to sandbox object should not be proxified");343      window.nested = document;344      assert(window.nested === document, "Nested attribute to proxy should not be double proxified");345      done();346    }347  );348});349exports["test Form nodeName"] = createProxyTest("", function (helper) {350  helper.createWorker(351    'new ' + function ContentScriptScope() {352      let body = document.body;353      // Check form[nodeName]354      let form = document.createElement("form");355      let input = document.createElement("input");356      input.setAttribute("name", "test");357      form.appendChild(input);358      body.appendChild(form);359      assert(form.test == input, "form[nodeName] is valid");360      body.removeChild(form);361      done();362    }363  );364});365exports["test localStorage"] = createProxyTest("", function (helper, assert) {366  let worker = helper.createWorker(367    'new ' + function ContentScriptScope() {368      // Check localStorage:369      assert(window.localStorage, "has access to localStorage");370      window.localStorage.name = 1;371      assert(window.localStorage.name == 1, "localStorage appears to work");372      self.port.on("step2", function () {373        window.localStorage.clear();374        assert(window.localStorage.name == undefined, "localStorage really, really works");375        done();376      });377      self.port.emit("step1");378    }379  );380  worker.port.on("step1", function () {381    assert.equal(helper.rawWindow.localStorage.name, 1, "localStorage really works");382    worker.port.emit("step2");383  });384});385exports["test Auto Unwrap Custom Attributes"] = createProxyTest("", function (helper) {386  helper.createWorker(387    'new ' + function ContentScriptScope() {388      let body = document.body;389      // Setting a custom object to a proxy attribute is not wrapped when we get it afterward390      let object = {custom: true, enumerable: false};391      body.customAttribute = object;392      if ('UNWRAP_ACCESS_KEY' in window)393        assert(body.customAttribute.valueOf() === body.customAttribute.valueOf(UNWRAP_ACCESS_KEY), "custom JS attributes are not wrapped");394      assert(object === body.customAttribute, "custom JS attributes are not wrapped");395      done();396    }397  );398});399exports["test Object Tag"] = createProxyTest("", function (helper) {400  helper.createWorker(401    'new ' + function ContentScriptScope() {402      // <object>, <embed> and other tags return typeof 'function'403      let flash = document.createElement("object");404      assert(typeof flash == "function", "<object> is typeof 'function'");405      assert(flash.toString().match(/\[object HTMLObjectElement.*\]/), "<object> is HTMLObjectElement");406      assert("setAttribute" in flash, "<object> has a setAttribute method");407      done();408    }409  );410});411exports["test Highlight toString Behavior"] = createProxyTest("", function (helper, assert) {412  // We do not have any workaround this particular use of toString413  // applied on <object> elements. So disable this test until we found one!414  //assert.equal(helper.rawWindow.Object.prototype.toString.call(flash), "[object HTMLObjectElement]", "<object> is HTMLObjectElement");415  function f() {};416  let funToString = Object.prototype.toString.call(f);417  assert.ok(/\[object Function.*\]/.test(funToString), "functions are functions 1");418  // This is how jquery call toString:419  let strToString = helper.rawWindow.Object.prototype.toString.call("");420  assert.ok(/\[object String.*\]/.test(strToString), "strings are strings");421  let o = {__exposedProps__:{}};422  let objToString = helper.rawWindow.Object.prototype.toString.call(o);423  assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects");424  // Make sure to pass a function from the same compartments425  // or toString will return [object Object] on FF8+426  let f2 = helper.rawWindow.eval("(function () {})");427  let funToString2 = helper.rawWindow.Object.prototype.toString.call(f2);428  assert.ok(/\[object Function.*\]/.test(funToString2), "functions are functions 2");429  helper.done();430});431exports["test Document TagName"] = createProxyTest("", function (helper) {432  helper.createWorker(433    'new ' + function ContentScriptScope() {434      let body = document.body;435      // Check document[tagName]436      let div = document.createElement("div");437      div.setAttribute("name", "test");438      body.appendChild(div);439      assert(!document.test, "document[divName] is undefined");440      body.removeChild(div);441      let form = document.createElement("form");442      form.setAttribute("name", "test");443      body.appendChild(form);444      assert(document.test == form, "document[formName] is valid");445      body.removeChild(form);446      let img = document.createElement("img");447      img.setAttribute("name", "test");448      body.appendChild(img);449      assert(document.test == img, "document[imgName] is valid");450      body.removeChild(img);451      done();452    }453  );454});455let html = '<iframe id="iframe" name="test" src="data:text/html;charset=utf-8," />';456exports["test Window Frames"] = createProxyTest(html, function (helper) {457  helper.createWorker(458    'let glob = this; new ' + function ContentScriptScope() {459      // Check window[frameName] and window.frames[i]460      let iframe = document.getElementById("iframe");461      //assert(window.frames.length == 1, "The iframe is reported in window.frames check1");462      //assert(window.frames[0] == iframe.contentWindow, "The iframe is reported in window.frames check2");463      //console.log(window.test+ "-"+iframe.contentWindow);464      //console.log(window);465      assert(window.test == iframe.contentWindow, "window[frameName] is valid");466      done();467    }468  );469});470exports["test Collections"] = createProxyTest("", function (helper) {471  helper.createWorker(472    'new ' + function ContentScriptScope() {473      // Highlight XPCNativeWrapper bug with HTMLCollection474      // tds[0] is only defined on first access :o475      let body = document.body;476      let div = document.createElement("div");477      body.appendChild(div);478      div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";479      let tds = div.getElementsByTagName("td");480      assert(tds[0] == tds[0], "We can get array element multiple times");481      body.removeChild(div);482      done();483    }484  );485});486let html = '<input id="input" type="text" /><input id="input3" type="checkbox" />' +487             '<input id="input2" type="checkbox" />';488exports["test Collections 2"] = createProxyTest(html, function (helper) {489  helper.createWorker(490    'new ' + function ContentScriptScope() {491      // Verify that NodeList/HTMLCollection are working fine492      let body = document.body;493      let inputs = body.getElementsByTagName("input");494      assert(body.childNodes.length == 3, "body.childNodes length is correct");495      assert(inputs.length == 3, "inputs.length is correct");496      assert(body.childNodes[0] == inputs[0], "body.childNodes[0] is correct");497      assert(body.childNodes[1] == inputs[1], "body.childNodes[1] is correct");498      assert(body.childNodes[2] == inputs[2], "body.childNodes[2] is correct");499      let count = 0;500      for(let i in body.childNodes) {501        count++;502      }503      // JS proxies were broken, we can iterate over some other items:504      // length, item and iterator505      let expectedCount;506      if ('UNWRAP_ACCESS_KEY' in window)507        expectedCount = 3;508      else509        expectedCount = 6;510      assert(count == expectedCount, "body.childNodes is iterable");511      done();512    }513  );514});515exports["test valueOf"] = createProxyTest("", function (helper) {516  if (USE_JS_PROXIES) {517    helper.createWorker(518      'new ' + function ContentScriptScope() {519        // Check internal use of valueOf() for JS proxies API520        assert(/\[object Window.*\]/.test(window.valueOf().toString()),521               "proxy.valueOf() returns the wrapped version");522        assert(/\[object Window.*\]/.test(window.valueOf({}).toString()),523               "proxy.valueOf({}) returns the wrapped version");524        done();525      }526    );527  }528  else {529    helper.createWorker(530      'new ' + function ContentScriptScope() {531        // Bug 787013: Until this bug is fixed, we are missing some methods532        // on JS objects that comes from global `Object` object533        assert(!('valueOf' in window), "valueOf is missing");534        assert(!('toLocateString' in window), "toLocaleString is missing");535        done();536      }537    );538  }539});540exports["test XMLHttpRequest"] = createProxyTest("", function (helper) {541  helper.createWorker(542    'new ' + function ContentScriptScope() {543      // XMLHttpRequest doesn't support XMLHttpRequest.apply,544      // that may break our proxy code545      assert(window.XMLHttpRequest(), "we are able to instantiate XMLHttpRequest object");546      done();547    }548  );549});550exports["test XPathResult"] = createProxyTest("", function (helper, assert) {551  const XPathResultTypes = ["ANY_TYPE",552                            "NUMBER_TYPE", "STRING_TYPE", "BOOLEAN_TYPE",553                            "UNORDERED_NODE_ITERATOR_TYPE",554                            "ORDERED_NODE_ITERATOR_TYPE",555                            "UNORDERED_NODE_SNAPSHOT_TYPE",556                            "ORDERED_NODE_SNAPSHOT_TYPE",557                            "ANY_UNORDERED_NODE_TYPE",558                            "FIRST_ORDERED_NODE_TYPE"];559  // Check XPathResult bug with constants being undefined on XPCNativeWrapper560  let xpcXPathResult = helper.xrayWindow.XPathResult;561  XPathResultTypes.forEach(function(type, i) {562    assert.equal(xpcXPathResult.wrappedJSObject[type],563                     helper.rawWindow.XPathResult[type],564                     "XPathResult's constants are valid on unwrapped node");565    assert.equal(xpcXPathResult[type], i,566                     "XPathResult's constants are defined on " +567                     "XPCNativeWrapper (platform bug #)");568  });569  let value = helper.rawWindow.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE;570  let worker = helper.createWorker(571    'new ' + function ContentScriptScope() {572      self.port.on("value", function (value) {573        // Check that our work around is working:574        assert(window.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE === value,575               "XPathResult works correctly on Proxies");576        done();577      });578    }579  );580  worker.port.emit("value", value);581});582exports["test Prototype Inheritance"] = createProxyTest("", function (helper) {583  helper.createWorker(584    'new ' + function ContentScriptScope() {585      // Verify that inherited prototype function like initEvent586      // are handled correctly. (e2.type will return an error if it's not the case)587      let event1 = document.createEvent( 'MouseEvents' );588      event1.initEvent( "click", true, true );589      let event2 = document.createEvent( 'MouseEvents' );590      event2.initEvent( "click", true, true );591      assert(event2.type == "click", "We are able to create an event");592      done();593    }594  );595});596exports["test Functions"] = createProxyTest("", function (helper) {597  helper.rawWindow.callFunction = function callFunction(f) f();598  helper.rawWindow.isEqual = function isEqual(a, b) a == b;599  // bug 784116: workaround in order to allow proxy code to cache proxies on600  // these functions:601  helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'};602  helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'};603  helper.createWorker(604    'new ' + function ContentScriptScope() {605      // Check basic usage of functions606      let closure2 = function () {return "ok";};607      assert(window.wrappedJSObject.callFunction(closure2) == "ok", "Function references work");608      // Ensure that functions are cached when being wrapped to native code609      let closure = function () {};610      assert(window.wrappedJSObject.isEqual(closure, closure), "Function references are cached before being wrapped to native");611      done();612    }613  );614});615let html = '<input id="input2" type="checkbox" />';616exports["test Listeners"] = createProxyTest(html, function (helper) {617  helper.createWorker(618    'new ' + function ContentScriptScope() {619      // Verify listeners:620      let input = document.getElementById("input2");621      assert(input, "proxy.getElementById works");622      function onclick() {};623      input.onclick = onclick;624      assert(input.onclick === onclick, "on* attributes are equal to original function set");625      let addEventListenerCalled = false;626      let expandoCalled = false;627      input.addEventListener("click", function onclick(event) {628        input.removeEventListener("click", onclick, true);629        assert(!addEventListenerCalled, "closure given to addEventListener is called once");630        if (addEventListenerCalled)631          return;632        addEventListenerCalled = true;633        assert(!event.target.ownerDocument.defaultView.documentGlobal, "event object is still wrapped and doesn't expose document globals");634        if ('UNWRAP_ACCESS_KEY' in window)635          assert("__isWrappedProxy" in event.target, "event object is a proxy");636        let input2 = document.getElementById("input2");637        input.onclick = function (event) {638          input.onclick = null;639          assert(!expandoCalled, "closure set to expando is called once");640          if (expandoCalled) return;641          expandoCalled = true;642          assert(!event.target.ownerDocument.defaultView.documentGlobal, "event object is still wrapped and doesn't expose document globals");643          if ('UNWRAP_ACCESS_KEY' in window)644            assert("__isWrappedProxy" in event.target, "event object is a proxy");645          setTimeout(function () {646            input.click();647            done();648          }, 0);649        }650        setTimeout(function () {651          input.click();652        }, 0);653      }, true);654      input.click();655    }656  );657});658exports["test MozRequestAnimationFrame"] = createProxyTest("", function (helper) {659  helper.createWorker(660    'new ' + function ContentScriptScope() {661      window.mozRequestAnimationFrame(function callback() {662        assert(callback == this, "callback is equal to `this`");663        done();664      });665    }666  );667});668exports["testGlobalScope"] = createProxyTest("", function (helper) {669  helper.createWorker(670    'let toplevelScope = true;' +671    'assert(window.toplevelScope, "variables in toplevel scope are set to `window` object");' +672    'assert(this.toplevelScope, "variables in toplevel scope are set to `this` object");' +673    'done();'674  );675});676if (USE_JS_PROXIES) {677  // Bug 671016: Typed arrays should not be proxified678  exports["test Typed ArraysX"] = createProxyTest("", function (helper) {679    helper.createWorker(680      'new ' + function ContentScriptScope() {681        let canvas = document.createElement("canvas");682        let context = canvas.getContext("2d");683        let imageData = context.getImageData(0,0, 1, 1);684        let unwrappedData;685        if ('UNWRAP_ACCESS_KEY' in window)686          unwrappedData = imageData.valueOf(UNWRAP_ACCESS_KEY).data687        else688          unwrappedData = imageData.wrappedJSObject.data;689        let data = imageData.data;690        dump(unwrappedData+" === "+data+"\n");691        assert(unwrappedData === data, "Typed array isn't proxified")692        done();693      }694    );695  });696}697// Bug 715755: proxy code throw an exception on COW698// Create an http server in order to simulate real cross domain documents699exports["test Cross Domain Iframe"] = createProxyTest("", function (helper) {700  let serverPort = 8099;701  let server = require("sdk/test/httpd").startServerAsync(serverPort);702  server.registerPathHandler("/", function handle(request, response) {703    // Returns the webpage that receive a message and forward it back to its704    // parent document by appending ' world'.705    let content = "<html><head><meta charset='utf-8'></head>\n";706    content += "<script>\n";707    content += "  window.addEventListener('message', function (event) {\n";708    content += "    parent.postMessage(event.data + ' world', '*');\n";709    content += "  }, true);\n";710    content += "</script>\n";711    content += "<body></body>\n";712    content += "</html>\n";713    response.write(content);714  });715  let worker = helper.createWorker(716    'new ' + function ContentScriptScope() {717      // Waits for the server page url718      self.on("message", function (url) {719        // Creates an iframe with this page720        let iframe = document.createElement("iframe");721        iframe.addEventListener("load", function onload() {722          iframe.removeEventListener("load", onload, true);723          try {724            // Try to communicate with iframe's content725            window.addEventListener("message", function onmessage(event) {726              window.removeEventListener("message", onmessage, true);727              assert(event.data == "hello world", "COW works properly");728              self.port.emit("end");729            }, true);730            iframe.contentWindow.postMessage("hello", "*");731          } catch(e) {732            assert(false, "COW fails : "+e.message);733          }734        }, true);735        iframe.setAttribute("src", url);736        document.body.appendChild(iframe);737      });738    }739  );740  worker.port.on("end", function () {741    server.stop(helper.done);742  });743  worker.postMessage("http://localhost:" + serverPort + "/");744});745// Bug 769006: Ensure that MutationObserver works fine with proxies746let html = '<a href="foo">link</a>';747exports["test MutationObvserver"] = createProxyTest(html, function (helper) {748  helper.createWorker(749    'new ' + function ContentScriptScope() {750      if (typeof MutationObserver == "undefined") {751        assert(true, "No MutationObserver for this FF version");752        done();753        return;754      }755      let link = document.getElementsByTagName("a")[0];756      // Register a Mutation observer757      let obs = new MutationObserver(function(mutations){758        // Ensure that mutation data are valid759        assert(mutations.length == 1, "only one attribute mutation");760        let mutation = mutations[0];761        assert(mutation.type == "attributes", "check `type`");762        assert(mutation.target == link, "check `target`");...

Full Screen

Full Screen

test-content-script.js

Source:test-content-script.js Github

copy

Full Screen

...40      let helper = {41        xrayWindow: xrayWindow,42        rawWindow: rawWindow,43        createWorker: function (contentScript) {44          return createWorker(assert, xrayWindow, contentScript, helper.done);45        },46        done: function () {47          if (isDone)48            return;49          isDone = true;50          element.remove();51          done();52        }53      };54      callback(helper, assert);55    }56  };57}58function createWorker(assert, xrayWindow, contentScript, done) {59  let loader = Loader(module);60  let Worker = loader.require("sdk/content/worker").Worker;61  let worker = Worker({62    window: xrayWindow,63    contentScript: [64      'new ' + function () {65        assert = function assert(v, msg) {66          self.port.emit("assert", {assertion:v, msg:msg});67        }68        done = function done() {69          self.port.emit("done");70        }71      },72      contentScript73    ]74  });75  worker.port.on("done", done);76  worker.port.on("assert", function (data) {77    assert.ok(data.assertion, data.msg);78  });79  return worker;80}81/* Examples for the `createProxyTest` uses */82var html = "<script>var documentGlobal = true</script>";83exports["test Create Proxy Test"] = createProxyTest(html, function (helper, assert) {84  // You can get access to regular `test` object in second argument of85  // `createProxyTest` method:86  assert.ok(helper.rawWindow.documentGlobal,87              "You have access to a raw window reference via `helper.rawWindow`");88  assert.ok(!("documentGlobal" in helper.xrayWindow),89              "You have access to an XrayWrapper reference via `helper.xrayWindow`");90  // If you do not create a Worker, you have to call helper.done(),91  // in order to say when your test is finished92  helper.done();93});94exports["test Create Proxy Test With Worker"] = createProxyTest("", function (helper) {95  helper.createWorker(96    "new " + function WorkerScope() {97      assert(true, "You can do assertions in your content script");98      // And if you create a worker, you either have to call `done`99      // from content script or helper.done()100      done();101    }102  );103});104exports["test Create Proxy Test With Events"] = createProxyTest("", function (helper, assert) {105  let worker = helper.createWorker(106    "new " + function WorkerScope() {107      self.port.emit("foo");108    }109  );110  worker.port.on("foo", function () {111    assert.pass("You can use events");112    // And terminate your test with helper.done:113    helper.done();114  });115});116/* Disabled due to bug 1038432117// Bug 714778: There was some issue around `toString` functions118//             that ended up being shared between content scripts119exports["test Shared To String Proxies"] = createProxyTest("", function(helper) {120  let worker = helper.createWorker(121    'new ' + function ContentScriptScope() {122      // We ensure that `toString` can't be modified so that nothing could123      // leak to/from the document and between content scripts124      // It only applies to JS proxies, there isn't any such issue with xrays.125      //document.location.toString = function foo() {};126      document.location.toString.foo = "bar";127      assert("foo" in document.location.toString, "document.location.toString can be modified");128      assert(document.location.toString() == "data:text/html;charset=utf-8,",129             "First document.location.toString()");130      self.postMessage("next");131    }132  );133  worker.on("message", function () {134    helper.createWorker(135      'new ' + function ContentScriptScope2() {136        assert(!("foo" in document.location.toString),137               "document.location.toString is different for each content script");138        assert(document.location.toString() == "data:text/html;charset=utf-8,",139               "Second document.location.toString()");140        done();141      }142    );143  });144});145*/146// Ensure that postMessage is working correctly across documents with an iframe147var html = '<iframe id="iframe" name="test" src="data:text/html;charset=utf-8," />';148exports["test postMessage"] = createProxyTest(html, function (helper, assert) {149  let ifWindow = helper.xrayWindow.document.getElementById("iframe").contentWindow;150  // Listen without proxies, to check that it will work in regular case151  // simulate listening from a web document.152  ifWindow.addEventListener("message", function(event) {153    // As we are in system principal, event is an XrayWrapper154    // xrays use current compartments when calling postMessage method.155    // Whereas js proxies was using postMessage method compartment,156    // not the caller one.157    assert.strictEqual(event.source, helper.xrayWindow,158                      "event.source is the top window");159    assert.equal(event.origin, testHost, "origin matches testHost");160    assert.equal(event.data, "{\"foo\":\"bar\\n \\\"escaped\\\".\"}",161                     "message data is correct");162    helper.done();163  }, {once: true});164  helper.createWorker(165    'new ' + function ContentScriptScope() {166      var json = JSON.stringify({foo : "bar\n \"escaped\"."});167      document.getElementById("iframe").contentWindow.postMessage(json, "*");168    }169  );170});171var html = '<input id="input2" type="checkbox" />';172exports["test Object Listener"] = createProxyTest(html, function (helper) {173  helper.createWorker(174    'new ' + function ContentScriptScope() {175      // Test objects being given as event listener176      let input = document.getElementById("input2");177      let myClickListener = {178        called: false,179        handleEvent: function(event) {180          assert(this === myClickListener, "`this` is the original object");181          assert(!this.called, "called only once");182          this.called = true;183          assert(event.target, input, "event.target is the wrapped window");184          done();185        }186      };187      window.addEventListener("click", myClickListener, true);188      input.click();189      window.removeEventListener("click", myClickListener, true);190    }191  );192});193exports["test Object Listener 2"] = createProxyTest("", function (helper) {194  helper.createWorker(195    ('new ' + function ContentScriptScope() {196      // variable replaced with `testHost`197      let testHost = "TOKEN";198      // Verify object as DOM event listener199      let myMessageListener = {200        called: false,201        handleEvent: function(event) {202          window.removeEventListener("message", myMessageListener, true);203          assert(this == myMessageListener, "`this` is the original object");204          assert(!this.called, "called only once");205          this.called = true;206          assert(event.target == document.defaultView, "event.target is the wrapped window");207          assert(event.source == document.defaultView, "event.source is the wrapped window");208          assert(event.origin == testHost, "origin matches testHost");209          assert(event.data == "ok", "message data is correct");210          done();211        }212      };213      window.addEventListener("message", myMessageListener, true);214      document.defaultView.postMessage("ok", '*');215    }216  ).replace("TOKEN", testHost));217});218var html = '<input id="input" type="text" /><input id="input3" type="checkbox" />' +219             '<input id="input2" type="checkbox" />';220exports.testStringOverload = createProxyTest(html, function (helper, assert) {221  helper.createWorker(222    'new ' + function ContentScriptScope() {223      // RightJS is hacking around String.prototype, and do similar thing:224      // Pass `this` from a String prototype method.225      // It is funny because typeof this == "object"!226      // So that when we pass `this` to a native method,227      // our proxy code can fail on another even more crazy thing.228      // See following test to see what fails around proxies.229      String.prototype.update = function () {230        assert(typeof this == "object", "in update, `this` is an object");231        assert(this.toString() == "input", "in update, `this.toString works");232        return document.querySelectorAll(this);233      };234      assert("input".update().length == 3, "String.prototype overload works");235      done();236    }237  );238});239exports["test Element.matches()"] = createProxyTest("", function (helper) {240  helper.createWorker(241    'new ' + function ContentScriptScope() {242      // Check matches XrayWrappers bug (Bug 658909):243      // Test that Element.matches() does not return bad results when we are244      // not calling it from the node itself.245      assert(document.createElement( "div" ).matches("div"),246             "matches works while being called from the node");247      assert(document.documentElement.matches.call(248               document.createElement( "div" ),249               "div"250             ),251             "matches works while being called from a " +252             "function reference to " +253             "document.documentElement.matches.call");254      done();255    }256  );257});258exports["test Events Overload"] = createProxyTest("", function (helper) {259  helper.createWorker(260    'new ' + function ContentScriptScope() {261      // If we add a "____proxy" attribute on XrayWrappers in order to store262      // the related proxy to create an unique proxy for each wrapper;263      // we end up setting this attribute to prototype objects :x264      // And so, instances created with such prototype will be considered265      // as equal to the prototype ...266      //   // Internal method that return the proxy for a given XrayWrapper267      //   function proxify(obj) {268      //     if (obj._proxy) return obj._proxy;269      //     return obj._proxy = Proxy.create(...);270      //   }271      //272      //   // Get a proxy of an XrayWrapper prototype object273      //   let proto = proxify(xpcProto);274      //275      //   // Use this proxy as a prototype276      //   function Constr() {}277      //   Constr.proto = proto;278      //279      //   // Try to create an instance using this prototype280      //   let xpcInstance = new Constr();281      //   let wrapper = proxify(xpcInstance)282      //283      //   xpcProto._proxy = proto and as xpcInstance.__proto__ = xpcProto,284      //   xpcInstance._proxy = proto ... and profixy(xpcInstance) = proto :(285      //286      let proto = window.document.createEvent('HTMLEvents').__proto__;287      window.Event.prototype = proto;288      let event = document.createEvent('HTMLEvents');289      assert(event !== proto, "Event should not be equal to its prototype");290      event.initEvent('dataavailable', true, true);291      assert(event.type === 'dataavailable', "Events are working fine");292      done();293    }294  );295});296exports["test Nested Attributes"] = createProxyTest("", function (helper) {297  helper.createWorker(298    'new ' + function ContentScriptScope() {299      // XrayWrappers has a bug when you set an attribute on it,300      // in some cases, it creates an unnecessary wrapper that introduces301      // a different object that refers to the same original object302      // Check that our wrappers don't reproduce this bug303      // SEE BUG 658560: Fix identity problem with CrossOriginWrappers304      let o = {sandboxObject:true};305      window.nested = o;306      o.foo = true;307      assert(o === window.nested, "Nested attribute to sandbox object should not be proxified");308      window.nested = document;309      assert(window.nested === document, "Nested attribute to proxy should not be double proxified");310      done();311    }312  );313});314exports["test Form nodeName"] = createProxyTest("", function (helper) {315  helper.createWorker(316    'new ' + function ContentScriptScope() {317      let body = document.body;318      // Check form[nodeName]319      let form = document.createElement("form");320      let input = document.createElement("input");321      input.setAttribute("name", "test");322      form.appendChild(input);323      body.appendChild(form);324      assert(form.test == input, "form[nodeName] is valid");325      body.removeChild(form);326      done();327    }328  );329});330exports["test localStorage"] = createProxyTest("", function (helper, assert) {331  let worker = helper.createWorker(332    'new ' + function ContentScriptScope() {333      // Check localStorage:334      assert(window.localStorage, "has access to localStorage");335      window.localStorage.name = 1;336      assert(window.localStorage.name == 1, "localStorage appears to work");337      self.port.on("step2", function () {338        window.localStorage.clear();339        assert(window.localStorage.name == undefined, "localStorage really, really works");340        done();341      });342      self.port.emit("step1");343    }344  );345  worker.port.on("step1", function () {346    assert.equal(helper.rawWindow.localStorage.name, 1, "localStorage really works");347    worker.port.emit("step2");348  });349});350exports["test Auto Unwrap Custom Attributes"] = createProxyTest("", function (helper) {351  helper.createWorker(352    'new ' + function ContentScriptScope() {353      let body = document.body;354      // Setting a custom object to a proxy attribute is not wrapped when we get it afterward355      let object = {custom: true, enumerable: false};356      body.customAttribute = object;357      assert(object === body.customAttribute, "custom JS attributes are not wrapped");358      done();359    }360  );361});362exports["test Object Tag"] = createProxyTest("", function (helper) {363  helper.createWorker(364    'new ' + function ContentScriptScope() {365      // <object>, <embed> and other tags return typeof 'object'366      let flash = document.createElement("object");367      assert(typeof flash == "object", "<object> is typeof 'function'");368      assert(flash.toString().match(/\[object HTMLObjectElement.*\]/), "<object> is HTMLObjectElement");369      assert("setAttribute" in flash, "<object> has a setAttribute method");370      done();371    }372  );373});374exports["test Highlight toString Behavior"] = createProxyTest("", function (helper, assert) {375  // We do not have any workaround this particular use of toString376  // applied on <object> elements. So disable this test until we found one!377  //assert.equal(helper.rawWindow.Object.prototype.toString.call(flash), "[object HTMLObjectElement]", "<object> is HTMLObjectElement");378  function f() {};379  let funToString = Object.prototype.toString.call(f);380  assert.ok(/\[object Function.*\]/.test(funToString), "functions are functions 1");381  // This is how jquery call toString:382  let strToString = helper.rawWindow.Object.prototype.toString.call("");383  assert.ok(/\[object String.*\]/.test(strToString), "strings are strings");384  let o = {__exposedProps__:{}};385  let objToString = helper.rawWindow.Object.prototype.toString.call(o);386  assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects");387  // Make sure to pass a function from the same compartments388  // or toString will return [object Object] on FF8+389  let f2 = helper.rawWindow.eval("(function () {})");390  let funToString2 = helper.rawWindow.Object.prototype.toString.call(f2);391  assert.ok(/\[object Function.*\]/.test(funToString2), "functions are functions 2");392  helper.done();393});394exports["test Document TagName"] = createProxyTest("", function (helper) {395  helper.createWorker(396    'new ' + function ContentScriptScope() {397      let body = document.body;398      // Check document[tagName]399      let div = document.createElement("div");400      div.setAttribute("name", "test");401      body.appendChild(div);402      assert(!document.test, "document[divName] is undefined");403      body.removeChild(div);404      let form = document.createElement("form");405      form.setAttribute("name", "test");406      body.appendChild(form);407      assert(document.test == form, "document[formName] is valid");408      body.removeChild(form);409      let img = document.createElement("img");410      img.setAttribute("name", "test");411      body.appendChild(img);412      assert(document.test == img, "document[imgName] is valid");413      body.removeChild(img);414      done();415    }416  );417});418var html = '<iframe id="iframe" name="test" src="data:text/html;charset=utf-8," />';419exports["test Window Frames"] = createProxyTest(html, function (helper) {420  helper.createWorker(421    'let glob = this; new ' + function ContentScriptScope() {422      // Check window[frameName] and window.frames[i]423      let iframe = document.getElementById("iframe");424      //assert(window.frames.length == 1, "The iframe is reported in window.frames check1");425      //assert(window.frames[0] == iframe.contentWindow, "The iframe is reported in window.frames check2");426      assert(window.test == iframe.contentWindow, "window[frameName] is valid");427      done();428    }429  );430});431exports["test Collections"] = createProxyTest("", function (helper) {432  helper.createWorker(433    'new ' + function ContentScriptScope() {434      // Highlight XPCNativeWrapper bug with HTMLCollection435      // tds[0] is only defined on first access :o436      let body = document.body;437      let div = document.createElement("div");438      body.appendChild(div);439      div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";440      let tds = div.getElementsByTagName("td");441      assert(tds[0] == tds[0], "We can get array element multiple times");442      body.removeChild(div);443      done();444    }445  );446});447var html = '<input id="input" type="text" /><input id="input3" type="checkbox" />' +448             '<input id="input2" type="checkbox" />';449exports["test Collections 2"] = createProxyTest(html, function (helper) {450  helper.createWorker(451    'new ' + function ContentScriptScope() {452      // Verify that NodeList/HTMLCollection are working fine453      let body = document.body;454      let inputs = body.getElementsByTagName("input");455      assert(body.childNodes.length == 3, "body.childNodes length is correct");456      assert(inputs.length == 3, "inputs.length is correct");457      assert(body.childNodes[0] == inputs[0], "body.childNodes[0] is correct");458      assert(body.childNodes[1] == inputs[1], "body.childNodes[1] is correct");459      assert(body.childNodes[2] == inputs[2], "body.childNodes[2] is correct");460      let count = 0;461      for(let i in body.childNodes) {462        count++;463      }464      assert(count >= 3, "body.childNodes is iterable");465      done();466    }467  );468});469exports["test XMLHttpRequest"] = createProxyTest("", function (helper) {470  helper.createWorker(471    'new ' + function ContentScriptScope() {472      // XMLHttpRequest doesn't support XMLHttpRequest.apply,473      // that may break our proxy code474      assert(new window.XMLHttpRequest(), "we are able to instantiate XMLHttpRequest object");475      done();476    }477  );478});479exports["test XPathResult"] = createProxyTest("", function (helper, assert) {480  const XPathResultTypes = ["ANY_TYPE",481                            "NUMBER_TYPE", "STRING_TYPE", "BOOLEAN_TYPE",482                            "UNORDERED_NODE_ITERATOR_TYPE",483                            "ORDERED_NODE_ITERATOR_TYPE",484                            "UNORDERED_NODE_SNAPSHOT_TYPE",485                            "ORDERED_NODE_SNAPSHOT_TYPE",486                            "ANY_UNORDERED_NODE_TYPE",487                            "FIRST_ORDERED_NODE_TYPE"];488  // Check XPathResult bug with constants being undefined on XPCNativeWrapper489  let xpcXPathResult = helper.xrayWindow.XPathResult;490  XPathResultTypes.forEach(function(type, i) {491    assert.equal(xpcXPathResult.wrappedJSObject[type],492                     helper.rawWindow.XPathResult[type],493                     "XPathResult's constants are valid on unwrapped node");494    assert.equal(xpcXPathResult[type], i,495                     "XPathResult's constants are defined on " +496                     "XPCNativeWrapper (platform bug #)");497  });498  let value = helper.rawWindow.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE;499  let worker = helper.createWorker(500    'new ' + function ContentScriptScope() {501      self.port.on("value", function (value) {502        // Check that our work around is working:503        assert(window.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE === value,504               "XPathResult works correctly on Proxies");505        done();506      });507    }508  );509  worker.port.emit("value", value);510});511exports["test Prototype Inheritance"] = createProxyTest("", function (helper) {512  helper.createWorker(513    'new ' + function ContentScriptScope() {514      // Verify that inherited prototype function like initEvent515      // are handled correctly. (e2.type will return an error if it's not the case)516      let event1 = document.createEvent( 'MouseEvents' );517      event1.initEvent( "click", true, true );518      let event2 = document.createEvent( 'MouseEvents' );519      event2.initEvent( "click", true, true );520      assert(event2.type == "click", "We are able to create an event");521      done();522    }523  );524});525exports["test Functions"] = createProxyTest("", function (helper) {526  helper.rawWindow.callFunction = function callFunction(f) {527    return f();528  };529  helper.rawWindow.isEqual = function isEqual(a, b) {530    return a == b;531  };532  // bug 784116: workaround in order to allow proxy code to cache proxies on533  // these functions:534  helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'};535  helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'};536  helper.createWorker(537    'new ' + function ContentScriptScope() {538      // Check basic usage of functions539      let closure2 = function () {return "ok";};540      assert(window.wrappedJSObject.callFunction(closure2) == "ok", "Function references work");541      // Ensure that functions are cached when being wrapped to native code542      let closure = function () {};543      assert(window.wrappedJSObject.isEqual(closure, closure), "Function references are cached before being wrapped to native");544      done();545    }546  );547});548var html = '<input id="input2" type="checkbox" />';549exports["test Listeners"] = createProxyTest(html, function (helper) {550  helper.createWorker(551    'new ' + function ContentScriptScope() {552      // Verify listeners:553      let input = document.getElementById("input2");554      assert(input, "proxy.getElementById works");555      function onclick() {};556      input.onclick = onclick;557      assert(input.onclick === onclick, "on* attributes are equal to original function set");558      let addEventListenerCalled = false;559      let expandoCalled = false;560      input.addEventListener("click", function onclick(event) {561        assert(!addEventListenerCalled, "closure given to addEventListener is called once");562        if (addEventListenerCalled)563          return;564        addEventListenerCalled = true;565        assert(!event.target.ownerDocument.defaultView.documentGlobal, "event object is still wrapped and doesn't expose document globals");566        let input2 = document.getElementById("input2");567        input.onclick = function (event) {568          input.onclick = null;569          assert(!expandoCalled, "closure set to expando is called once");570          if (expandoCalled) return;571          expandoCalled = true;572          assert(!event.target.ownerDocument.defaultView.documentGlobal, "event object is still wrapped and doesn't expose document globals");573          setTimeout(function () {574            input.click();575            done();576          }, 0);577        }578        setTimeout(function () {579          input.click();580        }, 0);581      }, {capture: true, once: true});582      input.click();583    }584  );585});586exports["test requestAnimationFrame"] = createProxyTest("", function (helper) {587  helper.createWorker(588    'new ' + function ContentScriptScope() {589      var self = (function() { return this; })();590      window.requestAnimationFrame(function callback() {591        assert(self == this, "self is equal to `this`");592        done();593      });594    }595  );596});597exports["testGlobalScope"] = createProxyTest("", function (helper) {598  helper.createWorker(599    'var toplevelScope = true;' +600    'assert(window.toplevelScope, "variables in toplevel scope are set to `window` object");' +601    'assert(this.toplevelScope, "variables in toplevel scope are set to `this` object");' +602    'done();'603  );604});605// Bug 715755: proxy code throw an exception on COW606// Create an http server in order to simulate real cross domain documents607exports["test Cross Domain Iframe"] = createProxyTest("", function (helper) {608  let serverPort = 8099;609  let server = require("./lib/httpd").startServerAsync(serverPort);610  server.registerPathHandler("/", function handle(request, response) {611    // Returns the webpage that receive a message and forward it back to its612    // parent document by appending ' world'.613    let content = "<html><head><meta charset='utf-8'></head>\n";614    content += "<script>\n";615    content += "  window.addEventListener('message', function (event) {\n";616    content += "    parent.postMessage(event.data + ' world', '*');\n";617    content += "  }, true);\n";618    content += "</script>\n";619    content += "<body></body>\n";620    content += "</html>\n";621    response.write(content);622  });623  let worker = helper.createWorker(624    'new ' + function ContentScriptScope() {625      // Waits for the server page url626      self.on("message", function (url) {627        // Creates an iframe with this page628        let iframe = document.createElement("iframe");629        iframe.addEventListener("load", function() {630          try {631            // Try to communicate with iframe's content632            window.addEventListener("message", function(event) {633              assert(event.data == "hello world", "COW works properly");634              self.port.emit("end");635            }, {capture: true, once: true});636            iframe.contentWindow.postMessage("hello", "*");637          } catch(e) {638            assert(false, "COW fails : "+e.message);639          }640        }, {capture: true, once: true});641        iframe.setAttribute("src", url);642        document.body.appendChild(iframe);643      });644    }645  );646  worker.port.on("end", function () {647    server.stop(helper.done);648  });649  worker.postMessage("http://localhost:" + serverPort + "/");650});651// Bug 769006: Ensure that MutationObserver works fine with proxies652var html = '<a href="foo">link</a>';653exports["test MutationObvserver"] = createProxyTest(html, function (helper) {654  helper.createWorker(655    'new ' + function ContentScriptScope() {656      if (typeof MutationObserver == "undefined") {657        assert(true, "No MutationObserver for this FF version");658        done();659        return;660      }661      let link = document.getElementsByTagName("a")[0];662      // Register a Mutation observer663      let obs = new MutationObserver(function(mutations){664        // Ensure that mutation data are valid665        assert(mutations.length == 1, "only one attribute mutation");666        let mutation = mutations[0];667        assert(mutation.type == "attributes", "check `type`");668        assert(mutation.target == link, "check `target`");669        assert(mutation.attributeName == "href", "check `attributeName`");670        assert(mutation.oldValue == "foo", "check `oldValue`");671        obs.disconnect();672        done();673      });674      obs.observe(document, {675        subtree: true,676        attributes: true,677        attributeOldValue: true,678        attributeFilter: ["href"]679      });680      // Modify the DOM681      link.setAttribute("href", "bar");682    }683  );684});685var html = '<script>' +686  'var accessCheck = function() {' +687  '  assert(true, "exporting function works");' +688  '  try{' +689  '    exportedObj.prop;' +690  '    assert(false, "content should not have access to content-script");' +691  '  } catch(e) {' +692  '    assert(e.toString().indexOf("Permission denied") != -1,' +693  '           "content should not have access to content-script");' +694  '  }' +695  '}</script>';696exports["test nsEp for content-script"] = createProxyTest(html, function (helper) {697  helper.createWorker(698    'let glob = this; new ' + function ContentScriptScope() {699      exportFunction(assert, unsafeWindow, { defineAs: "assert" });700      window.wrappedJSObject.assert(true, "assert exported");701      window.wrappedJSObject.exportedObj = { prop: 42 };702      window.wrappedJSObject.accessCheck();703      done();704    }705  );706});...

Full Screen

Full Screen

WorkPool.test.js

Source:WorkPool.test.js Github

copy

Full Screen

1/*2 * Copyright (c) 2002-2019 "Neo4j,"3 * Neo4j Sweden AB [http://neo4j.com]4 *5 * This file is part of Neo4j.6 *7 * Neo4j is free software: you can redistribute it and/or modify8 * it under the terms of the GNU General Public License as published by9 * the Free Software Foundation, either version 3 of the License, or10 * (at your option) any later version.11 *12 * This program is distributed in the hope that it will be useful,13 * but WITHOUT ANY WARRANTY; without even the implied warranty of14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the15 * GNU General Public License for more details.16 *17 * You should have received a copy of the GNU General Public License18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.19 */20/* global jest, beforeEach */21import { v4 as uuid } from 'uuid'22import WorkPool from './WorkPool'23describe('Workpool', () => {24  let createWorker25  let register26  let id27  let postMessage28  beforeEach(() => {29    postMessage = jest.fn()30    createWorker = jest.fn(() => {31      return {32        postMessage33      }34    })35    register = new WorkPool(createWorker)36    id = uuid()37  })38  test('can do and finish work', () => {39    // Given40    const work = {41      id42    }43    // When44    const workObj = register.doWork(work)45    // Then46    expect(register.getQueueSize()).toEqual(0)47    expect(register.getPoolSize()).toEqual(1)48    expect(register.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(1)49    expect(register.getPoolSize(WorkPool.workerStates.FREE)).toEqual(0)50    expect(createWorker).toHaveBeenCalledTimes(1)51    expect(workObj.id).toEqual(id)52    // When53    workObj.finish()54    // Then55    expect(register.getQueueSize()).toEqual(0)56    expect(register.getPoolSize()).toEqual(1)57    expect(register.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(0)58    expect(register.getPoolSize(WorkPool.workerStates.FREE)).toEqual(1)59    expect(createWorker).toHaveBeenCalledTimes(1)60  })61  test('can have onFinish ques', () => {62    // Given63    const id1 = { id: uuid() }64    const id2 = { id: uuid() }65    const id3 = { id: uuid() }66    const onFinishFn1 = jest.fn()67    const onFinishFn2 = jest.fn()68    const onFinishFn3 = jest.fn()69    // When70    const workObj1 = register.doWork(id1)71    const workObj2 = register.doWork(id2)72    workObj1.onFinish(onFinishFn1)73    workObj2.onFinish(onFinishFn2)74    // Then75    expect(createWorker).toHaveBeenCalledTimes(2)76    expect(onFinishFn1).toHaveBeenCalledTimes(0)77    expect(onFinishFn2).toHaveBeenCalledTimes(0)78    // When79    workObj1.finish()80    // Then81    expect(createWorker).toHaveBeenCalledTimes(2)82    expect(onFinishFn1).toHaveBeenCalledTimes(1)83    expect(onFinishFn2).toHaveBeenCalledTimes(0)84    // When85    const workObj3 = register.doWork(id3)86    workObj3.onFinish(onFinishFn3)87    workObj2.finish()88    // Then89    expect(onFinishFn1).toHaveBeenCalledTimes(1)90    expect(onFinishFn2).toHaveBeenCalledTimes(1)91    expect(onFinishFn3).toHaveBeenCalledTimes(0)92    // When93    workObj3.finish()94    // Then95    expect(onFinishFn1).toHaveBeenCalledTimes(1)96    expect(onFinishFn2).toHaveBeenCalledTimes(1)97    expect(onFinishFn3).toHaveBeenCalledTimes(1)98  })99  test('creates new workers if all are busy (not reaching pool size limit)', () => {100    // Given101    const id1 = { id: uuid() }102    const id2 = { id: uuid() }103    // When104    const workObj1 = register.doWork(id1)105    const workObj2 = register.doWork(id2)106    // Then107    expect(register.getPoolSize()).toEqual(2)108    expect(createWorker).toHaveBeenCalledTimes(2)109    expect(workObj1.id).toEqual(id1.id)110    expect(workObj2.id).toEqual(id2.id)111    expect(register.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(2)112    expect(register.getPoolSize(WorkPool.workerStates.FREE)).toEqual(0)113  })114  test('re-uses workers if there are available ones', () => {115    // Given116    const id1 = { id: uuid() }117    const id2 = { id: uuid() }118    const id3 = { id: uuid() }119    const id4 = { id: uuid() }120    // When121    const workObj1 = register.doWork(id1)122    const workObj2 = register.doWork(id2)123    register.doWork(id3)124    workObj1.finish()125    workObj2.finish()126    // When127    register.doWork(id4)128    // Then129    expect(createWorker).toHaveBeenCalledTimes(3)130    expect(register.getPoolSize()).toEqual(3)131    expect(register.getPoolSize(WorkPool.workerStates.FREE)).toEqual(1)132    expect(register.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(2)133  })134  it('exposes getWorkById and finds queued and ongoing work', () => {135    // Given136    const localRegister = new WorkPool(createWorker, 1)137    const initialWorkId = 'initial'138    // When139    // Just do some work so queue pool limit is reached140    const initialWorkObj = localRegister.doWork({ id: initialWorkId })141    const work = { id }142    const workObj = localRegister.doWork(work)143    // Then144    expect(createWorker).toHaveBeenCalledTimes(1)145    expect(workObj.id).toEqual(id)146    // When147    const workObj1 = localRegister.getWorkById(initialWorkId)148    const workObj2 = localRegister.getWorkById(id)149    // Then150    expect(workObj).toBe(workObj2) // same obj in memory151    expect(workObj1).toBe(initialWorkObj) // same obj in memory152    // When153    // Try something that's not there154    const notWorkObj = localRegister.getWorkById('not-present-id')155    // Then156    expect(notWorkObj).toEqual(null)157  })158  it('respcts the maxPoolSize and put jobs in queue', () => {159    // Given160    const poolSize = 2161    const localRegister = new WorkPool(createWorker, poolSize)162    const id1 = { id: uuid() }163    const id2 = { id: uuid() }164    const id3 = { id: uuid() }165    const id4 = { id: uuid() }166    // When167    const workObj1 = localRegister.doWork(id1)168    const workObj2 = localRegister.doWork(id2)169    const workObj3 = localRegister.doWork(id3)170    // Then171    expect(localRegister.getPoolSize()).toEqual(poolSize)172    expect(localRegister.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(173      poolSize174    )175    expect(localRegister.getPoolSize(WorkPool.workerStates.FREE)).toEqual(0)176    expect(localRegister.getQueueSize()).toEqual(1)177    // When178    workObj1.finish()179    // Then180    expect(localRegister.getPoolSize()).toEqual(poolSize)181    expect(localRegister.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(182      poolSize183    )184    expect(localRegister.getPoolSize(WorkPool.workerStates.FREE)).toEqual(0)185    expect(localRegister.getQueueSize()).toEqual(0)186    // When187    const workObj4 = localRegister.doWork(id4)188    // Then189    expect(localRegister.getPoolSize()).toEqual(poolSize)190    expect(localRegister.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(191      poolSize192    )193    expect(localRegister.getPoolSize(WorkPool.workerStates.FREE)).toEqual(0)194    expect(localRegister.getQueueSize()).toEqual(1)195    // When196    workObj2.finish()197    workObj3.finish()198    workObj4.finish()199    // Then200    expect(createWorker).toHaveBeenCalledTimes(poolSize)201    expect(localRegister.getPoolSize()).toEqual(poolSize)202    expect(localRegister.getPoolSize(WorkPool.workerStates.FREE)).toEqual(203      poolSize204    )205    expect(localRegister.getPoolSize(WorkPool.workerStates.BUSY)).toEqual(0)206  })207  test('Can message all workers at once', () => {208    const message = { type: 'hello all' }209    const postMessage1 = jest.fn()210    const postMessage2 = jest.fn()211    const postMessage3 = jest.fn()212    const createWorker = jest213      .fn()214      .mockImplementationOnce(() => {215        return {216          postMessage: postMessage1217        }218      })219      .mockImplementationOnce(() => {220        return {221          postMessage: postMessage2222        }223      })224      .mockImplementationOnce(() => {225        return {226          postMessage: postMessage3227        }228      })229    const localRegister = new WorkPool(createWorker)230    const id1 = { id: uuid() } // No work, just to create workers231    const id2 = { id: uuid() } // No work, just to create workers232    const id3 = { id: uuid() } // No work, just to create workers233    // When234    localRegister.doWork(id1)235    localRegister.doWork(id2)236    localRegister.doWork(id3)237    localRegister.messageAllWorkers(message)238    // Then239    expect(postMessage1).toHaveBeenCalledTimes(1)240    expect(postMessage1).toHaveBeenCalledWith(message)241    expect(postMessage2).toHaveBeenCalledTimes(1)242    expect(postMessage2).toHaveBeenCalledWith(message)243    expect(postMessage3).toHaveBeenCalledTimes(1)244    expect(postMessage3).toHaveBeenCalledWith(message)245  })...

Full Screen

Full Screen

test-Worker.js

Source:test-Worker.js Github

copy

Full Screen

...7expect.extend({ toBeType });8let worker;9beforeEach(() => worker && !worker.closed && worker.close());10afterEach(() => worker && !worker.closed && worker.close());11test('createWorker() succeeds', async () =>12{13	const onObserverNewWorker = jest.fn();14	observer.once('newworker', onObserverNewWorker);15	worker = await createWorker();16	expect(onObserverNewWorker).toHaveBeenCalledTimes(1);17	expect(onObserverNewWorker).toHaveBeenCalledWith(worker);18	expect(worker).toBeType('object');19	expect(worker.pid).toBeType('number');20	expect(worker.closed).toBe(false);21	worker.close();22	expect(worker.closed).toBe(true);23	// eslint-disable-next-line require-atomic-updates24	worker = await createWorker(25		{26			logLevel            : 'debug',27			logTags             : [ 'info' ],28			rtcMinPort          : 0,29			rtcMaxPort          : 9999,30			dtlsCertificateFile : 'test/data/dtls-cert.pem',31			dtlsPrivateKeyFile  : 'test/data/dtls-key.pem',32			appData             : { bar: 456 }33		});34	expect(worker).toBeType('object');35	expect(worker.pid).toBeType('number');36	expect(worker.closed).toBe(false);37	expect(worker.appData).toEqual({ bar: 456 });38	worker.close();39	expect(worker.closed).toBe(true);40}, 2000);41test('createWorker() with wrong settings rejects with TypeError', async () =>42{43	await expect(createWorker({ logLevel: 'chicken' }))44		.rejects45		.toThrow(TypeError);46	await expect(createWorker({ rtcMinPort: 1000, rtcMaxPort: 999 }))47		.rejects48		.toThrow(TypeError);49	// Port is from 0 to 65535.50	await expect(createWorker({ rtcMinPort: 1000, rtcMaxPort: 65536 }))51		.rejects52		.toThrow(TypeError);53	await expect(createWorker({ dtlsCertificateFile: '/notfound/cert.pem' }))54		.rejects55		.toThrow(TypeError);56	await expect(createWorker({ dtlsPrivateKeyFile: '/notfound/priv.pem' }))57		.rejects58		.toThrow(TypeError);59	await expect(createWorker({ appData: 'NOT-AN-OBJECT' }))60		.rejects61		.toThrow(TypeError);62}, 2000);63test('worker.updateSettings() succeeds', async () =>64{65	worker = await createWorker();66	await expect(worker.updateSettings({ logLevel: 'debug', logTags: [ 'ice' ] }))67		.resolves68		.toBeUndefined();69	worker.close();70}, 2000);71test('worker.updateSettings() with wrong settings rejects with TypeError', async () =>72{73	worker = await createWorker();74	await expect(worker.updateSettings({ logLevel: 'chicken' }))75		.rejects76		.toThrow(TypeError);77	worker.close();78}, 2000);79test('worker.updateSettings() rejects with InvalidStateError if closed', async () =>80{81	worker = await createWorker();82	worker.close();83	await expect(worker.updateSettings({ logLevel: 'error' }))84		.rejects85		.toThrow(InvalidStateError);86	worker.close();87}, 2000);88test('worker.dump() succeeds', async () =>89{90	worker = await createWorker();91	await expect(worker.dump())92		.resolves93		.toEqual({ pid: worker.pid, routerIds: [] });94	worker.close();95}, 2000);96test('worker.dump() rejects with InvalidStateError if closed', async () =>97{98	worker = await createWorker();99	worker.close();100	await expect(worker.dump())101		.rejects102		.toThrow(InvalidStateError);103	worker.close();104}, 2000);105test('worker.getResourceUsage() succeeds', async () =>106{107	worker = await createWorker();108	await expect(worker.getResourceUsage())109		.resolves110		.toMatchObject({});111	worker.close();112}, 2000);113test('worker.close() succeeds', async () =>114{115	worker = await createWorker({ logLevel: 'warn' });116	const onObserverClose = jest.fn();117	worker.observer.once('close', onObserverClose);118	worker.close();119	expect(onObserverClose).toHaveBeenCalledTimes(1);120	expect(worker.closed).toBe(true);121}, 2000);122test('Worker emits "died" if worker process died unexpectedly', async () =>123{124	let onObserverClose;125	worker = await createWorker({ logLevel: 'warn' });126	onObserverClose = jest.fn();127	worker.observer.once('close', onObserverClose);128	await new Promise((resolve) =>129	{130		worker.on('died', resolve);131		process.kill(worker.pid, 'SIGINT');132	});133	expect(onObserverClose).toHaveBeenCalledTimes(1);134	expect(worker.closed).toBe(true);135	// eslint-disable-next-line require-atomic-updates136	worker = await createWorker({ logLevel: 'warn' });137	onObserverClose = jest.fn();138	worker.observer.once('close', onObserverClose);139	await new Promise((resolve) =>140	{141		worker.on('died', resolve);142		process.kill(worker.pid, 'SIGTERM');143	});144	expect(onObserverClose).toHaveBeenCalledTimes(1);145	expect(worker.closed).toBe(true);146	// eslint-disable-next-line require-atomic-updates147	worker = await createWorker({ logLevel: 'warn' });148	onObserverClose = jest.fn();149	worker.observer.once('close', onObserverClose);150	await new Promise((resolve) =>151	{152		worker.on('died', resolve);153		process.kill(worker.pid, 'SIGKILL');154	});155	expect(onObserverClose).toHaveBeenCalledTimes(1);156	expect(worker.closed).toBe(true);157}, 5000);158test('worker process ignores PIPE, HUP, ALRM, USR1 and USR2 signals', async () =>159{160	// Windows doesn't have some signals such as SIGPIPE, SIGALRM, SIGUSR1, SIGUSR2161	// so we just skip this test in Windows.162	if (os.platform() === 'win32')163		return;164	worker = await createWorker({ logLevel: 'warn' });165	await new Promise((resolve, reject) =>166	{167		worker.on('died', reject);168		process.kill(worker.pid, 'SIGPIPE');169		process.kill(worker.pid, 'SIGHUP');170		process.kill(worker.pid, 'SIGALRM');171		process.kill(worker.pid, 'SIGUSR1');172		process.kill(worker.pid, 'SIGUSR2');173		setTimeout(() =>174		{175			expect(worker.closed).toBe(false);176			worker.close();177			resolve();178		}, 2000);...

Full Screen

Full Screen

wk06d03.inheritance.test.js

Source:wk06d03.inheritance.test.js Github

copy

Full Screen

...40        });41        /*42         * Wrapper functions43        */44        async function createWorker(boss, worker, from) {45            const createWorkersFrom = bossCreatesWorkers ?46                boss : worker.account;47            return instance.createWorker(48                worker.name,49                worker.age,50                worker.height,51                worker.salary,52                worker.account,53                { from: from || createWorkersFrom }54            );55        }56        async function getSalary(address) {57            return instance.salary(address);58        }59        async function fire(worker, from) {60            return instance.fire(61                worker.account,62                { from: from || worker.boss }63            );64        }65        async function getBoss(address) {66            return instance.bossOf(address);67        }68        describe('create worker', () => {69            it('should set the worker salary', async () => {70                await createWorker(bossAccount, worker);71                const result = await getSalary(worker.account);72                expect(result.toString(10)).to.equal(worker.salary.toString(10));73            });74            it('should create a person with the supplied values', async () => {75                await createWorker(bossAccount, worker);76                const result = await getPerson(instance, worker.account);77                expectPerson(result, worker);78            });79            it('should REVERT if the worker age is over 75', async () => {80                worker.age = 76;81                worker.senior = true;82                await truffleAssert.reverts(83                    createWorker(bossAccount, worker),84                    truffleAssert.ErrorType.REVERT85                );86            });87            describe('bonus', () => {88                it('should store the boss of the worker', async () => {89                    await createWorker(bossAccount, worker);90                    const result = await getBoss(worker.account);91                    expect(result).to.equal(bossAccount);92                });93                it('should REVERT if sender and boss are the same', async () => {94                    await truffleAssert.reverts(95                        createWorker(worker.account, worker, worker.account),96                        truffleAssert.ErrorType.REVERT97                    );98                });99            });100        });101        describe('fire', () => {102            beforeEach(async () => {103                await createWorker(bossAccount, worker);104            });105            it('should remove the worker salary', async () => {106                await fire(worker);107                const result = await getSalary(worker.account);108                expect(result.toString(10)).to.equal('0');109            });110            it('should delete the person', async () => {111                await fire(worker);112                const person = await getPerson(instance, worker.account);113                expect(person.name).to.equal('');114            });115            describe('bonus', () => {116                it('should REVERT if the sender is not the workers boss', async () => {117                    const angryCowokerker = accounts[3];...

Full Screen

Full Screen

handler.js

Source:handler.js Github

copy

Full Screen

...15    case 'POST':16      const zbc = new zb.ZBClient(zeebe_credentials, { loglevel: 'INFO' });17      const orderid = uuid.v4()18      // DECLARATION OF ANY PROCESS:19      zbc.createWorker('order-activity', async (job, complete) => {20        const { key, variables } = job;21        console.info(`* Starting Order...: ${variables}`);22        //const stock = 100; //Aqui se revisa el stock con una request23        complete.success({variables: variables, orderid: orderid });24        console.info(`* Passing to next task: ${variables}`);25      });26      zbc.createWorker('arrive-activity', async (job, complete) => {27        const { key, variables } = job;28        console.info(`* Arriving Order...: ${variables}`);29        complete.success({variables: variables, orderid: orderid });30        console.info(`* Passing to next task: ${variables}`);31      });32      zbc.createWorker('delivery-activity', async (job, complete) => { 33        const { key, variables } = job;34        console.info(`* Delivering Order...: ${variables}`);35        complete.success({variables: variables, orderid: orderid });36        console.info(`* Passing to next task: ${variables}`);37      });38      zbc.createWorker('on-warehouse-activity', async (job, complete) => { 39        const { key, variables } = job;40        console.info(`* Order On Warehouse...: ${variables}`);41        complete.success({variables: variables, orderid: orderid });42        console.info(`* Passing to next task: ${variables}`);43      });44      zbc.createWorker('process-pay-activity', async (job, complete) => { 45        const { key, variables } = job;46        console.info(`* Process pay order...: ${variables}`);47        complete.success({variables: variables, orderid: orderid });48        console.info(`* Passing to next task: ${variables}`);49      });50      zbc.createWorker('receive-activity', async (job, complete) => { 51        const { key, variables } = job;52        console.info(`* Receiving Order...: ${variables}`);53        complete.success({variables: variables, orderid: orderid });54        console.info(`* Passing to next task: ${variables}`);55      });56      zbc.createWorker('send-alert-admin-activity', async (job, complete) => { 57        const { key, variables } = job;58        console.info(`* Sending Alert to Admin ...: ${variables}`);59        complete.success({variables: variables, orderid: orderid });60        console.info(`* Passing to next task: ${variables}`);61      });62      zbc.createWorker('send-alert-client-activity', async (job, complete) => { 63        const { key, variables } = job;64        console.info(`* Sending Alert to Client ...: ${variables}`);65        complete.success({variables: variables, orderid: orderid });66        console.info(`* Passing to next task: ${variables}`);67      });68      zbc.createWorker('cancel-order-activity', async (job, complete) => { 69        const { key, variables } = job;70        console.info(`* Canceling Order ...: ${variables}`);71        complete.success({variables: variables, orderid: orderid });72        console.info(`* Passing to next task: ${variables}`);73      });74      zbc.createWorker('send-activity', async (job, complete) => { 75        const { key, variables } = job;76        console.info(`* Sending Package ...: ${variables}`);77        complete.success({variables: variables, orderid: orderid });78        console.info(`* Passing to next task: ${variables}`);79      });80      zbc.createWorker('on-ship-activity', async (job, complete) => { 81        const { key, variables } = job;82        console.info(`* Shipping Package ...: ${variables}`);83        complete.success({variables: variables, orderid: orderid });84        console.info(`* Passing to next task: ${variables}`);85      });86      //const newsbc = createWorkers(zbc);87      const wfi = await zbc.createWorkflowInstance("process-orders", data);88      wfi.orderid = orderid;89      context.succeed({ res: data , wfi });90      break;91    default:92      context.status(405).succeed({ res: false });93      break;94  }...

Full Screen

Full Screen

index.js

Source:index.js Github

copy

Full Screen

...21      const zbc = new zb.ZBClient(zeebe_credentials, { loglevel: 'INFO' });22      2324      // DECLARATION OF ANY PROCESS:25      zbc.createWorker('order-activity', async (job, complete) => {26        const { key, variables } = job;27        console.info(`* Starting Order...: ${variables}`);28        29        //const stock = 100; //Aqui se revisa el stock con una request30        complete.success({variables: variables});31        console.info(`* Passing to next task: ${variables}`);32      });3334      35      zbc.createWorker('on-warehouse-activity', async (job, complete) => { 36        const { key, variables } = job;37        console.info(`* Order On Warehouse...: ${variables}`);38        complete.success({variables: variables});39        console.info(`* Passing to next task: ${variables}`);40      });4142      4344      zbc.createWorker('arrive-activity', async (job, complete) => {45        const { key, variables } = job;46        console.info(`* Arriving Order...: ${variables}`);47        complete.success({variables: variables});48        console.info(`* Passing to next task: ${variables}`);49      });5051      zbc.createWorker('delivery-activity', async (job, complete) => { 52        const { key, variables } = job;53        console.info(`* Delivering Order...: ${variables}`);54        complete.success({variables: variables });55        console.info(`* Passing to next task: ${variables}`);56      });5758      59      zbc.createWorker('process-pay-activity', async (job, complete) => { 60        const { key, variables } = job;61        console.info(`* Process pay order...: ${variables}`);62        complete.success({variables: variables });63        console.info(`* Passing to next task: ${variables}`);64      });6566      zbc.createWorker('receive-activity', async (job, complete) => { 67        const { key, variables } = job;68        console.info(`* Receiving Order...: ${variables}`);69        complete.success({variables: variables});70        console.info(`* Passing to next task: ${variables}`);71      });7273      zbc.createWorker('send-alert-admin-activity', async (job, complete) => { 74        const { key, variables } = job;75        console.info(`* Sending Alert to Admin ...: ${variables}`);76        complete.success({variables: variables });77        console.info(`* Passing to next task: ${variables}`);78      });7980      zbc.createWorker('send-alert-client-activity', async (job, complete) => { 81        const { key, variables } = job;82        console.info(`* Sending Alert to Client ...: ${variables}`);83        complete.success({variables: variables});84        console.info(`* Passing to next task: ${variables}`);85      });8687      zbc.createWorker('cancel-order-activity', async (job, complete) => { 88        const { key, variables } = job;89        console.info(`* Canceling Order ...: ${variables}`);90        complete.success({variables: variables });91        console.info(`* Passing to next task: ${variables}`);92      });9394      zbc.createWorker('send-activity', async (job, complete) => { 95        const { key, variables } = job;96        console.info(`* Sending Package ...: ${variables}`);97        complete.success({variables: variables});98        console.info(`* Passing to next task: ${variables}`);99      });100101      zbc.createWorker('on-ship-activity', async (job, complete) => { 102        const { key, variables } = job;103        console.info(`* Shipping Package ...: ${variables}`);104        complete.success({variables: variables });105        console.info(`* Passing to next task: ${variables}`);106      });107108109      //const newsbc = createWorkers(zbc);110      data.orderid = uuid.v4()111      const wfi = await zbc.createWorkflowInstance("process-orders", data);112      //wfi.orderid = orderid;113      return {status: 200,114          body : { res: data , wfi },115      headers: {
...

Full Screen

Full Screen

workers.js

Source:workers.js Github

copy

Full Screen

1'use strict';2import { createReducer } from '../util';3import { F } from '~/common/util';4const STATE = F({5    delreq: createWorker()6});7function createWorker(opts) {8    let {9        tasks = [],10        id = null11    } = opts || {};12    tasks = F(tasks || []);13    return F({ tasks, id });14}15export default createReducer(STATE, {16    'SET_APP_WORKERS': reduce,17    'CLEAR_APP_WORKER_ID': clearWorkerId18});19function reduce(state = STATE, action) {20    let { delreq } = action;21    delreq = reduceWorker(state.delreq, delreq);22    let newState = {23        delreq24    };25    return F(newState);26}27function clearWorkerId(state = STATE, action) {28    let { worker } = action;29    let newState = { ...state };30    newState[worker] = createWorker({ ...state[worker], id: null });31    return F(newState);32}33const WORKER = createWorker();34function reduceWorker(prev = WORKER, next) {35    if (next == null) return prev;36    if (prev.id != null && prev.id !== next.id) return prev;37    let newState = { ...prev, ...next };38    return createWorker(newState);39}40export const internal = {41    createWorker,42    reduce,43    clearWorkerId...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1import { createWorker } from 'tesseract.js';2const worker = createWorker({3  logger: m => console.log(m),4});5(async () => {6  await worker.load();7  await worker.loadLanguage('eng');8  await worker.initialize('eng');9  console.log(text);10  await worker.terminate();11})();12describe('Test', () => {13  it('Test', () => {14    cy.get('input[type="file"]').attachFile('image.png');15  });16});

Full Screen

Using AI Code Generation

copy

Full Screen

1import { createWorker } from 'tesseract.js'2const worker = createWorker({3  logger: m => console.log(m)4})5describe('My First Test', function() {6  it('Does not do much!', function() {7    cy.contains('type').click()8    cy.get('.action-email')9      .type('

Full Screen

Using AI Code Generation

copy

Full Screen

1const createWorker = require('cypress-browserify-preprocessor')2  .createBrowserifyPreprocessor;3module.exports = (on, config) => {4  on('file:preprocessor', createWorker(config));5};6const createWorker = require('cypress-browserify-preprocessor')7  .createBrowserifyPreprocessor;8module.exports = (on, config) => {9  on('file:preprocessor', createWorker(config));10};11const createWorker = require('cypress-browserify-preprocessor')12  .createBrowserifyPreprocessor;13module.exports = (on, config) => {14  on('file:preprocessor', createWorker(config));15};16const createWorker = require('cypress-browserify-preprocessor')17  .createBrowserifyPreprocessor;18module.exports = (on, config) => {19  on('file:preprocessor', createWorker(config));20};21const createWorker = require('cypress-browserify-preprocessor')22  .createBrowserifyPreprocessor;23module.exports = (on, config) => {24  on('file:preprocessor', createWorker(config));25};26const createWorker = require('cypress-browserify-preprocessor')27  .createBrowserifyPreprocessor;28module.exports = (on, config) => {29  on('file:preprocessor', createWorker(config));30};31const createWorker = require('cypress-browserify-preprocessor')32  .createBrowserifyPreprocessor;33module.exports = (on, config) => {34  on('file:preprocessor', createWorker(config));35};

Full Screen

Using AI Code Generation

copy

Full Screen

1const { createWorker } = require('tesseract.js');2const worker = createWorker({3    logger: m => console.log(m)4});5const fs = require('fs');6const path = require('path');7describe('My First Test', () => {8    it('Does not do much!', () => {9        cy.contains('type').click()10        cy.url().should('include', '/commands/actions')11        cy.get('.action-email')12            .type('

Full Screen

Using AI Code Generation

copy

Full Screen

1const createWorker = require('cypress-browserify-preprocessor')2  .createWorker;3const browserify = require('browserify');4const babelify = require('babelify');5module.exports = (on, config) => {6  on('file:preprocessor', createWorker(browserify, {7  }));8}9const preprocessor = require('../test');10module.exports = (on, config) => {11  on('file:preprocessor', preprocessor);12};13import './commands';14describe('My First Test', () => {15  it('Does not do much!', () => {16    expect(true).to.equal(true)17  })18})19{20}21{22  "scripts": {23  },24  "devDependencies": {25  }26}

Full Screen

Using AI Code Generation

copy

Full Screen

1const createWorker = require('cypress-shared-utils/lib/createWorker');2const worker = createWorker(require.resolve('./worker.js'));3const createWorker = require('cypress-shared-utils/lib/createWorker');4const worker = createWorker(require.resolve('./worker.js'));5const { parentPort } = require('worker_threads');6parentPort.on('message', (message) => {7  console.log('Message from main thread:', message);8  parentPort.postMessage({ foo: 'bar' });9});10module.exports = (on, config) => {11  on('task', {12    foo(message) {13      return worker(message);14    },15  });16};17describe('Cypress worker', () => {18  it('works', () => {19    cy.task('foo', 'bar').then((response) => {20      expect(response).to.deep.equal({ foo: 'bar' });21    });22  });23});24const { parentPort } = require('worker_threads');25parentPort.on('message', (message) => {26  console.log('Message from main thread:', message);27  parentPort.postMessage({ foo: 'bar' });28});29module.exports = (on, config) => {30  on('task', {31    foo(message) {32      return worker(message);33    },34  });35};36describe('Cypress worker', () => {37  it('works', () => {38    cy.task('foo', 'bar').then((response) => {39      expect(response).to.deep.equal({ foo: 'bar' });40    });41  });42});43const { parentPort } = require('worker_threads');44parentPort.on('message', (message) => {45  console.log('Message from main thread:', message);46  parentPort.postMessage({ foo: 'bar' });47});48module.exports = (on, config) => {49  on('task', {50    foo(message) {51      return worker(message);52    },53  });54};55describe('Cypress worker', () => {56  it('works', () => {57    cy.task('foo', 'bar').then((response) => {58      expect(response).to.deep.equal({ foo: 'bar' });59    });60  });61});62const { parentPort } = require('worker_threads');63parentPort.on('message

Full Screen

Using AI Code Generation

copy

Full Screen

1const worker = createWorker();2worker.postMessage({ type: 'LOAD_MODEL', model: 'mobilenet' });3Cypress.Commands.add('createWorker', () => {4  return new Worker('cypress/support/worker.js')5})6self.addEventListener('message', (event) => {7  const { type, model } = event.data;8  if (type === 'LOAD_MODEL') {9    loadModel(model);10  }11})12function loadModel(model) {13  tf.loadModel(modelUrl).then((model) => {14    self.postMessage({ type: 'MODEL_LOADED', model });15  });16}17worker.addEventListener('message', (event) => {18  const { type, model } = event.data;19  if (type === 'MODEL_LOADED') {20    console.log('Model loaded');21  }22})

Full Screen

Using AI Code Generation

copy

Full Screen

1import createWorker from 'cypress-parallel/dist/createWorker'2createWorker(require.resolve('./worker.js'))3describe('My Test', () => {4  it('My Test', () => {5    cy.get('.home-list li').should('have.length', 3)6  })7})

Full Screen

Using AI Code Generation

copy

Full Screen

1const worker = createWorker({2})3worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})4worker.postMessage({type: 'action', payload: {type: 'LOAD_MODEL', payload: {model}}})5worker.postMessage({type: 'action', payload: {type: 'DETECT', payload: {data}}})6const worker = createWorker({7})8worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})9worker.postMessage({type: 'action', payload: {type: 'LOAD_MODEL', payload: {model}}})10worker.postMessage({type: 'action', payload: {type: 'DETECT', payload: {data}}})11const worker = createWorker({12})13worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})14worker.postMessage({type: 'action', payload: {type: 'LOAD_MODEL', payload: {model}}})15worker.postMessage({type: 'action', payload: {type: 'DETECT', payload: {data}}})16const worker = createWorker({17})18worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})19worker.postMessage({type: 'action', payload: {type: 'LOAD_MODEL', payload: {model}}})20worker.postMessage({type: 'action', payload: {type: 'DETECT', payload: {data}}})21const worker = createWorker({22})23worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})24worker.postMessage({type: 'action', payload: {type: 'LOAD_MODEL', payload: {model}}})25worker.postMessage({type: 'action', payload: {type: 'DETECT', payload: {data}}})26const worker = createWorker({27})28worker.postMessage({type: 'action', payload: {type: 'SET_CONFIG', payload: {config}}})29worker.postMessage({type: 'action', payload

Full Screen

Cypress Tutorial

Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.

Chapters:

  1. What is Cypress? -
  2. Why Cypress? - Learn why Cypress might be a good choice for testing your web applications.
  3. Features of Cypress Testing - Learn about features that make Cypress a powerful and flexible tool for testing web applications.
  4. Cypress Drawbacks - Although Cypress has many strengths, it has a few limitations that you should be aware of.
  5. Cypress Architecture - Learn more about Cypress architecture and how it is designed to be run directly in the browser, i.e., it does not have any additional servers.
  6. Browsers Supported by Cypress - Cypress is built on top of the Electron browser, supporting all modern web browsers. Learn browsers that support Cypress.
  7. Selenium vs Cypress: A Detailed Comparison - Compare and explore some key differences in terms of their design and features.
  8. Cypress Learning: Best Practices - Take a deep dive into some of the best practices you should use to avoid anti-patterns in your automation tests.
  9. How To Run Cypress Tests on LambdaTest? - Set up a LambdaTest account, and now you are all set to learn how to run Cypress tests.

Certification

You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.

YouTube

Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.

Run Cypress automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful