- Timestamp:
- 08/10/2023 08:35:55 AM (18 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tests/phpunit/tests/html-api/wpHtmlProcessorSemanticRules.php
r56331 r56380 16 16 * RULES FOR "IN BODY" MODE 17 17 *******************************************************************/ 18 19 /** 20 * Verifies that when encountering an end tag for which there is no corresponding 21 * element in scope, that it skips the tag entirely. 22 * 23 * @ticket 58961 24 * 25 * @since 6.4.0 26 * 27 * @throws Exception 28 */ 29 public function test_in_body_skips_unexpected_button_closer() { 30 $p = WP_HTML_Processor::createFragment( '<div>Test</button></div>' ); 31 32 $p->step(); 33 $this->assertEquals( 'DIV', $p->get_tag(), 'Did not stop at initial DIV tag.' ); 34 $this->assertFalse( $p->is_tag_closer(), 'Did not find that initial DIV tag is an opener.' ); 35 36 /* 37 * When encountering the BUTTON closing tag, there is no BUTTON in the stack of open elements. 38 * It should be ignored as there's no BUTTON to close. 39 */ 40 $this->assertTrue( $p->step(), 'Found no further tags when it should have found the closing DIV' ); 41 $this->assertEquals( 'DIV', $p->get_tag(), "Did not skip unexpected BUTTON; stopped at {$p->get_tag()}." ); 42 $this->assertTrue( $p->is_tag_closer(), 'Did not find that the terminal DIV tag is a closer.' ); 43 } 44 45 /** 46 * Verifies insertion of a BUTTON element when no existing BUTTON is already in scope. 47 * 48 * @ticket 58961 49 * 50 * @since 6.4.0 51 * 52 * @throws WP_HTML_Unsupported_Exception 53 */ 54 public function test_in_body_button_with_no_button_in_scope() { 55 $p = WP_HTML_Processor::createFragment( '<div><p>Click the button <button one>here</button>!</p></div><button two>not here</button>' ); 56 57 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected first button.' ); 58 $this->assertTrue( $p->get_attribute( 'one' ), 'Failed to match expected attribute on first button.' ); 59 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'P', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for first button.' ); 60 61 /* 62 * There's nothing special about this HTML construction, but it's important to verify that 63 * the HTML Processor can find a BUTTON under normal and normative scenarios, not just the 64 * malformed and unexpected ones. 65 */ 66 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected second button.' ); 67 $this->assertTrue( $p->get_attribute( 'two' ), 'Failed to match expected attribute on second button.' ); 68 $this->assertSame( array( 'HTML', 'BODY', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for second button.' ); 69 } 70 71 /** 72 * Verifies what when inserting a BUTTON element, when a BUTTON is already in scope, 73 * that the open button is closed with all other elements inside of it. 74 * 75 * @ticket 58961 76 * 77 * @since 6.4.0 78 * 79 * @throws WP_HTML_Unsupported_Exception 80 */ 81 public function test_in_body_button_with_button_in_scope_as_parent() { 82 $p = WP_HTML_Processor::createFragment( '<div><p>Click the button <button one>almost<button two>here</button>!</p></div><button three>not here</button>' ); 83 84 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected first button.' ); 85 $this->assertTrue( $p->get_attribute( 'one' ), 'Failed to match expected attribute on first button.' ); 86 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'P', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for first button.' ); 87 88 /* 89 * A naive parser might skip the second BUTTON because it's looking for the close of the first one, 90 * or it may place it as a child of the first one, but it implicitly closes the open BUTTON. 91 */ 92 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected second button.' ); 93 $this->assertTrue( $p->get_attribute( 'two' ), 'Failed to match expected attribute on second button.' ); 94 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'P', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for second button.' ); 95 96 /* 97 * This is another form of the test for the second button, but from a different side. The test is 98 * looking for proper handling of the open and close sequence for the BUTTON tags. 99 */ 100 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected third button.' ); 101 $this->assertTrue( $p->get_attribute( 'three' ), 'Failed to match expected attribute on third button.' ); 102 $this->assertSame( array( 'HTML', 'BODY', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for third button.' ); 103 } 104 105 /** 106 * Verifies what when inserting a BUTTON element, when a BUTTON is already in scope, 107 * that the open button is closed with all other elements inside of it, even if the 108 * BUTTON in scope is not a direct parent of the new BUTTON element. 109 * 110 * @ticket 58961 111 * 112 * @since 6.4.0 113 * 114 * @throws WP_HTML_Unsupported_Exception 115 */ 116 public function test_in_body_button_with_button_in_scope_as_ancestor() { 117 $p = WP_HTML_Processor::createFragment( '<div><button one><p>Click the button <span><button two>here</button>!</span></p></div><button three>not here</button>' ); 118 119 // This button finds itself normally nesting inside the DIV. 120 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected first button.' ); 121 $this->assertTrue( $p->get_attribute( 'one' ), 'Failed to match expected attribute on first button.' ); 122 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for first button.' ); 123 124 /* 125 * Because the second button appears while a BUTTON is in scope, it generates implied end tags and closes 126 * the BUTTON, P, and SPAN elements. It looks like the BUTTON is inside the SPAN, but it's another case 127 * of an unexpected closing SPAN tag because the SPAN was closed by the second BUTTON. This element finds 128 * itself a child of the most-recent open element above the most-recent BUTTON, or the DIV. 129 */ 130 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected second button.' ); 131 $this->assertTrue( $p->get_attribute( 'two' ), 'Failed to match expected attribute on second button.' ); 132 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for second button.' ); 133 134 // The third button is back to normal, because everything has been implicitly or explicitly closed by now. 135 $this->assertTrue( $p->next_tag( 'BUTTON' ), 'Could not find expected third button.' ); 136 $this->assertTrue( $p->get_attribute( 'three' ), 'Failed to match expected attribute on third button.' ); 137 $this->assertSame( array( 'HTML', 'BODY', 'BUTTON' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting for third button.' ); 138 } 18 139 19 140 /* … … 58 179 $this->assertSame( array( 'HTML', 'BODY', 'DIV', 'SPAN', 'CODE' ), $p->get_breadcrumbs(), 'Failed to produce expected DOM nesting.' ); 59 180 60 $this->assertTrue( $p-> next_tag(), 'Failed to advance past CODE tag to expected SPAN closer.' );181 $this->assertTrue( $p->step(), 'Failed to advance past CODE tag to expected SPAN closer.' ); 61 182 $this->assertTrue( $p->is_tag_closer(), 'Expected to find closing SPAN, but found opener instead.' ); 62 183 $this->assertSame( array( 'HTML', 'BODY', 'DIV' ), $p->get_breadcrumbs(), 'Failed to advance past CODE tag to expected DIV opener.' );
Note: See TracChangeset
for help on using the changeset viewer.