Best JavaScript code snippet using playwright-internal
GraphPro.js.consoleStripped.js
Source:GraphPro.js.consoleStripped.js
1require({cache:{2'url:dojox/calc/templates/GraphPro.html':"<div class=\"dijitReset dijitInline dojoxCalc\"\n><table class=\"dijitReset dijitInline dojoxCalcLayout\" data-dojo-attach-point=\"calcTable\" rules=\"none\" cellspacing=0 cellpadding=0 border=0>\n\t<tr\n\t\t><td colspan=\"4\" class=\"dojoxCalcTextAreaContainer\"\n\t\t\t><div class=\"dijitTextBox dijitTextArea\" style=\"height:10em;width:auto;max-width:15.3em;border-width:0px;\" data-dojo-attach-point='displayBox'></div\n\t\t></td\n\t></tr>\n\t<tr\n\t\t><td colspan=\"4\" class=\"dojoxCalcInputContainer\"\n\t\t\t><input data-dojo-type=\"dijit.form.TextBox\" data-dojo-attach-event=\"onBlur:onBlur,onKeyPress:onKeyPress\" data-dojo-attach-point='textboxWidget'\n\t\t/></td\n\t></tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"grapherMakerButton\" label=\"Graph\" data-dojo-attach-event='onClick:makeGrapherWindow' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"functionMakerButton\" label=\"Func\" data-dojo-attach-event='onClick:makeFunctionWindow' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"toFracButton\" label=\"toFrac\" value=\"toFrac(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td colspan=\"1\" class=\"dojoxCalcButtonContainer\">\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"seven\" label=\"7\" value='7' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"eight\" label=\"8\" value='8' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"nine\" label=\"9\" value='9' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"divide\" label=\"/\" value='/' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"four\" label=\"4\" value='4' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"five\" label=\"5\" value='5' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"six\" label=\"6\" value='6' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"multiply\" label=\"*\" value='*' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"one\" label=\"1\" value='1' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"two\" label=\"2\" value='2' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"three\" label=\"3\" value='3' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"add\" label=\"+\" value='+' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"decimal\" label=\".\" value='.' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"zero\" label=\"0\" value='0' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"equals\" label=\"x=y\" value='=' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcMinusButtonContainer\">\n\t\t\t<span data-dojo-type=\"dijit.form.ComboButton\" data-dojo-attach-point=\"subtract\" label='-' value='-' data-dojo-attach-event='onClick:insertOperator'>\n\n\t\t\t\t<div data-dojo-type=\"dijit.Menu\" style=\"display:none;\">\n\t\t\t\t\t<div data-dojo-type=\"dijit.MenuItem\" data-dojo-attach-event=\"onClick:insertMinus\">\n\t\t\t\t\t\t(-)\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</span>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"clear\" label=\"Clear\" data-dojo-attach-event='onClick:clearText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"sqrt\" label=\"√\" value=\"√\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"power\" label=\"^\" value=\"^\" data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"factorialButton\" label=\"!\" value=\"!\" data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"pi\" label=\"π\" value=\"π\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"sin\" label=\"sin\" value=\"sin(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"cos\" label=\"cos\" value=\"cos(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"tan\" label=\"tan\" value=\"tan(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"e\" label=\"ϵ\" value=\"ϵ\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"log10\" label=\"log\" value=\"log(\" value=\"log(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"lnE\" label=\"ln\" value=\"ln(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"round\" label=\"Round\" value=\"Round(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"intButton\" label=\"Int\" value=\"Int(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"PermutationButton\" label=\"P\" value=\"P(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"CombinationButton\" label=\"C\" value=\"C(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"comma\" label=\",\" value=',' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"AnsButton\" label=\"Ans\" value=\"Ans\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"LeftParenButton\" label=\"(\" value=\"(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"RightParenButton\" label=\")\" value=\")\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"enter\" label=\"Enter\" data-dojo-attach-event='onClick:parseTextbox' />\n\t\t</td>\n\t</tr>\n</table>\n<span data-dojo-attach-point=\"executor\" data-dojo-type=\"dojox.calc._Executor\" data-dojo-attach-event=\"onLoad:executorLoaded\"></span>\n</div>\n"}});3define("dojox/calc/GraphPro", [4 "dojo/_base/declare",5 "dojo/_base/lang",6 "dojo/_base/window",7 "dojo/dom-style",8 "dojo/dom-construct",9 "dojo/dom-geometry",10 "dojo/ready",11 "dojox/calc/Standard",12 "dojox/calc/Grapher",13 "dojox/layout/FloatingPane",14 "dojo/text!./templates/GraphPro.html",15 "dojox/calc/_Executor", // template16 "dijit/Menu", // template17 "dijit/MenuItem", // template18 "dijit/form/ComboButton", // template19 "dijit/form/Button", // template20 "dijit/form/TextBox" // template21], function(declare, lang, win, domStyle, domConstruct, domGeometry, ready, Standard, calc, FloatingPane, template){22 return declare(23 "dojox.calc.GraphPro",24 Standard,25 {26 // summary:27 // The dialog widget for a graphing, scientific calculator28 templateString: template,29 grapher:null,30 funcMaker:null,31 aFloatingPane: null,32 executorLoaded: function(){33 // summary:34 // when executor loads check to see if the writestore is there35 this.inherited(arguments);36 ready(lang.hitch(this, function(){37 if(this.writeStore == null && "functionMakerButton" in this){38 domStyle.set(this.functionMakerButton.domNode, { visibility: "hidden" });39 }40 }));41 },42 makeFunctionWindow: function(){43 // summary:44 // use this function to create a function window (with the button on the layout)45 var body = win.body();46 var pane = domConstruct.create('div');47 body.appendChild(pane);48 this.aFloatingPane = new dojox.layout.FloatingPane({resizable:false, dockable:true, maxable:false, closable:true, duration:300, title:"Function Window", style:"position:absolute;left:10em;top:10em;width:50em;"}, pane);49 var that = this;50 var d = domConstruct.create("div");51 this.funcMaker = new calc.FuncGen({52 writeStore:that.writeStore,53 readStore:that.readStore,54 functions:that.functions,55 deleteFunction: that.executor.deleteFunction,56 onSaved:function(){57 var name,58 body;59 if((name = this.combo.get("value")) == ""){60 this.status.set("value", "The function needs a name");61 }else if((body = this.textarea.get("value")) == ""){62 // i don't think users need empty functions for math63 this.status.set("value", "The function needs a body");64 }else{65 var args = this.args.get("value");66 if(!(name in this.functions)){67 this.combo.item = this.writeStore.put({name: name, args: args, body: body});68 }69 this.saveFunction(name, args, body);70 this.status.set("value", "Function "+name+" was saved");71 }72 },73 saveFunction: lang.hitch(that, that.saveFunction)74 }, d);75 this.aFloatingPane.set('content', this.funcMaker);76 this.aFloatingPane.startup();77 this.aFloatingPane.bringToTop();78 },79 makeGrapherWindow: function(){80 // summary:81 // use this to make a Grapher window appear with a button82 var body = win.body();83 var pane = domConstruct.create('div');84 body.appendChild(pane);85 this.aFloatingPane = new dojox.layout.FloatingPane({resizable:false, dockable:true, maxable:false, closable:true, duration:300, title:"Graph Window", style:"position:absolute;left:10em;top:5em;width:50em;"}, pane);86 var that = this;87 var d = domConstruct.create("div");88 this.grapher = new calc.Grapher({89 myPane: this.aFloatingPane,90 drawOne: function(i){91 this.array[i][this.chartIndex].resize(this.graphWidth.get("value"), this.graphHeight.get("value"));92 this.array[i][this.chartIndex].axes["x"].max = this.graphMaxX.get('value');93 if(this.array[i][this.expressionIndex].get("value")==""){94 this.setStatus(i, "Error");95 return;96 }97 var func;98 var yEquals = (this.array[i][this.functionMode]=="y=");99 if(this.array[i][this.expressionIndex].get("value")!=this.array[i][this.evaluatedExpression]){100 var args = 'x';101 if(!yEquals){102 args = 'y';103 }104 func = that.executor.Function('', args, "return "+this.array[i][this.expressionIndex].get('value'));105 this.array[i][this.evaluatedExpression] = this.array[i][this.expressionIndex].value;106 this.array[i][this.functionRef] = func;107 }108 else{109 func = this.array[i][this.functionRef];110 }111 var pickedColor = this.array[i][this.colorIndex].get("value");112 if(!pickedColor){113 pickedColor = 'black';114 }115 calc.draw(this.array[i][this.chartIndex], func, {graphNumber:this.array[i][this.funcNumberIndex], fOfX:yEquals, color:{stroke:{color:pickedColor}}});116 this.setStatus(i, "Drawn");117 },118 onDraw:function(){119 for(var i = 0; i < this.rowCount; i++){120 if((!this.dirty && this.array[i][this.checkboxIndex].get("checked")) || (this.dirty && this.array[i][this.statusIndex].innerHTML=="Drawn")){121 this.drawOne(i);122 }else{123 this.array[i][this.chartIndex].resize(this.graphWidth.get("value"), this.graphHeight.get("value"));124 this.array[i][this.chartIndex].axes["x"].max = this.graphMaxX.get('value');125 }126 }127 var bufferY = domGeometry.position(this.outerDiv).y-domGeometry.position(this.myPane.domNode).y;128 bufferY*=2;129 bufferY=Math.abs(bufferY);130 var height = "" + Math.max(parseInt(this.graphHeight.get('value'))+50, this.outerDiv.scrollHeight+bufferY);131 var width = "" + (parseInt(this.graphWidth.get('value')) + this.outerDiv.scrollWidth);132 this.myPane.resize({w:width, h:height});133 }134 }, d);135 this.aFloatingPane.set('content', this.grapher);136 this.aFloatingPane.startup();137 this.aFloatingPane.bringToTop();138 }139 });...
GraphPro.js.uncompressed.js
Source:GraphPro.js.uncompressed.js
1require({cache:{2'url:dojox/calc/templates/GraphPro.html':"<div class=\"dijitReset dijitInline dojoxCalc\"\n><table class=\"dijitReset dijitInline dojoxCalcLayout\" data-dojo-attach-point=\"calcTable\" rules=\"none\" cellspacing=0 cellpadding=0 border=0>\n\t<tr\n\t\t><td colspan=\"4\" class=\"dojoxCalcTextAreaContainer\"\n\t\t\t><div class=\"dijitTextBox dijitTextArea\" style=\"height:10em;width:auto;max-width:15.3em;border-width:0px;\" data-dojo-attach-point='displayBox'></div\n\t\t></td\n\t></tr>\n\t<tr\n\t\t><td colspan=\"4\" class=\"dojoxCalcInputContainer\"\n\t\t\t><input data-dojo-type=\"dijit.form.TextBox\" data-dojo-attach-event=\"onBlur:onBlur,onKeyPress:onKeyPress\" data-dojo-attach-point='textboxWidget'\n\t\t/></td\n\t></tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"grapherMakerButton\" label=\"Graph\" data-dojo-attach-event='onClick:makeGrapherWindow' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"functionMakerButton\" label=\"Func\" data-dojo-attach-event='onClick:makeFunctionWindow' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"toFracButton\" label=\"toFrac\" value=\"toFrac(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td colspan=\"1\" class=\"dojoxCalcButtonContainer\">\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"seven\" label=\"7\" value='7' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"eight\" label=\"8\" value='8' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"nine\" label=\"9\" value='9' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"divide\" label=\"/\" value='/' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"four\" label=\"4\" value='4' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"five\" label=\"5\" value='5' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"six\" label=\"6\" value='6' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"multiply\" label=\"*\" value='*' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"one\" label=\"1\" value='1' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"two\" label=\"2\" value='2' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"three\" label=\"3\" value='3' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"add\" label=\"+\" value='+' data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"decimal\" label=\".\" value='.' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"zero\" label=\"0\" value='0' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"equals\" label=\"x=y\" value='=' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcMinusButtonContainer\">\n\t\t\t<span data-dojo-type=\"dijit.form.ComboButton\" data-dojo-attach-point=\"subtract\" label='-' value='-' data-dojo-attach-event='onClick:insertOperator'>\n\n\t\t\t\t<div data-dojo-type=\"dijit.Menu\" style=\"display:none;\">\n\t\t\t\t\t<div data-dojo-type=\"dijit.MenuItem\" data-dojo-attach-event=\"onClick:insertMinus\">\n\t\t\t\t\t\t(-)\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</span>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"clear\" label=\"Clear\" data-dojo-attach-event='onClick:clearText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"sqrt\" label=\"√\" value=\"√\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"power\" label=\"^\" value=\"^\" data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"factorialButton\" label=\"!\" value=\"!\" data-dojo-attach-event='onClick:insertOperator' />\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"pi\" label=\"π\" value=\"π\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"sin\" label=\"sin\" value=\"sin(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"cos\" label=\"cos\" value=\"cos(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"tan\" label=\"tan\" value=\"tan(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"e\" label=\"ϵ\" value=\"ϵ\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"log10\" label=\"log\" value=\"log(\" value=\"log(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"lnE\" label=\"ln\" value=\"ln(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"round\" label=\"Round\" value=\"Round(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"intButton\" label=\"Int\" value=\"Int(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"PermutationButton\" label=\"P\" value=\"P(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"CombinationButton\" label=\"C\" value=\"C(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"comma\" label=\",\" value=',' data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\n\t</tr>\n\t<tr>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"AnsButton\" label=\"Ans\" value=\"Ans\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"LeftParenButton\" label=\"(\" value=\"(\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"RightParenButton\" label=\")\" value=\")\" data-dojo-attach-event='onClick:insertText' />\n\t\t</td>\n\t\t<td class=\"dojoxCalcButtonContainer\">\n\t\t\t<button data-dojo-type=\"dijit.form.Button\" data-dojo-attach-point=\"enter\" label=\"Enter\" data-dojo-attach-event='onClick:parseTextbox' />\n\t\t</td>\n\t</tr>\n</table>\n<span data-dojo-attach-point=\"executor\" data-dojo-type=\"dojox.calc._Executor\" data-dojo-attach-event=\"onLoad:executorLoaded\"></span>\n</div>\n"}});3define("dojox/calc/GraphPro", [4 "dojo/_base/declare",5 "dojo/_base/lang",6 "dojo/_base/window",7 "dojo/dom-style",8 "dojo/dom-construct",9 "dojo/dom-geometry",10 "dojo/ready",11 "dojox/calc/Standard",12 "dojox/calc/Grapher",13 "dojox/layout/FloatingPane",14 "dojo/text!./templates/GraphPro.html",15 "dojox/calc/_Executor", // template16 "dijit/Menu", // template17 "dijit/MenuItem", // template18 "dijit/form/ComboButton", // template19 "dijit/form/Button", // template20 "dijit/form/TextBox" // template21], function(declare, lang, win, domStyle, domConstruct, domGeometry, ready, Standard, calc, FloatingPane, template){22 return declare(23 "dojox.calc.GraphPro",24 Standard,25 {26 // summary:27 // The dialog widget for a graphing, scientific calculator28 templateString: template,29 grapher:null,30 funcMaker:null,31 aFloatingPane: null,32 executorLoaded: function(){33 // summary:34 // when executor loads check to see if the writestore is there35 this.inherited(arguments);36 ready(lang.hitch(this, function(){37 if(this.writeStore == null && "functionMakerButton" in this){38 domStyle.set(this.functionMakerButton.domNode, { visibility: "hidden" });39 }40 }));41 },42 makeFunctionWindow: function(){43 // summary:44 // use this function to create a function window (with the button on the layout)45 var body = win.body();46 var pane = domConstruct.create('div');47 body.appendChild(pane);48 this.aFloatingPane = new dojox.layout.FloatingPane({resizable:false, dockable:true, maxable:false, closable:true, duration:300, title:"Function Window", style:"position:absolute;left:10em;top:10em;width:50em;"}, pane);49 var that = this;50 var d = domConstruct.create("div");51 this.funcMaker = new calc.FuncGen({52 writeStore:that.writeStore,53 readStore:that.readStore,54 functions:that.functions,55 deleteFunction: that.executor.deleteFunction,56 onSaved:function(){57 var name,58 body;59 if((name = this.combo.get("value")) == ""){60 this.status.set("value", "The function needs a name");61 }else if((body = this.textarea.get("value")) == ""){62 // i don't think users need empty functions for math63 this.status.set("value", "The function needs a body");64 }else{65 var args = this.args.get("value");66 if(!(name in this.functions)){67 this.combo.item = this.writeStore.put({name: name, args: args, body: body});68 }69 this.saveFunction(name, args, body);70 this.status.set("value", "Function "+name+" was saved");71 }72 },73 saveFunction: lang.hitch(that, that.saveFunction)74 }, d);75 this.aFloatingPane.set('content', this.funcMaker);76 this.aFloatingPane.startup();77 this.aFloatingPane.bringToTop();78 },79 makeGrapherWindow: function(){80 // summary:81 // use this to make a Grapher window appear with a button82 var body = win.body();83 var pane = domConstruct.create('div');84 body.appendChild(pane);85 this.aFloatingPane = new dojox.layout.FloatingPane({resizable:false, dockable:true, maxable:false, closable:true, duration:300, title:"Graph Window", style:"position:absolute;left:10em;top:5em;width:50em;"}, pane);86 var that = this;87 var d = domConstruct.create("div");88 this.grapher = new calc.Grapher({89 myPane: this.aFloatingPane,90 drawOne: function(i){91 this.array[i][this.chartIndex].resize(this.graphWidth.get("value"), this.graphHeight.get("value"));92 this.array[i][this.chartIndex].axes["x"].max = this.graphMaxX.get('value');93 if(this.array[i][this.expressionIndex].get("value")==""){94 this.setStatus(i, "Error");95 return;96 }97 var func;98 var yEquals = (this.array[i][this.functionMode]=="y=");99 if(this.array[i][this.expressionIndex].get("value")!=this.array[i][this.evaluatedExpression]){100 var args = 'x';101 if(!yEquals){102 args = 'y';103 }104 func = that.executor.Function('', args, "return "+this.array[i][this.expressionIndex].get('value'));105 this.array[i][this.evaluatedExpression] = this.array[i][this.expressionIndex].value;106 this.array[i][this.functionRef] = func;107 }108 else{109 func = this.array[i][this.functionRef];110 }111 var pickedColor = this.array[i][this.colorIndex].get("value");112 if(!pickedColor){113 pickedColor = 'black';114 }115 calc.draw(this.array[i][this.chartIndex], func, {graphNumber:this.array[i][this.funcNumberIndex], fOfX:yEquals, color:{stroke:{color:pickedColor}}});116 this.setStatus(i, "Drawn");117 },118 onDraw:function(){119 for(var i = 0; i < this.rowCount; i++){120 if((!this.dirty && this.array[i][this.checkboxIndex].get("checked")) || (this.dirty && this.array[i][this.statusIndex].innerHTML=="Drawn")){121 this.drawOne(i);122 }else{123 this.array[i][this.chartIndex].resize(this.graphWidth.get("value"), this.graphHeight.get("value"));124 this.array[i][this.chartIndex].axes["x"].max = this.graphMaxX.get('value');125 }126 }127 var bufferY = domGeometry.position(this.outerDiv).y-domGeometry.position(this.myPane.domNode).y;128 bufferY*=2;129 bufferY=Math.abs(bufferY);130 var height = "" + Math.max(parseInt(this.graphHeight.get('value'))+50, this.outerDiv.scrollHeight+bufferY);131 var width = "" + (parseInt(this.graphWidth.get('value')) + this.outerDiv.scrollWidth);132 this.myPane.resize({w:width, h:height});133 }134 }, d);135 this.aFloatingPane.set('content', this.grapher);136 this.aFloatingPane.startup();137 this.aFloatingPane.bringToTop();138 }139 });...
spring.js
Source:spring.js
1import Body from '../entity/body';2import LineSegment from '../math/linesegment';3import { MinMax } from '../math/minmax';4import Vec2 from '../math/vec2';5/**6 * An object representation of the Spring class for easy conversion to JSON.7 *8 * @typedef {object} SpringAsObject9 * @property {number} length The length of the spring10 * @property {number} springConstant The stiffness of the spring11 * @property {boolean | {x:number, y:number}} pinned This property indicates whether12 * the spring is pinned or not13 * @property {import('../physics').ObjectIdentifier[]} objects The indices of the attached objects14 * @property {boolean} rotationLocked The variable inticating whether or not15 * the attached objects are allowed to rotate freely16 * @property {"spring"} type Indicates that the object is a spring17 */18/**19 * Class representing a string20 * They act like springs in real life21 * You can attach other objects to the ends of them22 * They do not collide with other object neither with each other23 */24class Spring {25 /**26 * Creates a spring27 *28 * @param {number} length The unstreched length of the spring29 * @param {number} springConstant Spring constant30 */31 constructor(length, springConstant) {32 this.length = length;33 this.springConstant = springConstant;34 /** @type {boolean | {x:number, y:number}} */35 this.pinned = false;36 /** @type {Body[]} */37 this.objects = [];38 this.rotationLocked = false;39 this.initialHeading = 0;40 this.initialOrientations = [0, 0];41 /** @type {Vec2[]} */42 this.attachPoints = [];43 /** @type {number[]} */44 this.attachRotations = [];45 /** @type {Vec2[]} */46 this.attachPositions = [];47 }48 /**49 * Returns a copy of the spring50 *51 * @returns {Spring} The copy52 */53 get copy() {54 /** @type {Spring} */55 const ret = Object.create(Spring.prototype);56 ret.length = this.length;57 ret.springConstant = this.springConstant;58 if (typeof this.pinned === 'boolean') {59 ret.pinned = this.pinned;60 } else ret.pinned = { x: this.pinned.x, y: this.pinned.y };61 ret.objects = this.objects;62 ret.rotationLocked = this.rotationLocked;63 ret.initialHeading = this.initialHeading;64 ret.initialOrientations = [...this.initialOrientations];65 ret.attachPoints = this.attachPoints.map((p) => p.copy);66 ret.attachRotations = [...this.attachRotations];67 ret.attachPositions = this.attachPositions.map((pos) => pos.copy);68 return ret;69 }70 /**71 * Pins one side of the the spring to a given coordinate in space72 *73 * @param {number} x x coordinate74 * @param {number} y y coordinate75 */76 pinHere(x, y) {77 this.pinned = {78 x,79 y,80 };81 }82 /**83 * Removes the pinned tag from the spring84 * You can now attach it to another object85 */86 unpin() {87 this.pinned = false;88 }89 /**90 * Attaches one end of the spring to an object (eg. Ball)91 *92 * @param {Body} object The object that the spring is getting attached to93 * @param {Vec2 | undefined} attachPoint The point to attach the spring to on the body94 */95 attachObject(object, attachPoint = undefined) {96 let ob = this.objects;97 ob.push(object);98 if (attachPoint) this.attachPoints.push(attachPoint.copy);99 else this.attachPoints.push(object.pos.copy);100 this.attachPositions.push(object.pos.copy);101 this.attachRotations.push(object.rotation);102 if (ob.length === 2) {103 this.pinned = false;104 }105 if (ob.length >= 3) {106 ob = [ob[ob.length - 2], ob[ob.length - 1]];107 this.attachPoints = [108 this.attachPoints[this.attachPoints.length - 2],109 this.attachPoints[this.attachPoints.length - 1],110 ];111 this.attachPositions = [112 this.attachPositions[this.attachPositions.length - 2],113 this.attachPositions[this.attachPositions.length - 1],114 ];115 this.attachRotations = [116 this.attachRotations[this.attachRotations.length - 2],117 this.attachRotations[this.attachRotations.length - 1],118 ];119 }120 }121 /**122 * Updates the first attach point.123 *124 * @param {Vec2} newAttachPoint The new attach point to have on the first object125 * @param {number} snapRadius The max radius where it snaps to the pos of the object126 */127 updateAttachPoint0(newAttachPoint, snapRadius = 0) {128 const isLocked = this.rotationLocked;129 if (isLocked) this.unlockRotation();130 this.attachPoints[0] = newAttachPoint.copy;131 this.attachPositions[0] = this.objects[0].pos.copy;132 this.attachRotations[0] = this.objects[0].rotation;133 if (this.attachPoints[0].dist(this.attachPositions[0]) <= snapRadius) {134 this.attachPoints[0] = this.attachPositions[0].copy;135 }136 if (isLocked) this.lockRotation();137 }138 /**139 * Updates the seccond attach point.140 *141 * @param {Vec2} newAttachPoint The new attach point to have on the second object142 * or on the pinpoint143 * @param {number} snapRadius The max radius where it snaps to the pos of the object144 */145 updateAttachPoint1(newAttachPoint, snapRadius = 0) {146 const isLocked = this.rotationLocked;147 if (isLocked) this.unlockRotation();148 if (this.objects.length === 2) {149 this.attachPoints[1] = newAttachPoint.copy;150 this.attachPositions[1] = this.objects[1].pos.copy;151 this.attachRotations[1] = this.objects[1].rotation;152 if (this.attachPoints[1].dist(this.attachPositions[1]) <= snapRadius) {153 this.attachPoints[1] = this.attachPositions[1].copy;154 }155 } else if (typeof this.pinned !== 'boolean') {156 this.pinned = newAttachPoint.copy;157 }158 if (isLocked) this.lockRotation();159 }160 /**161 * Returns the current absolute attach points of the spring.162 *163 * @returns {Vec2[]} The array of points164 */165 get points() {166 const ps = this.objects.map((o, i) => {167 const rStart = Vec2.sub(this.attachPoints[i], this.attachPositions[i]);168 rStart.rotate(o.rotation - this.attachRotations[i]);169 return Vec2.add(rStart, o.pos);170 });171 if (typeof this.pinned !== 'boolean') ps.push(Vec2.fromObject(this.pinned));172 return ps;173 }174 /**175 * Locks the objects attached to the ends of the spring176 * to not rotate around the attach point177 */178 lockRotation() {179 this.rotationLocked = true;180 this.initialOrientations = this.objects.map((body) => body.rotation);181 const ps = this.points;182 this.initialHeading = Vec2.sub(ps[1], ps[0]).heading;183 }184 /**185 * Releases the objects attached to the ends of the spring186 * to rotate around the attach point187 */188 unlockRotation() {189 this.rotationLocked = false;190 }191 /**192 * Arranges the rotations of the bodies to match the orientation when got locked.193 */194 arrangeOrientations() {195 const ps = this.points;196 const currentHeading = Vec2.sub(ps[1], ps[0]).heading;197 const dHeading = currentHeading - this.initialHeading;198 this.objects.forEach((body, i) => {199 const rotationGoal = this.initialOrientations[i] + dHeading;200 body.rotate(rotationGoal - body.rotation);201 });202 }203 /**204 * Returns the spring as a LineSegment.205 *206 * @returns {LineSegment} The segment made from the spring207 */208 getAsSegment() {209 const ps = this.points;210 return new LineSegment(ps[0], ps[1]);211 }212 /**213 * Updates the spring bay the elapsed time214 *215 * @param {number} t Elapsed time216 */217 update(t) {218 if (this.rotationLocked) this.arrangeOrientations();219 let p1;220 let p2;221 if (this.pinned instanceof Object && this.objects[0]) {222 [p2, p1] = [this.pinned, this.objects[0]];223 const ps = this.points;224 const dist = new Vec2(ps[1].x - ps[0].x, ps[1].y - ps[0].y);225 const dl = dist.length - this.length;226 dist.setMag(1);227 dist.mult((dl * this.springConstant * t));228 p1.applyImpulse(ps[1], dist);229 const v = p1.vel;230 v.rotate(-dist.heading);231 if (this.rotationLocked && p1.m !== 0) {232 const s = new Vec2(p2.x, p2.y);233 const r2 = Vec2.sub(p1.pos, s);234 const len = r2.length;235 const am = len * len * p1.m + p1.am;236 const ang = (p1.am * p1.ang - len * p1.m * v.y) / am;237 v.y = -ang * len;238 p1.ang = ang;239 }240 v.rotate(dist.heading);241 } else if (this.objects[0] && this.objects[1]) {242 [p1, p2] = [this.objects[0], this.objects[1]];243 const ps = this.points;244 let dist = Vec2.sub(ps[0], ps[1]);245 const dl = dist.length - this.length;246 dist.setMag(1);247 dist.mult(dl * this.springConstant * t);248 p2.applyImpulse(ps[1], dist);249 dist.mult(-1);250 p1.applyImpulse(ps[0], dist);251 dist = Vec2.sub(p1.pos, p2.pos);252 const v1 = p1.vel;253 const v2 = p2.vel;254 v1.rotate(-dist.heading);255 v2.rotate(-dist.heading);256 if (this.rotationLocked && p1.m !== 0 && p2.m !== 0) {257 const s = new Vec2(258 p1.pos.x * p1.m + p2.pos.x * p2.m,259 p1.pos.y * p1.m + p2.pos.y * p2.m,260 );261 s.div(p1.m + p2.m);262 const r1 = Vec2.sub(p1.pos, s);263 const r2 = Vec2.sub(p2.pos, s);264 const len1 = r1.length;265 const len2 = r2.length;266 const am = len1 * len1 * p1.m267 + p1.am268 + len2 * len2 * p2.m269 + p2.am;270 const sv = ((v1.y - v2.y) * len2) / (len1 + len2) + v2.y;271 const ang = (p1.am * p1.ang272 + p2.am * p2.ang273 + len1 * p1.m * (v1.y - sv)274 - len2 * p2.m * (v2.y - sv))275 / am;276 v1.y = ang * len1 + sv;277 v2.y = -ang * len2 + sv;278 p1.ang = ang;279 p2.ang = ang;280 }281 v1.rotate(dist.heading);282 v2.rotate(dist.heading);283 }284 }285 /**286 * Rotates the spring around a given center by a given angle.287 *288 * @param {Vec2} center The center of rotation289 * @param {number} angle The angle to rotate by290 */291 rotateAround(center, angle) {292 if (typeof this.pinned === 'boolean') return;293 const p = Vec2.fromObject(this.pinned);294 p.rotateAround(center, angle);295 this.pinned.x = p.x;296 this.pinned.y = p.y;297 }298 /**299 * Scales the spring around a given center by a given factor.300 *301 * @param {Vec2} center The center of scaling302 * @param {number} factor The factor to scale by303 */304 scaleAround(center, factor) {305 if (typeof this.pinned === 'boolean') return;306 const p = Vec2.fromObject(this.pinned);307 p.scaleAround(center, factor);308 this.pinned.x = p.x;309 this.pinned.y = p.y;310 this.length *= factor;311 }312 /**313 * Returns the MinMax of the spring along the x axis.314 *315 * @returns {MinMax} The bouding box of the spring in the x direction316 */317 getMinMaxX() {318 const xPoints = [...this.objects.map((b) => b.pos.x)];319 if (typeof this.pinned !== 'boolean')xPoints.push(this.pinned.x);320 return MinMax.fromPoints(...xPoints);321 }322 /**323 * Returns the MinMax of the spring along the y axis.324 *325 * @returns {MinMax} The bouding box of the spring in the y direction326 */327 getMinMaxY() {328 const yPoints = [...this.objects.map((b) => b.pos.y)];329 if (typeof this.pinned !== 'boolean') yPoints.push(this.pinned.y);330 return MinMax.fromPoints(...yPoints);331 }332}...
_AttachMixin.js.uncompressed.js
Source:_AttachMixin.js.uncompressed.js
1define("dijit/_AttachMixin", [2 "require",3 "dojo/_base/array", // array.forEach4 "dojo/_base/connect", // remove for 2.05 "dojo/_base/declare", // declare6 "dojo/_base/lang", // lang.getObject7 "dojo/mouse",8 "dojo/on",9 "dojo/touch",10 "./_WidgetBase"11], function(require, array, connect, declare, lang, mouse, on, touch, _WidgetBase){12 // module:13 // dijit/_AttachMixin14 // Map from string name like "mouseenter" to synthetic event like mouse.enter15 var synthEvents = lang.delegate(touch, {16 "mouseenter": mouse.enter,17 "mouseleave": mouse.leave,18 "keypress": connect._keypress // remove for 2.019 });20 // To be lightweight, _AttachMixin doesn't require() dijit/a11yclick.21 // If the subclass has a template using "ondijitclick", it must load dijit/a11yclick itself.22 // In that case, the a11yclick variable below will get set to point to that synthetic event.23 var a11yclick;24 var _AttachMixin = declare("dijit._AttachMixin", null, {25 // summary:26 // Mixin for widgets to attach to dom nodes and setup events via27 // convenient data-dojo-attach-point and data-dojo-attach-event DOM attributes.28 //29 // Superclass of _TemplatedMixin, and can also be used standalone when templates are pre-rendered on the30 // server.31 //32 // Does not [yet] handle widgets like ContentPane with this.containerNode set. It should skip33 // scanning for data-dojo-attach-point and data-dojo-attach-event inside this.containerNode, but it34 // doesn't.35/*=====36 // _attachPoints: [private] String[]37 // List of widget attribute names associated with data-dojo-attach-point=... in the38 // template, ex: ["containerNode", "labelNode"]39 _attachPoints: [],40 // _attachEvents: [private] Handle[]41 // List of connections associated with data-dojo-attach-event=... in the42 // template43 _attachEvents: [],44 // attachScope: [public] Object45 // Object to which attach points and events will be scoped. Defaults46 // to 'this'.47 attachScope: undefined,48 // searchContainerNode: [protected] Boolean49 // Search descendants of this.containerNode for data-dojo-attach-point and data-dojo-attach-event.50 // Should generally be left false (the default value) both for performance and to avoid failures when51 // this.containerNode holds other _AttachMixin instances with their own attach points and events.52 searchContainerNode: false,53 =====*/54 constructor: function(/*===== params, srcNodeRef =====*/){55 // summary:56 // Create the widget.57 // params: Object|null58 // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)59 // and functions, typically callbacks like onClick.60 // The hash can contain any of the widget's properties, excluding read-only properties.61 // srcNodeRef: DOMNode|String?62 // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.63 this._attachPoints = [];64 this._attachEvents = [];65 },66 buildRendering: function(){67 // summary:68 // Attach to DOM nodes marked with special attributes.69 // tags:70 // protected71 this.inherited(arguments);72 // recurse through the node, looking for, and attaching to, our73 // attachment points and events, which should be defined on the template node.74 this._attachTemplateNodes(this.domNode);75 this._beforeFillContent(); // hook for _WidgetsInTemplateMixin76 },77 _beforeFillContent: function(){78 },79 _attachTemplateNodes: function(rootNode){80 // summary:81 // Iterate through the dom nodes and attach functions and nodes accordingly.82 // description:83 // Map widget properties and functions to the handlers specified in84 // the dom node and it's descendants. This function iterates over all85 // nodes and looks for these properties:86 //87 // - dojoAttachPoint/data-dojo-attach-point88 // - dojoAttachEvent/data-dojo-attach-event89 // rootNode: DomNode90 // The node to search for properties. All descendants will be searched.91 // tags:92 // private93 // DFS to process all nodes except those inside of this.containerNode94 var node = rootNode;95 while(true){96 if(node.nodeType == 1 && (this._processTemplateNode(node, function(n,p){ return n.getAttribute(p); },97 this._attach) || this.searchContainerNode) && node.firstChild){98 node = node.firstChild;99 }else{100 if(node == rootNode){ return; }101 while(!node.nextSibling){102 node = node.parentNode;103 if(node == rootNode){ return; }104 }105 node = node.nextSibling;106 }107 }108 },109 _processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){110 // summary:111 // Process data-dojo-attach-point and data-dojo-attach-event for given node or widget.112 // Returns true if caller should process baseNode's children too.113 var ret = true;114 // Process data-dojo-attach-point115 var _attachScope = this.attachScope || this,116 attachPoint = getAttrFunc(baseNode, "dojoAttachPoint") || getAttrFunc(baseNode, "data-dojo-attach-point");117 if(attachPoint){118 var point, points = attachPoint.split(/\s*,\s*/);119 while((point = points.shift())){120 if(lang.isArray(_attachScope[point])){121 _attachScope[point].push(baseNode);122 }else{123 _attachScope[point] = baseNode;124 }125 ret = (point != "containerNode");126 this._attachPoints.push(point);127 }128 }129 // Process data-dojo-attach-event130 var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event");131 if(attachEvent){132 // NOTE: we want to support attributes that have the form133 // "domEvent: nativeEvent, ..."134 var event, events = attachEvent.split(/\s*,\s*/);135 var trim = lang.trim;136 while((event = events.shift())){137 if(event){138 var thisFunc = null;139 if(event.indexOf(":") != -1){140 // oh, if only JS had tuple assignment141 var funcNameArr = event.split(":");142 event = trim(funcNameArr[0]);143 thisFunc = trim(funcNameArr[1]);144 }else{145 event = trim(event);146 }147 if(!thisFunc){148 thisFunc = event;149 }150 this._attachEvents.push(attachFunc(baseNode, event, lang.hitch(_attachScope, thisFunc)));151 }152 }153 }154 return ret;155 },156 _attach: function(node, type, func){157 // summary:158 // Roughly corresponding to dojo/on, this is the default function for processing a159 // data-dojo-attach-event. Meant to attach to DOMNodes, not to widgets.160 // node: DOMNode161 // The node to setup a listener on.162 // type: String163 // Event name like "click".164 // getAttrFunc: Function165 // Function to get the specified property for a given DomNode/Widget.166 // attachFunc: Function?167 // Attaches an event handler from the specified node/widget to specified function.168 // Map special type names like "mouseenter" to synthetic events.169 // Subclasses are responsible to require() dijit/a11yclick if they want to use it.170 type = type.replace(/^on/, "").toLowerCase();171 if(type == "dijitclick"){172 type = a11yclick || (a11yclick = require("./a11yclick"));173 }else{174 type = synthEvents[type] || type;175 }176 return on(node, type, func);177 },178 _detachTemplateNodes: function() {179 // summary:180 // Detach and clean up the attachments made in _attachtempalteNodes.181 // Delete all attach points to prevent IE6 memory leaks.182 var _attachScope = this.attachScope || this;183 array.forEach(this._attachPoints, function(point){184 delete _attachScope[point];185 });186 this._attachPoints = [];187 // And same for event handlers188 array.forEach(this._attachEvents, function(handle){ handle.remove(); });189 this._attachEvents = [];190 },191 destroyRendering: function(){192 this._detachTemplateNodes();193 this.inherited(arguments);194 }195 });196 // These arguments can be specified for widgets which are used in templates.197 // Since any widget can be specified as sub widgets in template, mix it198 // into the base widget class. (This is a hack, but it's effective.).199 // Remove for 2.0. Also, hide from API doc parser.200 lang.extend(_WidgetBase, /*===== {} || =====*/ {201 dojoAttachEvent: "",202 dojoAttachPoint: ""203 });204 205 return _AttachMixin;...
_AttachMixin.js.consoleStripped.js
Source:_AttachMixin.js.consoleStripped.js
1define("dijit/_AttachMixin", [2 "require",3 "dojo/_base/array", // array.forEach4 "dojo/_base/connect", // remove for 2.05 "dojo/_base/declare", // declare6 "dojo/_base/lang", // lang.getObject7 "dojo/mouse",8 "dojo/on",9 "dojo/touch",10 "./_WidgetBase"11], function(require, array, connect, declare, lang, mouse, on, touch, _WidgetBase){12 // module:13 // dijit/_AttachMixin14 // Map from string name like "mouseenter" to synthetic event like mouse.enter15 var synthEvents = lang.delegate(touch, {16 "mouseenter": mouse.enter,17 "mouseleave": mouse.leave,18 "keypress": connect._keypress // remove for 2.019 });20 // To be lightweight, _AttachMixin doesn't require() dijit/a11yclick.21 // If the subclass has a template using "ondijitclick", it must load dijit/a11yclick itself.22 // In that case, the a11yclick variable below will get set to point to that synthetic event.23 var a11yclick;24 var _AttachMixin = declare("dijit._AttachMixin", null, {25 // summary:26 // Mixin for widgets to attach to dom nodes and setup events via27 // convenient data-dojo-attach-point and data-dojo-attach-event DOM attributes.28 //29 // Superclass of _TemplatedMixin, and can also be used standalone when templates are pre-rendered on the30 // server.31 //32 // Does not [yet] handle widgets like ContentPane with this.containerNode set. It should skip33 // scanning for data-dojo-attach-point and data-dojo-attach-event inside this.containerNode, but it34 // doesn't.35/*=====36 // _attachPoints: [private] String[]37 // List of widget attribute names associated with data-dojo-attach-point=... in the38 // template, ex: ["containerNode", "labelNode"]39 _attachPoints: [],40 // _attachEvents: [private] Handle[]41 // List of connections associated with data-dojo-attach-event=... in the42 // template43 _attachEvents: [],44 // attachScope: [public] Object45 // Object to which attach points and events will be scoped. Defaults46 // to 'this'.47 attachScope: undefined,48 // searchContainerNode: [protected] Boolean49 // Search descendants of this.containerNode for data-dojo-attach-point and data-dojo-attach-event.50 // Should generally be left false (the default value) both for performance and to avoid failures when51 // this.containerNode holds other _AttachMixin instances with their own attach points and events.52 searchContainerNode: false,53 =====*/54 constructor: function(/*===== params, srcNodeRef =====*/){55 // summary:56 // Create the widget.57 // params: Object|null58 // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)59 // and functions, typically callbacks like onClick.60 // The hash can contain any of the widget's properties, excluding read-only properties.61 // srcNodeRef: DOMNode|String?62 // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.63 this._attachPoints = [];64 this._attachEvents = [];65 },66 buildRendering: function(){67 // summary:68 // Attach to DOM nodes marked with special attributes.69 // tags:70 // protected71 this.inherited(arguments);72 // recurse through the node, looking for, and attaching to, our73 // attachment points and events, which should be defined on the template node.74 this._attachTemplateNodes(this.domNode);75 this._beforeFillContent(); // hook for _WidgetsInTemplateMixin76 },77 _beforeFillContent: function(){78 },79 _attachTemplateNodes: function(rootNode){80 // summary:81 // Iterate through the dom nodes and attach functions and nodes accordingly.82 // description:83 // Map widget properties and functions to the handlers specified in84 // the dom node and it's descendants. This function iterates over all85 // nodes and looks for these properties:86 //87 // - dojoAttachPoint/data-dojo-attach-point88 // - dojoAttachEvent/data-dojo-attach-event89 // rootNode: DomNode90 // The node to search for properties. All descendants will be searched.91 // tags:92 // private93 // DFS to process all nodes except those inside of this.containerNode94 var node = rootNode;95 while(true){96 if(node.nodeType == 1 && (this._processTemplateNode(node, function(n,p){ return n.getAttribute(p); },97 this._attach) || this.searchContainerNode) && node.firstChild){98 node = node.firstChild;99 }else{100 if(node == rootNode){ return; }101 while(!node.nextSibling){102 node = node.parentNode;103 if(node == rootNode){ return; }104 }105 node = node.nextSibling;106 }107 }108 },109 _processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){110 // summary:111 // Process data-dojo-attach-point and data-dojo-attach-event for given node or widget.112 // Returns true if caller should process baseNode's children too.113 var ret = true;114 // Process data-dojo-attach-point115 var _attachScope = this.attachScope || this,116 attachPoint = getAttrFunc(baseNode, "dojoAttachPoint") || getAttrFunc(baseNode, "data-dojo-attach-point");117 if(attachPoint){118 var point, points = attachPoint.split(/\s*,\s*/);119 while((point = points.shift())){120 if(lang.isArray(_attachScope[point])){121 _attachScope[point].push(baseNode);122 }else{123 _attachScope[point] = baseNode;124 }125 ret = (point != "containerNode");126 this._attachPoints.push(point);127 }128 }129 // Process data-dojo-attach-event130 var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event");131 if(attachEvent){132 // NOTE: we want to support attributes that have the form133 // "domEvent: nativeEvent, ..."134 var event, events = attachEvent.split(/\s*,\s*/);135 var trim = lang.trim;136 while((event = events.shift())){137 if(event){138 var thisFunc = null;139 if(event.indexOf(":") != -1){140 // oh, if only JS had tuple assignment141 var funcNameArr = event.split(":");142 event = trim(funcNameArr[0]);143 thisFunc = trim(funcNameArr[1]);144 }else{145 event = trim(event);146 }147 if(!thisFunc){148 thisFunc = event;149 }150 this._attachEvents.push(attachFunc(baseNode, event, lang.hitch(_attachScope, thisFunc)));151 }152 }153 }154 return ret;155 },156 _attach: function(node, type, func){157 // summary:158 // Roughly corresponding to dojo/on, this is the default function for processing a159 // data-dojo-attach-event. Meant to attach to DOMNodes, not to widgets.160 // node: DOMNode161 // The node to setup a listener on.162 // type: String163 // Event name like "click".164 // getAttrFunc: Function165 // Function to get the specified property for a given DomNode/Widget.166 // attachFunc: Function?167 // Attaches an event handler from the specified node/widget to specified function.168 // Map special type names like "mouseenter" to synthetic events.169 // Subclasses are responsible to require() dijit/a11yclick if they want to use it.170 type = type.replace(/^on/, "").toLowerCase();171 if(type == "dijitclick"){172 type = a11yclick || (a11yclick = require("./a11yclick"));173 }else{174 type = synthEvents[type] || type;175 }176 return on(node, type, func);177 },178 _detachTemplateNodes: function() {179 // summary:180 // Detach and clean up the attachments made in _attachtempalteNodes.181 // Delete all attach points to prevent IE6 memory leaks.182 var _attachScope = this.attachScope || this;183 array.forEach(this._attachPoints, function(point){184 delete _attachScope[point];185 });186 this._attachPoints = [];187 // And same for event handlers188 array.forEach(this._attachEvents, function(handle){ handle.remove(); });189 this._attachEvents = [];190 },191 destroyRendering: function(){192 this._detachTemplateNodes();193 this.inherited(arguments);194 }195 });196 // These arguments can be specified for widgets which are used in templates.197 // Since any widget can be specified as sub widgets in template, mix it198 // into the base widget class. (This is a hack, but it's effective.).199 // Remove for 2.0. Also, hide from API doc parser.200 lang.extend(_WidgetBase, /*===== {} || =====*/ {201 dojoAttachEvent: "",202 dojoAttachPoint: ""203 });204 205 return _AttachMixin;...
_AttachMixin.js
Source:_AttachMixin.js
1define([2 "require",3 "dojo/_base/array", // array.forEach4 "dojo/_base/connect", // remove for 2.05 "dojo/_base/declare", // declare6 "dojo/_base/lang", // lang.getObject7 "dojo/mouse",8 "dojo/on",9 "dojo/touch",10 "./_WidgetBase"11], function(require, array, connect, declare, lang, mouse, on, touch, _WidgetBase){12 // module:13 // dijit/_AttachMixin14 // Map from string name like "mouseenter" to synthetic event like mouse.enter15 var synthEvents = lang.delegate(touch, {16 "mouseenter": mouse.enter,17 "mouseleave": mouse.leave,18 "keypress": connect._keypress // remove for 2.019 });20 // To be lightweight, _AttachMixin doesn't require() dijit/a11yclick.21 // If the subclass has a template using "ondijitclick", it must load dijit/a11yclick itself.22 // In that case, the a11yclick variable below will get set to point to that synthetic event.23 var a11yclick;24 var _AttachMixin = declare("dijit._AttachMixin", null, {25 // summary:26 // Mixin for widgets to attach to dom nodes and setup events via27 // convenient data-dojo-attach-point and data-dojo-attach-event DOM attributes.28 //29 // Superclass of _TemplatedMixin, and can also be used standalone when templates are pre-rendered on the30 // server.31 //32 // Does not [yet] handle widgets like ContentPane with this.containerNode set. It should skip33 // scanning for data-dojo-attach-point and data-dojo-attach-event inside this.containerNode, but it34 // doesn't.35/*=====36 // _attachPoints: [private] String[]37 // List of widget attribute names associated with data-dojo-attach-point=... in the38 // template, ex: ["containerNode", "labelNode"]39 _attachPoints: [],40 // _attachEvents: [private] Handle[]41 // List of connections associated with data-dojo-attach-event=... in the42 // template43 _attachEvents: [],44 // attachScope: [public] Object45 // Object to which attach points and events will be scoped. Defaults46 // to 'this'.47 attachScope: undefined,48 // searchContainerNode: [protected] Boolean49 // Search descendants of this.containerNode for data-dojo-attach-point and data-dojo-attach-event.50 // Should generally be left false (the default value) both for performance and to avoid failures when51 // this.containerNode holds other _AttachMixin instances with their own attach points and events.52 searchContainerNode: false,53 =====*/54 constructor: function(/*===== params, srcNodeRef =====*/){55 // summary:56 // Create the widget.57 // params: Object|null58 // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)59 // and functions, typically callbacks like onClick.60 // The hash can contain any of the widget's properties, excluding read-only properties.61 // srcNodeRef: DOMNode|String?62 // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.63 this._attachPoints = [];64 this._attachEvents = [];65 },66 buildRendering: function(){67 // summary:68 // Attach to DOM nodes marked with special attributes.69 // tags:70 // protected71 this.inherited(arguments);72 // recurse through the node, looking for, and attaching to, our73 // attachment points and events, which should be defined on the template node.74 this._attachTemplateNodes(this.domNode);75 this._beforeFillContent(); // hook for _WidgetsInTemplateMixin76 },77 _beforeFillContent: function(){78 },79 _attachTemplateNodes: function(rootNode){80 // summary:81 // Iterate through the dom nodes and attach functions and nodes accordingly.82 // description:83 // Map widget properties and functions to the handlers specified in84 // the dom node and it's descendants. This function iterates over all85 // nodes and looks for these properties:86 //87 // - dojoAttachPoint/data-dojo-attach-point88 // - dojoAttachEvent/data-dojo-attach-event89 // rootNode: DomNode90 // The node to search for properties. All descendants will be searched.91 // tags:92 // private93 // DFS to process all nodes except those inside of this.containerNode94 var node = rootNode;95 while(true){96 if(node.nodeType == 1 && (this._processTemplateNode(node, function(n,p){ return n.getAttribute(p); },97 this._attach) || this.searchContainerNode) && node.firstChild){98 node = node.firstChild;99 }else{100 if(node == rootNode){ return; }101 while(!node.nextSibling){102 node = node.parentNode;103 if(node == rootNode){ return; }104 }105 node = node.nextSibling;106 }107 }108 },109 _processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){110 // summary:111 // Process data-dojo-attach-point and data-dojo-attach-event for given node or widget.112 // Returns true if caller should process baseNode's children too.113 var ret = true;114 // Process data-dojo-attach-point115 var _attachScope = this.attachScope || this,116 attachPoint = getAttrFunc(baseNode, "dojoAttachPoint") || getAttrFunc(baseNode, "data-dojo-attach-point");117 if(attachPoint){118 var point, points = attachPoint.split(/\s*,\s*/);119 while((point = points.shift())){120 if(lang.isArray(_attachScope[point])){121 _attachScope[point].push(baseNode);122 }else{123 _attachScope[point] = baseNode;124 }125 ret = (point != "containerNode");126 this._attachPoints.push(point);127 }128 }129 // Process data-dojo-attach-event130 var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event");131 if(attachEvent){132 // NOTE: we want to support attributes that have the form133 // "domEvent: nativeEvent; ..."134 var event, events = attachEvent.split(/\s*,\s*/);135 var trim = lang.trim;136 while((event = events.shift())){137 if(event){138 var thisFunc = null;139 if(event.indexOf(":") != -1){140 // oh, if only JS had tuple assignment141 var funcNameArr = event.split(":");142 event = trim(funcNameArr[0]);143 thisFunc = trim(funcNameArr[1]);144 }else{145 event = trim(event);146 }147 if(!thisFunc){148 thisFunc = event;149 }150 this._attachEvents.push(attachFunc(baseNode, event, lang.hitch(_attachScope, thisFunc)));151 }152 }153 }154 return ret;155 },156 _attach: function(node, type, func){157 // summary:158 // Roughly corresponding to dojo/on, this is the default function for processing a159 // data-dojo-attach-event. Meant to attach to DOMNodes, not to widgets.160 // node: DOMNode161 // The node to setup a listener on.162 // type: String163 // Event name like "click".164 // getAttrFunc: Function165 // Function to get the specified property for a given DomNode/Widget.166 // attachFunc: Function?167 // Attaches an event handler from the specified node/widget to specified function.168 // Map special type names like "mouseenter" to synthetic events.169 // Subclasses are responsible to require() dijit/a11yclick if they want to use it.170 type = type.replace(/^on/, "").toLowerCase();171 if(type == "dijitclick"){172 type = a11yclick || (a11yclick = require("./a11yclick"));173 }else{174 type = synthEvents[type] || type;175 }176 return on(node, type, func);177 },178 _detachTemplateNodes: function() {179 // summary:180 // Detach and clean up the attachments made in _attachtempalteNodes.181 // Delete all attach points to prevent IE6 memory leaks.182 var _attachScope = this.attachScope || this;183 array.forEach(this._attachPoints, function(point){184 delete _attachScope[point];185 });186 this._attachPoints = [];187 // And same for event handlers188 array.forEach(this._attachEvents, function(handle){ handle.remove(); });189 this._attachEvents = [];190 },191 destroyRendering: function(){192 this._detachTemplateNodes();193 this.inherited(arguments);194 }195 });196 // These arguments can be specified for widgets which are used in templates.197 // Since any widget can be specified as sub widgets in template, mix it198 // into the base widget class. (This is a hack, but it's effective.).199 // Remove for 2.0. Also, hide from API doc parser.200 lang.extend(_WidgetBase, /*===== {} || =====*/ {201 dojoAttachEvent: "",202 dojoAttachPoint: ""203 });204 205 return _AttachMixin;...
index.js
Source:index.js
1const weaponData = require("./weaponData");2const PistolAttachmentPos = new mp.Vector3(0.02, 0.06, 0.1);3const PistolAttachmentRot = new mp.Vector3(-100.0, 0.0, 0.0);4const SMGAttachmentPos = new mp.Vector3(0.08, 0.03, -0.1);5const SMGAttachmentRot = new mp.Vector3(-80.77, 0.0, 0.0);6const ShotgunAttachmentPos = new mp.Vector3(-0.1, -0.15, 0.11);7const ShotgunAttachmentRot = new mp.Vector3(-180.0, 0.0, 0.0);8const RifleAttachmentPos = new mp.Vector3(-0.1, -0.15, -0.13);9const RifleAttachmentRot = new mp.Vector3(0.0, 0.0, 3.5);10/*11 Weapon names have to be uppercase!12 You can get attachment bone IDs from https://wiki.rage.mp/index.php?title=Bones13 */14const weaponAttachmentData = {15 // Pistols16 "WEAPON_PISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },17 "WEAPON_PISTOL_MK2": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },18 "WEAPON_COMBATPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },19 "WEAPON_APPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },20 "WEAPON_STUNGUN": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },21 "WEAPON_PISTOL50": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },22 "WEAPON_SNSPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },23 "WEAPON_SNSPISTOL_MK2": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },24 "WEAPON_HEAVYPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },25 "WEAPON_VINTAGEPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },26 "WEAPON_REVOLVER": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },27 "WEAPON_REVOLVER_MK2": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },28 "WEAPON_DOUBLEACTION": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },29 "WEAPON_RAYPISTOL": { Slot: "RIGHT_THIGH", AttachBone: 51826, AttachPosition: PistolAttachmentPos, AttachRotation: PistolAttachmentRot },30 // Submachine Guns31 "WEAPON_MICROSMG": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },32 "WEAPON_SMG": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },33 "WEAPON_SMG_MK2": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },34 "WEAPON_ASSAULTSMG": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },35 "WEAPON_COMBATPDW": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },36 "WEAPON_MACHINEPISTOL": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },37 "WEAPON_MINISMG": { Slot: "LEFT_THIGH", AttachBone: 58271, AttachPosition: SMGAttachmentPos, AttachRotation: SMGAttachmentRot },38 // Shotguns39 "WEAPON_PUMPSHOTGUN": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },40 "WEAPON_PUMPSHOTGUN_MK2": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },41 "WEAPON_SAWNOFFSHOTGUN": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },42 "WEAPON_ASSAULTSHOTGUN": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },43 "WEAPON_BULLPUPSHOTGUN": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },44 "WEAPON_HEAVYSHOTGUN": { Slot: "LEFT_BACK", AttachBone: 24818, AttachPosition: ShotgunAttachmentPos, AttachRotation: ShotgunAttachmentRot },45 // Rifles46 "WEAPON_ASSAULTRIFLE": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },47 "WEAPON_ASSAULTRIFLE_MK2": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },48 "WEAPON_CARBINERIFLE": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },49 "WEAPON_CARBINERIFLE_MK2": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },50 "WEAPON_SPECIALCARBINE": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },51 "WEAPON_SPECIALCARBINE_MK2": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },52 "WEAPON_MARKSMANRIFLE": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot },53 "WEAPON_MARKSMANRIFLE_MK2": { Slot: "RIGHT_BACK", AttachBone: 24818, AttachPosition: RifleAttachmentPos, AttachRotation: RifleAttachmentRot }54};55// Update weaponAttachmentData with attachment name and model56for (let weapon in weaponAttachmentData) {57 let hash = mp.joaat(weapon);58 if (weaponData[hash]) {59 weaponAttachmentData[weapon].AttachName = `WDSP_${weaponData[hash].HashKey}`;60 weaponAttachmentData[weapon].AttachModel = weaponData[hash].ModelHashKey;61 } else {62 console.log(`[!] ${weapon} not found in weapon data file and will cause issues, remove it from weaponAttachmentData.`);63 }64}65mp.events.add("playerReady", (player) => {66 player._bodyWeapons = {};67 player.call("registerWeaponAttachments", [ JSON.stringify(weaponAttachmentData) ]);68});69mp.events.add("playerWeaponChange", (player, oldWeapon, newWeapon) => {70 if (weaponData[oldWeapon]) {71 let oldWeaponKey = weaponData[oldWeapon].HashKey;72 if (weaponAttachmentData[oldWeaponKey]) {73 // Remove the attached weapon that is occupying the slot74 let slot = weaponAttachmentData[oldWeaponKey].Slot;75 if (player._bodyWeapons[slot] && player.hasAttachment(player._bodyWeapons[slot])) player.addAttachment(player._bodyWeapons[slot], true);76 // Attach the updated old weapon77 let attachName = weaponAttachmentData[oldWeaponKey].AttachName;78 player.addAttachment(attachName, false);79 player._bodyWeapons[slot] = attachName;80 }81 }82 if (weaponData[newWeapon]) {83 let newWeaponKey = weaponData[newWeapon].HashKey;84 if (weaponAttachmentData[newWeaponKey]) {85 // De-attach the new/current weapon (if attached)86 let slot = weaponAttachmentData[newWeaponKey].Slot;87 let attachName = weaponAttachmentData[newWeaponKey].AttachName;88 if (player._bodyWeapons[slot] === attachName) {89 if (player.hasAttachment(attachName)) player.addAttachment(attachName, true);90 delete player._bodyWeapons[slot];91 }92 }93 }94});95// De-attach all weapons on death96mp.events.add("playerDeath", (player) => {97 for (let name in player._bodyWeapons) {98 player.addAttachment(player._bodyWeapons[name], true);99 delete player._bodyWeapons[name];100 }...
browser_directorscript_actors_exports.js
Source:browser_directorscript_actors_exports.js
1/* vim: set ft=javascript ts=2 et sw=2 tw=80: */2/* Any copyright is dedicated to the Public Domain.3 http://creativecommons.org/publicdomain/zero/1.0/ */4"use strict";5const {DirectorManagerFront} = require("devtools/shared/fronts/director-manager");6const {DirectorRegistry} = require("devtools/server/actors/director-registry");7DirectorRegistry.clear();8add_task(function* () {9 let browser = yield addTab(MAIN_DOMAIN + "director-script-target.html");10 let doc = browser.contentDocument;11 initDebuggerServer();12 let client = new DebuggerClient(DebuggerServer.connectPipe());13 let form = yield connectDebuggerClient(client);14 DirectorRegistry.clear();15 let directorManager = DirectorManagerFront(client, form);16 // director scripts attach method defaults to module.exports17 let attachModuleExports = yield testDirectorScriptExports(directorManager, {18 scriptId: "testDirectorScript_moduleExports",19 scriptCode: "(" + (function () {20 module.exports = function () {};21 }).toString() + ")();",22 scriptOptions: {}23 });24 ok(attachModuleExports.port, "testDirectorScript_moduleExports attach event received");25 // director scripts attach method can be configured using the attachMethod scriptOptions26 let attachExportsAttach = yield testDirectorScriptExports(directorManager, {27 scriptId: "testDirectorScript_exportsAttach",28 scriptCode: "(" + (function () {29 exports.attach = function () {};30 }).toString() + ")();",31 scriptOptions: {32 attachMethod: "attach"33 }34 });35 ok(attachExportsAttach.port, "testDirectorScript_exportsAttach attach event received");36 // director scripts without an attach method generates an error event37 let errorUndefinedAttachMethod = yield testDirectorScriptExports(directorManager, {38 scriptId: "testDirectorScript_undefinedAttachMethod",39 scriptCode: "(" + (function () {40 // this director script should raise an error41 // because it doesn't export any attach method42 }).toString() + ")();",43 scriptOptions: {44 attachMethod: "attach"45 }46 });47 let { message } = errorUndefinedAttachMethod;48 ok(!!message, "testDirectorScript_undefinedAttachMethod error event received");49 assertIsDirectorScriptError(errorUndefinedAttachMethod);50 yield client.close();51 gBrowser.removeCurrentTab();52 DirectorRegistry.clear();53});54function assertIsDirectorScriptError(error) {55 ok(!!error.message, "errors should contain a message");56 ok(!!error.stack, "errors should contain a stack trace");57 ok(!!error.fileName, "errors should contain a fileName");58 ok(typeof error.columnNumber == "number", "errors should contain a columnNumber");59 ok(typeof error.lineNumber == "number", "errors should contain a lineNumber");60 ok(!!error.directorScriptId, "errors should contain a directorScriptId");61}62function* testDirectorScriptExports(directorManager, directorScriptDef) {63 let { scriptId } = directorScriptDef;64 DirectorRegistry.install(scriptId, directorScriptDef);65 let waitForAttach = once(directorManager, "director-script-attach");66 let waitForError = once(directorManager, "director-script-error");67 directorManager.enableByScriptIds([scriptId], {reload: false});68 let attachOrErrorEvent = yield Promise.race([waitForAttach, waitForError]);69 return attachOrErrorEvent;...
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 const client = await page.context().newCDPSession(page);6 await client.send('Page.enable');7 await client.send('Page.setDownloadBehavior', {8 });9 await page.click('a');10 await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const page = await browser.newPage();16 page.route('**/*', (route) => {17 if (route.request().resourceType() === 'document') {18 route.continue();19 } else {20 route.fulfill({21 body: Buffer.from('Hello World'),22 });23 }24 });25 await page.click('a');26 await browser.close();27})();28const { chromium } = require('playwright');29(async () => {30 const browser = await chromium.launch();31 const page = await browser.newPage();32 await page.click('a');33 await browser.close();34})();35const { chromium } = require('playwright');36(async () => {37 const browser = await chromium.launch();38 const page = await browser.newPage();39 await page.evaluate(() => {40 const link = document.querySelector('a');41 link.click();42 });43 await browser.close();44})();
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const client = await page.context().newCDPSession(page);7 await client.send('Page.enable');8 await client.send('Page.setDownloadBehavior', { behavior: 'allow', downloadPath: '/home/user/Downloads' });9 await browser.close();10})();11[MIT](LICENSE)
Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const page = await browser.newPage();5 await page.screenshot({ path: 'example.png' });6 await browser.close();7})();8## [How to use Playwright in Docker container](
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({ headless: false });4 const context = await browser.newContext();5 const page = await context.newPage();6 await page.waitForTimeout(2000);7 await page.click('text="Try it"');8 await page.waitForTimeout(2000);9 await page.click('input[type="file"]');10 await page.waitForTimeout(2000);11 const [fileChooser] = await Promise.all([12 page.waitForEvent('filechooser'),13 page.click('input[type="file"]'),14 ]);15 await fileChooser.setFiles('C:/Users/Downloads/1.jpg');16 await page.waitForTimeout(2000);17 await page.click('text="Submit"');18 await page.waitForTimeout(2000);19 await browser.close();20})();
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!!