Jsdom: WebComponents API рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдлрд╝рд░ре░ 2015  ┬╖  89рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрд░ (http://facebook.github.io/react/) рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗрдм рдШрдЯрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореВрд▓ рд░реВрдк рд╕реЗ jsdom рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ webcomponents.js рдкреЙрд▓реАрдлрд╝рд┐рд▓ jsdom рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ WebComponent рд╕рдорд░реНрдерди (рдХрд╕реНрдЯрдо рддрддреНрд╡, рд╢реИрдбреЛ рдбреЛрдо, html рдЖрдпрд╛рдд, рдЖрджрд┐) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИред

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

рдЯреАрдПрд▓; рдбреАрдЖрд░

рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ 2 рд╣рдлреНрддреЛрдВ рдореЗрдВ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рд╣реИ рдЬрд╛рдВрдЪ рдХрд╛ рдирддреАрдЬрд╛.

рдЖрдк рдпрд╣рд╛рдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/jsdom/jsdom/compare/master...pmdartus:custom-elements?expand=1 ред рдпрд╣рд╛рдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдХреБрдЫ рдЦреБрд░рджреБрд░реЗ рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ WPT-рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реИрдВ ред рд╢реЗрд╖ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рддреЛ рдЬреНрдЮрд╛рдд JSDOM рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдорд╛рдореВрд▓реА рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдо jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдЕрдм рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдЕрдм рдЬрдм рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд╕реНрдЯрдо-рдПрд▓рд┐рдореЗрдВрдЯ рд╢рд╛рдЦрд╛ рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдкреЙрд▓рд┐рдорд░ 3 рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ jsdom рдореЗрдВ рд▓реЛрдб рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢рд╛рдЦрд╛ рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (рд╕реНрдЯреИрдВрд╕рд┐рд▓ рджреЗрд╡ рдореЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ module , рдФрд░ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЛрдб рдореЛрдб рдлреЗрдВрдХрддрд╛ рд╣реИ)ред

рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛

рдпрд╣рд╛рдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд▓реНрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

[CEReactions] IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рдХреЛрд░ рдореЗрдВ рд╕реЗ рдПрдХ [CEReactions] рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдореИрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреИрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди-рдореВрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧреБрдгреЛрдВ ( HTMLOptionsCollection , DOMStringMap ) рд╕реЗ рдЬреБрдбрд╝реЗ [CEReactions] рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, jsdom рдЙрди рдЧреБрдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреИрдЪрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ)ред

рдореИрдВ webidl2js рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ [CEReactions] рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╣реБрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкрд░рд┐рд╡рд░реНрддрди:

[HTMLConstructor] IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ, [HTMLConstructor] рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

