From 0f9b24ca16afd210a697fcb77b645411d0539703 Mon Sep 17 00:00:00 2001
From: Dustin Wilson
Date: Fri, 26 Nov 2021 23:03:56 -0600
Subject: [PATCH] Element::insertAdjacentHTML added & tested
---
lib/Document.php | 11 +--
lib/Element.php | 76 +++++++++++++++-
lib/Node.php | 14 +++
tests/cases/TestDocument.php | 5 ++
tests/cases/TestElement.php | 160 ++++++++++++++++++++++++++++++++-
tests/cases/TestNode.php | 3 +
tests/cases/TestParentNode.php | 1 +
7 files changed, 256 insertions(+), 14 deletions(-)
diff --git a/lib/Document.php b/lib/Document.php
index aca8774..b6907ab 100644
--- a/lib/Document.php
+++ b/lib/Document.php
@@ -382,16 +382,7 @@ class Document extends Node {
$this->_characterSet = $source->encoding;
$this->_compatMode = ($source->quirksMode === Parser::NO_QUIRKS_MODE || $source->quirksMode === Parser::LIMITED_QUIRKS_MODE) ? 'CSS1Compat' : 'BackCompat';
- // If there are any templates in the document they must be cloned and replaced
- // so their contents may be stored in the HTMLTemplateElement's content document
- // fragment.
- $templates = (new \DOMXPath($this->innerNode))->query('//template[not(ancestor::template)]');
- // Iterate in reverse to prevent the live nodelist from doing anything screwy
- for ($templatesCount = count($templates), $i = $templatesCount - 1; $i >= 0; $i--) {
- $t = $templates->item($i);
- $clone = $this->cloneInnerNode($t, $this->innerNode, true, true);
- $t->parentNode->replaceChild($clone, $t);
- }
+ $this->postParsingTemplatesFix($this->innerNode);
}
public function loadFile(string $filename, ?string $charset = null): void {
diff --git a/lib/Element.php b/lib/Element.php
index a01f49c..64d77da 100644
--- a/lib/Element.php
+++ b/lib/Element.php
@@ -80,6 +80,7 @@ class Element extends Node {
# the new value as markup, and with context element.
$innerFragment = Parser::parseFragment($innerContext, Parser::NO_QUIRKS_MODE, $value, 'UTF-8');
$fragment = $innerContext->ownerDocument->getWrapperNode($innerFragment);
+ $this->postParsingTemplatesFix($innerFragment);
# 3. If the context object is a template element, then let context object be the
# template's template contents (a DocumentFragment).
@@ -158,6 +159,7 @@ class Element extends Node {
# the new value as markup, and parent as the context element.
$innerFragment = Parser::parseFragment($innerParent, Parser::NO_QUIRKS_MODE, $value, 'UTF-8');
$fragment = $this->innerNode->ownerDocument->getWrapperNode($innerFragment);
+ $this->postParsingTemplatesFix($innerFragment);
# 6. Replace the context object with fragment within the context object's
# parent.
@@ -399,6 +401,78 @@ class Element extends Node {
return $this->insertAdjacent($this, $where, $element);
}
+ public function insertAdjacentHTML(string $where, string $data): void {
+ # The insertAdjacentHTML(position, text) method must run these steps:
+ // This is from the W3C specification which the WHATWG delegates to concerning
+ // innerHTML, outerHTML and this one. Using $where and $data for the parameters
+ // to keep things consistent with the WHATWG specification.
+
+ # 1. Use the first matching item from this list:
+ $where = strtolower($where);
+ switch ($where) {
+ case 'beforebegin':
+ case 'afterend':
+ # Let context be the context object's parent.
+ $context = $this->parentNode;
+ $innerContext = $this->innerNode->parentNode;
+
+ # If context is null or a Document, throw a "NoModificationAllowedError" DOMException.
+ if ($context === null || $context instanceof Document) {
+ throw new DOMException(DOMException::NO_MODIFICATION_ALLOWED);
+ }
+ break;
+ case 'afterbegin':
+ case 'beforeend':
+ # Let context be the context object.
+ $context = $this;
+ $innerContext = $this->innerNode;
+ break;
+ default: throw new DOMException(DOMException::SYNTAX_ERROR);
+ }
+
+ # 2. If context is not an Element or the following are all true:
+ # • context's node document is an HTML document,
+ # • context's local name is "html", and
+ # • context's namespace is the HTML namespace;
+ if (!$context instanceof Element || ($context->ownerDocument instanceof Document && $context->localName === 'html' && $context->namespaceURI === Node::HTML_NAMESPACE)) {
+ # let context be a new Element with
+ # • body as its local name,
+ # • The HTML namespace as its namespace, and
+ # • The context object's node document as its node document.
+ $context = $context->ownerDocument->createElement('body');
+ $innerContext = $this->getInnerNode($context);
+ }
+
+ # 3. Let fragment be the result of invoking the fragment parsing algorithm with
+ # text as markup, and context as the context element.
+ $innerFragment = Parser::parseFragment($innerContext, Parser::NO_QUIRKS_MODE, $data, 'UTF-8');
+ $fragment = $innerContext->ownerDocument->getWrapperNode($innerFragment);
+
+ # 4. Use the first matching item from this list:
+ switch ($where) {
+ case 'beforebegin':
+ # Insert fragment into the context object's parent before the context object.
+ $this->parentNode->insertBefore($fragment, $this);
+ break;
+
+ case 'afterbegin':
+ # Insert fragment into the context object before its first child.
+ $this->insertBefore($fragment, $this->firstChild);
+ break;
+
+ case 'beforeend':
+ # Append fragment to the context object.
+ $this->appendChild($fragment);
+ break;
+
+ case 'afterend':
+ # Insert fragment into the context object's parent before the context object's
+ # next sibling.
+ $this->parentNode->insertBefore($fragment, $this->nextSibling);
+ break;
+ }
+ }
+
public function insertAdjacentText(string $where, string $data): void {
# The insertAdjacentText(where, data) method steps are:
#
@@ -597,7 +671,7 @@ class Element extends Node {
# To insert adjacent, given an element element, string where, and a node node,
# run the steps associated with the first ASCII case-insensitive match for
# where:
- switch ($where) {
+ switch (strtolower($where)) {
case 'beforebegin':
# If element’s parent is null, return null.
if ($element->parentNode === null) {
diff --git a/lib/Node.php b/lib/Node.php
index 3a93452..19a67c6 100644
--- a/lib/Node.php
+++ b/lib/Node.php
@@ -1209,6 +1209,20 @@ abstract class Node {
return null;
}
+ protected function postParsingTemplatesFix(\DOMNode $contextNode): void {
+ // If there are any templates in the document they must be cloned and replaced
+ // so their contents may be stored in the HTMLTemplateElement's content document
+ // fragment.
+ $doc = $this->getInnerDocument();
+ $templates = (new \DOMXPath($doc))->query('//template[not(ancestor::template)]', $contextNode);
+ // Iterate in reverse to prevent the live nodelist from doing anything screwy
+ for ($templatesCount = count($templates), $i = $templatesCount - 1; $i >= 0; $i--) {
+ $t = $templates->item($i);
+ $clone = $this->cloneInnerNode($t, $doc, true, true);
+ $t->parentNode->replaceChild($clone, $t);
+ }
+ }
+
protected function preInsertionBugFixes(\DOMElement &$element): void {
// PHP DOM has a really nasty bug where if a default namespaced element is
// inserted to the document and it has non-default namespaced descendants
diff --git a/tests/cases/TestDocument.php b/tests/cases/TestDocument.php
index 205b5a9..b18915e 100644
--- a/tests/cases/TestDocument.php
+++ b/tests/cases/TestDocument.php
@@ -268,6 +268,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
@@ -298,6 +299,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
*/
public function testMethod_loadFile(): void {
@@ -334,6 +336,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMException::__construct
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
*/
public function testMethod_loadFile__errors(): void {
@@ -425,6 +428,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
*/
public function testProperty_charset() {
@@ -472,6 +476,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
*/
public function testProperty_documentURI() {
diff --git a/tests/cases/TestElement.php b/tests/cases/TestElement.php
index dfd7d12..2dc6eda 100644
--- a/tests/cases/TestElement.php
+++ b/tests/cases/TestElement.php
@@ -30,6 +30,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\NonElementParentNode::getElementById
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath
@@ -114,6 +115,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -150,6 +152,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
@@ -191,6 +194,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -239,6 +243,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -283,6 +288,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -327,6 +333,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
@@ -412,6 +419,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::insertBefore
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\ParentNode::walkInner
@@ -433,12 +441,12 @@ class TestElement extends \PHPUnit\Framework\TestCase {
$dd = $d->createElement('div');
$dd->appendChild($d->createTextNode('beforebegin'));
- $p->insertAdjacentElement('beforebegin', $dd);
+ $p->insertAdjacentElement('beForebEgin', $dd);
$this->assertSame('beforebegin
Ook
', (string)$body);
$dd = $d->createElement('div');
$dd->appendChild($d->createTextNode('afterbegin'));
- $p->insertAdjacentElement('afterbegin', $dd);
+ $p->insertAdjacentElement('AfterbeGin', $dd);
$this->assertSame('beforebegin
afterbegin
Ook
', (string)$body);
$dd = $d->createElement('div');
@@ -448,15 +456,154 @@ class TestElement extends \PHPUnit\Framework\TestCase {
$dd = $d->createElement('div');
$dd->appendChild($d->createTextNode('afterend'));
- $p->insertAdjacentElement('afterend', $dd);
+ $p->insertAdjacentElement('aFteREND', $dd);
$this->assertSame('beforebegin
afterbegin
Ookbeforeend
afterend
', (string)$body);
+ $t = $d->createElement('template');
+ $t->content->appendChild($d->createTextNode('beforebegin'));
+ $p->insertAdjacentElement('beForebEgin', $t);
+ $this->assertSame('beforebegin
beforebeginafterbegin
Ookbeforeend
afterend
', (string)$body);
+
$p = $d->createElement('p');
$this->assertNull($p->insertAdjacentElement('beforebegin', $dd));
$this->assertNull($p->insertAdjacentElement('afterend', $dd));
}
+ /**
+ * @covers \MensBeam\HTML\DOM\Element::insertAdjacentHTML
+ *
+ * @covers \MensBeam\HTML\DOM\Collection::__construct
+ * @covers \MensBeam\HTML\DOM\Collection::item
+ * @covers \MensBeam\HTML\DOM\Document::__construct
+ * @covers \MensBeam\HTML\DOM\Document::__get_body
+ * @covers \MensBeam\HTML\DOM\Document::createDocumentFragment
+ * @covers \MensBeam\HTML\DOM\Document::createElement
+ * @covers \MensBeam\HTML\DOM\Document::load
+ * @covers \MensBeam\HTML\DOM\Document::serialize
+ * @covers \MensBeam\HTML\DOM\DocumentFragment::__construct
+ * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName
+ * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
+ * @covers \MensBeam\HTML\DOM\Element::__construct
+ * @covers \MensBeam\HTML\DOM\Element::__get_localName
+ * @covers \MensBeam\HTML\DOM\HTMLCollection::item
+ * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
+ * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__construct
+ * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__get_content
+ * @covers \MensBeam\HTML\DOM\Node::__construct
+ * @covers \MensBeam\HTML\DOM\Node::__get_firstChild
+ * @covers \MensBeam\HTML\DOM\Node::__get_lastChild
+ * @covers \MensBeam\HTML\DOM\Node::__get_nextSibling
+ * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
+ * @covers \MensBeam\HTML\DOM\Node::__get_parentNode
+ * @covers \MensBeam\HTML\DOM\Node::__toString
+ * @covers \MensBeam\HTML\DOM\Node::appendChild
+ * @covers \MensBeam\HTML\DOM\Node::appendChildInner
+ * @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
+ * @covers \MensBeam\HTML\DOM\Node::getInnerDocument
+ * @covers \MensBeam\HTML\DOM\Node::getInnerNode
+ * @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::insertBefore
+ * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
+ * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
+ * @covers \MensBeam\HTML\DOM\Serializer::getTemplateContent
+ * @covers \MensBeam\HTML\DOM\Text::__construct
+ * @covers \MensBeam\HTML\DOM\Inner\Document::__construct
+ * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
+ * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set
+ * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor
+ * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty
+ * @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties
+ */
+ public function testMethod_insertAdjacentHTML() {
+ $d = new Document('Ook
Ook!', 'UTF-8');
+ $body = $d->body;
+ $p = $d->getElementsByTagName('p')[0];
+ $t = $d->getElementsByTagName('template')[0];
+
+ $p->insertAdjacentHTML('beForebEgin', 'beforebegin
');
+ $this->assertSame('beforebegin
Ook
Ook!', (string)$body);
+
+ $p->insertAdjacentHTML('AfterbeGin', 'afterbegin
');
+ $this->assertSame('beforebegin
afterbegin
OokOok!', (string)$body);
+
+ $p->insertAdjacentHTML('beforeend', 'beforeend
');
+ $this->assertSame('beforebegin
afterbegin
Ookbeforeend
Ook!', (string)$body);
+
+ $p->insertAdjacentHTML('aFteREND', 'afterend
');
+ $this->assertSame('beforebegin
afterbegin
Ookbeforeend
afterend
Ook!', (string)$body);
+
+ $t->insertAdjacentHTML('beforebegin', 'beforebegin
');
+ $this->assertSame('beforebegin
afterbegin
Ookbeforeend
afterend
beforebegin
Ook!', (string)$body);
+
+ // Yes, this is correct. There are no special handling instructions for
+ // templates in this.
+ $t->insertAdjacentHTML('afterbegin', 'afterbegin
');
+ $this->assertSame('beforebegin
afterbegin
Ookbeforeend
afterend
beforebegin
Ook!', (string)$body);
+
+ $t->content->appendChild($d->createElement('div'));
+ $t->content->lastChild->insertAdjacentHTML('beforebegin', 'beforebegin
');
+ $this->assertSame('beforebegin
afterbegin
Ookbeforeend
afterend
beforebegin
Ook!beforebegin
', (string)$body);
+ }
+
+
+ public function provideMethod_insertAdjacentHTML__errors(): iterable {
+ return [
+ [ function() {
+ $d = new Document();
+ $documentElement = $d->appendChild($d->createElement('html'));
+ $documentElement->insertAdjacentHTML('beforebegin', 'Ook!');
+ }, DOMException::NO_MODIFICATION_ALLOWED ],
+
+ [ function() {
+ $d = new Document();
+ $documentElement = $d->appendChild($d->createElement('html'));
+ $documentElement->insertAdjacentHTML('fail', 'fail');
+ }, DOMException::SYNTAX_ERROR ]
+ ];
+ }
+
+ /**
+ * @dataProvider provideMethod_insertAdjacentHTML__errors
+ * @covers \MensBeam\HTML\DOM\Element::insertAdjacentHTML
+ *
+ * @covers \MensBeam\HTML\DOM\Document::__construct
+ * @covers \MensBeam\HTML\DOM\Document::createElement
+ * @covers \MensBeam\HTML\DOM\DOMException::__construct
+ * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
+ * @covers \MensBeam\HTML\DOM\Element::__construct
+ * @covers \MensBeam\HTML\DOM\Node::__construct
+ * @covers \MensBeam\HTML\DOM\Node::__get_parentNode
+ * @covers \MensBeam\HTML\DOM\Node::appendChild
+ * @covers \MensBeam\HTML\DOM\Node::getInnerDocument
+ * @covers \MensBeam\HTML\DOM\Node::getInnerNode
+ * @covers \MensBeam\HTML\DOM\Node::getRootNode
+ * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
+ * @covers \MensBeam\HTML\DOM\Inner\Document::__construct
+ * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
+ * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key
+ * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set
+ * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor
+ * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty
+ */
+ public function testMethod_insertAdjacentHTML__errors(\Closure $closure, int $errorCode) {
+ $this->expectException(DOMException::class);
+ $this->expectExceptionCode($errorCode);
+ $closure();
+ }
+
+
/**
* @covers \MensBeam\HTML\DOM\Element::insertAdjacentText
*
@@ -485,6 +632,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::insertBefore
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\Text::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
@@ -526,6 +674,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\NonElementParentNode::getElementById
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath
@@ -614,6 +763,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
@@ -672,6 +822,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -772,6 +923,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -1036,6 +1188,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
@@ -1066,6 +1219,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::get
diff --git a/tests/cases/TestNode.php b/tests/cases/TestNode.php
index e7c74cf..3686bd3 100644
--- a/tests/cases/TestNode.php
+++ b/tests/cases/TestNode.php
@@ -63,6 +63,7 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::isEqualInnerNode
* @covers \MensBeam\HTML\DOM\Node::isEqualNode
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\ParentNode::walkInner
@@ -155,6 +156,7 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::removeChild
* @covers \MensBeam\HTML\DOM\NonElementParentNode::getElementById
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
@@ -1063,6 +1065,7 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
diff --git a/tests/cases/TestParentNode.php b/tests/cases/TestParentNode.php
index d817f20..bc4078e 100644
--- a/tests/cases/TestParentNode.php
+++ b/tests/cases/TestParentNode.php
@@ -42,6 +42,7 @@ class TestParentNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
+ * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
* @covers \MensBeam\HTML\DOM\ParentNode::scopeMatchSelector
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode