Jsdom: HTML5 рдлреЙрд░реНрдо рд╕рддреНрдпрд╛рдкрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рджрд┐рд╕ре░ 2012  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

JSDOM рд╡рд░реНрддрдорд╛рди рдореЗрдВ HTML5 рдкреНрд░рдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ checkValidity API рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

HTML5 рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдзреБрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдЯреАрдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ http://www.thecssninja.com/javascript/h5f рдХреЛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред H5F рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ HTML5 рдлреЙрд░реНрдо рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╢рд┐рдо рд╣реИ рдЬреЛ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рддрд░рдл, рдореБрдЭреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИред

feature html living standard needs tests

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

: +1: рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрд╛рдлреА рдЙрдкрдХреНрд░рдо рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЬрд░реВрд░рдд рдПрдХ рдареЛрд╕ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рд╣реИред рдпрджрд┐ рдЖрдк Contributing.md рджрд┐рд╢рд╛-рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдБ рдЦреЛрдЬрд╛ рдЬрд╛рдП, рдпрд╛ рдЗрд╕реЗ рд╡рд┐рдлрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреМрди рд╕реА рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкреВрдЫрдиреА рд╣реИред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЦреЛрдж рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╢реЙрдЯ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдПрдЪ 5 рдПрдл рдХреЛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ DOM рд╕реНрддрд░ 3 рд╕реЗ рдкрд░реЗ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд "рд╕реНрддрд░ 4" рдпрд╛ "рдПрдЪрдЯреАрдПрдордПрд▓ 5" рдлрд╝реЛрд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЙрд╕ рдкрд░ рдЬрд▓реНрджреА рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред

: +1: рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред

рдЕрднреА рдореИрдВ jsdom рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рдж https://github.com/hyperform/hyperform рдХреЛ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рд╣! рдореИрдВ рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рдХрд╛ рд▓реЗрдЦрдХ рд╣реВрдВред рдФрд░ рднрд╛рдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА JSDom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ JSDom рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдореИрдВрдиреЗ JSDom рдХреЗ рдЕрдВрджрд░ рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рдЙрдкрдпреБрдХреНрдд рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЦреЗрд▓рд╛:

$ git diff test/web-platform-tests/create-jsdom.js
diff --git a/test/web-platform-tests/create-jsdom.js b/test/web-platform-tests/create-jsdom.js
index 7009df7..9edcb16 100644
--- a/test/web-platform-tests/create-jsdom.js
+++ b/test/web-platform-tests/create-jsdom.js
@@ -1,5 +1,6 @@
 "use strict";
 const jsdom = require("../..");
+const hyperform = require("hyperform");
 const nodeResolverPromise = require("../util").nodeResolverPromise;

 const globalPool = { maxSockets: 6 };
