@@ -1439,6 +1439,128 @@ describe("pat-inject", function () {
14391439                        expect ( pattern . onTrigger ) . toHaveBeenCalledTimes ( 1 ) ; 
14401440                    } ) ; 
14411441                } ) ; 
1442+ 
1443+                 describe ( "9.2.4.6 - Validation on submit" ,  ( )  =>  { 
1444+                     it ( "9.2.4.6.1 - Submit valid forms." ,  async  function  ( )  { 
1445+                         document . body . innerHTML  =  ` 
1446+                           <form action="." class="pat-inject"> 
1447+                             <input name="ok" /> 
1448+                             <button>submit</button> 
1449+                           </form> 
1450+                         ` ; 
1451+                         jest . spyOn ( pattern ,  "execute" ) ; 
1452+ 
1453+                         const  form  =  document . querySelector ( "form" ) ; 
1454+                         const  button  =  form . querySelector ( "button" ) ; 
1455+ 
1456+                         // add submit listener 
1457+                         let  catched  =  false ; 
1458+                         form . addEventListener ( "submit" ,  ( )  =>  { 
1459+                             catched  =  true ; 
1460+                         } ) ; 
1461+ 
1462+                         pattern . init ( $ ( form ) ) ; 
1463+                         await  utils . timeout ( 1 ) ;  // wait a tick for async to settle. 
1464+ 
1465+                         button . click ( ) ; 
1466+ 
1467+                         expect ( catched ) . toBe ( true ) ; 
1468+                         expect ( pattern . execute ) . toHaveBeenCalled ( ) ; 
1469+                     } ) ; 
1470+ 
1471+                     it ( "9.2.4.6.2 - Do not submit invalid forms." ,  async  function  ( )  { 
1472+                         document . body . innerHTML  =  ` 
1473+                           <form action="." class="pat-inject"> 
1474+                             <input name="ok" required /> 
1475+                             <button>submit</button> 
1476+                           </form> 
1477+                         ` ; 
1478+                         jest . spyOn ( pattern ,  "execute" ) ; 
1479+ 
1480+                         const  form  =  document . querySelector ( "form" ) ; 
1481+                         const  button  =  form . querySelector ( "button" ) ; 
1482+ 
1483+                         // add submit listener 
1484+                         let  catched  =  false ; 
1485+                         form . addEventListener ( "submit" ,  ( )  =>  { 
1486+                             catched  =  true ; 
1487+                         } ) ; 
1488+ 
1489+                         pattern . init ( $ ( form ) ) ; 
1490+                         await  utils . timeout ( 1 ) ;  // wait a tick for async to settle. 
1491+ 
1492+                         button . click ( ) ; 
1493+ 
1494+                         expect ( catched ) . toBe ( false ) ; 
1495+                         expect ( pattern . execute ) . not . toHaveBeenCalled ( ) ; 
1496+                     } ) ; 
1497+ 
1498+                     it ( "9.2.4.6.3 - Respect a form novalidate attribute and allow submission." ,  async  function  ( )  { 
1499+                         document . body . innerHTML  =  ` 
1500+                           <form novalidate action="." class="pat-inject"> 
1501+                             <input name="ok" required /> 
1502+                             <button>submit</button> 
1503+                           </form> 
1504+                         ` ; 
1505+                         jest . spyOn ( pattern ,  "execute" ) ; 
1506+ 
1507+                         const  form  =  document . querySelector ( "form" ) ; 
1508+                         const  button  =  form . querySelector ( "button" ) ; 
1509+ 
1510+                         // add submit listener 
1511+                         let  catched  =  false ; 
1512+                         form . addEventListener ( "submit" ,  ( )  =>  { 
1513+                             catched  =  true ; 
1514+                         } ) ; 
1515+ 
1516+                         pattern . init ( $ ( form ) ) ; 
1517+                         await  utils . timeout ( 1 ) ;  // wait a tick for async to settle. 
1518+ 
1519+                         button . click ( ) ; 
1520+ 
1521+                         expect ( catched ) . toBe ( true ) ; 
1522+                         expect ( pattern . execute ) . toHaveBeenCalled ( ) ; 
1523+                     } ) ; 
1524+ 
1525+                     // The following test does not work with jsDOM 25.0.1. 
1526+                     // jsDOM supports `form[novalidate]` but not `button[formnovalidate]` 
1527+                     // Ref: https://github.com/jsdom/jsdom/pull/3249 
1528+                     it . skip ( "9.2.4.6.4 - Respect a formnovalidate attribute on buttons and allow submission." ,  async  function  ( )  { 
1529+                         document . body . innerHTML  =  ` 
1530+                           <form action="." class="pat-inject"> 
1531+                             <input name="ok" required /> 
1532+                             <button class="cancel" formnovalidate>cancel</button> 
1533+                             <button class="submit">submit</button> 
1534+                           </form> 
1535+                         ` ; 
1536+                         jest . spyOn ( pattern ,  "execute" ) ; 
1537+ 
1538+                         const  form  =  document . querySelector ( "form" ) ; 
1539+                         const  button_cancel  =  form . querySelector ( "button.cancel" ) ; 
1540+                         const  button_submit  =  form . querySelector ( "button.submit" ) ; 
1541+ 
1542+                         // add submit listener 
1543+                         let  catched  =  false ; 
1544+                         form . addEventListener ( "submit" ,  ( )  =>  { 
1545+                             catched  =  true ; 
1546+                         } ) ; 
1547+ 
1548+                         pattern . init ( $ ( form ) ) ; 
1549+                         await  utils . timeout ( 1 ) ;  // wait a tick for async to settle. 
1550+ 
1551+                         button_submit . click ( ) ; 
1552+ 
1553+                         expect ( catched ) . toBe ( false ) ; 
1554+                         expect ( pattern . execute ) . not . toHaveBeenCalled ( ) ; 
1555+ 
1556+                         button_cancel . click ( ) ; 
1557+ 
1558+                         expect ( catched ) . toBe ( true ) ; 
1559+                         expect ( pattern . execute ) . toHaveBeenCalled ( ) ; 
1560+ 
1561+                     } ) ; 
1562+ 
1563+                 } ) ; 
14421564            } ) ; 
14431565        } ) ; 
14441566    } ) ; 
0 commit comments