Best JavaScript code snippet using wpt
test-content-proxy.js
Source:test-content-proxy.js
...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`");...
test-content-script.js
Source:test-content-script.js
...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});...
WorkPool.test.js
Source:WorkPool.test.js
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 })...
test-Worker.js
Source:test-Worker.js
...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);...
wk06d03.inheritance.test.js
Source:wk06d03.inheritance.test.js
...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];...
handler.js
Source:handler.js
...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 }...
index.js
Source:index.js
...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: {
...
workers.js
Source:workers.js
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...
Using AI Code Generation
1const wpt = require('webpagetest');2const wpt = new WebPageTest('www.webpagetest.org');3const worker = wpt.createWorker();4const wpt = require('webpagetest');5const wpt = new WebPageTest('www.webpagetest.org');6const worker = wpt.createWorker();7const wpt = require('webpagetest');8const wpt = new WebPageTest('www.webpagetest.org');9const worker = wpt.createWorker();10const wpt = require('webpagetest');11const wpt = new WebPageTest('www.webpagetest.org');12const worker = wpt.createWorker();13const wpt = require('webpagetest');14const wpt = new WebPageTest('www.webpagetest.org');15const worker = wpt.createWorker();16const wpt = require('webpagetest');17const wpt = new WebPageTest('www.webpagetest.org');18const worker = wpt.createWorker();19const wpt = require('webpagetest');20const wpt = new WebPageTest('www.webpagetest.org');21const worker = wpt.createWorker();22const wpt = require('webpagetest');23const wpt = new WebPageTest('www.webpagetest.org');24const worker = wpt.createWorker();
Using AI Code Generation
1var worker = createWorker();2worker.onmessage = function(event) {3 console.log(event.data);4};5worker.postMessage('Hello World');6function createWorker() {7 var blobURL = URL.createObjectURL(new Blob(['importScripts("worker.js");'], { type: 'text/javascript' }));8 return new Worker(blobURL);9}10self.onmessage = function(event) {11 self.postMessage('Worker says: ' + event.data);12};13var worker = createWorker();14worker.onmessage = function(event) {15 console.log(event.data);16};17worker.postMessage('Hello World');18function createWorker() {19 var blobURL = URL.createObjectURL(new Blob(['importScripts("worker.js");'], { type: 'text/javascript' }));20 return new Worker(blobURL);21}22var worker = createWorker();23worker.onmessage = function(event) {24 self.postMessage('Worker says: ' + event.data);25};26worker.postMessage('Hello World');27var worker = createWorker();28worker.onmessage = function(event) {29 console.log(event.data);30};31worker.postMessage('Hello World');32worker.terminate();33var worker = new Worker('worker.js');
Using AI Code Generation
1var worker = wpt.createWorker();2worker.onmessage = function(event) {3 console.log(event.data);4};5worker.onerror = function(event) {6 console.error(event.message);7};8worker.postMessage("Hello World");9onmessage = function(event) {10 postMessage(event.data);11};
Using AI Code Generation
1var wptool = require('wptool');2var worker = wptool.createWorker();3worker.on('message', function(data) {4 console.log(data);5});6worker.on('error', function(err) {7 console.log(err);8});9worker.on('exit', function(code) {10 console.log(code);11});12worker.send('Hello from parent');13var wptool = require('wptool');14var worker = wptool.createWorker();15worker.on('message', function(data) {16 console.log(data);17});18worker.on('error', function(err) {19 console.log(err);20});21worker.on('exit', function(code) {22 console.log(code);23});24worker.send('Hello from child');25wptool.createWorker() : child_process26wptool.createWorker(options) : child_process27wptool.createWorker(options, callback) : child_process
Using AI Code Generation
1var wpt = require('wpt-api');2var wpt = new WebPageTest('www.webpagetest.org', 'A.7a6f8b0c7a6f8b0c7a6f8b0c7a6f8b0c');3wpt.createWorker('test', function(err, data) {4 if (err) {5 console.log(err);6 } else {7 console.log(data);8 }9});10var wpt = require('wpt-api');11var wpt = new WebPageTest('www.webpagetest.org', 'A.7a6f8b0c7a6f8b0c7a6f8b0c7a6f8b0c');12wpt.getTestResults('150819_9F_1f8b', function(err, data) {13 if (err) {14 console.log(err);15 } else {16 console.log(data);17 }18});
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!