@@ -35,6 +36,9 @@ module.exports = (urlPrefix, testPath) => {

   return created
   .then(window => {
+    global.window = window;
+    global.document = window.document;
+    hyperform(window);
     return new Promise((resolve, reject) => {
       const errors = [];

рдФрд░ test/web-platform-tests/index.js рдореЗрдВ "html/semantics/forms/constraints/*.html" рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрд╕рдореНрдмрджреНрдзрддрд╛ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдорд┐рд▓реЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк JSDom рдореЗрдВ рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдХреБрдЫ рдФрд░ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛

рдП) рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░
рдмреА) рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ; рдореИрдВ рдПрдХ рд╡реВ рдШрдЯрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ JSON рд╕реНрдХреАрдорд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдлреЙрд░реНрдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдорд╛ рдХрд░рдиреЗ рдкрд░ рд╕рддреНрдпрд╛рдкрди рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдзрддрд╛ API рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреЛ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдЕрднреА рддрдХ рдореИрдВ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред

@ рдмреЛрд▓реНрдбрд╡рд┐рди рдЕрдЧрд░ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рд╕рд╣рд░реНрд╖ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рднреА рдХреБрдЫ рдорджрдж рджреЗ рд╕рдХреВрдВ, рдЕрдЧрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рджрд┐рдпрд╛ рдЬрд╛рдП :)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдиреАрдЪреЗ @EricHenry рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдореБрдЭреЗ рдмрд╕ checkValidity рдХреЛ HTMLInputElement , HTMLSelectElement , рдФрд░ HTMLTextAreaElement рдХреЗ рд▓рд┐рдП рднреА рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ HTMLFormElement рдХреЗ рд╕рд╛рде рдмреЗрд▓рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА

рдЬреЗрд╕реНрдЯ рдФрд░ рдПрдВрдЬрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдореИрдВ @fernandopasik рдФрд░ @Boldewyn рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JSDOM рдХреЛ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдк рд╣рд╛рдЗрдкрд░рдлреЙрд░реНрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

import * as hyperform from 'hyperform';

var global = global;

const defineValidity = {
  get() {
    return hyperform.ValidityState(this);
  },
  configurable: true
};

global.HTMLFormElement.prototype.checkValidity = function() {
  return hyperform.checkValidity(this);
};

Object.defineProperty(global.HTMLFormElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLInputElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLSelectElement.prototype, 'validity', defineValidity);
Object.defineProperty(global.HTMLTextAreaElement.prototype, 'validity', defineValidity);

рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп HTMLElements рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреАрдЖрд░ #2142 рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рдкреВрд░реНрдг рдмрд╛рдзрд╛ рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ

рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдореЙрдХрд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ JSDOM рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдПрдХ рдХреНрд▓реАрдирд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореЗрд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдлреЙрд░реНрдо рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХреЗ classList рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореБрдЭреЗ рдлреЙрд░реНрдо рдХреА рд╡реИрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧреАред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдлреЙрд░реНрдо рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП classList рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП $ DOMTokenList рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛

beforeAll(() => {
    window.DOMTokenList = jest.fn().mockImplementation(() => {
        return {
            list: [],
            remove: jest.fn().mockImplementation(function (item) {
                const idx = this.list.indexOf(item);

                if (idx > -1) {
                    this.list.splice(idx, 1)
                }
            }),
            add: jest.fn().mockImplementation(function (item) {
                this.list.push(item);
            }),
            contains: jest.fn().mockImplementation(function (item) {
                return this.list.indexOf(item) > -1;
            })
        };
    });
})

рддрдм рдореИрдВрдиреЗ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреБрдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдореИрдВ event.currentTarget.form . рдХреЗ рд╕рд╛рде рд╕рдмрдорд┐рдЯ рдмрдЯрди рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдореЗрдВ рдлреЙрд░реНрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ

let mockClassList = new DOMTokenList();

submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => false,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    })

рдпрд╣ рдореБрдЭреЗ рдлреЙрд░реНрдо рдХреА рд╡реИрдзрддрд╛ рдХреЛ рдЧрд▓рдд рдФрд░ рд╕рддреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ was-validated рд╡рд░реНрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП mockClassList рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ

    submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => false,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    });

    expect(mockClassList.contains('was-validated')).toBeTruthy();

    submitBtn.simulate('click', {
        currentTarget: {
            form: {
                checkValidity: () => true,
                classList: mockClassList
            }
        },
        preventDefault: jest.fn(),
        stopPropagation: jest.fn()
    });

    expect(mockClassList.contains('was-validated')).toBeFalsy();

рдПрдлрд╡рд╛рдИрдЖрдИ: рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдВрдЬрд╛рдЗрдо рдХреЗ рдЙрдерд▓реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдорд╛рдЙрдВрдЯ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡, рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдорд╛рдЙрдВрдЯ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ input.validity рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП j [email protected] рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

// EditableInput.js:
this.inputElement = React.createRef();
...
const input = this.inputElement.current;
console.error('input.validity: ', input.validity);
// EditableInput.test.js run outcome:
    console.error src/components/Form/Input/EditableInput.js:47
      input.validity:  undefined
// yarn.lock:
jsdom@^11.5.1:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
  integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рд╡рд╣ 11.8.0 рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕ рджрд┐рди рдкреАрдЖрд░ рд╡реИрдзрддрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

philipwalton picture philipwalton  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cg433n picture cg433n  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

camelaissani picture camelaissani  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JacksonGariety picture JacksonGariety  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tolmasky picture tolmasky  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