Best JavaScript code snippet using playwright-internal
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 { createWorker } = require('@playwright/test');2const worker = await createWorker();3const browser = await worker.createBrowser();4const context = await browser.newContext();5const page = await context.newPage();6await page.screenshot({ path: 'screenshot.png' });7await browser.close();8await worker.close();9const { test, expect } = require('@playwright/test');10test('should display "Learn more"', async ({ page }) => {11 const text = await page.textContent('.navbar__title');12 expect(text).toBe('Learn more');13});
Using AI Code Generation
1const { createWorker } = require('playwright');2const worker = await createWorker();3const browser = await worker.launchBrowser();4const context = await browser.newContext();5const page = await context.newPage();6await page.screenshot({ path: 'example.png' });7await browser.close();8await worker.close();
Using AI Code Generation
1const { createWorker } = require('@playwright/test');2const worker = await createWorker();3const context = await worker.createBrowserContext();4const page = await context.newPage();5await page.screenshot({ path: 'example.png' });6await context.close();7await worker.terminate();8const { createWorker } = require('@playwright/test');9const worker = await createWorker();10const context = await worker.createBrowserContext();11const page = await context.newPage();12await page.screenshot({ path: 'example.png' });13await context.close();14await worker.terminate();15const { createWorker } = require('@playwright/test');16const worker = await createWorker();17const context = await worker.createBrowserContext();18const page = await context.newPage();19await page.screenshot({ path: 'example.png' });20await context.close();21await worker.terminate();22const { createWorker } = require('@playwright/test');23const worker = await createWorker();24const context = await worker.createBrowserContext();25const page = await context.newPage();26await page.screenshot({ path: 'example.png' });27await context.close();
Using AI Code Generation
1const { createWorker } = require('playwright-core/lib/server/worker');2const worker = await createWorker({3});4const page = await worker.newPage();5await page.screenshot({ path: 'example.png' });6await worker.close();
Using AI Code Generation
1const playwright = require('playwright-internal');2const worker = playwright.createWorker();3(async () => {4 await worker.run(async ({ chromium }) => {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 await page.screenshot({ path: 'example.png' });9 await browser.close();10 });11})();12#### playwright.createWorker([options])13#### playwright.executablePath()14#### playwright.selectBrowser(options)15#### worker.run([options], callback)16#### worker.stop()17#### browserType.launch([options])
Using AI Code Generation
1const { createWorker } = require('@playwright/test');2const worker = await createWorker();3const worker = await createWorker();4const page = await worker.newPage();5await page.screenshot({ path: 'example.png' });6await worker.close();
Using AI Code Generation
1const { createWorker } = require('@playwright/test');2const worker = await createWorker();3const browser = await worker.createBrowser();4await browser.close();5await worker.destroy();6### `worker.createBrowser(options)`
Using AI Code Generation
1const { createWorker } = require("playwright-core/lib/server/worker");2const path = require("path");3(async () => {4 const worker = await createWorker({5 playwrightPath: path.join(__dirname, "node_modules", "playwright-core"),6 });7 const browser = await worker.createBrowser({8 env: {},9 });10 const context = await browser.newContext({11 });12 const page = await context.newPage();13 const title = await page.title();14 console.log(title);15 await browser.close();16 await worker.stop();17})();18[Apache-2.0](LICENSE)
Using AI Code Generation
1const { createWorker } = require('@playwright/test');2const worker = await createWorker({3});4const browser = await worker.launchBrowser();5const page = await browser.newPage();6await page.screenshot({ path: 'example.png' });7await browser.close();8await worker.close();9import { test, expect } from '@playwright/test';10test('basic test', async ({ page }) => {11 await page.screenshot({ path: 'example.png' });12 expect(page).toHaveText('Get started');13});14import { test, expect } from '@playwright/test';15test('basic test', async ({ page }) => {16 await page.screenshot({ path: 'example.png' });17 expect(page).toHaveText('Get started');18});19import { test, expect } from '@playwright/test';20test('basic test', async ({ page }) => {
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!