Best JavaScript code snippet using playwright-internal
commands.js
Source:commands.js
1/* Server Commands parsing */2window.ServerCommandsHandlers = {3 "USER": function (room, cmd, spl, context) {4 context.client.changeLogin(spl.slice(3).join("|"), spl[1] === "0", spl[2]);5 },6 "ROOMS": function (room, cmd, spl, context) {7 context.client.home_room.setRoomsList(JSON.parse(spl.slice(1)));8 },9 "CHAT": function (room, cmd, spl, context) {10 room.addChat(spl[3], spl[2], spl.slice(4), (parseInt(spl[1]) * 1000) + context.client.timeoffset);11 },12 "ERR-CANNOT-CHAT": function (room, cmd, spl, context) {13 room.addLine('<span class="error-msg">You cannot chat in this room right now.</span>');14 },15 "ERR-CMD": function (room, cmd, spl, context) {16 if (spl[1] === "help") {17 room.add('<div class="chat-msg"><div class="chat-msg-box">' + $("#data-div-help-command").html() + '</div></div>');18 } else if (spl[1] === "adminhelp") {19 room.add('<div class="chat-msg"><div class="chat-msg-box">' + $("#data-div-adminhelp-command").html() + '</div></div>');20 } else {21 room.addLine('<span class="error-msg">Command not found: ' + Tools.escapeHTML(spl[1]) + '</span>');22 }23 },24 "ERR": function (room, cmd, spl, context) {25 switch (Tools.toId(spl[1])) {26 case "token":27 if (Tools.getCookie("token") === spl[3]) {28 document.cookie = "";29 }30 break;31 case "denied":32 room.addLine(Tools.escapeHTML(spl[2]) + ": access denied.");33 break;34 case "usage":35 if (spl[2] === "login") {36 context.client.logindialog.dialog("open");37 $("#login-dialog-error-msg").html("");38 } else if (spl[2] === "register") {39 context.client.registerdialog.dialog("open");40 $("#register-dialog-error-msg").html("");41 } else if (spl[2] === "changepassword") {42 context.client.cpassworddialog.dialog("open");43 $("#cpassword-dialog-error-msg").html("");44 } else if (CommandsUsageData[spl[2]]) {45 room.addLine("Usage: /" + Tools.escapeHTML(spl[2]) + " " + Tools.escapeHTML(CommandsUsageData[spl[2]]));46 } else {47 room.addLine("Invalid syntax for command /" + Tools.escapeHTML(spl[2]));48 }49 break;50 case "login":51 context.client.logindialog.dialog("open");52 switch (spl[2]) {53 case "INVALID-NAME":54 $("#login-dialog-error-msg").html("Ivalid username.");55 break;56 case "INVALID-LOGIN":57 $("#login-dialog-error-msg").html("Invalid password.");58 break;59 case "NOT-REGISTERED":60 $("#login-dialog-error-msg").html("The userame you chose is not registered.");61 break;62 }63 break;64 case "rename":65 context.client.renamedialog.dialog("open");66 switch (spl[2]) {67 case "INVALID-NAME":68 $("#rename-dialog-error-msg").html("Invalid username.");69 break;70 }71 break;72 case "register":73 context.client.registerdialog.dialog("open");74 switch (spl[2]) {75 case "GUEST":76 $("#register-dialog-error-msg").html("You cannot register a guest account.");77 break;78 case "INVALID-ID":79 $("#register-dialog-error-msg").html("Invalid user ID.");80 break;81 case "ALREADY-REGISTERED":82 $("#register-dialog-error-msg").html("The account is already registered");83 break;84 case "CANNOT-REGISTER":85 $("#register-dialog-error-msg").html("You are not allowed to register more than one account every 12 hours.");86 break;87 }88 break;89 case "deregister":90 switch (spl[2]) {91 case "IS-AUTH":92 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot deregister an account with authority. " + (spl[3] ? ("(room auth in " + Tools.escapeHTML(spl[3])) : ""));93 break;94 case "NOT-REGISTERED":95 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");96 break;97 }98 break;99 case "changepassword":100 context.client.cpassworddialog.dialog("open");101 switch (spl[2]) {102 case "NOT-REGISTERED":103 $("#cpassword-dialog-error-msg").html("You are not registered.");104 break;105 case "INVALID-PASSWORD":106 $("#cpassword-dialog-error-msg").html("Wrong password.");107 break;108 }109 break;110 case "join":111 switch (spl[2]) {112 case "NOT-FOUND":113 context.client.showAlert("Join Failure", "Room <b>" + Tools.escapeHTML(spl[3]) + "</b> not found.");114 break;115 case "DENIED":116 context.client.showAlert("Join Failure", "You are not allowed to join the room <b>" + Tools.escapeHTML(spl[3]) + "</b>");117 break;118 }119 break;120 case "admin":121 switch (spl[2]) {122 case "ALREADY-ADMIN":123 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is already administrator.");124 break;125 case "NOT-REGISTERED":126 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");127 break;128 }129 break;130 case "deadmin":131 switch (spl[2]) {132 case "NOT-ADMIN":133 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not an administrator.");134 break;135 case "NOT-REGISTERED":136 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");137 break;138 }139 break;140 case "manager":141 switch (spl[2]) {142 case "ALREADY":143 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is already room manager.");144 break;145 case "NOT-REGISTERED":146 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");147 break;148 }149 break;150 case "moderator":151 switch (spl[2]) {152 case "ALREADY":153 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is already moderator.");154 break;155 case "NOT-REGISTERED":156 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");157 break;158 }159 break;160 case "deauth":161 switch (spl[2]) {162 case "ALREADY":163 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not room auth.");164 break;165 case "NOT-REGISTERED":166 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");167 break;168 }169 break;170 case "makeroom":171 switch (spl[2]) {172 case "ID-TOO-LONG":173 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room identifier is too long.");174 break;175 case "NAME-TOO-LONG":176 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room name is too long.");177 break;178 case "ALREADY-EXISTS":179 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room '" + Tools.escapeHTML(spl[3]) + "' already exists.");180 break;181 }182 break;183 case "deleteroom":184 switch (spl[2]) {185 case "NOT-EXISTS":186 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room '" + Tools.escapeHTML(spl[3]) + "' does not exists.");187 break;188 }189 break;190 case "private":191 switch (spl[2]) {192 case "ALREADY":193 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room '" + Tools.escapeHTML(spl[3]) + "' is already private.");194 break;195 }196 break;197 case "public":198 switch (spl[2]) {199 case "ALREADY":200 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room '" + Tools.escapeHTML(spl[3]) + "' is already public.");201 break;202 }203 break;204 case "roomname":205 switch (spl[2]) {206 case "NAME-TOO-LONG":207 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Room name is too long.");208 break;209 }210 break;211 case "modchat":212 switch (spl[2]) {213 case "ALREADY":214 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Modchat is currently set to level " + Tools.escapeHTML(spl[3]) + ".");215 break;216 }217 break;218 case "ban":219 switch (spl[2]) {220 case "NOT-REGISTERED":221 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");222 break;223 }224 break;225 case "unban":226 switch (spl[2]) {227 case "NOT-BANNED":228 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not banned.");229 break;230 }231 break;232 case "config":233 switch (spl[2]) {234 case "BAD-CONFIG":235 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "The configuration you chose for this auction is not valid.");236 break;237 }238 break;239 case "turn":240 switch (spl[2]) {241 case "NOT-PAUSED":242 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");243 break;244 case "TEAM-NOT-FOUND":245 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");246 break;247 }248 break;249 case "addplayers":250 switch (spl[2]) {251 case "NOT-PAUSED":252 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");253 break;254 case "NO-PLAYERS":255 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "No players where added.");256 break;257 }258 break;259 case "rmplayers":260 switch (spl[2]) {261 case "NOT-PAUSED":262 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");263 break;264 case "NO-PLAYERS":265 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "No players where removed.");266 break;267 }268 break;269 case "addteam":270 switch (spl[2]) {271 case "NOT-PAUSED":272 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");273 break;274 case "INVALID-MONEY":275 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid money. You just use multiples of 0.5K.");276 break;277 case "INVALID-NAME":278 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid name.");279 break;280 case "EXISTS":281 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' already exists");282 break;283 }284 break;285 case "rmteam":286 switch (spl[2]) {287 case "NOT-PAUSED":288 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");289 break;290 case "NOT-EXISTS":291 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");292 break;293 }294 break;295 case "setcaptain":296 switch (spl[2]) {297 case "NOT-PAUSED":298 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");299 break;300 case "TEAM-NOT-FOUND":301 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");302 break;303 case "NOT-REGISTERED":304 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not registered.");305 break;306 case "ALREADY-SET":307 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is already a captain.");308 break;309 }310 break;311 case "unsetcaptain":312 switch (spl[2]) {313 case "NOT-PAUSED":314 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");315 break;316 case "NOT-CAPTAIN":317 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "User '" + Tools.escapeHTML(spl[3]) + "' is not a captain.");318 break;319 }320 break;321 case "setmoney":322 switch (spl[2]) {323 case "NOT-PAUSED":324 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");325 break;326 case "INVALID-MONEY":327 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid money. You just use multiples of 0.5K.");328 break;329 case "TEAM-NOT-FOUND":330 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");331 break;332 }333 break;334 case "teamname":335 switch (spl[2]) {336 case "NOT-PAUSED":337 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");338 break;339 case "INVALID-NAME":340 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid name.");341 break;342 case "TEAM-NOT-FOUND":343 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");344 break;345 }346 break;347 case "assign":348 switch (spl[2]) {349 case "NOT-PAUSED":350 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");351 break;352 case "INVALID-MONEY":353 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid money. You must use multiples of 0.5K.");354 break;355 case "TEAM-NOT-FOUND":356 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) + "' was not found.");357 break;358 case "PLAYER-NOT-FOUND":359 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' was not found.");360 break;361 case "PLAYER-NOT-FREE":362 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' is already member of another team.");363 break;364 case "LACKS-MONEY":365 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) +366 "' does not have enougth money to paid " + Tools.escapeHTML(spl[4]) + "K.");367 break;368 case "CANNOT-PAID":369 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Team '" + Tools.escapeHTML(spl[3]) +370 "' cannot paid " + Tools.escapeHTML(spl[4]) + "K. They need to complete their team.");371 break;372 }373 break;374 case "free":375 switch (spl[2]) {376 case "NOT-PAUSED":377 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");378 break;379 case "PLAYER-NOT-FOUND":380 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' was not found.");381 break;382 case "ALREADY-FREE":383 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' is not assigned to any team.");384 break;385 }386 break;387 case "finalizebid":388 switch (spl[2]) {389 case "NOT-ACTIVE-BID":390 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "There is not an active bid.");391 break;392 }393 break;394 case "nominate":395 switch (spl[2]) {396 case "NOT-PAUSED":397 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");398 break;399 case "NOT-YOUR-TURN":400 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "It is not your turn.");401 break;402 case "LACKS-MONEY":403 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You have not enought money to nominate.");404 break;405 case "PLAYER-NOT-FOUND":406 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' was not found.");407 break;408 case "NOT-FREE":409 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Player '" + Tools.escapeHTML(spl[3]) + "' is already member of another team.");410 break;411 }412 break;413 case "pass":414 switch (spl[2]) {415 case "NOT-PAUSED":416 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot do this when there is an active bid.");417 break;418 case "NOT-YOUR-TURN":419 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "It is not your turn.");420 break;421 case "CANNOT-PASS":422 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You cannot pass the turn. You need to complete your team.");423 break;424 }425 break;426 case "bid":427 switch (spl[2]) {428 case "NOT-ACTIVE-BID":429 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "There is not an active bid.");430 break;431 case "NOT-CAPTAIN":432 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You are not a team captain.");433 break;434 case "NOMINATING":435 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You already have the higher bid.");436 break;437 case "INVALID-MONEY":438 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Invalid money. You must use multiples of 0.5K.");439 break;440 case "LACKS-MONEY":441 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "You team does not have enougth money to paid " +442 Tools.escapeHTML(spl[3]) + "K.");443 break;444 case "CANNOT-PAID":445 room.addLine(Tools.escapeHTML(spl[1]) + ": " + "Your team cannot paid " +446 Tools.escapeHTML(spl[3]) + "K. You need to complete your team.");447 break;448 }449 break;450 }451 },452 "OK": function (room, cmd, spl, context) {453 switch (Tools.toId(spl[1])) {454 case "register":455 context.client.showAlert("Registered", "The account <b>" + Tools.escapeHTML(spl[2]) + "</b> was registered sucessfully.");456 break;457 case "deregister":458 room.addLine("Account deregistered: " + Tools.escapeHTML(spl[2]));459 break;460 case "changepassword":461 context.client.showAlert("Change Password", "You have changed your password sucessfully.");462 break;463 case "admin":464 room.addLine("User promoted to administrator: " + Tools.escapeHTML(spl[2]));465 break;466 case "deadmin":467 room.addLine("User demoted: " + Tools.escapeHTML(spl[2]));468 break;469 case "makeroom":470 room.addLine("Room created: " + Tools.escapeHTML(spl[2]));471 break;472 case "deleteroom":473 room.addLine("Room deleted: " + Tools.escapeHTML(spl[2]));474 break;475 }476 },477 "INIT": function (room, cmd, spl, context) {478 room.setRoomName(spl.slice(1));479 context.init = true;480 context.client.maintabs.tabs("option", "active", $('#tabs a[href="#' + room.id + '"]').parent().index());481 },482 "CLOSED": function (room, cmd, spl, context) {483 context.client.removeTab(room.id);484 delete context.client.rooms[room.id];485 },486 "USERS": function (room, cmd, spl, context) {487 var users = JSON.parse(spl.slice(1).join("|"));488 var user;489 room.users = {};490 for (var i = 0; i < users.length; i++) {491 user = users[i].split("|");492 console.log(user[1]);493 room.users[Tools.toId(user[1])] = {494 id: Tools.toId(user[1]),495 name: user[1],496 group: user[0]497 };498 }499 room.updateAuctionView();500 room.updateUsersTab();501 },502 "AUCTION": function (room, cmd, spl, context) {503 room.auction = JSON.parse(spl.slice(1).join("|"));504 room.updateAuctionView();505 },506 "STATUS": function (room, cmd, spl, context) {507 room.status = parseInt(spl[1]);508 room.updateAuctionView();509 },510 "BS": function (room, cmd, spl, context) {511 room.nominated = spl[1];512 room.timeout = parseInt(spl[2]);513 room.nominatedTeam = spl[3];514 room.nominatedCost = parseFloat(spl[4]);515 room.updateAuctionView();516 },517 "J": function (room, cmd, spl, context) {518 room.users[Tools.toId(spl[2])] = {519 id: Tools.toId(spl[2]),520 name: spl[2],521 group: spl[1]522 };523 if (spl[1] !== "+") {524 room.addLine(Tools.escapeHTML(spl[2]) + " joined the room.");525 }526 room.updateAuctionView();527 room.updateUsersTab();528 },529 "L": function (room, cmd, spl, context) {530 var id = Tools.toId(spl[1]);531 if (room.users[id] && room.users[id].group !== "+") {532 room.addLine(Tools.escapeHTML(room.users[id].name) + " left the room.");533 }534 delete room.users[id];535 room.updateAuctionView();536 room.updateUsersTab();537 },538 "RN": function (room, cmd, spl, context) {539 var id = Tools.toId(spl[1]);540 if (Tools.toId(spl[3]) === id) {541 room.users[id].name = spl[3];542 room.users[id].group = spl[2];543 room.updateAuctionView();544 room.updateUsersTab();545 return;546 }547 var txt = "";548 if (room.users[id] && room.users[id].group !== "+") {549 txt += Tools.escapeHTML(room.users[id].name) + " left the room.";550 }551 delete room.users[id];552 id = Tools.toId(spl[3]);553 if (!room.users[id] && spl[2] !== "+") {554 txt += Tools.escapeHTML(spl[3]) + " joined the room.";555 }556 room.users[id] = {557 id: id,558 name: spl[3],559 group: spl[2]560 };561 room.addLine(txt);562 room.updateAuctionView();563 room.updateUsersTab();564 },565 "PROMOTED-ADMIN-BY": function (room, cmd, spl, context) {566 context.client.showAlert("Promoted", "You were promoted to administrator by <i>" + Tools.escapeHTML(spl[1]) + "</i>.");567 },568 "DEMOTED-ADMIN-BY": function (room, cmd, spl, context) {569 context.client.showAlert("Demoted", "You were taken administrator permissions by <i>" + Tools.escapeHTML(spl[1]) + "</i>.");570 },571 "MC": function (room, cmd, spl, context) {572 var txt = "";573 room.modchat = parseInt(spl[1]);574 switch (room.modchat) {575 case 0:576 txt = "Any registered user can talk.";577 break;578 case 1:579 txt = "Only participants and above can talk.";580 break;581 case 2:582 txt = "Only room managers and above can talk.";583 break;584 }585 room.addLine('<div class="announcement">Modchat level ' + Tools.escapeHTML(spl[1]) + ': ' + txt + '</div>');586 },587 "PROMOTION": function (room, cmd, spl, context) {588 var names = {589 "~": "Administrator",590 "#": "Room Manager",591 "@": "Moderator"592 };593 room.addLine('<div class="ban-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' was promoted to ' + names[spl[1]] +594 ' by ' + Tools.escapeHTML(room.userName(spl[3])) + '</div>');595 },596 "DEMOTE": function (room, cmd, spl, context) {597 room.addLine('<div class="ban-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ' was demoted by ' +598 Tools.escapeHTML(room.userName(spl[2])) + '</div>');599 },600 "BAN": function (room, cmd, spl, context) {601 room.addLine('<div class="ban-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ' was banned from this room by ' +602 Tools.escapeHTML(room.userName(spl[2])) + '</div>');603 },604 "UNBAN": function (room, cmd, spl, context) {605 room.addLine('<div class="ban-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ' was unbanned by ' +606 Tools.escapeHTML(room.userName(spl[2])) + '</div>');607 },608 "ROOM": function (room, cmd, spl, context) {609 switch (spl[1]) {610 case "PRIVATE":611 if (spl[2] === "TRUE") {612 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[3])) + ' made this room private.</div>');613 } else {614 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[3])) + ' made this room public.</div>');615 }616 break;617 }618 },619 "ROOM-NAME-INF": function (room, cmd, spl, context) {620 if (!context.init) room.setRoomName(spl[2]);621 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ' changed the name of this room to ' + Tools.escapeHTML(spl.slice(2)) + '.</div>');622 },623 "MC-INF": function (room, cmd, spl, context) {624 var info = "";625 if (!context.init) room.modchat = parseInt(spl[1]);626 switch (room.modchat) {627 case 0:628 info = "Any registered user can talk now.";629 break;630 case 1:631 info = "Only participants and above can talk now.";632 break;633 case 2:634 info = "Only room managers can talk now.";635 break;636 }637 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' changed the modchat level. ' + info + '</div>');638 },639 "INF": function (room, cmd, spl, context) {640 var aux;641 switch (spl[1]) {642 case "SET-CONFIG":643 if (!context.init) {644 room.auction.config.timer = parseInt(spl[2]);645 room.auction.config.mincost = parseFloat(spl[3]);646 room.auction.config.minplayers = parseInt(spl[4]);647 }648 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[5])) + ' changed the auction configuration.</div>');649 break;650 case "SET-TURN":651 if (!context.init) {652 room.auction.turn = spl[2];653 }654 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[3])) + ' set the turn for ' +655 Tools.escapeHTML(room.teamName(spl[2])) + '</div>');656 break;657 case "ADD-PLAYERS":658 aux = JSON.parse(spl.slice(3).join("|"));659 if (!context.init) {660 for (var i = 0; i < aux.length; i++)661 room.addPlayer(aux[i]);662 }663 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' added players: ' +664 Tools.escapeHTML(aux.join(', ')) + '</div>');665 break;666 case "RM-PLAYERS":667 aux = JSON.parse(spl.slice(3).join("|"));668 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' deleted players: ' +669 Tools.escapeHTML(aux.join(', ')) + '</div>');670 if (!context.init) {671 for (var i = 0; i < aux.length; i++)672 room.removePlayer(aux[i]);673 }674 break;675 case "NEW-TEAM":676 if (!context.init) {677 room.addTeam(spl[3], parseFloat(spl[4]));678 }679 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' registered team: ' +680 Tools.escapeHTML(room.teamName(spl[3])) + '</div>');681 break;682 case "DELETE-TEAM":683 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' deleted team: ' +684 Tools.escapeHTML(room.teamName(spl[3])) + '</div>');685 if (!context.init) {686 room.deleteTeam(spl[3]);687 }688 break;689 case "SET-CAPTAIN":690 if (!context.init) {691 room.auction.teams[spl[3]].captains[spl[4]] = true;692 }693 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' add ' +694 Tools.escapeHTML(room.userName(spl[4])) + ' as a captain for team ' + Tools.escapeHTML(room.teamName(spl[3])) + '</div>');695 break;696 case "RM-CAPTAIN":697 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' removed ' +698 Tools.escapeHTML(room.userName(spl[4])) + ' as a captain.</div>');699 if (!context.init) {700 delete room.auction.teams[spl[3]].captains[spl[4]];701 }702 break;703 case "SET-MONEY":704 if (!context.init) {705 room.auction.teams[spl[3]].money = parseFloat(spl[4]);706 }707 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' set money of team ' +708 Tools.escapeHTML(room.teamName(spl[3])) + ' at ' + Tools.escapeHTML(spl[4]) + 'K.</div>');709 break;710 case "SET-NAME":711 if (!context.init) {712 room.auction.teams[spl[3]].name = spl.slice(4);713 }714 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' updated team name: ' +715 Tools.escapeHTML(room.teamName(spl[3])) + '</div>');716 break;717 case "ASSIGN":718 if (!context.init) {719 room.assignPlayer(spl[4], spl[3], parseFloat(spl[5]));720 }721 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' assigned player ' +722 Tools.escapeHTML(room.playerName(spl[4])) + ' to team ' + Tools.escapeHTML(room.teamName(spl[3])) +723 ' for ' + Tools.escapeHTML(spl[5]) + 'K.</div>');724 break;725 case "FREE":726 if (!context.init) {727 room.setFreePlayer(spl[3]);728 }729 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' removed player ' +730 Tools.escapeHTML(room.playerName(spl[3])) + ' from team ' + Tools.escapeHTML(room.teamName(spl[4])) +731 '. ' + Tools.escapeHTML(spl[5]) + 'K were retrived.</div>');732 break;733 case "FINALIZE-BID":734 room.addLine('<div class="config-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ' forced the timeout.</div>');735 break;736 case "PASS":737 room.addLine('<div class="auction-announcement">' + Tools.escapeHTML(room.userName(spl[2])) + ', ' + Tools.escapeHTML(room.teamName(spl[3])) + ' passed the turn.</div>');738 break;739 }740 if (!context.init) {741 room.updateAuctionView();742 }743 },744 "TURN-INF": function (room, cmd, spl, context) {745 if (!context.init) {746 room.status = 0;747 room.auction.turn = spl[1];748 room.updateAuctionView();749 }750 room.addLine('<div class="auction-announcement">' + Tools.escapeHTML(room.teamName(spl[1])) + ' has the turn for nominating a player.</div>');751 },752 "NOMINATED": function (room, cmd, spl, context) {753 if (!context.init) {754 room.nominated = spl[3];755 room.nominatedCost = room.auction.config.mincost;756 room.nominatedTeam = spl[2];757 room.status = 1;758 room.timeout = parseInt(spl[4]);759 room.updateAuctionView();760 }761 room.addLine('<div class="auction-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ', ' +762 Tools.escapeHTML(room.teamName(spl[2])) + ' nominated player ' + Tools.escapeHTML(room.playerName(spl[3])) +763 ' for ' + Tools.escapeHTML(room.auction.config.mincost) + 'K.</div>');764 },765 "BID": function (room, cmd, spl, context) {766 if (!context.init) {767 room.nominatedCost = parseFloat(spl[3]);768 room.nominatedTeam = spl[2];769 room.timeout = parseInt(spl[4]);770 room.updateAuctionView();771 }772 room.addLine('<div class="auction-announcement">' + Tools.escapeHTML(room.userName(spl[1])) + ', ' +773 Tools.escapeHTML(room.teamName(spl[2])) + ' offers ' + Tools.escapeHTML(spl[3]) + 'K.</div>');774 },775 "TO": function (room, cmd, spl, context) {776 console.log("TO: " + context.init);777 if (!context.init) {778 room.assignPlayer(spl[1], spl[2], parseFloat(spl[3]));779 room.nominated = null;780 room.nominatedCost = 0;781 room.nominatedTeam = null;782 room.status = 2;783 room.timeout = 0;784 room.updateAuctionView();785 }786 room.addLine('<div class="auction-announcement">Time is out! ' + Tools.escapeHTML(room.playerName(spl[1])) +787 ' was assigned to ' + Tools.escapeHTML(room.teamName(spl[2])) + ' for ' + Tools.escapeHTML(spl[3]) + 'K.</div>');788 },789 "TOKEN": function (room, cmd, spl, context) {790 document.cookie = "token=" + spl[1] + "; path=/";791 },792 "ERR-ROOM": function () {793 return;794 },...
copyright.js
Source:copyright.js
1var copyright = copyright || {};2copyright.updateUI = function() {3 'use strict';4 $('#cn_urls .contenturl, #dn_urls .contenturl', '.cn-form').rebind('click', function() {5 if ($(this).val() === '') {6 $(this).select();7 }8 });9};10/**11 * Validate the email address, as without a valid email we can not contact the complainant12 * if there is a counter-notice, or to report stats on their complaints.13 * Further email validation may occur in the API14 * @param {String} email The email to validate15 * @return {Boolean} True if passing validation, false otherwise16 */17copyright.validateEmail = function(email) {18 'use strict';19 return isValidEmail(email);20};21copyright.ourDomains = {'mega.co.nz': 1, 'mega.nz': 1, 'mega.io': 1};22/**23 * Validate that the user has entered a link that is, or can be easily turned into, a valid MEGA link24 * @param {String} url The url to validate as a mega public link25 * @return {Array} The link type at idx 0, handle found as idx 1, and sub-node as idx 2 if any.26 */27copyright.validateUrl = function(url) {28 'use strict';29 url = tryCatch(() => new URL(mURIDecode(url).trim()), false)();30 const ext = url && String(url.protocol).endsWith('-extension:');31 if (!url || !this.ourDomains[url.host] && !ext) {32 return null;33 }34 let path = (ext ? '' : url.pathname) + url.hash;35 if (url.hash) {36 const hash = String(url.hash).replace('#', '');37 if (hash[0] === '!' || hash[0] === 'F' && hash[1] === '!') {38 path = hash[0] === 'F'39 ? hash.replace('F!', '/folder/').replace('!', '#').replace('!', '/folder/').replace('?', '/file/')40 : hash.replace('!', '/file/').replace('!', '#');41 }42 else if (hash[0] === 'P' && hash[1] === '!') {43 const a = base64urldecode(hash.substr(2));44 const b = String.fromCharCode(a.charCodeAt(2))45 + String.fromCharCode(a.charCodeAt(3))46 + String.fromCharCode(a.charCodeAt(4))47 + String.fromCharCode(a.charCodeAt(5))48 + String.fromCharCode(a.charCodeAt(6))49 + String.fromCharCode(a.charCodeAt(7));50 path = '/file/' + base64urlencode(b);51 }52 }53 const match = path.match(/^[#/]*(file|folder|embed)[!#/]+([\w-]{8})\b/i);54 if (!match) {55 console.warn('Invalid url.', url);56 return null;57 }58 const result = [match[1], match[2]];59 if (match[1] === 'folder') {60 result.push((path.replace(match[0], '').match(/(?:file|folder)\/([\w-]{8})/i) || [])[1]);61 }62 return result;63};64/**65 * Check if the entered URL is a folder link without a subfile link.66 * @param url67 * @return {Boolean} If is folder without subfile link.68 */69copyright.isFolderWithoutSubHandle = function(url) {70 'use strict';71 url = this.isFolderLink(url);72 return url && !url[2];73};74/**75 * Check if a URL is a folder link.76 * @param url77 * @return {Boolean}78 */79copyright.isFolderLink = function(url) {80 'use strict';81 url = this.validateUrl(url) || !1;82 return url[0] === 'folder' && url;83};84/**85 * Store the complainant details so they don't have to type them in next time86 * Puts them into localStorage.copyrightOwnerDetails87 */88copyright.saveCopyrightOwnerValues = function() {89 'use strict';90 var details = {91 owner: $('input.copyrightowner', '.cn-form').val(),92 jobtitle: $('input.jobtitle', '.cn-form').val(),93 email: $('input.email', '.cn-form').val(),94 fax: $('input.fax', '.cn-form').val(),95 city: $('input.city', '.cn-form').val(),96 postalcode: $('input.zip', '.cn-form').val(),97 name: $('input.agent', '.cn-form').val(),98 company: $('input.company', '.cn-form').val(),99 phone: $('input.phone', '.cn-form').val(),100 address: $('input.address', '.cn-form').val(),101 province: $('input.state', '.cn-form').val(),102 country: $('.select.country select', '.cn-form').val()103 };104 localStorage.setItem('copyrightOwnerDetails', JSON.stringify(details));105};106/**107 * Load the complainant details directly into the html elements so they don't have to type them in again108 */109copyright.loadCopyrightOwnerValues = function() {110 'use strict';111 if (localStorage.copyrightOwnerDetails) {112 var details = JSON.parse(localStorage.copyrightOwnerDetails);113 $('input.copyrightowner', '.cn-form').val(details.owner);114 $('input.jobtitle', '.cn-form').val(details.jobtitle);115 $('input.email', '.cn-form').val(details.email);116 $('input.fax', '.cn-form').val(details.fax);117 $('input.city', '.cn-form').val(details.city);118 $('input.zip', '.cn-form').val(details.postalcode);119 $('input.agent', '.cn-form').val(details.name);120 $('input.company', '.cn-form').val(details.company);121 $('input.phone', '.cn-form').val(details.phone);122 $('input.address', '.cn-form').val(details.address);123 $('input.state', '.cn-form').val(details.province);124 $('.select.country select', '.cn-form').val(details.country).change();125 }126};127copyright.step2Submit = function() {128 'use strict';129 if (!$('.select.content', '.cn-form').hasClass('selected')) {130 msgDialog('warninga', l[135], escapeHTML(l[657]));131 }132 else if ($('.select.type', '.cn-form').hasClass('selected')) {133 var invalidWords = ['asd', 'asdf', 'copyright'];134 var $copyrightwork = $('.copyrightwork', '.cn-form');135 var proceed = false;136 var takedownType = $('.select.type select', '.cn-form').val();137 var doStep2Submit = function() {138 copyright.step2Submit();139 };140 var $contentURL = $('.contenturl', '.cn-form');141 var e;142 for (var i = 0; i < $contentURL.length; i++) {143 e = $contentURL[i];144 var cVal = String($($copyrightwork[i]).val()).trim();145 var urls = String($(e).val()).split(/\n/);146 urls = urls.map(String.trim).filter(String);147 proceed = urls.length > 0;148 if (!proceed) {149 msgDialog('warninga', l[135], escapeHTML(l[659]));150 copyright.markInputWrong(e);151 return false;152 }153 for (var k = 0; k < urls.length; k++) {154 var eVal = urls[k];155 if (eVal !== '' && cVal === '' || invalidWords.indexOf(cVal.toLowerCase()) !== -1) {156 proceed = false;157 msgDialog('warninga', l[135], escapeHTML(l[660]));158 copyright.markInputWrong($copyrightwork[i]);159 return false;160 }161 if (eVal === '' || cVal === '') {162 proceed = false;163 msgDialog('warninga', l[135], escapeHTML(l[659]));164 copyright.markInputWrong(eVal ? $copyrightwork[i] : e);165 return false;166 }167 if (!copyright.validateUrl(eVal)) {168 proceed = false;169 msgDialog('warninga', l[135], escapeHTML(l[7686]));170 copyright.markInputWrong(e);171 return false;172 }173 if (copyright.validateUrl(cVal)) {174 proceed = false;175 msgDialog('warninga', l[135], escapeHTML(l[9056]));176 copyright.markInputWrong($copyrightwork[i]);177 return false;178 }179 if (takedownType === "1" && copyright.isFolderLink(eVal)180 && !copyright.isFolderWithoutSubHandle(eVal)) {181 proceed = false;182 msgDialog('warninga', l[135], l[19804]);183 return false;184 }185 if ((takedownType === "2" || takedownType === "3")186 && localStorage.tdFolderlinkWarning !== "1"187 && copyright.isFolderWithoutSubHandle(eVal)) {188 localStorage.tdFolderlinkWarning = 1;189 proceed = false;190 msgDialog('info', l[621], escapeHTML(l[19802]), null, doStep2Submit);191 return false;192 }193 }194 $(e).removeClass("red");195 }196 if (proceed && !$('.cn_check1 .checkinput', '.cn-form').prop('checked')) {197 msgDialog('warninga', l[135], escapeHTML(l[665]));198 }199 else if (proceed) {200 $('.cn.step1', '.cn-form').addClass('hidden');201 $('.cn.step2', '.cn-form').removeClass('hidden');202 document.getElementsByClassName('cn step2')[0].scrollIntoView();203 // Reload values from local storage if the user has previously been here204 copyright.loadCopyrightOwnerValues();205 }206 }207 else {208 msgDialog('warninga', l[135], escapeHTML(l[658]));209 }210};211/**212 * Initialises the copyright form page, binding the events the form requires213 */214copyright.init_cn = function() {215 'use strict';216 if (is_mobile) {217 $('.cn.main-pad-block').removeClass('hidden');218 $('.js-back-to-copyright', '.cn.header').rebind('click', () => {219 loadSubPage('copyright');220 });221 }222 $('.addurlbtn', '.cn-form').rebind('click', () => {223 $('#cn_urls', '.cn-form').safeAppend('<div class="new-affiliate-label">' +224 '<div class="new-affiliate-star"></div>@@</div>' +225 '<div class="clear"></div>' +226 '<div class="affiliate-input-block dynamic-height">' +227 '<textarea class="contenturl" rows="3"></textarea>' +228 '</div>' +229 '<div class="new-affiliate-label">' +230 '<div class="new-affiliate-star"></div>@@' +231 '</div>' +232 '<div class="clear"></div>' +233 '<div class="affiliate-input-block">' +234 '<input type="text" class="copyrightwork" value="">' +235 '</div>', l[641], l[648]);236 copyright.updateUI();237 });238 copyright.updateUI();239 $('.step2btn', '.cn-form').rebind('click', () => {240 copyright.step2Submit();241 });242 $('.backbtn', '.cn-form').rebind('click', () => {243 $('.cn.step1', '.cn-form').removeClass('hidden');244 $('.cn.step2', '.cn-form').addClass('hidden');245 });246 copyright.initCheckboxListeners();247 $('.select select', '.cn-form').rebind('change.initcn', function() {248 var c = $(this).attr('class');249 if (c && c.indexOf('type') > -1 && $(this).val() === 4) {250 msgDialog(251 'info',252 escapeHTML(l[701]),253 escapeHTML(l[700])254 .replace('[A1]', '<a href="mailto:copyright@mega.nz" class="red">')255 .replace('[/A1]', '</A>')256 .replace('[A2]', '<a href="/copyright" class="red clickurl">')257 .replace('[/A2]', '</A>'));258 clickURLs();259 $(this).val(0);260 $(this).parent().find('.affiliate-select-txt').text(l[1278]);261 }262 else if ($(this).val() !== 0) {263 $(this).parent().addClass('selected');264 $(this).parent().find('.affiliate-select-txt')265 .text($(this).find('option[value=\'' + $(this).val() + '\']').text());266 }267 });268 $('.signbtn', '.cn-form').rebind('click', () => {269 if ($('input.copyrightowner', '.cn-form').val() === '') {270 msgDialog('warninga', l[135], escapeHTML(l[661]), false, function() {271 $('input.copyrightowner', '.cn-form').trigger("focus");272 });273 }274 else if ($('input.agent', '.cn-form').val() === '') {275 msgDialog('warninga', l[135], escapeHTML(l[662]), false, function() {276 $('input.agent', '.cn-form').trigger("focus");277 });278 }279 else if ($('input.email', '.cn-form').val() === '') {280 msgDialog('warninga', l[135], escapeHTML(l[663]), false, function() {281 $('input.email', '.cn-form').trigger("focus");282 });283 }284 else if (!copyright.validateEmail($('input.email', '.cn-form').val())) {285 msgDialog('warninga', l[135], escapeHTML(l[198]), false, function() {286 $('input.email', '.cn-form').trigger("focus");287 });288 }289 else if ($('input.city', '.cn-form').val() === '') {290 msgDialog('warninga', l[135], escapeHTML(l[1262]), false, function() {291 $('input.city', '.cn-form').trigger("focus");292 });293 }294 else if (!$('.select.country', '.cn-form').hasClass('selected')) {295 msgDialog('warninga', l[135], escapeHTML(l[568]));296 }297 else if (!$('.cn_check2 .checkinput', '.cn-form').prop('checked')) {298 msgDialog('warninga', l[135], escapeHTML(l[666]));299 }300 else if ($('.cn_check3 .checkinput', '.cn-form').prop('checked')) {301 // Save the entered values into local storage so the user doesn't have to re-enter them next time302 copyright.saveCopyrightOwnerValues();303 var cn_post_urls = [];304 var cn_post_works = [];305 var $copyrightwork = $('.copyrightwork', '.cn-form');306 var $contentURL = $('.contenturl', '.cn-form');307 for (var i = 0; i < $contentURL.length; i++) {308 var e = $contentURL[i];309 var cVal = String($($copyrightwork[i]).val()).trim();310 var urls = String($(e).val() || $(e).html()).split(/\n/);311 urls = urls.map(String.trim).filter((url) => {312 return url !== "";313 });314 for (var k = 0; k < urls.length; k++) {315 cn_post_urls.push(urls[k]);316 cn_post_works.push(cVal);317 }318 }319 var cn_works_json = JSON.stringify([cn_post_urls, cn_post_works]);320 loadingDialog.show();321 api_req({322 a: 'cn',323 works: cn_works_json,324 infr_type: $('.select.content select', '.cn-form').val(),325 takedown_type: $('.select.type select', '.cn-form').val(),326 jobtitle: $('input.jobtitle', '.cn-form').val(),327 owner: $('input.copyrightowner', '.cn-form').val(),328 email: $('input.email', '.cn-form').val(),329 fax: $('input.fax', '.cn-form').val(),330 postalcode: $('input.zip', '.cn-form').val(),331 city: $('input.city', '.cn-form').val(),332 company: $('input.company', '.cn-form').val(),333 name: $('input.agent', '.cn-form').val(),334 phone: $('input.phone', '.cn-form').val(),335 address: $('input.address', '.cn-form').val(),336 province: $('input.state', '.cn-form').val(),337 country: $('.select.country select', '.cn-form').val()338 }, {339 callback: function() {340 loadingDialog.hide();341 msgDialog(342 'info',343 escapeHTML(l[1287]),344 escapeHTML(l[1288]),345 false,346 function() {347 loadSubPage('copyright');348 });349 }350 });351 }352 else {353 msgDialog('warninga', l[135], escapeHTML(l[667]));354 }355 });356 var markup = '<OPTION value="0"></OPTION>';357 var countries = M.getCountries();358 for (var country in countries) {359 if (countries.hasOwnProperty(country)) {360 markup += '<option value="' + escapeHTML(country) + '">'361 + escapeHTML(countries[country]) + '</option>';362 }363 }364 $('.select.country select', '.cn-form').safeHTML(markup);365};366copyright.validatePhoneNumber = function(phoneNumber) {367 'use strict';368 var p = /\d[^\d]*\d[^\d]*\d[^\d]*\d/;369 var match = p.exec(phoneNumber);370 // if not at least 4 numbers, what is this thing?371 return match !== null;372};373copyright.validateDisputeForm = function() {374 'use strict';375 var $copyrightwork = $('.copyrightwork', '.dn-form');376 var $explanation = $('.copyrightexplanation', '.dn-form');377 var proceed = true;378 var $contentURL = $('.contenturl', '.dn-form');379 for (var i = 0; i < $contentURL.length; i++) {380 proceed = true;381 var eVal = $($contentURL[i]).val();382 var cprVal = $($copyrightwork[i]).val();383 var explainVal = $($explanation[i]).val();384 if (eVal !== '' && cprVal !== '' && explainVal === '') {385 proceed = false;386 msgDialog('warninga', l[135], escapeHTML(l[8809]));387 return false;388 }389 else if (eVal !== '' && cprVal === '') {390 proceed = false;391 msgDialog('warninga', l[135], escapeHTML(l[8810]));392 return false;393 }394 else if (eVal === '' || cprVal === '') {395 proceed = false;396 msgDialog('warninga', l[135], escapeHTML(l[8811]));397 return false;398 }399 else if (!copyright.validateUrl(eVal)) {400 proceed = false;401 msgDialog('warninga', l[135], escapeHTML(l[8812]));402 return false;403 }404 }405 if (!proceed) {406 return false;407 }408 if ($('input.copyrightowner', '.dn-form').val() === '') {409 msgDialog('warninga', l[135], escapeHTML(l[662]), false, function() {410 $('input.copyrightowner', '.dn-form').trigger("focus");411 });412 return false;413 }414 else if ($('input.phonenumber', '.dn-form').val() === '') {415 msgDialog('warninga', l[135], escapeHTML(l[8813]), false, function() {416 $('input.phonenumber', '.dn-form').trigger("focus");417 });418 return false;419 }420 else if (!copyright.validatePhoneNumber($('input.phonenumber', '.dn-form').val())) {421 msgDialog('warninga', l[135], escapeHTML(l[8814]), false, function() {422 $('input.phonenumber', '.dn-form').trigger("focus");423 });424 return false;425 }426 else if ($('input.email', '.dn-form').val() === '') {427 msgDialog('warninga', l[135], escapeHTML(l[663]), false, function() {428 $('input.email', '.dn-form').trigger("focus");429 });430 return false;431 }432 else if (!copyright.validateEmail($('input.email', '.dn-form').val())) {433 msgDialog('warninga', l[135], escapeHTML(l[198]), false, function() {434 $('input.email', '.dn-form').trigger("focus");435 });436 return false;437 }438 else if ($('input.address', '.dn-form').val() === '') {439 msgDialog('warninga', l[135], escapeHTML(l[8815]), false, function() {440 $('input.address', '.dn-form').trigger("focus");441 });442 return false;443 }444 else if ($('input.city', '.dn-form').val() === '') {445 msgDialog('warninga', l[135], escapeHTML(l[1262]), false, function() {446 $('input.city', '.dn-form').trigger("focus");447 });448 return false;449 }450 else if (!$('.select.country', '.dn-form').hasClass('selected')) {451 msgDialog('warninga', l[135], escapeHTML(l[568]));452 return false;453 }454 // The checkboxes depend on the type455 if (proceed && !$('.cn_check1 .checkinput', '.dn-form').prop('checked')) {456 msgDialog('warninga', l[135], escapeHTML(l[8816]));457 return false;458 }459 else if (!$('.cn_check2 .checkinput', '.dn-form').prop('checked')) {460 msgDialog('warninga', l[135], escapeHTML(l[8817]));461 return false;462 }463 return true;464};465copyright.init_cndispute = function() {466 'use strict';467 if (is_mobile) {468 $('.dn.main-pad-block').removeClass('hidden');469 $('.js-back-to-dispute', '.dn.header').rebind('click', () => {470 loadSubPage('dispute');471 });472 }473 if (typeof (u_attr) !== 'undefined' && typeof (u_attr.email) !== 'undefined' && u_attr.email !== '') {474 $('input.email', '.dn-form').val(u_attr.email);475 }476 // prefill the URL with public node handle.477 if (u_attr) {478 var localStorageKey = 'takedownDisputeNodeURL';479 var disputeNodeURL = localStorage.getItem(localStorageKey);480 if (disputeNodeURL) {481 $('.bottom-page .copyrightdisputeform .contenturl', '.dn-form').val(disputeNodeURL);482 localStorage.removeItem(localStorageKey);483 }484 }485 // The sign button needs to validate the form486 $('.signbtn', '.dn-form').rebind('click.copydispute', () => {487 if (copyright.validateDisputeForm()) {488 // Show loading dialog489 loadingDialog.show();490 // The 'copyright notice dispute' api request. Pull the values straight from the inputs491 // as we have already validated them492 var url = $('input.contenturl', '.dn-form').val();493 var handles = copyright.validateUrl(url);494 var requestParameters = {495 a: 'cnd',496 ph: handles[1],497 ufsh: handles[2],498 desc: $('input.copyrightwork', '.dn-form').val(),499 comments: $('input.copyrightexplanation', '.dn-form').val(),500 name: $('input.copyrightowner', '.dn-form').val(),501 phonenumber: $('input.phonenumber', '.dn-form').val(),502 email: $('input.email', '.dn-form').val(),503 company: $('input.company', '.dn-form').val(),504 address1: $('input.address', '.dn-form').val(),505 address2: $('input.address2', '.dn-form').val(),506 city: $('input.city', '.dn-form').val(),507 province: $('input.state', '.dn-form').val(),508 postalcode: $('input.zip', '.dn-form').val(),509 country: $('.select.country select', '.dn-form').val(),510 otherremarks: $('input.otherremarks', '.dn-form').val()511 };512 api_req(requestParameters, {513 callback: function(response) {514 loadingDialog.hide();515 if (!isNaN(parseFloat(response)) && isFinite(response)) {516 // Its a number, must be error code of some kind517 if (response === -9) {518 // ENOENT error519 msgDialog('warninga',520 escapeHTML(l[135]), escapeHTML(l[8818]), false);521 return false;522 }523 if (response === -12) {524 // EEXIST error, they have already made a dispute for this link525 msgDialog('warninga',526 escapeHTML(l[135]), escapeHTML(l[8819]), false);527 return false;528 }529 else if (response === -11) {530 // Access531 msgDialog('warninga',532 escapeHTML(l[135]), escapeHTML(l[8820]), false);533 return false;534 }535 else {536 // Generic (probably args)537 msgDialog('warninga',538 escapeHTML(l[135]), escapeHTML(l[47]), false);539 return false;540 }541 }542 msgDialog('info',543 escapeHTML(l[1287]), escapeHTML(l[1288]), false,544 function() {545 loadSubPage('dispute');546 });547 }548 });549 }550 });551 // Add click and unclick functionality for the custom styled checkboxes552 copyright.initCheckboxListeners();553 $('.select select', '.dn-form').rebind('change.copydispute', function() {554 if ($(this).val() !== 0) {555 $(this).parent().addClass('selected');556 $(this).parent().find('.affiliate-select-txt')557 .text($(this).find('option[value=\'' + $(this).val() + '\']').text());558 }559 });560 // Set up the country values561 var markup = '<OPTION value="0"></OPTION>';562 var countries = M.getCountries();563 for (var country in countries) {564 if (countries.hasOwnProperty(country)) {565 markup += '<option value="' + escapeHTML(country) + '">'566 + escapeHTML(countries[country]) + '</option>';567 }568 }569 $('.select.country select', '.dn-form').safeHTML(markup);570};571// Add click and unclick functionality for the custom styled checkboxes572copyright.initCheckboxListeners = function() {573 'use strict';574 $('.cn_check1, .cn_check2, .cn_check3, .cn_check4').rebind('click.copydispute', function() {575 var $input = $(this).find('input');576 var $checkboxDiv = $(this).find('.checkdiv');577 // If unticked, tick the box578 if ($input.hasClass('checkboxOff')) {579 $input.removeClass('checkboxOff').addClass('checkboxOn').prop('checked', true);580 $checkboxDiv.removeClass('checkboxOff').addClass('checkboxOn');581 }582 else {583 // Otherwise untick the box584 $input.removeClass('checkboxOn').addClass('checkboxOff').prop('checked', false);585 $checkboxDiv.removeClass('checkboxOn').addClass('checkboxOff');586 }587 });588};589/**590 * Mark input field as wrong.591 * @param elm592 */593copyright.markInputWrong = function(elm) {594 'use strict';595 $(elm)596 .addClass("red")597 .css('font-weight', 'bold')598 .rebind('click', function() {599 $(this).off('click')600 .removeClass("red")601 .css('font-weight', 'normal')602 .parent()603 .css('box-shadow', 'none');604 })605 .parent().css('box-shadow', '0px 0px 8px #f00');...
set-params.js
Source:set-params.js
...17 var $confirmBtn = modal.querySelector('button.confirm');18 /*19 * Title20 */21 $title.innerHTML = params.html ? params.title : _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.title).split('\n').join('<br>');22 /*23 * Text24 */25 $text.innerHTML = params.html ? params.text : _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.text || '').split('\n').join('<br>');26 if (params.text) _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($text);27 /*28 * Custom class29 */30 if (params.customClass) {31 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass(modal, params.customClass);32 modal.setAttribute('data-custom-class', params.customClass);33 } else {34 // Find previously set classes and remove them35 var customClass = modal.getAttribute('data-custom-class');36 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.removeClass(modal, customClass);37 modal.setAttribute('data-custom-class', '');38 }39 /*40 * Icon41 */42 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide(modal.querySelectorAll('.sa-icon'));43 if (params.type && !_isIE8.isIE8()) {44 var _ret = (function () {45 var validType = false;46 for (var i = 0; i < alertTypes.length; i++) {47 if (params.type === alertTypes[i]) {48 validType = true;49 break;50 }51 }52 if (!validType) {53 logStr('Unknown alert type: ' + params.type);54 return {55 v: false56 };57 }58 var typesWithIcons = ['success', 'error', 'warning', 'info'];59 var $icon = undefined;60 if (typesWithIcons.indexOf(params.type) !== -1) {61 $icon = modal.querySelector('.sa-icon.' + 'sa-' + params.type);62 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($icon);63 }64 var $input = _getModal$getInput$setFocusStyle.getInput();65 // Animate icon66 switch (params.type) {67 case 'success':68 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'animate');69 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-tip'), 'animateSuccessTip');70 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-long'), 'animateSuccessLong');71 break;72 case 'error':73 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'animateErrorIcon');74 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-x-mark'), 'animateXMark');75 break;76 case 'warning':77 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'pulseWarning');78 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-body'), 'pulseWarningIns');79 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-dot'), 'pulseWarningIns');80 break;81 case 'input':82 case 'prompt':83 $input.setAttribute('type', params.inputType);84 $input.value = params.inputValue;85 $input.setAttribute('placeholder', params.inputPlaceholder);86 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass(modal, 'show-input');87 setTimeout(function () {88 $input.focus();89 $input.addEventListener('keyup', swal.resetInputError);90 }, 400);91 break;92 }93 })();94 if (typeof _ret === 'object') {95 return _ret.v;96 }97 }98 /*99 * Custom image100 */101 if (params.imageUrl) {102 var $customIcon = modal.querySelector('.sa-icon.sa-custom');103 $customIcon.style.backgroundImage = 'url(' + params.imageUrl + ')';104 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($customIcon);105 var _imgWidth = 80;106 var _imgHeight = 80;107 if (params.imageSize) {108 var dimensions = params.imageSize.toString().split('x');109 var imgWidth = dimensions[0];110 var imgHeight = dimensions[1];111 if (!imgWidth || !imgHeight) {112 logStr('Parameter imageSize expects value with format WIDTHxHEIGHT, got ' + params.imageSize);113 } else {114 _imgWidth = imgWidth;115 _imgHeight = imgHeight;116 }117 }118 $customIcon.setAttribute('style', $customIcon.getAttribute('style') + 'width:' + _imgWidth + 'px; height:' + _imgHeight + 'px');119 }120 /*121 * Show cancel button?122 */123 modal.setAttribute('data-has-cancel-button', params.showCancelButton);124 if (params.showCancelButton) {125 $cancelBtn.style.display = 'inline-block';126 } else {127 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide($cancelBtn);128 }129 /*130 * Show confirm button?131 */132 modal.setAttribute('data-has-confirm-button', params.showConfirmButton);133 if (params.showConfirmButton) {134 $confirmBtn.style.display = 'inline-block';135 } else {136 _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide($confirmBtn);137 }138 /*139 * Custom text on cancel/confirm buttons140 */141 if (params.cancelButtonText) {142 $cancelBtn.innerHTML = _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.cancelButtonText);143 }144 if (params.confirmButtonText) {145 $confirmBtn.innerHTML = _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.confirmButtonText);146 }147 /*148 * Custom color on confirm button149 */150 if (params.confirmButtonColor) {151 // Set confirm button to selected background color152 $confirmBtn.style.backgroundColor = params.confirmButtonColor;153 // Set the confirm button color to the loading ring154 $confirmBtn.style.borderLeftColor = params.confirmLoadingButtonColor;155 $confirmBtn.style.borderRightColor = params.confirmLoadingButtonColor;156 // Set box-shadow to default focused button157 _getModal$getInput$setFocusStyle.setFocusStyle($confirmBtn, params.confirmButtonColor);158 }159 /*...
validationSchema.js
Source:validationSchema.js
1const BaseJoi = require("joi");2const sanitizeHTML = require("sanitize-html");3const extension = (joi) => ({4 type: "string",5 base: joi.string(),6 messages: {7 "string.escapeHTML": "{{#label}} must not include HTML"8 },9 rules: {10 escapeHTML: {11 validate(value, helpers) {12 const clean = sanitizeHTML(value, {13 allowedTags: [],14 allowedAtributes: {}15 });16 if (clean !== value)17 return helpers.error("string.escapeHTML", { value });18 return clean;19 }20 }21 }22});23const Joi = BaseJoi.extend(extension);24module.exports.dogSchema = Joi.object({25 dog: Joi.object({26 name: Joi.string().required().escapeHTML(),27 dateOfBirth: Joi.string().required(),28 parent1: Joi.string().required().escapeHTML(),29 parent2: Joi.string().required().escapeHTML(),30 description: Joi.string().required().escapeHTML(),31 status: Joi.string().required().escapeHTML(),32 yearOfDeath: Joi.number().integer().min(1800).max(9999)33 }).required(),34 deleteImages: Joi.array()35});36module.exports.newsSchema = Joi.object({37 news: Joi.object({38 title: Joi.string().required().escapeHTML(),39 content: Joi.string().required().escapeHTML(),40 date: Joi.string()41 }).required(),42 deleteImages: Joi.array()43});44module.exports.homeSchema = Joi.object({45 home: Joi.object({46 aboutUs: Joi.string().required().escapeHTML()47 }).required(),48 deleteImages: Joi.array()49});50module.exports.competitionSchema = Joi.object({51 competition: Joi.object({52 name: Joi.string().required().escapeHTML(),53 startDate: Joi.date().required(),54 endDate: Joi.date().greater(Joi.ref("startDate")).required(),55 location: Joi.string().required().escapeHTML(),56 award: Joi.string().required().escapeHTML(),57 linkTo: Joi.string().escapeHTML(),58 dog: Joi.string().required().escapeHTML()59 }).required(),60 deleteImages: Joi.array()61});62module.exports.aboutUsSchema = Joi.object({63 aboutUs: Joi.object({64 field1Title: Joi.string().required().escapeHTML(),65 field2Title: Joi.string().required().escapeHTML(),66 field3Title: Joi.string().required().escapeHTML(),67 field1: Joi.string().required().escapeHTML(),68 field2: Joi.string().required().escapeHTML(),69 field3: Joi.string().required().escapeHTML()70 }).required(),71 deleteImages: Joi.array()72});73module.exports.contactSchema = Joi.object({74 contact: Joi.object({75 street: Joi.string().required().escapeHTML(),76 streetNo: Joi.number().required(),77 city: Joi.string().required().escapeHTML(),78 country: Joi.string().required().escapeHTML(),79 phone: Joi.number().required(),80 email: Joi.string().required().escapeHTML(),81 faceLink: Joi.string().required().escapeHTML(),82 instaLink: Joi.string().required().escapeHTML(),83 twittLink: Joi.string().required().escapeHTML()84 }).required()85});86module.exports.messageSchema = Joi.object({87 message: Joi.object({88 name: Joi.string().required().escapeHTML(),89 email: Joi.string().required().escapeHTML(),90 message: Joi.string().required().escapeHTML()91 }).required()...
checkout.js
Source:checkout.js
1import baseJoi from 'joi'2import sanitizeHtml from 'sanitize-html'3const extension = joi => ({4 type: 'string',5 base: joi.string(),6 messages: {7 'string.escapeHTML': '{{#label}} must not include HTML!',8 },9 rules: {10 escapeHTML: {11 validate(value, helpers) {12 const clean = sanitizeHtml(value, {13 allowedTags: [],14 allowedAttributes: {},15 })16 if (clean !== value)17 return helpers.error('string.escapeHTML', { value })18 return clean19 },20 },21 },22})23const Joi = baseJoi.extend(extension)24export const checkoutValidationSchema = Joi.object({25 totalAmount: Joi.object({26 amount: Joi.string().required().escapeHTML(),27 currency: Joi.string().required().escapeHTML(),28 }).required(),29 consumer: Joi.object({30 givenNames: Joi.string().required().escapeHTML(),31 surname: Joi.string().required().escapeHTML(),32 phoneNumber: Joi.string().escapeHTML(),33 email: Joi.string().escapeHTML(),34 }).required(),35 shipping: Joi.object({36 phoneNumber: Joi.string().escapeHTML(),37 countryCode: Joi.string().required().escapeHTML(),38 name: Joi.string().required().escapeHTML(),39 postcode: Joi.string().required().escapeHTML(),40 line1: Joi.string().required().escapeHTML(),41 }).required(),42 items: Joi.array()43 .items(44 Joi.object({45 gtin: Joi.string().escapeHTML(),46 brand: Joi.string().escapeHTML(),47 quantity: Joi.number().integer().required().min(0),48 price: Joi.object({49 amount: Joi.string().required().escapeHTML(),50 currency: Joi.string().required().escapeHTML(),51 }).required(),52 name: Joi.string().required().escapeHTML(),53 category: Joi.string().required().escapeHTML(),54 sku: Joi.string().required().escapeHTML(),55 })56 )57 .required(),58 merchant: Joi.object({59 redirectCancelUrl: Joi.string().required().escapeHTML(),60 redirectConfirmUrl: Joi.string().required().escapeHTML(),61 }).required(),...
tag.js
Source:tag.js
1// ==========================================================================2// Project: SproutCore - JavaScript Application Framework3// Copyright: ©2006-2011 Strobe Inc. and contributors.4// Portions ©2008-2011 Apple Inc. All rights reserved.5// License: Licensed under MIT license (see license.js)6// ==========================================================================7/*global module test equals context */8var context = null;9module("SC.RenderContext#tag", {10 setup: function() {11 context = SC.RenderContext() ;12 }13});14test("should emit a self closing tag. like calling begin().end()", function() {15 context.tag("input");16 equals(SC.RenderContext.escapeHTML(context.get(1)), SC.RenderContext.escapeHTML("<input />"));17});18test("should respect passed opts when emitting", function() {19 context.tag("foo") ;20 equals(context.length, 3);21 equals(SC.RenderContext.escapeHTML(context.get(1)), SC.RenderContext.escapeHTML("<foo>"));22 equals(SC.RenderContext.escapeHTML(context.get(2)), SC.RenderContext.escapeHTML('<'+'/foo>'));23});24test("should NOT emit self closing tag if tag is script", function() {25 context.tag("script");26 equals(SC.RenderContext.escapeHTML(context.get(1)), SC.RenderContext.escapeHTML('<script>'));27 equals(SC.RenderContext.escapeHTML(context.get(2)), SC.RenderContext.escapeHTML('<'+'/script>'));28});29test("should NOT emit self closing tag if tag is div", function() {30 context.tag("div");31 equals(SC.RenderContext.escapeHTML(context.get(1)), SC.RenderContext.escapeHTML('<div>'));32 equals(SC.RenderContext.escapeHTML(context.get(2)), SC.RenderContext.escapeHTML('<'+'/div>'));33});34test("should NOT emit self closing tag if no tag is passed", function() {35 context.tag();36 equals(SC.RenderContext.escapeHTML(context.get(1)), SC.RenderContext.escapeHTML('<div>'));37 equals(SC.RenderContext.escapeHTML(context.get(2)), SC.RenderContext.escapeHTML('<'+'/div>'));...
schemas.js
Source:schemas.js
1const BaseJoi = require('joi');2const sanitizeHTML=require('sanitize-html')3const extension=(joi)=>({4 type:'string',5 base:joi.string(),6 messages: {7 'string.escapeHTML':'{{#label}} must not include HTML'8 },9 rules:{10 escapeHTML: {11 validate(value, helpers){12 const clean = sanitizeHTML(value,{13 allowedTags: [],14 allowedAttributes: {},15 });16 if(clean!==value) return helpers.error('string.escapeHTML',{value})17 return clean18 }19 }20 }21});22const Joi=BaseJoi.extend(extension)23module.exports.locationSchema = Joi.object({24 location: Joi.object({25 title: Joi.string().required().escapeHTML(),26 price: Joi.number().required().min(0),27 description: Joi.string().required().escapeHTML(),28 location: Joi.string().required().escapeHTML(),29 }).required(),30 deleteImages: Joi.array()31})32module.exports.reviewSchema = Joi.object({33 review: Joi.object({34 rating: Joi.number().required().min(1).max(5),35 body: Joi.string().required().escapeHTML()36 }).required()...
escapeHTML.test.js
Source:escapeHTML.test.js
1const test = require('tape');2const escapeHTML = require('./escapeHTML.js');3test('Testing escapeHTML', (t) => {4 //For more information on all the methods supported by tape5 //Please go to https://github.com/substack/tape6 t.true(typeof escapeHTML === 'function', 'escapeHTML is a Function');7 t.equal(escapeHTML('<a href="#">Me & you</a>'), '<a href="#">Me & you</a>', "Escapes a string for use in HTML");8 //t.deepEqual(escapeHTML(args..), 'Expected');9 //t.equal(escapeHTML(args..), 'Expected');10 //t.false(escapeHTML(args..), 'Expected');11 //t.throws(escapeHTML(args..), 'Expected');12 t.end();...
Using AI Code Generation
1const { escapeHtml } = require('playwright/lib/utils/escape');2console.log(escapeHtml('<script>alert(1)</script>'));3const { escapeHtml } = require('playwright/lib/utils/escape');4console.log(escapeHtml('<script>alert(1)</script>'));5const { escapeHtml } = require('playwright/lib/utils/escape');6console.log(escapeHtml('<script>alert(1)</script>'));7const { escapeHtml } = require('playwright/lib/utils/escape');8console.log(escapeHtml('<script>alert(1)</script>'));9const { escapeHtml } = require('playwright/lib/utils/escape');10console.log(escapeHtml('<script>alert(1)</script>'));11const { escapeHtml } = require('playwright/lib/utils/escape');12console.log(escapeHtml('<script>alert(1)</script>'));13const { escapeHtml } = require('playwright/lib/utils/escape');14console.log(escapeHtml('<script>alert(1)</script>'));15const { escapeHtml } = require('playwright/lib/utils/escape');16console.log(escapeHtml('<script>alert(1)</script>'));17const { escapeHtml } =
Using AI Code Generation
1const { escapeHtml } = require('playwright/lib/utils/escape');2const html = '<div>test</div>';3const { escapeHtml } = require('playwright/lib/utils/escape');4const html = '<div>test</div>';5const { escapeHtml } = require('playwright/lib/utils/escape');6const html = '<div>test</div>';7const { escapeHtml } = require('playwright/lib/utils/escape');8const html = '<div>test</div>';9const { escapeHtml } = require('playwright/lib/utils/escape');10const html = '<div>test</div>';11const { escapeHtml } = require('playwright/lib/utils/escape');12const html = '<div>test</div>';13const { escapeHtml } = require('playwright/lib/utils/escape');14const html = '<div>test</div>';15const { escapeHtml } = require('playwright/lib/utils/escape');16const html = '<div>test</div>';17const { escapeHtml } = require('playwright/lib/utils/escape');18const html = '<div>test</div>';19const { escapeHtml } = require('playwright/lib/utils/escape');
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!!