рдореЗрдХ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпреБрдХреНрддрд┐ рдЕрдиреБрд░реВрдк рдмрдирд╛рдПрдВ (#2522)

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, Element.innerHTML рдФрд░ Element.outerHTML рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ

рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЬрд┐рди рдореБрджреНрджреЛрдВ рдкрд░ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдареЛрдХрд░ рдЦрд╛рдИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирдИ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдерд╛ред CustomElementRegistry рдФрд░ рдХреНрд░рд┐рдПрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреЛрдиреЛрдВ рдХреЛ рдПрд▓рд┐рдореЗрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рджреБрдГрд╕реНрд╡рдкреНрди рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред

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

jsdom рдореЗрдВ рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж jsdom рдХреЗ рд╡реЗрдмрдкреИрдХ/рдмреНрд░рд╛рдЙрдЬрд╝рд░реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ (рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рдкрд░рд┐рд╡рд░реНрддрди:

~рд╢реИрдбреЛ рдбреЛрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Element.isConnected рдХреЛ рдареАрдХ рдХрд░реЗрдВ (https://github.com/jsdom/jsdom/pull/2424)~

рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдлрд┐рд╕рд▓ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рддрддреНрд╡ рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рддреЛ рдХрдиреЗрдХреНрдЯреЗрдб рд░рд┐рдЯрд░реНрди false рд╣реИред рдПрдХ рдирдпрд╛ WPT-рдкрд░реАрдХреНрд╖рдг рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

HTMLTemplateElement.templateContents рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (#2426)

рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ HTMLTemplateElement рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИред jsdom рдЖрдЬ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTMLTemplateElement рдФрд░ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕рдорд╛рди рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдбред

рдкрд░рд┐рд╡рд░реНрддрди:

  • HTMLTemplateElement-impl.js
  • htmltodom.js ред рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдХреБрдЫ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рднрд╛рд╡ рднреА рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджрд░реНрдн рддрддреНрд╡ рдПрдХ HTMLTemplateElement рд╣реИ, рддреЛ HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдб рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕реНрд╡рдпрдВ рддрддреНрд╡ рд╕реЗред

HTMLTemplateElement (#2426) рдореЗрдВ рдЧреБрдо рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВ

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

рдкрд░рд┐рд╡рд░реНрддрди:

Parse5 serializer рдореЗрдВ isValue рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреБрдХрдбрд╝реЗ рдЕрд▓рдЧреЛ, рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝рд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред parse5 рдЯреНрд░реА рдПрдбреЙрдкреНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рддрддреНрд╡ getIsValue(element: Element): void | string рд╕реЗ рдЬреБрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдЧрд╛ред

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╡рд░реНрддрдорд╛рди getAttrList рд╣реБрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪреА рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдкреНрд░рджрд░реНрд╢рди

рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЯреНрд░реА рдореНрдпреВрдЯреЗрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдЯрд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ 10% рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдП JSDOM рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдм рдорд╛рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3x рд╕реЗ 6x рдзреАрдорд╛ рд╣реИ, рдЗрд╕рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг: рдпрд╣рд╛рдБ

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

рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ API webcomponents.js рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ jsdom рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛, рддреЛ рдкреВрд░реНрдг рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдЙрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рдЬрд┐рддрдирд╛ рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ --- рдЪрд╢реНрдорд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯрд╛ рд╣реИред

рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЛрджрдиреЗ рдХрд╛ рд╕рдордп рдерд╛:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛ рд╕реНрдХреЛрдк рдореЗрдВ Window рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ this.Window = this.prototype рдХреЗ рд╕рд╛рде Window рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреИрдЪ рдХрд┐рдпрд╛ред
рджреВрд╕рд░рд╛, webcomponentsjs рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ Window рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реЛрдЧрд╛, рдпрд╛рдиреА EventTarget рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдмрд╕ рдереЛрдбрд╝реА рд╕реА рдЬрд╛рдирдХрд╛рд░реА, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдереЛрдбрд╝рд╛ рд╕рдордп рдерд╛ред

рдЕрдЪреНрдЫрд╛ред рд╡рд┐рдВрдбреЛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред EventTarget рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕ рд╕рд╛рдорд╛рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдореЗрд░рд╛ рдПрдХ TODO рд░рд╣рд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдкреИрдЪ рдЕрдм рддрдХ рдЖрд╕рд╛рди рд╣реИрдВ:

  • [x] this.Window = Window; рд╡рд┐рдВрдбреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ
  • [x] inherits(dom.EventTarget, Window, dom.EventTarget.prototype); рд╡рд┐рдВрдбреЛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж

webcomponents.js рдХрд╛ рдЕрдЧрд▓рд╛ рдХреНрд░реИрд╢ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ HTMLUnknownElement (#1068) рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╣рдореЗрдВ SVGUseElement рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ webcomponents.js рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ SVGUseElement рдХреЛ HTMLDivElement рд╕реЗ рдХрдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬрд╛рдБрдЪ рдХреА, рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ / рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╢рд┐рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • [рдПрдХреНрд╕] HTMLUnknownElement #1068
  • [ ] SVGUseElement
  • [ ] window.CanvasRenderingContext2D
  • [ ] рд░реЗрдВрдЬ рдПрдкреАрдЖрдИ (рд╕рд╣рд┐рдд: document.getRange() , window.getSelection() , window.Range , window.Selection ; #804 рдПрдХ рд╢реБрд░реБрдЖрдд рд╣реЛ рд╕рдХрддреА рд╣реИ)
  • [ ] npm i canvas

(рдЕрднреА рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА)

рдПрдХ рд╢реБрд░реБрдЖрдд рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

jsdom.env({
  file: __dirname + '/index.htm', // refers to webcomponent.js
  created: function (err, window) {
    jsdom.getVirtualConsole(window).sendTo(console)

    window.document.createRange = function () { }
    window.getSelection = function () { }
    window.Range = function () { }
    window.Selection = function () { }
    window.CanvasRenderingContext2D = function () { } // Object.getPrototypeOf(require("canvas")(0,0).getContext("2d")) might be better
    window.SVGUseElement = window.HTMLUnknownElement
  },
  done: function (err, window) {
    console.log(err[0].data.error);
    console.log(window.CustomElements)
  },
  features: {
    ProcessExternalResources: ['script']
  }
});

рдпрд╣ рд╣реЛ рдЧрдпрд╛, рд╣рдорд╛рд░реЗ HTMLDocument рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдмрдЧ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрдкрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

+1 рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ jsdom рдкрд░ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреЙрд▓рд┐рдорд░ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рд▓рд╛рдн рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╣реЗрдбрд▓реЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЕрднреА рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рдХреЛрдИ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛ред (рд╣рдо рд╕рд┐рд░реНрдл рдХреНрд░реЛрдо рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред) рдЗрд╕ рдмреАрдЪ, рдЖрдк рдкреЙрд▓рд┐рдорд░ рдХреЗ рд╕рд╛рде jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдбреЛрдореЗрдирд┐рдХ рдореЗрд▓рд╛ рдХрд╛рдлреАред рд╡реИрд╕реЗ рдпрд╣ WebComponents.js рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ рдЬреЛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреЙрд▓рд┐рдорд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдпрд╛ webcomponents-lite (рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЙрди рд╕рднреА рдХреЛ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд░рддрд╛ рд╣реИ)ред рдкреЙрд▓рд┐рдорд░ рдХреЛ jsdom рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ @Sebmaster рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реЗ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рд╣реИрдВред рдУрдкреА рдореЗрдВ рдПрдХ рдкреЙрд▓рд┐рдорд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж webcomponents.org рдкреЙрд▓реАрдлрд┐рд▓реНрд╕ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкреБрд░рд╛рдиреЗ-рдкреЙрд▓рд┐рдорд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдлрд┐рд░ рдкреЙрд▓рд┐рдорд░ 1.0 рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЙрд▓реАрдлрд┐рд▓ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЙрд▓реАрдлрд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реЗ рд╡реЗрдм-рдШрдЯрдХ-рдИрд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕-рд▓рд╛рдЗрдЯ рд╣реЛред

WebComponentsJS рд░реЗрдкреЛ рдкрд░, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ webcomponentsjs-lite рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ , рдЬреЛ рд╕рднреА _but_ рд╢реИрдбреЛ рдбреЛрдо рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреЙрд▓рд┐рдорд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╢реИрдбреА рдбреЛрдо рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рд┐рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рдорд░ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдкрд░ рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕рдЬреЗрдПрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдЧреНрд░рдВрдЯ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рдлреА рдХрдо рд╡рдЬрди (рдордЬреЗрджрд╛рд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд ..) рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП jsdom рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ jsdom рдореЗрдВ рдкреЙрд▓реАрдлрд┐рд▓ (рд▓рд╛рдЗрдЯ рдпрд╛ рдлреБрд▓) рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреНрдпрд╛ рд╣реИ?

рдмрд┐рдирд╛ рдЬрд╛рдВрдЪ-рдкрдбрд╝рддрд╛рд▓ рдХреЗ рдпрд╣ рдХрд╣рдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ... рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдЯреВрдбреВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реИ рдФрд░ рд╢рд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред #1227 рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рд╕реЗ рд╣рдореЗрдВ рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬреА рдЖ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд▓рд╛рдкрддрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреЗрдВред

рдореИрдВрдиреЗ (рд╢рд╛рдпрдж рднреЛрд▓реЗрдкрди рд╕реЗ) CustomElementsRegistry рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ jsdom рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪреА рдореЗрдВ "рдХрд╕реНрдЯрдо-рддрддреНрд╡/рдХрд╕реНрдЯрдо-рддрддреНрд╡-рд░рдЬрд┐рд╕реНрдЯреНрд░реА/define.html" рдЬреЛрдбрд╝рд╛ рдФрд░ рдпрд╣ рддрдм рдЧреБрдЬрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд▓рдЧрднрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ throw рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рднреА рдЗрд╕реЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рддреЛ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ; test/web-platform-tests/index.js рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╢реБрд░реБрдЖрддреА const testWindow = iframe.contentDocument.defaultView; рд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдП рдХреНрдпреЛрдВрдХрд┐ contentDocument рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рд╣рдорд╛рд░реЗ рд▓реЛрдбрд┐рдВрдЧ рдСрд░реНрдбрд░ рдмрдирд╛рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

@Sebmaster рдмрд╕ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╢реЛрдз рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИрдВред

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

<div id="foo"></div>
<script>
  console.log(window.foo === document.getElementById('foo'));
</script>

_рд╣рд╛рд▓рд╛рдБрдХрд┐_, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ)ред рдЖрдИрдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╡рд╣ contentWindow рд╣реИред jsdom рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рднреА рд╣реИ ред рд╕рдлрд╛рд░реА рднреА рдареАрдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рдЯреАрдПрд▓рдбреАрдЖрд░; Jsdom рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ рдФрд░ рдЖрдк рд▓реЛрдЧ рдПрдХ рдЕрджреНрднреБрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

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

рдпрд╣ https://github.com/tmpvar/jsdom/blob/master/test/living-html/named-properties-window.js рд╕реЗ WPT рдЬреИрд╕реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╣реИред рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ jsdom рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╣рд╕реВрд╕ рдХрд░рд╛рддрд╛ рд╣реИ ^_^

рдирдорд╕реНрддреЗ!

рдореИрдВ рд╕рдВрдпреЛрдЬрди рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЛ jsdom рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛

рдиреЛрдЯ: рд░реЗрдкреЛ jsdom 8.5.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреЗрд╡рд▓ MutationObserver рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛ рдорд┐рд▓реА, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ Mutation Events рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдг 8.5.0 рдХреЗ рдмрд╛рдж рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рджреЗрд╢реА рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ рдФрд░ рдирд╡реАрдирддрдо jsdom рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░ рджреВрдВрдЧрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо jsdom рд╣реИ, рдФрд░ https://github.com/WebReflection/document-register-element рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ! рдореИрдВ рдЕрдзрд┐рдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХрд╕реНрдЯрдо рддрддреНрд╡ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ ... рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкреЙрд▓рд┐рдорд░ рдХреЛ рднреА рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВред

рдореИрдВ рдкреЙрд▓рд┐рдорд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рдШрдЯрдХ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЪреБрдкрдЪрд╛рдк рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рдореБрджреНрджрд╛ рд╣реИред

рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП webcomponentsjs HTML рдЖрдпрд╛рдд рдкреЙрд▓реАрдлрд┐рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░реЗ HTML рдЖрдпрд╛рдд рдПрдХ xmlhttprequest рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореЗрд░реЗ рдЖрдпрд╛рдд рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рддреА рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг @lastmjs рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рджреЗрдЦрднрд╛рд▓? рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рдШреБрдЯрдиреЗ рдЯреЗрдХ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдЖрдкрдХреЗ рд╕рд╛рде рдпреЛрдЧрджрд╛рди рджреВрдВрдЧрд╛ред

@snuggs рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдПрдХ рдпрд╛ рджреЛ рджрд┐рди рджреЛ, рдореИрдВ рдЗрд╕ рд╕рдордп рдХреБрдЫ рджрдмрд╛рд╡ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реВрдВред

@snuggs рдЕрдЧрд░ рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП webcomponents-lite рдкреЙрд▓реАрдлрд┐рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреЙрд▓рд┐рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реИрдбреЛ рдбреЛрдо рдЕрдм рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдард┐рди рдкреЙрд▓реАрдлрд┐рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╣рдо webcomponents-lite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ template рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред , custom elements , рдФрд░ HTML imports ред

рдореИрдВ webcomponents-lite рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTML рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рдерд╛, рдлрд┐рд░ рдореИрдВ рдЗрд╕ рдкрд░ рдЖрдпрд╛: https://github.com/Polymer/polymer/issues/1535 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HTML рдЖрдпрд╛рдд рдХреЗрд╡рд▓ рдПрдХ cors- рд╕рдХреНрд╖рдо рдЧреИрд░-рдлрд╝рд╛рдЗрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд http рд╕рд░реНрд╡рд░ рдмрдирд╛рдпрд╛:

npm install -g http-server
http-server --cors

рдФрд░ рдпрд╣рд╛рдВ рдореВрд▓ рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

const jsdom = require('jsdom');

const doc = jsdom.jsdom(`
    <!DOCTYPE html>

    <html>
        <head>
            <script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
            <link rel="import" href="http://localhost:8080/bower_components/polymer/polymer.html">
        </head>

        <body>
            <test-app></test-app>

            <dom-module id="test-app">
                <template>
                </template>

                <script>
                    setTimeout(() => {
                        class TestApp {
                            beforeRegister() {
                                this.is = 'test-app';
                                console.log('before register');
                            }

                            ready() {
                                console.log('ready');
                            }

                            created() {
                                console.log('created');
                            }

                            attached() {
                                console.log('attached');
                            }
                        }

                        Polymer(TestApp);
                    }, 1000);
                </script>
            </dom-module>
        </body>
    </html>
`, {
    virtualConsole: jsdom.createVirtualConsole().sendTo(console)
});

рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ TestApp рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЛ setTimeout рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рдорд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдЖрдпрд╛рдд рдмрд╛рдХреА рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП setTimeout рдХреЗ рдмрд┐рдирд╛ рдкреЙрд▓рд┐рдорд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ HTML рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ?

beforeRegister рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реИред рддреЛ рдЕрдм рд╣рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ HTML рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ webcomponents-lite рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреЙрд▓реАрдлрд┐рд▓ рдХреИрд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЬрдм рдореИрдВ TestApp рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ ready рдпрд╛ created рд╡рд┐рдзрд┐ рдбрд╛рд▓рддрд╛ рд╣реВрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЗрдзрд░-рдЙрдзрд░ рдЦреЗрд▓рддрд╛ рд░рд╣реВрдВрдЧрд╛ред

рд╣рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ:

  • [ ] HTML рдЖрдпрд╛рдд рдареАрдХ рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ
  • [] рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?
  • [] рдкреЙрд▓рд┐рдорд░ рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдЕрдзрд┐рдХ рдЯрд┐рдВрдХрд░рд┐рдВрдЧ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдд рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рдХреНрд░рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж const testApp = document.createElement('test-app'); рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ created рдФрд░ ready рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди attached рд╡рд┐рдзрд┐ рдХреЛ рдирд╣реАрдВред рд╢рд╛рдпрдж jsdom рдХрд╕реНрдЯрдо рддрддреНрд╡ рдЕрдХреНрд╖рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ? рд╕рд╛рде рд╣реА, document.body.appendChild(testApp) рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рднреА, attached рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд▓реЛрдб рдСрд░реНрдбрд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: https://github.com/webcomponents/webcomponentsjs#helper -utilities

@lastmjs рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ CustomElementRegistry.define() рдФрд░ document.registerElement() рдХреЗ рдмреАрдЪ рд╕рд┐рдХреНрдХреЛрдВ рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдбреЛрдорд┐рдирд┐рдХ рдиреЗ рдХреБрдЫ рдмреЗрд╣рддрд░реАрди рдЗрдирдкреБрдЯ рджрд┐рдП рд╣реИрдВ рдФрд░ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреБрдЫ рдХрд╛рдо рдХреЛ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рд╣реИ (https://github.com/whatwg/html/issues/1329) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдПрдкреАрдЖрдИ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрд▓реНрдкрдирд╛ connectedCallback рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ attachedCallback рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм attachedCallback рдерд╛ рдЬрдм рдЖрдкрдиреЗ attached рдХрд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╣реИрдВрдбрд▓рд░ рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓рдмреИрдХ рдлрд╛рдпрд░рд┐рдВрдЧ define() рдФрд░ registerElement() рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИред HTMLImports рдбреЛрдореЗрдирд┐рдХ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ XMLHTTPRequest рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕реАрдзреЗ DocumentFragment рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рддрд░рд╣ рдХреА рдЧрдВрдз "рдЖрдпрд╛рдд" рдХреЗ рд╕рд╛рде рд╕рд╛рдБрдк рдХрд╛ рддреЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ "рдЕрд╢реБрджреНрдз" рдЖрдпрд╛рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рд╡реЗрдХ рд░рд╣рддрд╛ рд╣реИред

ES6 -> ES5 рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп super() рдкрд░ HTMLElement рдкрд░ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирдХрд▓реА рднреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд░ рдКрдкрд░ рд░рдЦреЗрдВред рдореИрдВ рдЗрд╕реЗ рд░реЛрд▓рдЕрдк.рдЬреЗрдПрд╕/рдмреЗрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдкреИрдХреЗрдЬ рд╕реЗ (рд╣рд▓реНрдХреЗ) рд╢рд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
https://developers.google.com/web/fundamentals/getting-started/primers/customelements

рдЕрдВрдд рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ (рдЕрдзрд┐рдХ) рд╕рдлрд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИред

document.createElement('main', 'test-app')

рдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рд╕рдмрд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рд╣рд░ рд╕реНрдкреЗрдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рди рдХрд┐ рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ GOOGLE рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЗрдВ рдзреБрдВрдзрд▓реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВред

рдЖрдк рдХрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЕрдм рддрдХ рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЗрд╡рд▓ webcomponents-lite рдкреЙрд▓реАрдлрд┐рд▓ рдФрд░ рдкреЙрд▓рд┐рдорд░ <2.0 рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВрдиреЗ attached рд╡рд┐рдзрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдкреЙрд▓рд┐рдорд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдкрджреНрдзрддрд┐ рд╕реЗ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗ attachedCallback рдХреЗ рдмрдЬрд╛рдп рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдЕрднреА рддрдХ рдирдП v1 рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд╕реНрдкреЗрдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХреЗрд╡рд▓ рдкреЙрд▓рд┐рдорд░ рдХреЛ рдореМрдЬреВрджрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рд╣реИред

@snuggs рдХреНрдпрд╛ рдЖрдк рдЕрднреА рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЖрдк jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@lastmjs рдореИрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 80% рд░рд╛рд╕реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдм рдЗрддрдирд╛ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝реЗ рд╕реЗ рдЕрдкрдлреНрд░рдВрдЯ рдЯреНрд╡рд┐рдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдореВрд▓ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдврд╛рдВрдЪреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рд▓реНрдХреЗ (рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рде рд╕реЗ рд▓реБрдврд╝рдХрд╛ рд╣реБрдЖ) рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЛрдорд┐рдирд┐рдХ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХрд╕реНрдЯрдо рддрддреНрд╡ html рдЖрдпрд╛рдд рд╣реИ рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ fetching рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП XMLHTTPRequest рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдПрдЧреАред рдХрд░реАрдм 6 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреА рдмрд╛рдд рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИред рддреЛ рд╣рдо @lastmjs рдХреЛ рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ?

@snuggs рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рдФрд░ рднрд╡рд┐рд╖реНрдп-рд╕рдмреВрдд рдЪреАрдЬ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдФрд░ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдирдХ v1 рдкрд░ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рд╕реБрди рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдореБрдЦ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╕реАрдорд┐рдд рд╕рдордп рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред @domenic рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рд╣рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреЗрд╡рд▓ рдХрд▓реНрдкрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭрд╕реЗ рдХреЛрдИ рдареЛрд╕ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛ :)

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

@matthewp рдпрд╣ рдорджрджрдЧрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рд╢рд╛рдЦрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ?

@matthewp рд╣рд╛рдБ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛

https://github.com/matthewp/jsdom/commits/custom-elements рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд╣рд╛, рддрдм рд╕реЗ рдХрд▓реНрдкрдирд╛ рдмрджрд▓ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реИред @snuggs @lastmjs

  • рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рднреА рдкреНрд░рдореБрдЦ рдмреНрд░рд╛рдЙрдЬрд╝рд░ ( W3C рдХрд▓реНрдкрдирд╛ ) рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
  • рдХрд╕реНрдЯрдо рддрддреНрд╡ рдЬрд▓реНрдж рд╣реА рд╣реЛрдВрдЧреЗ ( W3C рдХрд▓реНрдкрдирд╛ )
  • HTML рдЖрдпрд╛рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдХреНрд░реЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрднреА рднреА рдЬрд▓реНрдж рд╣реА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ( W3C рдпреБрдХреНрддрд┐ )
  • рд╢реИрдбреЛ рдбреЛрдо рдмреАрдЪ рдореЗрдВ рд╣реИ...( W3c рдХрд▓реНрдкрдирд╛ )

(http://jonrimmer.github.io/are-we-componentized-yet/)

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдлреИрдВрдЯрдордЬреЗрдПрд╕ 2.5 рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рд╢рд╛рдпрдж рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реЗрдмрдХрд┐рдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╣реИ)ред

рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ lib рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХрд╛ рдирдХрд▓ рдХрд░рддрд╛ рд╣реВрдВ

const {before} = require('mocha')

before(mockDOM)
before(mockCustomElements)

function mockDOM() {
  const {JSDOM: Dom} = require('jsdom')
  const dom = new Dom('<!doctype html><html><body></body></html>')
  global.document = dom.window.document
  global.window = document.defaultView
  window.Object = Object
  window.Math = Math
}

function mockCustomElements() {
  require('document-register-element/pony')(window)
}

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реБрдИ рд╣реИ?

рдЕрдм рддрдХ, рдирд╣реАрдВ :D

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдФрд░ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмреЗрд╣рддрд░ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВ

рдпрд╣ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдмрд╣реБрд▓рдХ рдкрд╕рдВрдж рд╣реИ, рдкрд░реАрдХреНрд╖рдг рд╕реЗрддреБ рдирд░рдХ рд╣реИ рдФрд░ рдлреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ jsdom рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ;) рдХрд╛рдо рдХреЛ рдЕрдВрджрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреАрдЖрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ! https://github.com/tmpvar/jsdom/pull/1872

рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ lib рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рддрддреНрд╡ @darlanmendonca . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реВрдВ

рдЬреЗрдПрд╕рдбреЙрдо рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЛ рдиреЛрдб рдЧреНрд▓реЛрдмрд▓ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реИред

рд╣реИрд▓реЛ рд╕рднреА рдХреЛ,
рдореИрдВ JSDOM (Node.js 6.7.0 рдФрд░ JSDOM 11.1.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рдЕрдВрджрд░ рдкреЙрд▓рд┐рдорд░ рдЪрд▓рд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдБред рдореИрдВрдиреЗ рдорд┐рд╢реНрд░рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдпрд╣рд╛рдВ рднрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ ...

рдореИрдВрдиреЗ рдЕрдм рддрдХ рдХреНрдпрд╛ рдХрд┐рдпрд╛:

1) рдореИрдВрдиреЗ рдЕрдкрдиреА рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдПрдХ http рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛

./node_modules/http-server/bin/http-server --cors

2) рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреЙрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ JSDOM рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ:

jsdom.JSDOM.fromURL("http://localhost:8080/path/to/my-component.html",
  { runScripts: "dangerously",
    resources: "usable"
  })
.then(function (dom) {
  setTimeout(() => {
    window = dom.window;
    component = window.document.querySelector("my-component");
  }, 10000);
})

(рдореИрдВрдиреЗ рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред)

3) рдпрд╣ рдореЗрд░рд╛ рдШрдЯрдХ рдХреЛрдб рд╣реИ:

<!DOCTYPE html>
<html>
<head>
  <script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
</head>

<body>
<link rel="import" href="/bower_components/polymer/polymer.html">
<dom-module id="order-app">
  <template>
    <h1>Hello Polymer</h1>
  </template>

  <script>
    console.log("javascript is being executed");
    addEventListener('WebComponentsReady', function () {
      console.log("web components are ready");
      Polymer({
        is: 'order-app'
      });
    });
  </script>
</dom-module>
</body>
</html>

(рдореИрдВрдиреЗ рд╡реЗрдм рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрдб рдЬреЛрдбрд╝рд╛ред)

рдореИрдВ рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ?

рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ

  • рдХрд┐ рд╡реЗрдм рдШрдЯрдХ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЛ рд╡реЗрдмрд╕рд░реНрд╡рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
  • рд╕рдВрджреЗрд╢ "рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ" рдХрдВрд╕реЛрд▓ рдореЗрдВ

рдореБрдЭреЗ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛

  • рдХрд┐ рдмрд╣реБрд▓рдХ.рдПрдЪрдЯреАрдПрдордПрд▓ рдШрдЯрдХ рд╡реЗрдмрд╕рд░реНрд╡рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
  • рд╕рдВрджреЗрд╢ "рд╡реЗрдм рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИрдВ" рдХрдВрд╕реЛрд▓ рдореЗрдВ

рдпрд╣ рдореБрдЭреЗ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ WebComponentsReady рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ HTML рдЖрдпрд╛рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?) рднреА,
window.WebComponents рдореЗрдВ { flags: { log: {} } } рд╢рд╛рдорд┐рд▓ рд╣реИ -- ready рд╕рдВрдХреЗрддрдХ рдЧрд╛рдпрдм рд╣реИред

рдореИрдВрдиреЗ рдХреБрдЫ рдореЙрдХрд┐рдВрдЧ рдФрд░ рдкреЙрд▓реАрдлрд┐рд▓рд┐рдВрдЧ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА:

  window.Object = Object;
  window.Math = Math;
  require('document-register-element/pony')(window);

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред

рдЕрдм, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ :-) рдХреНрдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЧреБрдо/рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдХрд┐рд╕реА рднреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореЛрдЗрди

рдореИрдВрдиреЗ рдпрд╣ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХрдо рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдореИрдВрдиреЗ рдпрд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

https://github.com/sebs/noframework/blob/master/test/configurator.js

рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдмрд╕ рдПрдХ рдФрд░ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕ред рд╡рд╣реА рднреНрд░рдо рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред рд╡рд╣реА рдирд┐рд╖реНрдХрд░реНрд╖

Jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ jsdom рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

рдореВрд▓рднреВрдд рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ jsdom рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЙрдирдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдкреНрд░рддрд┐-рд╡рд┐рдВрдбреЛ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ HTMLElement рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рднреА рд╡рд┐рдВрдбреЛ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ super() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдм рдЪрд▓ рд░рд╣реЗ HTMLElement рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд┐рд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реИред рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмрдбрд╝реА рдмрдВрджреВрдХ рдЬреЗрдПрд╕рдбреЙрдо рдХреЛ рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ рдЬреЛ рдЧреИрд░-рд╕рд╛рдЭрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рд╕рд╛рдеред рд╢рд╛рдпрдж рд╣рдо рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:

  • Jsdom рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП [WebIDL2JSFactory] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо HTMLElement рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ [WebIDL2JSFactory] рдЕрднреА рддрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рднреА рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рд▓рд╛рдЧрдд рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рдмрдирд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛред
  • рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд╣рд╛рдВ jsdom vm рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдк рд╣реИрдВ рдЬреЛ рд╕рднреА рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЛ jsdom рдореЗрдВ рдмрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЬрдм рдЖрдк рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирдП рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЧреНрд▓реЛрдмрд▓ рдХреЗ рдЕрдВрджрд░ рдЙрд╕ рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде vm.runScript() рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рд╣рдореЗрдВ [WebIDL2JSFactory] рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рддрд┐ Node.js рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИред


рдЙрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд╛рдзрд╛ рдХреЗ рдмрд╛рдж, рдмрд╛рдХреА рдпреБрдХреНрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИред рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╢рд╛рдпрдж [CEReactions] рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╣рдорд╛рд░реА рд╕рднреА рдЖрдИрдбреАрдПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ [WebIDL2JSFactory] рдЕрднреА рддрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реАрдзрд╛ рд╣реИред

рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд╣рд╛рдВ jsdom vm рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред

рдореИрдВ рдпрд╣реА рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди vm рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╛рд╣рд░реА рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдм рдХреБрдЫ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдбрд╛рд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ delete рдХреЗ рдмрд╛рдж рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред . рдпрд╣ [NamedConstructor] рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдПрдХ jsdom рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП V8 рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг [WebIDL2JSFactory] рд╡реНрдпрд╡рд╕рд╛рдп рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдПрдХ рд╣реИрдХ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

+1 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реВрдБред

рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ @TimothyGu рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ
https://github.com/mraerino/jsdom/tree/custom-elements-spec

рдореИрдВ рдпрдерд╛рд╕рдВрднрд╡ рдиреНрдпреВрдирддрдо рдЗрдирд╡реЗрд╕рд┐рд╡ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рде рд╣реА рдпрдерд╛рд╕рдВрднрд╡ рдХрд▓реНрдкрдирд╛ рдХреЗ рдХрд░реАрдм рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реА рд░рд╛рдд рдХреЛ рд╣реИрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЬреЛ webIdl2JS рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://github.com/mraerino/jsdom/commit/592ad1236e9ca8f63f789d48e1887003305bc618

@TimothyGu рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдмрд▓реЛрдВ рдХреЛ рдЧрдардмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реЛрдВрдЧреЗ?

рдпрд╣рд╛рдВ рдмрд╕ рдХреБрдЫ рдЕрдкрдбреЗрдЯ:
рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ [HTMLConstructor] рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд IDL рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ https://github.com/jsdom/webidl2js/issues/87 . рдЦреЛрд▓рд╛

рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП [Constructor] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ [HTMLConstructor] рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ред (рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реЗ window рдореЗрдВ рдПрдХ рдирдХрд▓реА HTMLElement рдХреНрд▓рд╛рд╕ рдбрд╛рд▓рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред)

рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ https://github.com/tmpvar/jsdom/issues/1030#issuecomment -333994158 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, HTMLConstructor рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдореВрд▓рднреВрдд рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рддрдиреЗ рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЕрднреА рдХреЗ рд▓рд┐рдП customElementRegistry рд╡рд╛рд▓реЗ, рдФрд░ рдореИрдВ рдЕрдкрдиреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдареАрдХ рд╣реИ, рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЖрдкрдХрд╛ рдорддрд▓рдм рдорд┐рд▓рд╛ред рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЬрд╝рдорд╛рдЙрдВрдЧрд╛, рд▓реЗрдХрд┐рди @TimothyGu рднреА рдЕрд▓рдЧрд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдкреЙрд▓рд┐рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╣реВрдВ: +1: рдЗрд╕ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕реБрд╡рд┐рдзрд╛

@dman777 @mraerino рд╕реНрд▓рд┐рдо.рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред рд╕реНрд▓рд┐рдо рджреЗрд╢реА рд╡реЗрдм рдШрдЯрдХ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ jsdom рдкрд░ рд╣реИрдХ рдХрд┐рдП рдмрд┐рдирд╛ HTMLElement рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓реЗ рддреАрди рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ jsdom рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрдм рдХрд░реЗрдЧрд╛?

рдЯреАрдПрд▓; рдбреАрдЖрд░

рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ 2 рд╣рдлреНрддреЛрдВ рдореЗрдВ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рд╣реИ рдЬрд╛рдВрдЪ рдХрд╛ рдирддреАрдЬрд╛.

рдЖрдк рдпрд╣рд╛рдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/jsdom/jsdom/compare/master...pmdartus:custom-elements?expand=1 ред рдпрд╣рд╛рдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдХреБрдЫ рдЦреБрд░рджреБрд░реЗ рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ WPT-рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реИрдВ ред рд╢реЗрд╖ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рддреЛ рдЬреНрдЮрд╛рдд JSDOM рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдорд╛рдореВрд▓реА рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдо jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдЕрдм рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдЕрдм рдЬрдм рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд╕реНрдЯрдо-рдПрд▓рд┐рдореЗрдВрдЯ рд╢рд╛рдЦрд╛ рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдкреЙрд▓рд┐рдорд░ 3 рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ jsdom рдореЗрдВ рд▓реЛрдб рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢рд╛рдЦрд╛ рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (рд╕реНрдЯреИрдВрд╕рд┐рд▓ рджреЗрд╡ рдореЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ module , рдФрд░ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЛрдб рдореЛрдб рдлреЗрдВрдХрддрд╛ рд╣реИ)ред

рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛

рдпрд╣рд╛рдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд▓реНрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

[CEReactions] IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рдХреЛрд░ рдореЗрдВ рд╕реЗ рдПрдХ [CEReactions] рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдореИрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреИрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди-рдореВрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧреБрдгреЛрдВ ( HTMLOptionsCollection , DOMStringMap ) рд╕реЗ рдЬреБрдбрд╝реЗ [CEReactions] рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, jsdom рдЙрди рдЧреБрдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреИрдЪрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ)ред

рдореИрдВ webidl2js рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ [CEReactions] рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╣реБрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкрд░рд┐рд╡рд░реНрддрди:

[HTMLConstructor] IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ, [HTMLConstructor] рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

рдореЗрдХ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпреБрдХреНрддрд┐ рдЕрдиреБрд░реВрдк рдмрдирд╛рдПрдВ (#2522)

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, Element.innerHTML рдФрд░ Element.outerHTML рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ

рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЬрд┐рди рдореБрджреНрджреЛрдВ рдкрд░ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдареЛрдХрд░ рдЦрд╛рдИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирдИ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдерд╛ред CustomElementRegistry рдФрд░ рдХреНрд░рд┐рдПрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреЛрдиреЛрдВ рдХреЛ рдПрд▓рд┐рдореЗрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рджреБрдГрд╕реНрд╡рдкреНрди рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред

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

jsdom рдореЗрдВ рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж jsdom рдХреЗ рд╡реЗрдмрдкреИрдХ/рдмреНрд░рд╛рдЙрдЬрд╝рд░реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ (рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рдкрд░рд┐рд╡рд░реНрддрди:

~рд╢реИрдбреЛ рдбреЛрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Element.isConnected рдХреЛ рдареАрдХ рдХрд░реЗрдВ (https://github.com/jsdom/jsdom/pull/2424)~

рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдлрд┐рд╕рд▓ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рддрддреНрд╡ рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рддреЛ рдХрдиреЗрдХреНрдЯреЗрдб рд░рд┐рдЯрд░реНрди false рд╣реИред рдПрдХ рдирдпрд╛ WPT-рдкрд░реАрдХреНрд╖рдг рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди:

HTMLTemplateElement.templateContents рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (#2426)

рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ HTMLTemplateElement рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИред jsdom рдЖрдЬ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTMLTemplateElement рдФрд░ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕рдорд╛рди рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдбред

рдкрд░рд┐рд╡рд░реНрддрди:

  • HTMLTemplateElement-impl.js
  • htmltodom.js ред рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдХреБрдЫ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рднрд╛рд╡ рднреА рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджрд░реНрдн рддрддреНрд╡ рдПрдХ HTMLTemplateElement рд╣реИ, рддреЛ HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдб рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕реНрд╡рдпрдВ рддрддреНрд╡ рд╕реЗред

HTMLTemplateElement (#2426) рдореЗрдВ рдЧреБрдо рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВ

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

рдкрд░рд┐рд╡рд░реНрддрди:

Parse5 serializer рдореЗрдВ isValue рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреБрдХрдбрд╝реЗ рдЕрд▓рдЧреЛ, рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝рд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред parse5 рдЯреНрд░реА рдПрдбреЙрдкреНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рддрддреНрд╡ getIsValue(element: Element): void | string рд╕реЗ рдЬреБрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдЧрд╛ред

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╡рд░реНрддрдорд╛рди getAttrList рд╣реБрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪреА рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдкреНрд░рджрд░реНрд╢рди

рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЯреНрд░реА рдореНрдпреВрдЯреЗрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдЯрд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ 10% рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдП JSDOM рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдм рдорд╛рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3x рд╕реЗ 6x рдзреАрдорд╛ рд╣реИ, рдЗрд╕рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг: рдпрд╣рд╛рдБ

@pmdartus рдпрд╣ рдмрд╣реБрдд рд╣реА рдЖрд╢рд╛рдЬрдирдХ, рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ! рдореИрдВ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрдкрдиреА рд╣реИрдХ рд╢рд╛рдЦрд╛ jsdom-wc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдореБрджреНрджреЛрдВ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:

class Component extends HTMLElement {

}

customElements.define('custom-component', Component);

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ:

const el = assign(this.fixture, {
  innerHTML: `
    <custom-component></custom-component>
  `,
});

рдореБрдЭреЗ рддрддреНрдХрд╛рд▓ рдорд┐рд▓рддрд╛ рд╣реИ: Error: Uncaught [TypeError: Illegal constructor] ред

рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдХреЛрдб рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдкрд░ custom-elements рд╢рд╛рдЦрд╛ рдкрд░ рдареАрдХ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ: https://github.com/pmdartus/jsdom/tree/custom-elements

const { JSDOM } = require("jsdom");

const dom = new JSDOM(`
<body>
  <div id="container"></div>
  <script>
    class Component extends HTMLElement {
        connectedCallback() {
            this.attachShadow({ mode: "open" });
            this.shadowRoot.innerHTML = "<p>Hello world</p>";
        }
    }
    customElements.define('custom-component', Component);

    const container = document.querySelector("#container");

    Object.assign(container, {
        innerHTML: "<custom-component></custom-component>"
    })

    console.log(container.innerHTML); // <custom-component></custom-component>
    console.log(container.firstChild.shadowRoot.innerHTML); // <p>Hello world</p>
  </script>
</body>
`, { 
    runScripts: "dangerously" 
});

рдЕрд╡реИрдз рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдореВрд▓ HTMLElement рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред @tbranyen рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдг рдкреНрд░рдЬрдирди рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╣рд╛рдп @pmdartus рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реАрдзреЗ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const { JSDOM } = require('.');
const window = (new JSDOM()).window;
const { HTMLElement, customElements, document } = window;

class CustomElement extends HTMLElement {
  constructor() {
    super();

    console.log('constructed');
  }

  connectedCallback() {
    console.log('connected');
  }
}

customElements.define('custom-element', CustomElement);
document.body.appendChild(new CustomElement());
//constructed
//connected

{
  const window = (new JSDOM()).window;
  const { HTMLElement, customElements, document } = window;

  class CustomElement extends HTMLElement {
    constructor() {
      super();

      console.log('Constructed');
    }

    connectedCallback() {
      console.log('Connected');
    }
  }

  customElements.define('custom-element', CustomElement);
  document.body.appendChild(new CustomElement());
  //constructed
  //connected
}

рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдореЗрд░реА рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдореЗрд░реЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдЖрд╣ рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрдХреБрдЪрд┐рдд рд╣реЛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ HTMLElement рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдореИрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:

  // Inside the block, second component, reuse the HTMLElement.
  const { customElements, document } = window;

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:

connected
/home/tbranyen/git/pmdartus/jsdom/lib/jsdom/living/helpers/create-element.js:643
        throw new TypeError("Illegal constructor");

2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдорд┐рд▓ рдЧрдпрд╛:

  // Don't reuse the previously defined Element...
  global.HTMLElement = global.HTMLElement || jsdom.window.HTMLElement;

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ 4 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдХреНрдпрд╛ рд╡реЗрдм рдШрдЯрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ рдпрд╛ рд╣реЛрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдЗрд╕рдореЗрдВ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдпрджрд┐ рдХреЛрдИ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ .... рд╣реЗрдбрд▓реЗрд╕ рдХреНрд░реЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдм рдиреЛрдб рдореЗрдВ HTML рд╕реНрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░реЗрдВрдбрд░/рдмрд┐рд▓реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ 4 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдХреНрдпрд╛ рд╡реЗрдм рдШрдЯрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ рдпрд╛ рд╣реЛрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдпрд╣ рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреБрдХреНрддрд┐ рдХреЛ рдЯреБрдХрдбрд╝реЗ-рдЯреБрдХрдбрд╝реЗ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреЙрд▓реАрдлрд┐рд▓ рдпрд╣рд╛рдВ: https://github.com/WebReflection/document-register-element рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдЦрдХ рдХреЛ рдореЗрд░рд╛ рд╣рд╛рд░реНрджрд┐рдХ рдзрдиреНрдпрд╡рд╛рдж!

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:

npm install -D document-register-element

рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдИ рдЬрд╛рдПрдЧреА:

{ "setupFilesAfterEnv": [ "./tests/setup.js" ] }

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ ('tests/setup.js'):

import 'document-register-element'

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, document.createElement('custom-component') рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЯреБрдХрдбрд╝реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред (рд╡реИрд╕реЗ, рдореИрдВ рдЫрд╛рдпрд╛ рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

@tebanep рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рдШрдЯрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИ, рдпрджрд┐ рдпрд╣ рд╢реИрдбреЛ рдбреЛрдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдкреВрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

@tebanep рдзрдиреНрдпрд╡рд╛рджред рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рд╢реИрдбреЛ рдбреЛрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ

рдХреНрдпрд╛ рдХреЛрдИ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЕрднреА рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рдХреЗ рд╕рд╛рде jsdom-wc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдореЗрд░реА рдЖрд╢рд╛ рдФрд░ рдкреНрд░рд╛рд░реНрдердирд╛ред

@dknight рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ jsdom-wc рдЗрд╕реЗ рдереЛрдбрд╝реЗ-рдереЛрдбрд╝реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдХ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрдирдкреАрдПрдо рджрд╛рдпрд░реЗ рдХреЗ рддрд╣рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

npm install @tbranyen/[email protected] --save-dev

рдореИрдВ рдЗрд╕реЗ рдЕрдм рд╕реНрдерд┐рд░ рднреВрдорд┐ рддрдХ рдЕрдкрдиреА рд╕рднреА JSDOM рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

@tbranyen рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдХрд╛рдВрдЯрд╛ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛? рдореИрдВ рдЗрд╕реЗ рдПрдирдкреАрдПрдо рдкрд░ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛ред

@KingHenne dangit, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ "рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝" рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЬрдирддрд╛ рдХреЗ рд▓рд┐рдП npm рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдлрд╝ рдХрд░рдирд╛!

рдореБрдЭреЗ @ рдордд рдХрд░реЛ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬреИрд╕реЗ рдХрдардкреБрддрд▓реА рдХреЗ рд╕рд╛рде рд╡реЗрдм рдпреВрдЖрдИ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реИрдбреЛ рдбреЛрдо/рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рд╕рдкреЛрд░реНрдЯ рдЗрд╢реНрдпреВ рддрдм рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк @'d @Georgegriff рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдкреЛрд╕реНрдЯ рди рдХрд░реЗрдВред рдпрд╣ рдПрдХ рд╡реИрдз рд░рдгрдиреАрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдзреАрдореА рдФрд░ рдЫреЛрдЯреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЖрдИрдкреАрд╕реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рдВ рдХрдардкреБрддрд▓реА рдХреЗ рд╕рд╛рде рднреАред рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдорд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрдардкреБрддрд▓реА рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдордЬрд╛рдХ рдореЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рдбрд┐рдмрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдЙрд╕реА рдереНрд░реЗрдб рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд░рдирдЯрд╛рдЗрдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред JSDOM рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ, рдмрд╕ рдмрд┐рдЧ рдереНрд░реА рдЬрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред

рдкреЙрд▓реАрдлрд┐рд▓ рдпрд╣рд╛рдВ: https://github.com/WebReflection/document-register-element рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдЦрдХ рдХреЛ рдореЗрд░рд╛ рд╣рд╛рд░реНрджрд┐рдХ рдзрдиреНрдпрд╡рд╛рдж!

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:

npm install -D document-register-element

рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдИ рдЬрд╛рдПрдЧреА:

{ "setupFilesAfterEnv": [ "./tests/setup.js" ] }

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ ('tests/setup.js'):

import 'document-register-element'

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, document.createElement('custom-component') рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЯреБрдХрдбрд╝реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред (рд╡реИрд╕реЗ, рдореИрдВ рдЫрд╛рдпрд╛ рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди connectedCallback рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@FaBeyyy рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣реА :(

@FaBeyyy @majo44 рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЕрд░реНрдерд╛рддред document.body.appendChild(...) рдХреЗ рд▓рд┐рдП connectedCallback рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд╢реНрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдбреЛрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред

JSDOM рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ, рдмрд╕ рдмрд┐рдЧ рдереНрд░реА рдЬрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рдмрдбрд╝реЗ рджреЛ рдХреА рддрд░рд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Microsoft рдЙрдирдХреА рдЦрд╛рдИ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реА рд╣реИред

@FaBeyyy @majo44 рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЕрд░реНрдерд╛рддред document.body.appendChild(...) рдХреЗ рд▓рд┐рдП connectedCallback рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд╢реНрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдбреЛрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж рдХрдкреНрддрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдШрдЯрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рдордп рдорд┐рд▓рдиреЗ рдкрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рд░реЗрдкреЛ рд╢реЛрдХреЗрд╕ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

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

// package.json
{  ...
  "jest": {
    "transform": {
      "^.+\\.(mjs|jsx|js)$": "babel-jest"
    },
    "setupFiles": [
      "<rootDir>/node_modules/babel-polyfill/dist/polyfill.js",
      "<rootDir>/node_modules/mutationobserver-shim/dist/mutationobserver.min.js",
      "<rootDir>/node_modules/document-register-element/build/document-register-element.node.js"
    ]
  }
... 
}
//.bablerc
{
    "presets": [
        ["@babel/preset-env", { "modules": "commonjs"}]
    ]
}

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

// package.json
{  ...
  "jest": {
    "transform": {
      "^.+\\.(mjs|jsx|js)$": "babel-jest"
    },
    "setupFiles": [
      "<rootDir>/node_modules/babel-polyfill/dist/polyfill.js",
      "<rootDir>/node_modules/mutationobserver-shim/dist/mutationobserver.min.js",
      "<rootDir>/node_modules/document-register-element/build/document-register-element.node.js"
    ]
  }
... 
}

//.bablerc { "presets": [ ["@babel/preset-env", { "modules": "commonjs"}] ] }

рдЕрдЪреНрдЫрд╛ рдзрдиреНрдпрд╡рд╛рдж!

@ majo44 рдирд╡реАрдирддрдо jsdom рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп (рдЬреЛ jsdom v11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдЖрдк рдХреЗрд╡рд▓ рдЕрджреНрдпрддрди рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://www.npmjs.com/package/jest-environment-jsdom-fourteen

@mgibas рдзрдиреНрдпрд╡рд╛рдж, jest-environment-jsdom-рдЪреМрджрд╣ рдХреЗ рд╕рд╛рде рдпрд╣ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкреЙрд▓реАрдлрд┐рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 0.1.0 рд╣реИ, рдПрдХрд▓ рдкреНрд░рддрд┐рдмрджреНрдз рдкреИрдХреЗрдЬ :))

рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЯреВрдЯрдирд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рд░рд┐рд▓реАрдЬ рд╢рд╛рдЦрд╛/рд░реЗрдкреЛ рдореЗрдВ)?

npm install @tbranyen/[email protected] --save-dev

@tbranyen рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╣реАрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ? рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реЛрдВрдЧреЗ

рдореИрдВ jest-environment-jsdom-fifteen рдЬреИрд╕реЗ @ majo44 рд╕реБрдЭрд╛рдП рдЧрдП, рдФрд░ рдмреЗрдмреЗрд▓-рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рдПрд▓рд┐рдореЗрдВрдЯ (рджреЗрдЦреЗрдВ @mgibas рдЙрддреНрддрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрдм рдореИрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реЗрдм рдШрдЯрдХ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред

el.shadowRoot рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рд╣реИ:

const el;
beforeEach(async() => {
  const tag= 'my-component'
  const myEl = document.createElement(tag);
  document.body.appendChild(myEl);
  await customElements.whenDefined(tag);
  await new Promise(resolve => requestAnimationFrame(() => resolve()));
  el = document.querySelector(tag);
}

it(() => {
  const fooContent = el.shadowRoot.querySelectorAll('slot[name=foo] > *');
})

рдХрд╛рдордХрд╛рдЬ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? FYI рдХрд░реЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░реНрдорд╛, рдореЛрдЪрд╛, рдЪрд╛рдИ рдФрд░ рдЬреИрд╕реНрдореАрди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореЗрд░реЗ рдШрдЯрдХ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ:

customElements.define(
  'my-component',
  class extends HTMLElement {
    constructor() {
      super();

      const shadowRoot = this.attachShadow({ mode: 'open' });
      ...
  }
})

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП jsdom 15.1.1 рдХреЗ рд╕рд╛рде рдХреБрдЫ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреАред
рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдБ рд╢реВрдиреНрдп рдХреНрдпреЛрдВ рд╣реИ ...

рддреЛ, Element.shadowRoot 88e72ef рдХреЗ рдмрд╛рдж рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
https://github.com/jsdom/jsdom/blob/1951a19d8d40bc196cfda62a8dafa76ddda6a0d2/lib/jsdom/living/nodes/Element-impl.js#L388 -L415

document.createElement рдХреЗ рдмрд╛рдж, this._shadowDom https://github.com/jsdom/jsdom/blob/15.1.1/lib/jsdom/living/nodes/Element-impl.js#L403 рдкрд░ рдареАрдХ рд╣реИред рдФрд░ рдЫрд╛рдпрд╛ рдбреЛрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрд▓рд┐рдореЗрдВрдЯ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рд╣реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ document.body.appendChild(el) рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж el.shadowDom рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ (https://github.com/jsdom/jsdom/blob/15.1.1/lib/jsdom/living/nodes/Element-impl .js#L408), this. _shadowRoot рд╢реВрдиреНрдп рд╣реИ!

рдмрд╛рдж рдореЗрдВ рд╡рд╣реА рдмрд╛рдд

 await customElements.whenDefined(tag);
 await new Promise(resolve => requestAnimationFrame(() => resolve()));

рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

document.body.innerHTML = `
  <my-component id="fixture"></my-component>
`:

рдкреНрд░рдЬрдирди рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
https://github.com/noelmace/devcards/tree/jest

@nminhnguyen рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк @tbranyan рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдХрд╛рдВрдЯреЗ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ https://github.com/tbranyen/jsdom/tree/initial-custom-elements-impl рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВ рд▓рд┐рдЯ-рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рд▓рд┐рдЯ-рдПрд▓рд┐рдореЗрдВрдЯ рд╕реЗ рдмрдиреЗ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрд╛ред

const myElem = new MyElem();

document.body.appendChild(myElem);
await myElem.updateComplete;

console.log(myElem.shadowRoot) // exists and has the rendered markup

рдФрд░ рдЬрдм рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред createElement

const myElem = document.createElement('my-elem');

document.body.appendChild(myElem);
await myElem.updateComplete;

console.log(myElem.shadowRoot) // null

рдЬреЗрд╕реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╣реИ: setupFiles: ['document-register-element']

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ myElem рдореЗрдВ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ initialize рдЬреЛ рдХрд┐ рд▓рд┐рдЯ-рдПрд▓рд┐рдореЗрдВрдЯ рдореЗрдВ рд╣реИ, рдЙрд╕реЗ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдБ

const myElem = document.createElement('my-elem');
myElem.initialize();

document.body.appendChild(myElem);
await myElem.updateComplete;

console.log(myElem.shadowRoot) //  exists and has the rendered markup

рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдбреЛрдо:
https://www.npmjs.com/package/happy-dom

рдЬреЗрд╕реНрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг:
https://www.npmjs.com/package/jest-environment-happy-dom

рдХрдорд╛рд▓ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рд╕реЛрдо рдХреЛ, 7 рдЕрдХреНрдЯреВрдмрд░, 2019, 1:08 AM capricorn86 [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдореИ
рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛
рд╡рд╣рд╛рдБ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░/рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдбреЛрдо:
https://www.npmjs.com/package/happy-dom

рдЬреЗрд╕реНрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг:
https://www.npmjs.com/package/jest-environment-happy-dom

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/jsdom/jsdom/issues/1030?email_source=notifications&email_token=ACQ5ZD5QUEITPND4SXWOHW3QNILSRA5CNFSM4A4G5SF2YY3PNVWWK3TUL52HS4DFVREXGEA43VMVB70
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACQ5ZDYU465DXI4KHBQH4KTQNILSRANCNFSM4A4G5SFQ
.

@ рдордХрд░ 86
рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
https://github.com/EasyWebApp/WebCell/tree/v2/MobX

@ рдордХрд░ 86
рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
https://github.com/EasyWebApp/WebCell/tree/v2/MobX

рдзрдиреНрдпрд╡рд╛рдж @TechQuery!

рдХрдорд╛рд▓ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред
тАж
рд╕реЛрдо, 7 рдЕрдХреНрдЯреВрдмрд░ 2019, 1:08 AM рдордХрд░ 86 @ рдкрд░ред * > рд▓рд┐рдЦрд╛ рд╣реИ: рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░/рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдбреЛрдо: https://www.npmjs.com/package/happy-dom рдЬреЗрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ: https://www.npmjs.com/package/jest-environment-happy-dom тАФ рдЖрдк рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред рдзрд╛рдЧрд╛ред рдЗрд╕ рдИ-рдореЗрд▓ рд╕реАрдзреЗ рдЬрд╡рд╛рдм рджреЗрдВ, GitHub рдкрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ <# 1030? Email_source = рд╕реВрдЪрдирд╛рдПрдВ рдФрд░ email_token = ACQ5ZD5QUEITPND4SXWOHW3QNILSRA5CNFSM4A4G5SF2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEAOO5ZA # issuecomment-538,767,076>, рдпрд╛ рдзрд╛рдЧрд╛ рдореВрдХ https://github.com/notifications/unsubscribe-auth/ACQ5ZDYU465DXI4KHBQH4KTQNILSRANCNFSM4A4G5SFQ ред

рдзрдиреНрдпрд╡рд╛рдж @motss!

рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЯреВрдЯрдирд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рд░рд┐рд▓реАрдЬ рд╢рд╛рдЦрд╛/рд░реЗрдкреЛ рдореЗрдВ)?

рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА :)

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

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

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

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

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

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

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