Browse Source

Node::innerNode is now public faux read only

master 1.0.3
Dustin Wilson 2 years ago
parent
commit
f731a3fe00
  1. 30
      README.md
  2. 16
      lib/Attr.php
  3. 16
      lib/CharacterData.php
  4. 12
      lib/ChildNode.php
  5. 2
      lib/DOMImplementation.php
  6. 6
      lib/DOMTokenList.php
  7. 106
      lib/Document.php
  8. 16
      lib/DocumentOrElement.php
  9. 8
      lib/DocumentType.php
  10. 70
      lib/Element.php
  11. 12
      lib/HTMLElement.php
  12. 12
      lib/Inner/Document.php
  13. 2
      lib/NamedNodeMap.php
  14. 124
      lib/Node.php
  15. 4
      lib/NonDocumentTypeChildNode.php
  16. 2
      lib/NonElementParentNode.php
  17. 16
      lib/ParentNode.php
  18. 2
      lib/ProcessingInstruction.php
  19. 4
      lib/Serializer.php
  20. 4
      lib/Text.php
  21. 2
      lib/XMLDocument.php
  22. 4
      lib/XPathEvaluate.php
  23. 2
      lib/XPathExpression.php
  24. 100
      tests/cases/TestAttr.php
  25. 6
      tests/cases/TestChildNode.php
  26. 5
      tests/cases/TestDOMImplementation.php
  27. 31
      tests/cases/TestDOMTokenList.php
  28. 20
      tests/cases/TestDocument.php
  29. 44
      tests/cases/TestElement.php
  30. 2
      tests/cases/TestHTMLElement.php
  31. 36
      tests/cases/TestInnerDocument.php
  32. 8
      tests/cases/TestNamedNodeMap.php
  33. 44
      tests/cases/TestNode.php
  34. 8
      tests/cases/TestParentNode.php
  35. 6
      tests/cases/TestSerializer.php
  36. 2
      tests/cases/TestXPathEvaluate.php
  37. 2
      tests/cases/TestXPathExpression.php

30
README.md

@ -6,6 +6,7 @@
[f]: https://html.spec.whatwg.org/multipage/dom.html
[g]: https://php.net/manual/en/book.dom.php
[h]: https://www.php.net/manual/en/book.ctype.php
[i]: https://code.mensbeam.com/MensBeam/Lit
# HTML DOM #
@ -216,6 +217,8 @@ Common namespace constants are provided in `MensBeam\HTML\DOM\Node` to make usin
namespace MensBeam\HTML\DOM;
partial abstract class Node implements \Stringable {
public readonly \DOMNode $innerNode;
// Common namespace constants provided for convenience
public const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
public const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
@ -235,6 +238,13 @@ partial abstract class Node implements \Stringable {
}
```
#### Properties ####
*innerNode*: A readonly property that returns the encapsulated inner element.
**WARNING**: Manipulating this node directly can result in unexpected behavior. This is available in the public API only so the class may be interfaced with other libraries which expect a \\DOMDocument object such as [mensbeam\\lit][i].
#### MensBeam\HTML\DOM\Node::getNodePath ####
Carryover from PHP's DOM. It's a useful method that returns an XPath location path for the node. Returns a string if successful or null on failure.
@ -353,6 +363,26 @@ Found 2 nodes with classes starting with 'subtitle':
partial class XPathResult implements \ArrayAccess, \Countable, \Iterator {}
```
### MensBeam\HTML\DOM\Inner\Document ###
This is the document object that is wrapped. There are a few things that are publicly available. This is only available in the public API so the class may be interfaced with other libraries which expect a \\DOMDocument object such as [mensbeam\\lit][i].
```php
namespace MensBeam\HTML\DOM\Inner;
partial abstract class Document extends \DOMDocument {
public readonly \MensBeam\HTML\DOM\Node $wrapperNode;
public function getWrapperNode(\DOMNode $node): ?\MensBeam\HTML\DOM\Node;
}
```
#### MensBeam\HTML\DOM\Inner\Document::getWrapperNode ####
Returns the wrapper node that corresponds to the provided inner node. If one does not exist it is created.
* `node`: The inner node to use to look up/create the wrapper node with.
## Limitations & Differences from Specification ##
The primary aim of this library is accuracy. However, due either to limitations imposed by PHP's DOM, by assumptions made by the specification that aren't applicable to a PHP library, or simply because of impracticality some changes have needed to be made. These are as follows:

16
lib/Attr.php

@ -13,7 +13,7 @@ class Attr extends Node {
protected function __get_localName(): string {
// PHP's DOM does this correctly already.
// Need to uncoerce string if necessary.
$localName = $this->innerNode->localName;
$localName = $this->_innerNode->localName;
return (!str_contains(needle: 'U', haystack: $localName)) ? $localName : $this->uncoerceName($localName);
}
@ -21,29 +21,29 @@ class Attr extends Node {
// PHP's DOM incorrectly returns the local name instead of the qualified name
// per the specification.
// Need to uncoerce string if necessary.
$name = $this->innerNode->nodeName;
$name = $this->_innerNode->nodeName;
return (!str_contains(needle: 'U', haystack: $name)) ? $name : $this->uncoerceName($name);
}
protected function __get_namespaceURI(): ?string {
return $this->innerNode->namespaceURI;
return $this->_innerNode->namespaceURI;
}
protected function __get_ownerElement(): ?Element {
// PHP's DOM does this correctly already.
$innerOwnerElement = $this->innerNode->ownerElement;
$innerOwnerElement = $this->_innerNode->ownerElement;
if ($innerOwnerElement === null) {
return null;
}
return $this->innerNode->ownerDocument->getWrapperNode($this->innerNode->ownerElement);
return $this->_innerNode->ownerDocument->getWrapperNode($this->_innerNode->ownerElement);
}
protected function __get_prefix(): string {
// PHP's DOM does this correctly already.
// Need to uncoerce string if necessary.
$prefix = $this->innerNode->prefix;
$prefix = $this->_innerNode->prefix;
return (!str_contains(needle: 'U', haystack: $prefix)) ? $prefix : $this->uncoerceName($prefix);
}
@ -54,11 +54,11 @@ class Attr extends Node {
protected function __get_value(): string {
// PHP's DOM does this correctly already.
return $this->innerNode->value;
return $this->_innerNode->value;
}
protected function __set_value(string $value) {
// PHP's DOM does this correctly already.
$this->innerNode->value = $value;
$this->_innerNode->value = $value;
}
}

16
lib/CharacterData.php

@ -15,41 +15,41 @@ abstract class CharacterData extends Node {
protected function __get_data(): string {
// PHP's DOM does this correctly already.
return $this->innerNode->data;
return $this->_innerNode->data;
}
protected function __set_data(string $value): void {
// PHP's DOM does this correctly already.
$this->innerNode->data = $value;
$this->_innerNode->data = $value;
}
protected function __get_length(): int {
// PHP's DOM does this correctly already.
return $this->innerNode->length;
return $this->_innerNode->length;
}
public function appendData(string $data) {
$this->innerNode->data .= $data;
$this->_innerNode->data .= $data;
}
public function deleteData(int $offset, int $count) {
// PHP's DOM does this correctly already.
return $this->innerNode->deleteData($offset, $count);
return $this->_innerNode->deleteData($offset, $count);
}
public function insertData(int $offset, string $data) {
// PHP's DOM does this correctly already.
return $this->innerNode->insertData($offset, $data);
return $this->_innerNode->insertData($offset, $data);
}
public function replaceData(int $offset, int $count, string $data) {
// PHP's DOM does this correctly already.
return $this->innerNode->replaceData($offset, $count, $data);
return $this->_innerNode->replaceData($offset, $count, $data);
}
public function substringData(int $offset, int $count): string {
// PHP's DOM does this correctly already.
return $this->innerNode->substringData($offset, $count);
return $this->_innerNode->substringData($offset, $count);
}
}

12
lib/ChildNode.php

@ -21,7 +21,7 @@ trait ChildNode {
# The after(nodes) method steps are:
#
# 1. Let parent be this’s parent.
$inner = $this->innerNode;
$inner = $this->_innerNode;
$parent = $this->parentNode;
# 2. If parent is null, then return.
@ -35,7 +35,7 @@ trait ChildNode {
$viableNextSibling = null;
while ($n = $n->nextSibling) {
foreach ($nodes as $nodeOrString) {
if ($nodeOrString instanceof Node && $this->getInnerNode($nodeOrString) === $n) {
if ($nodeOrString instanceof Node && $nodeOrString->innerNode === $n) {
continue 2;
}
}
@ -59,7 +59,7 @@ trait ChildNode {
# The before(nodes) method steps are:
#
# 1. Let parent be this’s parent.
$inner = $this->innerNode;
$inner = $this->_innerNode;
$parent = $this->parentNode;
# 2. If parent is null, then return.
@ -73,7 +73,7 @@ trait ChildNode {
$viablePreviousSibling = null;
while ($n = $n->previousSibling) {
foreach ($nodes as $nodeOrString) {
if ($nodeOrString instanceof Node && $this->getInnerNode($nodeOrString) === $n) {
if ($nodeOrString instanceof Node && $nodeOrString->innerNode === $n) {
continue 2;
}
}
@ -112,7 +112,7 @@ trait ChildNode {
# The replaceWith(nodes) method steps are:
#
# 1. Let parent be this’s parent.
$inner = $this->innerNode;
$inner = $this->_innerNode;
$parent = $this->parentNode;
# 2. If parent is null, then return.
@ -126,7 +126,7 @@ trait ChildNode {
$viableNextSibling = null;
while ($n = $n->nextSibling) {
foreach ($nodes as $nodeOrString) {
if ($nodeOrString instanceof Node && $this->getInnerNode($nodeOrString) === $n) {
if ($nodeOrString instanceof Node && $nodeOrString->innerNode === $n) {
continue 2;
}
}

2
lib/DOMImplementation.php

@ -101,7 +101,7 @@ class DOMImplementation {
# 2. Return a new doctype, with qualifiedName as its name, publicId as its
# public ID, and systemId as its system ID, and with its node document set to
# the associated document of this.
$innerDocument = Reflection::getProtectedProperty($this->document->get(), 'innerNode');
$innerDocument = $this->document->get()->innerNode;
// PHP's DOM won't accept an empty string as the qualifiedName, so use a space
// instead which won't be encountered elsewhere because it violates the QName
// production; this will be worked around in DocumentType.

6
lib/DOMTokenList.php

@ -38,7 +38,7 @@ class DOMTokenList implements \ArrayAccess, \Countable, \Iterator {
protected function __set_value(string $value) {
# Setting the value attribute must set an attribute value for the associated
# element using associated attribute’s local name and the given value.
$element = Reflection::getProtectedProperty($this->element->get(), 'innerNode');
$element = $this->element->get()->innerNode;
$element->setAttribute($this->localName, $value);
// Also update the token set and the length.
$this->tokenSet = $this->parseOrderedSet($value);
@ -63,7 +63,7 @@ class DOMTokenList implements \ArrayAccess, \Countable, \Iterator {
$this->supportedTokens = $supportedTokens;
# 3. Let value be the result of getting an attribute value given element and
# localName.
$element = Reflection::getProtectedProperty($element, 'innerNode');
$element = $element->innerNode;
$value = $element->getAttribute($attributeLocalName);
# 4. Run the attribute change steps for element, localName, value, value, and
# null.
@ -326,7 +326,7 @@ class DOMTokenList implements \ArrayAccess, \Countable, \Iterator {
protected function update(): void {
# A DOMTokenList object’s update steps are:
$element = Reflection::getProtectedProperty($this->element->get(), 'innerNode');
$element = $this->element->get()->innerNode;
# 1. If the associated element does not have an associated attribute and token
# set is empty, then return.

106
lib/Document.php

@ -33,7 +33,7 @@ class Document extends Node implements \ArrayAccess {
protected string $_URL = 'about:blank';
protected function __get_body(): ?Element {
$documentElement = $this->innerNode->documentElement;
$documentElement = $this->_innerNode->documentElement;
if ($documentElement === null) {
return null;
}
@ -134,14 +134,14 @@ class Document extends Node implements \ArrayAccess {
protected function __get_doctype(): ?DocumentType {
// PHP's DOM does this correctly already.
$doctype = $this->innerNode->doctype;
return ($doctype !== null) ? $this->innerNode->getWrapperNode($doctype) : null;
$doctype = $this->_innerNode->doctype;
return ($doctype !== null) ? $this->_innerNode->getWrapperNode($doctype) : null;
}
protected function __get_documentElement(): ?Element {
// PHP's DOM does this correctly already.
$documentElement = $this->innerNode->documentElement;
return ($documentElement !== null) ? $this->innerNode->getWrapperNode($documentElement) : null;
$documentElement = $this->_innerNode->documentElement;
return ($documentElement !== null) ? $this->_innerNode->getWrapperNode($documentElement) : null;
}
protected function __get_documentURI(): string {
@ -154,7 +154,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $this->innerNode->xpath->query(".//embed[namespace-uri()='$namespace']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $this->_innerNode->xpath->query(".//embed[namespace-uri()='$namespace']"));
}
protected function __get_forms(): HTMLCollection {
@ -163,7 +163,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $this->innerNode->xpath->query(".//form[namespace-uri()='$namespace']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $this->_innerNode->xpath->query(".//form[namespace-uri()='$namespace']"));
}
protected function __get_head(): ?Element {
@ -171,12 +171,12 @@ class Document extends Node implements \ArrayAccess {
# the html element, if there is one, or null otherwise.
# The head attribute, on getting, must return the head element of the document
# (a head element or null).
$documentElement = $this->innerNode->documentElement;
$documentElement = $this->_innerNode->documentElement;
if ($documentElement !== null) {
$children = $documentElement->childNodes;
foreach ($children as $child) {
if ($child instanceof \DOMElement && $child->namespaceURI === null && $child->tagName === 'head') {
return $this->innerNode->getWrapperNode($child);
return $this->_innerNode->getWrapperNode($child);
}
}
}
@ -190,7 +190,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $this->innerNode->xpath->query(".//img[namespace-uri()='$namespace']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $this->_innerNode->xpath->query(".//img[namespace-uri()='$namespace']"));
}
protected function __get_implementation(): DOMImplementation {
@ -208,7 +208,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $this->innerNode->xpath->query(".//*[namespace-uri()='$namespace' and @href][name()='a' or name()='area']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $this->_innerNode->xpath->query(".//*[namespace-uri()='$namespace' and @href][name()='a' or name()='area']"));
}
protected function __get_plugins(): HTMLCollection {
@ -222,7 +222,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $this->innerNode->xpath->query(".//script[namespace-uri()='$namespace']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $this->_innerNode->xpath->query(".//script[namespace-uri()='$namespace']"));
}
protected function __get_title(): string {
@ -230,7 +230,7 @@ class Document extends Node implements \ArrayAccess {
# 1. If the document element is an SVG svg element, then let value be the child text
# content of the first SVG title element that is a child of the document element.
$value = '';
$documentElement = $this->innerNode->documentElement;
$documentElement = $this->_innerNode->documentElement;
if ($documentElement === null) {
return '';
}
@ -249,7 +249,7 @@ class Document extends Node implements \ArrayAccess {
else {
# The title element of a document is the first title element in the document (in
# tree order), if there is one, or null otherwise.
$title = $this->innerNode->getElementsByTagName('title');
$title = $this->_innerNode->getElementsByTagName('title');
if ($title->length > 0) {
$value = $title->item(0)->textContent ?? '';
}
@ -264,7 +264,7 @@ class Document extends Node implements \ArrayAccess {
# On setting, the steps corresponding to the first matching condition in the following list must be run:
#
# If the document element is an SVG svg element
$documentElement = $this->innerNode->documentElement;
$documentElement = $this->_innerNode->documentElement;
if ($documentElement === null) {
return;
}
@ -285,10 +285,10 @@ class Document extends Node implements \ArrayAccess {
if ($element === null) {
# 1. Let element be the result of creating an element given the document element's
# node document, title, and the SVG namespace.
$element = $this->innerNode->createElementNS(Node::SVG_NAMESPACE, 'title');
$element = $this->_innerNode->createElementNS(Node::SVG_NAMESPACE, 'title');
# 2. Insert element as the first child of the document element.
$this->innerNode->documentElement->appendChild($element);
$this->_innerNode->documentElement->appendChild($element);
}
# 3. String replace all with the given value within element.
@ -303,7 +303,7 @@ class Document extends Node implements \ArrayAccess {
# tree order), if there is one, or null otherwise.
$title = null;
$element = null;
$titles = $this->innerNode->getElementsByTagName('title');
$titles = $this->_innerNode->getElementsByTagName('title');
if ($titles->length > 0) {
$title = $titles->item(0);
}
@ -331,7 +331,7 @@ class Document extends Node implements \ArrayAccess {
else {
# 1. Let element be the result of creating an element given the document
# element's node document, title, and the HTML namespace.
$element = $this->innerNode->createElementNS(Node::SVG_NAMESPACE, 'title');
$element = $this->_innerNode->createElementNS(Node::SVG_NAMESPACE, 'title');
# 2. Append element to the head element.
$head->appendChild($element);
@ -371,7 +371,7 @@ class Document extends Node implements \ArrayAccess {
self::$cache = new NodeCache(); //@codeCoverageIgnore
}
self::$cache->set($this, $this->innerNode);
self::$cache->set($this, $this->_innerNode);
}
@ -404,7 +404,7 @@ class Document extends Node implements \ArrayAccess {
}
// Remove node from the inner document's node cache.
Reflection::getProtectedProperty($this->getInnerNode($node)->ownerDocument, 'nodeCache')->delete($node);
Reflection::getProtectedProperty($node->innerNode->ownerDocument, 'nodeCache')->delete($node);
# 5. Return node.
$node = $newNode;
@ -412,7 +412,7 @@ class Document extends Node implements \ArrayAccess {
}
public function createAttribute(string $localName): Attr {
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
# The createAttribute(localName) method steps are:
#
@ -456,7 +456,7 @@ class Document extends Node implements \ArrayAccess {
$attr = $this->cloneInnerNode($attr, $innerNode);
}
return $this->innerNode->getWrapperNode($attr);
return $this->_innerNode->getWrapperNode($attr);
}
public function createAttributeNS(?string $namespace, string $qualifiedName): Attr {
@ -471,7 +471,7 @@ class Document extends Node implements \ArrayAccess {
// cannot create attribute nodes if there's no document element. So, create the
// attribute node in a separate document which does have a document element and
// then import
$target = $this->innerNode;
$target = $this->_innerNode;
$documentElement = $this->documentElement;
if ($documentElement === null) {
$target = new \DOMDocument();
@ -498,10 +498,10 @@ class Document extends Node implements \ArrayAccess {
}
if ($documentElement === null) {
$attr = $this->cloneInnerNode($attr, $this->innerNode);
$attr = $this->cloneInnerNode($attr, $this->_innerNode);
}
return $this->innerNode->getWrapperNode($attr);
return $this->_innerNode->getWrapperNode($attr);
}
public function createCDATASection(string $data): CDATASection {
@ -520,15 +520,15 @@ class Document extends Node implements \ArrayAccess {
# 3. Return a new CDATASection node with its data set to data and node document
# set to this.
return $this->innerNode->getWrapperNode($this->innerNode->createCDATASection($data));
return $this->_innerNode->getWrapperNode($this->_innerNode->createCDATASection($data));
}
public function createComment(string $data): Comment {
return $this->innerNode->getWrapperNode($this->innerNode->createComment($data));
return $this->_innerNode->getWrapperNode($this->_innerNode->createComment($data));
}
public function createDocumentFragment(): DocumentFragment {
return $this->innerNode->getWrapperNode($this->innerNode->createDocumentFragment());
return $this->_innerNode->getWrapperNode($this->_innerNode->createDocumentFragment());
}
public function createElement(string $localName): Element {
@ -559,15 +559,15 @@ class Document extends Node implements \ArrayAccess {
# null, is, and with the synchronous custom elements flag set.
try {
$element = $this->innerNode->createElementNS(null, $localName);
$element = $this->_innerNode->createElementNS(null, $localName);
} catch (\DOMException $e) {
// The element name is invalid for XML
// Replace any offending characters with "UHHHHHH" where H are the
// uppercase hexadecimal digits of the character's code point
$element = $this->innerNode->createElementNS(null, $this->coerceName($localName));
$element = $this->_innerNode->createElementNS(null, $this->coerceName($localName));
}
return $this->innerNode->getWrapperNode($element);
return $this->_innerNode->getWrapperNode($element);
}
public function createElementNS(?string $namespace, string $qualifiedName): Element {
@ -588,33 +588,33 @@ class Document extends Node implements \ArrayAccess {
// DEVIATION: There is no scripting in this implementation.
try {
$element = $this->innerNode->createElementNS($namespace, $qualifiedName);
$element = $this->_innerNode->createElementNS($namespace, $qualifiedName);
} catch (\DOMException $e) {
// The element name is invalid for XML
// Replace any offending characters with "UHHHHHH" where H are the
// uppercase hexadecimal digits of the character's code point
$qualifiedName = $this->coerceName($prefix) . ':' . $this->coerceName($localName);
$element = $this->innerNode->createElementNS($namespace, $qualifiedName);
$element = $this->_innerNode->createElementNS($namespace, $qualifiedName);
}
return $this->innerNode->getWrapperNode($element);
return $this->_innerNode->getWrapperNode($element);
}
public function createProcessingInstruction(string $target, string $data): ProcessingInstruction {
try {
$instruction = $this->innerNode->createProcessingInstruction($target, $data);
$instruction = $this->_innerNode->createProcessingInstruction($target, $data);
} catch (\DOMException $e) {
// The target is invalid for XML
// Replace any offending characters with "UHHHHHH" where H are the
// uppercase hexadecimal digits of the character's code point
$instruction = $this->innerNode->createProcessingInstruction($this->coerceName($target), $data);
$instruction = $this->_innerNode->createProcessingInstruction($this->coerceName($target), $data);
}
return $this->innerNode->getWrapperNode($instruction);
return $this->_innerNode->getWrapperNode($instruction);
}
public function createTextNode(string $data): Text {
return $this->innerNode->getWrapperNode($this->innerNode->createTextNode($data));
return $this->_innerNode->getWrapperNode($this->_innerNode->createTextNode($data));
}
public function getElementsByName(string $elementName): NodeList {
@ -627,7 +627,7 @@ class Document extends Node implements \ArrayAccess {
// Because of how namespaces are handled internally they're null when a HTML document.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
// NodeLists cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NodeList', $this->innerNode, $this->innerNode->xpath->query(".//*[namespace-uri()='$namespace' and @name='$elementName']"));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NodeList', $this->_innerNode, $this->_innerNode->xpath->query(".//*[namespace-uri()='$namespace' and @name='$elementName']"));
}
public function importNode(Node|\DOMNode $node, bool $deep = false): Node {
@ -642,7 +642,7 @@ class Document extends Node implements \ArrayAccess {
# 2. Return a clone of node, with this and the clone children flag set if deep
# is true.
return ($node instanceof \DOMNode) ? $this->innerNode->getWrapperNode($this->cloneInnerNode($node, $this->innerNode, $deep)) : $this->cloneWrapperNode($node, $this, $deep);
return ($node instanceof \DOMNode) ? $this->_innerNode->getWrapperNode($this->cloneInnerNode($node, $this->_innerNode, $deep)) : $this->cloneWrapperNode($node, $this, $deep);
}
public function load(string $source = null, ?string $charset = null): void {
@ -660,11 +660,11 @@ class Document extends Node implements \ArrayAccess {
$config->encodingFallback = Charset::fromCharset($charset);
}
$source = Parser::parseInto($source, $this->innerNode, null, $config);
$source = Parser::parseInto($source, $this->_innerNode, null, $config);
$this->_characterSet = $source->encoding;
$this->_compatMode = ($source->quirksMode === Parser::NO_QUIRKS_MODE || $source->quirksMode === Parser::LIMITED_QUIRKS_MODE) ? 'CSS1Compat' : 'BackCompat';
$this->postParsingTemplatesFix($this->innerNode);
$this->postParsingTemplatesFix($this->_innerNode);
}
public function loadFile(string $filename, ?string $charset = null): void {
@ -712,7 +712,7 @@ class Document extends Node implements \ArrayAccess {
}
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
return ($this->innerNode->xpath->query(".//*[(name()='form' or name()='iframe' or name()='img') and namespace-uri()='$namespace' and @name='$offset'] | .//img[namespace-uri()='$namespace' and @id='$offset' and @name and not(@name='')] | .//embed[namespace-uri()='$namespace' and @name='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])] | .//object[namespace-uri()='$namespace' and @id='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])]")->length > 0);
return ($this->_innerNode->xpath->query(".//*[(name()='form' or name()='iframe' or name()='img') and namespace-uri()='$namespace' and @name='$offset'] | .//img[namespace-uri()='$namespace' and @id='$offset' and @name and not(@name='')] | .//embed[namespace-uri()='$namespace' and @name='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])] | .//object[namespace-uri()='$namespace' and @id='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])]")->length > 0);
}
public function offsetGet(mixed $offset): Element|HTMLCollection|null {
@ -759,7 +759,7 @@ class Document extends Node implements \ArrayAccess {
# ancestor, and, for object elements, is additionally either not showing its
# fallback content or has no object or embed descendants.
$namespace = (!$this instanceof XMLDocument) ? '' : Node::HTML_NAMESPACE;
$elements = $this->innerNode->xpath->query(".//*[(name()='form' or name()='iframe' or name()='img') and namespace-uri()='$namespace' and @name='$offset'] | .//img[namespace-uri()='$namespace' and @id='$offset' and @name and not(@name='')] | .//embed[namespace-uri()='$namespace' and @name='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])] | .//object[namespace-uri()='$namespace' and @id='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])]");
$elements = $this->_innerNode->xpath->query(".//*[(name()='form' or name()='iframe' or name()='img') and namespace-uri()='$namespace' and @name='$offset'] | .//img[namespace-uri()='$namespace' and @id='$offset' and @name and not(@name='')] | .//embed[namespace-uri()='$namespace' and @name='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])] | .//object[namespace-uri()='$namespace' and @id='$offset' and not(ancestor::object[namespace-uri()='$namespace']) and not(descendant::*[(name()='embed' or name()='object') and namespace-uri()='$namespace'])]");
# NOTE: There will be at least one such element, by definition.
// This algorithm seems to expect user agents to keep up with a list of named
@ -779,13 +779,13 @@ class Document extends Node implements \ArrayAccess {
# 3. Otherwise, if elements has only one element, return that element.
if ($elements->length === 1) {
return $this->innerNode->getWrapperNode($elements->item(0));
return $this->_innerNode->getWrapperNode($elements->item(0));
}
# 4. Otherwise return an HTMLCollection rooted at the Document node, whose
# filter matches only named elements with the name name.
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->innerNode, $elements);
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $this->_innerNode, $elements);
}
public function offsetSet(mixed $offset, mixed $value): void {
@ -804,17 +804,11 @@ class Document extends Node implements \ArrayAccess {
public function serialize(?Node $node = null, array $config = []): string {
$node = $node ?? $this;
if ($node !== $this) {
if ($node->ownerDocument !== $this) {
throw new DOMException(DOMException::WRONG_DOCUMENT);
}
$node = $this->getInnerNode($node);
} else {
$node = $node->innerNode;
if ($node !== $this && $node->ownerDocument !== $this) {
throw new DOMException(DOMException::WRONG_DOCUMENT);
}
return Serializer::serialize($node, $config);
return Serializer::serialize($node->innerNode, $config);
}

16
lib/DocumentOrElement.php

@ -21,7 +21,7 @@ use MensBeam\HTML\Parser\Data;
*/
trait DocumentOrElement {
public function getElementsByClassName(string $classNames): HTMLCollection {
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
$doc = $this->getInnerDocument();
$wrapperDoc = ($this instanceof Document) ? $this : $this->ownerDocument;
@ -81,7 +81,7 @@ trait DocumentOrElement {
# 1. If qualifiedName is U+002A (*), then return a HTMLCollection rooted at
# root, whose filter matches only descendant elements.
if ($qualifiedName === '*') {
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->_innerNode));
}
# 2. Otherwise, if root’s node document is an HTML document, return a
@ -94,12 +94,12 @@ trait DocumentOrElement {
if (!$wrapperDoc instanceof XMLDocument) {
// Because of a PHP DOM bug all HTML namespaced elements use null internally as
// their namespace.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//' . strtolower($qualifiedName) . "[namespace-uri()=''] | .//{$qualifiedName}[not(namespace-uri()='')]", $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//' . strtolower($qualifiedName) . "[namespace-uri()=''] | .//{$qualifiedName}[not(namespace-uri()='')]", $this->_innerNode));
}
# 3. Otherwise, return a HTMLCollection rooted at root, whose filter matches
# descendant elements whose qualified name is qualifiedName.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $this->innerNode->getElementsByTagNameNS(null, $qualifiedName));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $this->_innerNode->getElementsByTagNameNS(null, $qualifiedName));
}
public function getElementsByTagNameNS(?string $namespace, string $localName): HTMLCollection {
@ -128,24 +128,24 @@ trait DocumentOrElement {
# 2. If both namespace and localName are U+002A (*), then return a HTMLCollection
# rooted at root, whose filter matches descendant elements.
if ($namespace === '*' && $localName === '*') {
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->_innerNode));
}
# 3. If namespace is U+002A (*), then return a HTMLCollection rooted at root, whose
# filter matches descendant elements whose local name is localName.
if ($namespace === '*') {
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query(".//*[local-name()='$localName']", $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query(".//*[local-name()='$localName']", $this->_innerNode));
}
# 4. If localName is U+002A (*), then return a HTMLCollection rooted at root, whose
# filter matches descendant elements whose namespace is namespace.
if ($localName === '*') {
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query(".//*[namespace-uri()='$namespace']", $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query(".//*[namespace-uri()='$namespace']", $this->_innerNode));
}
# 5. Return a HTMLCollection rooted at root, whose filter matches descendant
# elements whose namespace is namespace and local name is localName.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $this->innerNode->getElementsByTagNameNS($namespace, $localName));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $this->_innerNode->getElementsByTagNameNS($namespace, $localName));
}

8
lib/DocumentType.php

@ -23,8 +23,8 @@ class DocumentType extends Node {
// itself cannot create a doctype with an empty string as the name, the HTML
// parser can. PHP's DOM cannot handle an empty string as the name, so a single
// space (an invalid value) is used instead and coerced to an empty string.
$name = $this->innerNode->name;
return ($name !== ' ') ? $this->innerNode->name : '';
$name = $this->_innerNode->name;
return ($name !== ' ') ? $this->_innerNode->name : '';
}
protected function __get_ownerDocument(): ?Document {
@ -32,11 +32,11 @@ class DocumentType extends Node {
}
protected function __get_publicId(): string {
return $this->innerNode->publicId;
return $this->_innerNode->publicId;
}
protected function __get_systemId(): string {
return $this->innerNode->systemId;
return $this->_innerNode->systemId;
}

70
lib/Element.php

@ -22,7 +22,7 @@ class Element extends Node {
protected function __get_attributes(): NamedNodeMap {
// NamedNodeMaps cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NamedNodeMap', $this, ($this instanceof Document) ? $this->innerNode : $this->innerNode->ownerDocument, $this->innerNode->attributes);
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NamedNodeMap', $this, ($this instanceof Document) ? $this->_innerNode : $this->_innerNode->ownerDocument, $this->_innerNode->attributes);
}
protected function __get_classList(): DOMTokenList {
@ -64,7 +64,7 @@ class Element extends Node {
# might throw an exception instead of returning a string).
// TODO: If adding better XML support this should require XML well-formed
// serialization here.
return Serializer::serializeInner($this->innerNode);
return Serializer::serializeInner($this->_innerNode);
}
protected function __set_innerHTML(string $value): void {
@ -75,7 +75,7 @@ class Element extends Node {
// There's no scripting in this implementation and therefore no shadow root
// object.
$context = $this;
$innerContext = $this->innerNode;
$innerContext = $this->_innerNode;
# 2. Let fragment be the result of invoking the fragment parsing algorithm with
# the new value as markup, and with context element.
@ -89,7 +89,7 @@ class Element extends Node {
# its template contents (template.content) rather than its children.
if ($this instanceof HTMLTemplateElement) {
$context = $this->content;
$innerContext = $this->getInnerNode($context);
$innerContext = $context->innerNode;
}
# 4. Replace all with fragment within the context object.
@ -108,7 +108,7 @@ class Element extends Node {
protected function __get_localName(): ?string {
// PHP's DOM does this correctly already.
return $this->innerNode->localName;
return $this->_innerNode->localName;
}
protected function __get_namespaceURI(): ?string {
@ -116,7 +116,7 @@ class Element extends Node {
// use the HTML namespace anyway it has additional bugs we don't have to work
// around because of the wrapper classes; So, use the null namespace internally
// but print out the HTML namespace instead.
$namespace = $this->innerNode->namespaceURI;
$namespace = $this->_innerNode->namespaceURI;
return (!$this->ownerDocument instanceof XMLDocument && $namespace === null) ? self::HTML_NAMESPACE : $namespace;
}
@ -127,7 +127,7 @@ class Element extends Node {
# returning a string).
// TODO: If adding better XML support this should require XML well-formed
// serialization here.
return Serializer::serialize($this->innerNode);
return Serializer::serialize($this->_innerNode);
}
protected function __set_outerHTML(string $value): void {
@ -135,7 +135,7 @@ class Element extends Node {
#
# 1. Let parent be the context object's parent.
$parent = $this->parentNode;
$innerParent = $this->innerNode->parentNode;
$innerParent = $this->_innerNode->parentNode;
# 2. If parent is null, terminate these steps. There would be no way to obtain a
# reference to the nodes created even if the remaining steps were run.
@ -153,13 +153,13 @@ class Element extends Node {
# • The HTML namespace as its namespace, and
# • The context object's node document as its node document.
if ($innerParent instanceof \DOMDocumentFragment) {
$innerParent = $this->innerNode->ownerDocument->createElement('body');
$innerParent = $this->_innerNode->ownerDocument->createElement('body');
}
# 5. Let fragment be the result of invoking the fragment parsing algorithm with
# 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);
$fragment = $this->_innerNode->ownerDocument->getWrapperNode($innerFragment);
$this->postParsingTemplatesFix($innerFragment);
# 6. Replace the context object with fragment within the context object's
@ -168,7 +168,7 @@ class Element extends Node {
}
protected function __get_prefix(): ?string {
$prefix = $this->innerNode->prefix;
$prefix = $this->_innerNode->prefix;
return ($prefix !== '') ? $prefix : null;
}
@ -205,7 +205,7 @@ class Element extends Node {
// the queries generated by Symfony's library aren't conducive to that kind of
// query, so we must instead manually loop instead of having XPath do it for
// us...
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
$doc = $this->getInnerDocument();
$xpath = $doc->xpath;
$n = $innerNode;
@ -252,7 +252,7 @@ class Element extends Node {
# The getAttributeNames() method steps are to return the qualified names of the
# attributes in this’s attribute list, in order; otherwise a new list.
$list = [];
$attributes = $this->innerNode->attributes;
$attributes = $this->_innerNode->attributes;
if ($attributes !== null) {
foreach ($attributes as $attr) {
$list[] = $attr->nodeName;
@ -282,10 +282,10 @@ class Element extends Node {
// Manually going through the attributes because PHP DOM has issues, returning
// odd "DOMNamespaceNode" objects sometimes instead of the actual attributes...
// yeah...
$attributes = $this->innerNode->attributes;
$attributes = $this->_innerNode->attributes;
foreach ($attributes as $attr) {
if ($attr->nodeName === $qualifiedName) {
return $this->innerNode->ownerDocument->getWrapperNode($attr);
return $this->_innerNode->ownerDocument->getWrapperNode($attr);
}
}
@ -313,10 +313,10 @@ class Element extends Node {
// Manually going through the attributes because PHP DOM has issues, returning
// odd "DOMNamespaceNode" objects sometimes instead of the actual attributes...
// yeah...
$attributes = $this->innerNode->attributes;
$attributes = $this->_innerNode->attributes;
foreach ($attributes as $attr) {
if ($attr->namespaceURI === $namespace && $attr->localName === $localName) {
return $this->innerNode->ownerDocument->getWrapperNode($attr);
return $this->_innerNode->ownerDocument->getWrapperNode($attr);
}
}
@ -354,7 +354,7 @@ class Element extends Node {
# An element has an attribute A if its attribute list contains A.
// Going to try to handle this by getting the PHP DOM to do the heavy lifting
// when we can because it's faster.
$value = $this->innerNode->hasAttribute($qualifiedName);
$value = $this->_innerNode->hasAttribute($qualifiedName);
if (!$value) {
// PHP DOM does not acknowledge the presence of XMLNS-namespace attributes,
// so try it again just in case; getAttributeNode will coerce names if
@ -378,7 +378,7 @@ class Element extends Node {
# An element has an attribute A if its attribute list contains A.
// Going to try to handle this by getting the PHP DOM to do the heavy lifting
// when we can because it's faster.
$value = $this->innerNode->hasAttributeNS($namespace, $localName);
$value = $this->_innerNode->hasAttributeNS($namespace, $localName);
if (!$value) {
// PHP DOM does not acknowledge the presence of XMLNS-namespace attributes,
// so try it again just in case; getAttributeNode will coerce names if
@ -393,7 +393,7 @@ class Element extends Node {
# The hasAttributes() method steps are to return false if this’s attribute list
# is empty; otherwise true.
// PHP's DOM does this correctly already.
return $this->innerNode->hasAttributes();
return $this->_innerNode->hasAttributes();
}
public function insertAdjacentElement(string $where, Element $element): ?Element {
@ -415,7 +415,7 @@ class Element extends Node {
case 'afterend':
# Let context be the context object's parent.
$context = $this->parentNode;
$innerContext = $this->innerNode->parentNode;
$innerContext = $this->_innerNode->parentNode;
# If context is null or a Document, throw a "NoModificationAllowedError" DOMException.
if ($context === null || $context instanceof Document) {
@ -426,7 +426,7 @@ class Element extends Node {
case 'beforeend':
# Let context be the context object.
$context = $this;
$innerContext = $this->innerNode;
$innerContext = $this->_innerNode;
break;
default: throw new DOMException(DOMException::SYNTAX_ERROR);
}
@ -441,7 +441,7 @@ class Element extends Node {
# • 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);
$innerContext = $context->innerNode;
}
# 3. Let fragment be the result of invoking the fragment parsing algorithm with
@ -502,7 +502,7 @@ class Element extends Node {
# 3. If the result of match a selector against an element, using s, this, and
# :scope element this, returns success, then return true; otherwise, return
# false. [SELECTORS4]
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
// Query the parent as the context node, yes. This is due to how the XPath
// queries are generated from Symfony.
return ($innerNode->ownerDocument->xpath->query($s, $innerNode->parentNode)->item(0) === $innerNode);
@ -520,7 +520,7 @@ class Element extends Node {
# 2. If attr is non-null, then remove attr.
# 3. Return attr.
// Going to let PHP's DOM do the heavy lifting here instead
$this->innerNode->removeAttribute($this->coerceName($qualifiedName));
$this->_innerNode->removeAttribute($this->coerceName($qualifiedName));
}
public function removeAttributeNode(Attr $attr): Attr {
@ -532,7 +532,7 @@ class Element extends Node {
# 2. Remove attr.
try {
$this->innerNode->removeAttributeNode(Reflection::getProtectedProperty($attr, 'innerNode'));
$this->_innerNode->removeAttributeNode($attr->innerNode);
} catch (\DOMException $e) {
throw new DOMException($e->code);
}
@ -553,7 +553,7 @@ class Element extends Node {
# 2. If attr is non-null, then remove attr.
# 3. Return attr.
// Going to let PHP's DOM do the heavy lifting here instead
$this->innerNode->removeAttributeNS($namespace, $this->coerceName($localName));
$this->_innerNode->removeAttributeNS($namespace, $this->coerceName($localName));
}
public function setAttribute(string $qualifiedName, string $value): void {
@ -578,18 +578,18 @@ class Element extends Node {
// Going to try to handle this by getting the PHP DOM to do the heavy lifting
// when we can because it's faster.
try {
$this->innerNode->setAttributeNS(null, $qualifiedName, $value);
$this->_innerNode->setAttributeNS(null, $qualifiedName, $value);
} catch (\DOMException $e) {
// The attribute name is invalid for XML
// Replace any offending characters with "UHHHHHH" where H are the uppercase
// hexadecimal digits of the character's code point
$this->innerNode->setAttributeNS(null, $this->coerceName($qualifiedName), $value);
$this->_innerNode->setAttributeNS(null, $this->coerceName($qualifiedName), $value);
}
// If you create an id attribute it won't be used by PHP in getElementById, so
// let's fix that.
if ($qualifiedName === 'id') {
$this->innerNode->setIdAttribute($qualifiedName, true);
$this->_innerNode->setIdAttribute($qualifiedName, true);
}
}
@ -618,12 +618,12 @@ class Element extends Node {
# 4. If oldAttr is non-null, then replace oldAttr with attr.
if ($oldAttr !== null) {
$this->innerNode->setAttributeNode($this->getInnerNode($attr));
$this->_innerNode->setAttributeNode($attr->innerNode);
return $attr;
}
# 5. Otherwise, append attr to element.
else {
$this->innerNode->appendChild($this->getInnerNode($attr));
$this->_innerNode->appendChild($attr->innerNode);
return $attr;
}
@ -653,13 +653,13 @@ class Element extends Node {
$attr->value = $this->escapeString($value, true);
$this->setAttributeNodeNS($attr);
} else {
$this->innerNode->setAttributeNS($namespace, $qualifiedName, $value);
$this->_innerNode->setAttributeNS($namespace, $qualifiedName, $value);
}
// If you create an id attribute this way it won't be used by PHP in
// getElementById, so let's fix that.
if ($namespace === null && $qualifiedName === 'id') {
$this->innerNode->setIdAttribute($qualifiedName, true);
$this->_innerNode->setIdAttribute($qualifiedName, true);
}
}
@ -671,7 +671,7 @@ class Element extends Node {
protected function getRenderedTextFragment(string $input): \DOMDocumentFragment {
# The rendered text fragment for a string input given a Document document is the
# result of running the following steps:
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
$fragment = $innerNode->ownerDocument->createDocumentFragment();
# 1. Let position be a position variable for input, initially pointing at the

12
lib/HTMLElement.php

@ -25,7 +25,7 @@ class HTMLElement extends Element {
# The autocapitalize getter steps are to:
#
# 1. Let state be the own autocapitalization hint of this.
$state = $this->autoCapitalizationHint($this->innerNode);
$state = $this->autoCapitalizationHint($this->_innerNode);
# 2. If state is default, then return the empty string.
# 3. If state is none, then return "none".
@ -224,7 +224,7 @@ class HTMLElement extends Element {
return true;
}
$n = $this->innerNode;
$n = $this->_innerNode;
$doc = $n->ownerDocument;
while ($n = $n->parentNode) {
if ($doc->getWrapperNode($n) instanceof HTMLElement && $n->hasAttribute('hidden')) {
@ -267,7 +267,7 @@ class HTMLElement extends Element {
$fragment = $this->getRenderedTextFragment($value);
# 2. Replace all with fragment within this.
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
$children = $innerNode->childNodes;
while ($innerNode->hasChildNodes()) {
$innerNode->removeChild($innerNode->firstChild);
@ -331,7 +331,7 @@ class HTMLElement extends Element {
}
}
$n = $this->innerNode;
$n = $this->_innerNode;
while ($n = $n->parentNode) {
if ($n instanceof \DOMElement) {
if ($n->getAttribute('contenteditable') === 'true' && $n->ownerDocument->getWrapperNode($n) instanceof HTMLElement) {
@ -364,7 +364,7 @@ class HTMLElement extends Element {
# The outerText setter steps are:
# 1. If this's parent is null, then throw a "NoModificationAllowedError"
# DOMException.
$innerNode = $this->innerNode;
$innerNode = $this->_innerNode;
if ($this->parentNode === null) {
throw new DOMException(DOMException::NO_MODIFICATION_ALLOWED);
}
@ -475,7 +475,7 @@ class HTMLElement extends Element {
return false;
}
$n = $this->innerNode;
$n = $this->_innerNode;
$doc = $n->ownerDocument;
while ($n = $n->parentNode) {
// This looks weird but it's faster to check for the method here first because

12
lib/Inner/Document.php

@ -67,6 +67,18 @@ class Document extends \DOMDocument {
return $this->wrapperNode;
}
if ($node instanceof \DOMDocument) {
throw new DOMException(DOMException::NOT_SUPPORTED);
}
// There's no way to see whether unappended doctypes are owned by a document in
// PHP DOM because of a bug where unappended doctypes have a null owner
// document. This is worked around in the wrapper DOM but a problem here when
// creating the wrapper node.
if (!$node instanceof \DOMDocumentType && $node->ownerDocument !== $this) {
throw new DOMException(DOMException::WRONG_DOCUMENT);
}
// If the wrapper node already exists then return that.
if ($wrapperNode = $this->nodeCache->get($node)) {
return $wrapperNode;

2
lib/NamedNodeMap.php

@ -71,7 +71,7 @@ class NamedNodeMap extends Collection {
# 2. If lowercaseName is not equal to name, remove name from names.
# 3. Return names.
$innerElement = Reflection::getProtectedProperty($this->element, 'innerNode');
$innerElement = $this->element->innerNode;
$innerDocument = $innerElement->ownerDocument;
$attributes = $innerElement->attributes;
if ($attributes->length > 0) {

124
lib/Node.php

@ -52,7 +52,7 @@ abstract class Node implements \Stringable {
public const WALK_SKIP_CHILDREN = 0x04;
public const WALK_STOP = 0x08;
protected \DOMNode $innerNode;
protected \DOMNode $_innerNode;
protected array $bullshitReplacements = [];
private static ?int $rand = null;
@ -63,7 +63,7 @@ abstract class Node implements \Stringable {
#
# The document base URL of a Document object is the absolute URL obtained by running these steps:
$doc = ($this instanceof Document) ? $this : $this->ownerDocument;
$base = $this->getInnerNode($doc)->getElementsByTagName('base');
$base = $doc->innerNode->getElementsByTagName('base');
foreach ($base as $b) {
$href = $b->getAttribute('href');
# 2. Otherwise, return the frozen base URL of the first base element in the
@ -90,18 +90,22 @@ abstract class Node implements \Stringable {
}
protected function __get_childNodes(): NodeList {
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NodeList', ($this instanceof Document) ? $this->innerNode : $this->innerNode->ownerDocument, $this->innerNode->childNodes);
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\NodeList', ($this instanceof Document) ? $this->_innerNode : $this->_innerNode->ownerDocument, $this->_innerNode->childNodes);
}
protected function __get_firstChild(): ?Node {
// PHP's DOM does this correctly already.
if (!$value = $this->innerNode->firstChild) {
if (!$value = $this->_innerNode->firstChild) {
return null;
}
return $this->getInnerDocument()->getWrapperNode($value);
}
protected function __get_innerNode(): \DOMNode {
return $this->_innerNode;
}
protected function __get_isConnected(): bool {
# The isConnected getter steps are to return true, if this is connected;
# otherwise false.
@ -111,7 +115,7 @@ abstract class Node implements \Stringable {
protected function __get_lastChild(): ?Node {
// PHP's DOM does this correctly already.
if (!$value = $this->innerNode->lastChild) {
if (!$value = $this->_innerNode->lastChild) {
return null;
}
@ -120,7 +124,7 @@ abstract class Node implements \Stringable {
protected function __get_previousSibling(): ?Node {
// PHP's DOM does this correctly already.
if (!$value = $this->innerNode->previousSibling) {
if (!$value = $this->_innerNode->previousSibling) {
return null;
}
@ -129,7 +133,7 @@ abstract class Node implements \Stringable {
protected function __get_nextSibling(): ?Node {
// PHP's DOM does this correctly already.
if (!$value = $this->innerNode->nextSibling) {
if (!$value = $this->_innerNode->nextSibling) {
return null;
}
@ -150,7 +154,7 @@ abstract class Node implements \Stringable {
// Attribute nodes and processing instructions need the node name uncoerced if
// necessary
elseif ($this instanceof Attr || $this instanceof ProcessingInstruction) {
$nodeName = $this->innerNode->nodeName;
$nodeName = $this->_innerNode->nodeName;
return (!str_contains(needle: 'U', haystack: $nodeName)) ? $nodeName : $this->uncoerceName($nodeName);
}
// While the DOM itself cannot create a doctype with an empty string as the
@ -162,12 +166,12 @@ abstract class Node implements \Stringable {
}
// PHP's DOM handles everything correctly on everything else.
return $this->innerNode->nodeName;
return $this->_innerNode->nodeName;
}
protected function __get_nodeType(): int {
// PHP's DOM does this correctly already.
return $this->innerNode->nodeType;
return $this->_innerNode->nodeType;
}
protected function __get_nodeValue(): ?string {
@ -182,7 +186,7 @@ abstract class Node implements \Stringable {
// PHP's DOM mostly does this correctly with the exception of Element, so let's
// fall back to PHP's DOM on everything else.
return $this->innerNode->nodeValue;
return $this->_innerNode->nodeValue;
}
protected function __set_nodeValue(?string $value) {
@ -198,18 +202,19 @@ abstract class Node implements \Stringable {
// PHP's DOM mostly does this correctly with the exception of Element, so let's
// fall back to PHP's DOM on everything else.
$this->innerNode->nodeValue = $value;
$this->_innerNode->nodeValue = $value;
}
protected function __get_ownerDocument(): ?Document {
# The ownerDocument getter steps are to return null, if this is a document;
# otherwise this’s node document.
// PHP's DOM does this correctly already.
if ($this instanceof Document || !$ownerDocument = $this->innerNode->ownerDocument) {
// PHP's DOM does this correctly on everything but document types. That's taken
// care of in DocumentType.
if ($this instanceof Document || !$ownerDocument = $this->_innerNode->ownerDocument) {
return null;
}
return $this->innerNode->ownerDocument->getWrapperNode($ownerDocument);
return $this->_innerNode->ownerDocument->getWrapperNode($ownerDocument);
}
protected function __get_parentElement(): ?Element {
@ -229,7 +234,7 @@ abstract class Node implements \Stringable {
return null;
}
$parent = $this->innerNode->parentNode;
$parent = $this->_innerNode->parentNode;
if ($parent === null) {
return null;
}
@ -244,7 +249,7 @@ abstract class Node implements \Stringable {
// PHP's DOM does this correctly already with the exception of Document and
// DocumentType.
return $this->innerNode->textContent;
return $this->_innerNode->textContent;
}
protected function __set_textContent(string $value): void {
@ -270,28 +275,28 @@ abstract class Node implements \Stringable {
# data is string and node document is parent’s node document.
// string is $value
if ($value !== '') {
$node = $this->innerNode->ownerDocument->createTextNode($value);
$node = $this->_innerNode->ownerDocument->createTextNode($value);
}
# 3. Replace all with node within parent.
while ($this->innerNode->hasChildNodes()) {
$this->innerNode->removeChild($this->innerNode->firstChild);
while ($this->_innerNode->hasChildNodes()) {
$this->_innerNode->removeChild($this->_innerNode->firstChild);
}
if ($value !== '') {
$this->innerNode->appendChild($node);
$this->_innerNode->appendChild($node);
}
}
# ↪ Attr
# This's value
elseif ($this instanceof Attr) {
$this->innerNode->value = $value;
$this->_innerNode->value = $value;
}
# ↪ CharacterData
# Replace data with node this, offset 0, count this’s length, and data the given
# value.
elseif ($this instanceof CharacterData) {
$this->innerNode->data = $value;
$this->_innerNode->data = $value;
}
# ↪ Otherwise
# Do nothing.
@ -301,13 +306,13 @@ abstract class Node implements \Stringable {
protected function __construct(\DOMNode $innerNode) {
$this->innerNode = $innerNode;
$this->_innerNode = $innerNode;
}
public function appendChild(Node $node): Node {
$this->preInsertionValidity($node);
$this->innerNode->appendChild($this->getInnerNode($node));
$this->_innerNode->appendChild($node->innerNode);
$this->postInsertionBugFixes();
return $node;
}
@ -336,8 +341,8 @@ abstract class Node implements \Stringable {
# 2. Let node1 be other and node2 be this.
$node1 = $other;
$node2 = $this;
$innerNode1 = $this->getInnerNode($other);
$innerNode2 = $this->innerNode;
$innerNode1 = $other->innerNode;
$innerNode2 = $this->_innerNode;
$doc = $this->getInnerDocument();
# 3. Let attr1 and attr2 be null.
@ -433,11 +438,11 @@ abstract class Node implements \Stringable {
}
public function contains(?Node $other): bool {
return $this->containsInner($this->innerNode, $this->getInnerNode($other));
return $this->containsInner($this->_innerNode, $other->innerNode);
}
public function getNodePath(): ?string {
return $this->innerNode->getNodePath();
return $this->_innerNode->getNodePath();
}
public function getRootNode(): ?Node {
@ -449,7 +454,7 @@ abstract class Node implements \Stringable {
# The root of an object is itself, if its parent is null, or else it is the root
# of its parent. The root of a tree is any object participating in that tree
# whose parent is null.
$node = $this->innerNode;
$node = $this->_innerNode;
if ($node->parentNode === null) {
return $this;
}
@ -463,14 +468,14 @@ abstract class Node implements \Stringable {
public function hasChildNodes(): bool {
// PHP's DOM does this correctly already.
return $this->innerNode->hasChildNodes();
return $this->_innerNode->hasChildNodes();
}
public function insertBefore(Node $node, ?Node $child = null): Node {
# The insertBefore(node, child) method steps are to return the result of
# pre-inserting node into this before child.
$this->preInsertionValidity($node, $child);
$this->innerNode->insertBefore($this->getInnerNode($node), ($child !== null) ? $this->getInnerNode($child) : null);
$this->_innerNode->insertBefore($node->innerNode, ($child !== null) ? $child->innerNode : null);
$this->postInsertionBugFixes();
return $node;
}
@ -488,13 +493,13 @@ abstract class Node implements \Stringable {
# 2. Let defaultNamespace be the result of running locate a namespace for this
# using null.
# 3. Return true if defaultNamespace is the same as namespace; otherwise false.
return ($this->locateNamespace($this->innerNode, null) === $namespace);
return ($this->locateNamespace($this->_innerNode, null) === $namespace);
}
public function isEqualNode(?Node $otherNode) {
# The isEqualNode(otherNode) method steps are to return true if otherNode is
# non-null and this equals otherNode; otherwise false.
return $this->isEqualInnerNode($this->innerNode, $this->getInnerNode($otherNode));
return $this->isEqualInnerNode($this->_innerNode, $otherNode->innerNode);
}
public function isSameNode(?Node $otherNode) {
@ -518,7 +523,7 @@ abstract class Node implements \Stringable {
# ↪ Element
if ($this instanceof Element) {
# Return the result of locating a namespace prefix for it using namespace.
return $this->locateNamespacePrefix($this->innerNode, $namespace);
return $this->locateNamespacePrefix($this->_innerNode, $namespace);
}
# ↪ Document
@ -526,7 +531,7 @@ abstract class Node implements \Stringable {
$documentElement = $this->documentElement;
# Return the result of locating a namespace prefix for its document element, if
# its document element is non-null; otherwise null.
return ($documentElement !== null) ? $this->locateNamespacePrefix($this->getInnerNode($documentElement), $namespace) : null;
return ($documentElement !== null) ? $this->locateNamespacePrefix($documentElement->innerNode, $namespace) : null;
}
# ↪ DocumentType
@ -539,14 +544,14 @@ abstract class Node implements \Stringable {
elseif ($this instanceof Attr) {
# Return the result of locating a namespace prefix for its element, if its
# element is non-null; otherwise null.
return $this->locateNamespacePrefix($this->getInnerNode($this->ownerElement), $namespace);
return $this->locateNamespacePrefix($this->ownerElement->innerNode, $namespace);
}
# ↪ Otherwise
# Return the result of locating a namespace prefix for its parent element,
# if its parent element is non-null; otherwise null.
$parentElement = $this->parentElement;
return ($parentElement !== null) ? $this->locateNamespacePrefix($this->getInnerNode($parentElement), $namespace) : null;
return ($parentElement !== null) ? $this->locateNamespacePrefix($parentElement->innerNode, $namespace) : null;
}
public function lookupNamespaceURI(?string $prefix = null): ?string {
@ -560,24 +565,24 @@ abstract class Node implements \Stringable {
}
# 2. Return the result of running locate a namespace for this using prefix.
return $this->locateNamespace($this->innerNode, $prefix);
return $this->locateNamespace($this->_innerNode, $prefix);
}
public function normalize(): void {
// PHP's DOM does this correctly already.
$this->innerNode->normalize();
$this->_innerNode->normalize();
}
public function removeChild(Node $child): Node {
// PHP's DOM does this correctly already.
return $this->getInnerDocument()->getWrapperNode($this->innerNode->removeChild($this->getInnerNode($child)));
return $this->getInnerDocument()->getWrapperNode($this->_innerNode->removeChild($child->innerNode));
}
public function replaceChild(Node $node, Node $child): Node {
$wrapperNode = $node;
$node = $this->getInnerNode($node);
$child = $this->getInnerNode($child);
$inner = $this->innerNode;
$node = $node->innerNode;
$child = $child->innerNode;
$inner = $this->_innerNode;
# The replaceChild(node, child) method steps are to return the result of
# replacing child with node within this.
@ -768,7 +773,7 @@ abstract class Node implements \Stringable {
// DEVIATION: CDATA section nodes will be converted to text nodes when importing
// into HTML documents
if ($node instanceof \DOMCdataSection) {
$doc = ($this instanceof InnerDocument) ? $this : $this->innerNode;
$doc = ($this instanceof InnerDocument) ? $this : $this->_innerNode;
if (!$doc instanceof XMLDocument) {
return $document->createTextNode($node->data);
}
@ -813,7 +818,7 @@ abstract class Node implements \Stringable {
$copyWrapperContent->appendChild($this->cloneWrapperNode($nodeWrapperContent, $document->wrapperNode, true));
}
} else {
$copyContent = $this->getInnerNode($copyWrapperContent);
$copyContent = $copyWrapperContent->innerNode;
$childNodes = $node->childNodes;
foreach ($childNodes as $child) {
$this->appendChildInner($copyContent, $this->cloneInnerNode($child, $document, true, true));
@ -867,7 +872,7 @@ abstract class Node implements \Stringable {
# Set copy’s encoding, content type, URL, origin, type, and mode to those of node.
if ($node instanceof Document) {
$document = new Document();
$innerDocument = $this->getInnerNode($document);
$innerDocument = $document->innerNode;
$import = true;
if ($node->characterSet !== 'UTF-8' || $node->compatMode !== 'CSS1Compat' || $node->contentType !== 'text/html' || $node->URL !== 'about:blank') {
@ -884,8 +889,8 @@ abstract class Node implements \Stringable {
$innerNode = $node->innerNode;
} else {
$import = ($document !== $node->ownerDocument);
$innerNode = $this->getInnerNode($node);
$innerDocument = $this->getInnerNode($document);
$innerNode = $node->innerNode;
$innerDocument = $document->innerNode;
if ($node instanceof Element) {
$copy = ($import) ? $innerDocument->importNode($innerNode) : $innerNode->cloneNode();
@ -1013,18 +1018,7 @@ abstract class Node implements \Stringable {
}
protected function getInnerDocument(): InnerDocument {
return ($this instanceof Document) ? $this->innerNode : $this->innerNode->ownerDocument;
}
protected function getInnerNode(?Node $node = null): \DOMNode {
if ($node === $this) {
return $this->innerNode;
}
// Using reflection to get the inner node (for everything but documents) rather
// than polling the inner owner document's node map is a good bit faster. It's
// wrong to do this, but hey... it's faster.
return Reflection::getProtectedProperty($node, 'innerNode');
return ($this instanceof Document) ? $this->_innerNode : $this->_innerNode->ownerDocument;
}
protected function isEqualInnerNode(\DOMNode $thisNode, \DOMNode $otherNode) {
@ -1280,10 +1274,10 @@ abstract class Node implements \Stringable {
}
protected function preInsertionValidity(Node $node, ?Node $child = null): void {
$parent = $this->innerNode;
$node = $this->getInnerNode($node);
$parent = $this->_innerNode;
$node = $node->innerNode;
if ($child !== null) {
$child = $this->getInnerNode($child);
$child = $child->innerNode;
}
$doc = $this->getInnerDocument();
@ -1311,7 +1305,7 @@ abstract class Node implements \Stringable {
if ($parentRoot instanceof \DOMDocumentFragment) {
$wrappedParentRoot = $parentRoot->ownerDocument->getWrapperNode($parentRoot);
$parentRootHost = Reflection::getProtectedProperty($wrappedParentRoot, 'host');
if ($parentRootHost !== null && ($parentRootHost === $node || $this->containsInner($node, $this->getInnerNode($parentRootHost->get())))) {
if ($parentRootHost !== null && ($parentRootHost === $node || $this->containsInner($node, $parentRootHost->get()->innerNode))) {
throw new DOMException(DOMException::HIERARCHY_REQUEST_ERROR);
}
}

4
lib/NonDocumentTypeChildNode.php

@ -19,7 +19,7 @@ trait NonDocumentTypeChildNode {
// that is an element; otherwise null.
// PHP's DOM does this correctly already.
$inner = $this->innerNode;
$inner = $this->_innerNode;
$result = $inner->nextElementSibling;
return ($result !== null) ? $inner->ownerDocument->getWrapperNode($result) : null;
}
@ -29,7 +29,7 @@ trait NonDocumentTypeChildNode {
// sibling that is an element; otherwise null.
// PHP's DOM does this correctly already.
$inner = $this->innerNode;
$inner = $this->_innerNode;
$result = $inner->previousElementSibling;
return ($result !== null) ? $inner->ownerDocument->getWrapperNode($result) : null;
}

2
lib/NonElementParentNode.php

@ -17,7 +17,7 @@ use MensBeam\HTML\Parser;
trait NonElementParentNode {
public function getElementById(string $elementId): ?Element {
$document = $this->getInnerDocument();
$innerElement = $this->innerNode->getElementById($elementId);
$innerElement = $this->_innerNode->getElementById($elementId);
return ($innerElement !== null) ? $document->getWrapperNode($innerElement) : null;
}
}

16
lib/ParentNode.php

@ -17,22 +17,22 @@ use Symfony\Component\CssSelector\CssSelectorConverter,
trait ParentNode {
protected function __get_childElementCount(): int {
return $this->innerNode->childElementCount;
return $this->_innerNode->childElementCount;
}
protected function __get_children(): HTMLCollection {
$doc = $this->getInnerDocument();
// HTMLCollections cannot be created from their constructors normally.
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->innerNode));
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\HTMLCollection', $doc, $doc->xpath->query('.//*', $this->_innerNode));
}
protected function __get_firstElementChild(): ?Element {
$result = $this->innerNode->firstElementChild;
$result = $this->_innerNode->firstElementChild;
return ($result !== null) ? $this->getInnerDocument()->getWrapperNode($result) : null;
}
protected function __get_lastElementChild(): ?Element {
$result = $this->innerNode->lastElementChild;
$result = $this->_innerNode->lastElementChild;
return ($result !== null) ? $this->getInnerDocument()->getWrapperNode($result) : null;
}
@ -67,8 +67,8 @@ trait ParentNode {
$this->preInsertionValidity($node);
# 3. Replace all with node within this.
while ($this->innerNode->hasChildNodes()) {
$this->innerNode->removeChild($this->innerNode->firstChild);
while ($this->_innerNode->hasChildNodes()) {
$this->_innerNode->removeChild($this->_innerNode->firstChild);
}
$this->appendChild($node);
@ -100,7 +100,7 @@ trait ParentNode {
*/
public function walk(?\Closure $filter = null, bool $includeReferenceNode = false): \Generator {
if ($this instanceof DocumentFragment || (!$this instanceof DocumentFragment && !$includeReferenceNode)) {
$node = $this->innerNode->firstChild;
$node = $this->_innerNode->firstChild;
}
if ($node !== null) {
@ -154,7 +154,7 @@ trait ParentNode {
# 3. Return the result of match a selector against a tree with s and node’s root
# using scoping root node. [SELECTORS4].
$nodeList = $this->getInnerDocument()->xpath->query($s, $this->innerNode);
$nodeList = $this->getInnerDocument()->xpath->query($s, $this->_innerNode);
return $nodeList;
}
}

2
lib/ProcessingInstruction.php

@ -12,7 +12,7 @@ namespace MensBeam\HTML\DOM;
class ProcessingInstruction extends CharacterData {
protected function __get_target(): string {
// Need to uncoerce string if necessary.
$target = $this->innerNode->target;
$target = $this->_innerNode->target;
return (!str_contains(needle: 'U', haystack: $target)) ? $target : $this->uncoerceName($target);
}

4
lib/Serializer.php

@ -21,7 +21,7 @@ class Serializer extends ParserSerializer {
}
protected static function getTemplateContent(\DOMElement $node): \DOMNode {
return Reflection::getProtectedProperty($node->ownerDocument->getWrapperNode($node)->content, 'innerNode');
return $node->ownerDocument->getWrapperNode($node)->content->innerNode;
}
protected static function isPreformattedContent(\DOMNode $node): bool {
@ -34,7 +34,7 @@ class Serializer extends ParserSerializer {
} elseif ($n instanceof \DOMDocumentFragment) {
$host = Reflection::getProtectedProperty($node->ownerDocument->getWrapperNode($n), 'host');
if ($host !== null) {
$n = Reflection::getProtectedProperty($host->get(), 'innerNode');
$n = $host->get()->innerNode;
}
}
} while ($n = $n->parentNode);

4
lib/Text.php

@ -12,7 +12,7 @@ namespace MensBeam\HTML\DOM;
class Text extends CharacterData {
protected function __get_wholeText(): string {
// PHP's DOM does this correctly already.
return $this->innerNode->wholeText;
return $this->_innerNode->wholeText;
}
@ -23,7 +23,7 @@ class Text extends CharacterData {
throw new DOMException(DOMException::INDEX_SIZE_ERROR);
}
return $this->innerNode->ownerDocument->getWrapperNode($this->innerNode->splitText($offset));
return $this->_innerNode->ownerDocument->getWrapperNode($this->_innerNode->splitText($offset));
}

2
lib/XMLDocument.php

@ -18,6 +18,6 @@ class XMLDocument extends Document {
throw new DOMException(DOMException::NO_MODIFICATION_ALLOWED);
}
$this->innerNode->loadXML($source);
$this->_innerNode->loadXML($source);
}
}

4
lib/XPathEvaluate.php

@ -23,7 +23,7 @@ trait XPathEvaluate {
} // @codeCoverageIgnore
protected function xpathEvaluate(string $expression, Node $contextNode, ?XPathNSResolver $resolver = null, int $type = XPathResult::ANY_TYPE, ?XPathResult $result = null): XPathResult {
$innerContextNode = Reflection::getProtectedProperty($contextNode, 'innerNode');
$innerContextNode = $contextNode->innerNode;
$doc = ($innerContextNode instanceof \DOMDocument) ? $innerContextNode : $innerContextNode->ownerDocument;
if ($resolver !== null && preg_match_all('/([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}][A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]+):([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}][A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]+)/u', $expression, $m, \PREG_SET_ORDER)) {
@ -140,7 +140,7 @@ trait XPathEvaluate {
}
protected function xpathRegisterPhpFunctions(Document $document, string|array|null $restrict = null): void {
$xpath = Reflection::getProtectedProperty($document, 'innerNode')->xpath;
$xpath = $document->innerNode->xpath;
$xpath->registerNamespace('php', 'http://php.net/xpath');
$xpath->registerPhpFunctions($restrict);
}

2
lib/XPathExpression.php

@ -23,7 +23,7 @@ class XPathExpression {
// protected properties, but neither should be exposed publicly; this is a crazy
// polyfill hack that wouldn't normally be necessary otherwise.
$nodeResolver = Reflection::getProtectedProperty($resolver, 'nodeResolver');
$innerNodeResolver = Reflection::getProtectedProperty($nodeResolver, 'innerNode');
$innerNodeResolver = $nodeResolver->innerNode;
$doc = ($innerNodeResolver instanceof \DOMDocument) ? $innerNodeResolver : $innerNodeResolver->ownerDocument;
foreach ($m as $prefix) {

100
tests/cases/TestAttr.php

@ -16,6 +16,44 @@ use MensBeam\HTML\DOM\{
/** @covers \MensBeam\HTML\DOM\Attr */
class TestAttr extends \PHPUnit\Framework\TestCase {
/**
* @covers \MensBeam\HTML\DOM\Attr::__get_name
*
* @covers \MensBeam\HTML\DOM\Attr::__get_localName
* @covers \MensBeam\HTML\DOM\Attr::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement
* @covers \MensBeam\HTML\DOM\Attr::__set_value
* @covers \MensBeam\HTML\DOM\Document::__construct
* @covers \MensBeam\HTML\DOM\Document::__get_body
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS
* @covers \MensBeam\HTML\DOM\Document::load
* @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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\NonElementParentNode::getElementById
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath
* @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
*/
public function testProperty_name(): void {
$d = new Document('<!DOCTYPE html><html><body ook="ook" poop💩="poop💩"><svg id="eek"></svg></body></html>', 'utf-8');
$body = $d->body;
@ -30,6 +68,42 @@ class TestAttr extends \PHPUnit\Framework\TestCase {
$this->assertSame('xmlns:xlink', $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'xlink')->name);
}
/**
* @covers \MensBeam\HTML\DOM\Attr::__get_prefix
*
* @covers \MensBeam\HTML\DOM\Attr::__get_localName
* @covers \MensBeam\HTML\DOM\Attr::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement
* @covers \MensBeam\HTML\DOM\Attr::__set_value
* @covers \MensBeam\HTML\DOM\Document::__construct
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS
* @covers \MensBeam\HTML\DOM\Document::load
* @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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\NonElementParentNode::getElementById
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath
* @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
*/
public function testProperty_prefix(): void {
$d = new Document('<!DOCTYPE html><html><body><svg id="eek"></svg></body></html>', 'utf-8');
$svg = $d->getElementById('eek');
@ -41,6 +115,32 @@ class TestAttr extends \PHPUnit\Framework\TestCase {
$this->assertSame('poop💩', $svg->getAttributeNodeNS('https://poop.poop', 'poop💩')->prefix);
}
/**
* @covers \MensBeam\HTML\DOM\Attr::__get_specified
*
* @covers \MensBeam\HTML\DOM\Document::__construct
* @covers \MensBeam\HTML\DOM\Document::__get_body
* @covers \MensBeam\HTML\DOM\Document::load
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @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::__get_xpath
* @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
*/
public function testProperty_specified(): void {
$d = new Document('<!DOCTYPE html><html><body ook="ook"></body></html>', 'utf-8');
$this->assertTrue($d->body->getAttributeNode('ook')->specified);

6
tests/cases/TestChildNode.php

@ -36,6 +36,7 @@ class TestChildNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode
* @covers \MensBeam\HTML\DOM\Node::__toString
@ -43,7 +44,6 @@ class TestChildNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @covers \MensBeam\HTML\DOM\Node::convertNodesToNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::insertBefore
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -111,16 +111,16 @@ class TestChildNode extends \PHPUnit\Framework\TestCase {
/**
* @covers \MensBeam\HTML\DOM\ChildNode::remove
*
*
* @covers \MensBeam\HTML\DOM\Document::__construct
* @covers \MensBeam\HTML\DOM\Document::__get_body
* @covers \MensBeam\HTML\DOM\Document::load
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode
* @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

5
tests/cases/TestDOMImplementation.php

@ -37,11 +37,11 @@ class TestDOMImplementation extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_prefix
* @covers \MensBeam\HTML\DOM\Element::__get_tagName
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -118,11 +118,11 @@ class TestDOMImplementation extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_prefix
* @covers \MensBeam\HTML\DOM\Element::__get_tagName
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -136,7 +136,6 @@ class TestDOMImplementation extends \PHPUnit\Framework\TestCase {
* @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_createHTMLDocument(): void {

31
tests/cases/TestDOMTokenList.php

@ -87,7 +87,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_add_remove_replace_toggle___errors(\Closure $closure, int $errorCode): void {
$this->expectException(DOMException::class);
@ -110,9 +109,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -124,7 +123,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_contains() {
$d = new Document();
@ -149,9 +147,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -163,7 +161,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_count(): void {
$d = new Document();
@ -189,9 +186,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -203,7 +200,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_item(): void {
$d = new Document();
@ -229,9 +225,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -243,7 +239,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_offsetSet_offsetUnset(): void {
$d = new Document();
@ -274,10 +269,10 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -290,7 +285,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_replace(): void {
$d = new Document();
@ -324,10 +318,10 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -340,7 +334,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_remove(): void {
$d = new Document();
@ -375,9 +368,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -389,7 +382,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_supports(): void {
// PHPUnit is supposed to support expecting of errors, but it doesn't. So let's
@ -430,10 +422,10 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -446,7 +438,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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_toggle(): void {
$d = new Document();
@ -490,9 +481,9 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_classList
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -504,7 +495,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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 testProcess_iteration(): void {
$d = new Document();
@ -540,10 +530,10 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttribute
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -556,7 +546,6 @@ class TestDOMTokenList extends \PHPUnit\Framework\TestCase {
* @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 testProperty_value(): void {
// Test it with and without an attached document element

20
tests/cases/TestDocument.php

@ -192,6 +192,7 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode
* @covers \MensBeam\HTML\DOM\Node::appendChild
@ -199,7 +200,6 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
* @covers \MensBeam\HTML\DOM\Node::cloneWrapperNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -350,12 +350,12 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
* @covers \MensBeam\HTML\DOM\Node::cloneWrapperNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
* @covers \MensBeam\HTML\DOM\Text::__construct
@ -443,9 +443,9 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -565,9 +565,9 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -749,11 +749,11 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -785,9 +785,9 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -828,11 +828,11 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -871,11 +871,11 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -914,11 +914,11 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -956,10 +956,10 @@ class TestDocument extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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

44
tests/cases/TestElement.php

@ -77,9 +77,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -190,9 +190,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::item
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -284,9 +284,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::item
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -361,10 +361,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::insertAdjacentText
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -408,13 +408,13 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::insertBefore
@ -492,6 +492,7 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_lastChild
* @covers \MensBeam\HTML\DOM\Node::__get_nextSibling
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
@ -501,7 +502,6 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @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
@ -579,10 +579,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -622,13 +622,13 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::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
@ -719,9 +719,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -818,9 +818,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -866,9 +866,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -919,9 +919,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -964,10 +964,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::hasAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -1002,9 +1002,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -1043,10 +1043,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttribute
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -1096,10 +1096,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -1139,9 +1139,9 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::getAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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
@ -1250,10 +1250,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -1290,10 +1290,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -1333,11 +1333,11 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @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
@ -1389,13 +1389,13 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::containsInner
* @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
@ -1445,10 +1445,10 @@ class TestElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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

2
tests/cases/TestHTMLElement.php

@ -448,11 +448,11 @@ class TestHTMLElement extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::getRenderedTextFragment
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_childNodes
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode
* @covers \MensBeam\HTML\DOM\Node::__get_textContent
* @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

36
tests/cases/TestInnerDocument.php

@ -10,6 +10,7 @@ namespace MensBeam\HTML\DOM\TestCase;
use MensBeam\HTML\DOM\{
Document,
DOMException,
HTMLElement,
HTMLPreElement,
HTMLUnknownElement
@ -42,4 +43,39 @@ class TestInnerDocument extends \PHPUnit\Framework\TestCase {
$this->assertSame(HTMLPreElement::class, $d->createElement('pre')::class);
$this->assertSame(HTMLElement::class, $d->createElement('p-icon')::class);
}
public function provideMethod_getWrapperNode__errors(): iterable {
return [
[ function () {
$d = new Document();
$d->innerNode->getWrapperNode(new \DOMDocument());
}, DOMException::NOT_SUPPORTED ],
[ function () {
$d = new Document();
$d2 = new Document();
$d->innerNode->getWrapperNode($d2->innerNode->createTextNode('fail'));
}, DOMException::WRONG_DOCUMENT ],
];
}
/**
* @dataProvider provideMethod_getWrapperNode__errors
* @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode
*
* @covers \MensBeam\HTML\DOM\Document::__construct
* @covers \MensBeam\HTML\DOM\DOMException::__construct
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::has
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::key
* @covers \MensBeam\HTML\DOM\Inner\NodeCache::set
*/
public function testMethod_getWrapperNode__errors(\Closure $closure, int $errorCode): void {
$this->expectException(DOMException::class);
$this->expectExceptionCode($errorCode);
$closure();
}
}

8
tests/cases/TestNamedNodeMap.php

@ -49,9 +49,9 @@ class TestNamedNodeMap extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -108,12 +108,12 @@ class TestNamedNodeMap extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
* @covers \MensBeam\HTML\DOM\Node::cloneWrapperNode
* @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
@ -185,9 +185,9 @@ class TestNamedNodeMap extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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
@ -279,8 +279,8 @@ class TestNamedNodeMap extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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

44
tests/cases/TestNode.php

@ -52,13 +52,13 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::appendChildInner
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode
* @covers \MensBeam\HTML\DOM\Node::cloneWrapperNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::isEqualInnerNode
@ -150,11 +150,11 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::item
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @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
@ -238,10 +238,10 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -287,11 +287,11 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__toString
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -338,9 +338,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::setAttribute
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::isEqualInnerNode
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
@ -396,9 +396,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -445,10 +445,10 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::locateNamespace
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
@ -547,12 +547,12 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__get_parentElement
* @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::locateNamespacePrefix
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
@ -616,9 +616,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::locateNamespace
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
@ -656,9 +656,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_childNodes
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -812,11 +812,11 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::insertBefore
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
@ -860,12 +860,12 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::__toString
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1024,10 +1024,10 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocumentType
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::containsInner
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::getRootNode
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1067,9 +1067,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\HTMLCollection::item
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
@ -1119,11 +1119,11 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_prefix
* @covers \MensBeam\HTML\DOM\Element::__get_tagName
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_lastChild
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1169,9 +1169,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1209,9 +1209,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1246,9 +1246,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1298,9 +1298,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1349,10 +1349,10 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocumentType
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_lastChild
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1708,10 +1708,10 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity
@ -1796,9 +1796,9 @@ class TestNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_childNodes
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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::preInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::preInsertionValidity

8
tests/cases/TestParentNode.php

@ -31,11 +31,11 @@ class TestParentNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::convertNodesToNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
@ -77,11 +77,11 @@ class TestParentNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_firstChild
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::convertNodesToNode
* @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
@ -122,11 +122,11 @@ class TestParentNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::convertNodesToNode
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix
@ -291,9 +291,9 @@ class TestParentNode extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct
* @covers \MensBeam\HTML\DOM\Element::__construct
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @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

6
tests/cases/TestSerializer.php

@ -33,10 +33,10 @@ class TestSerializer extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -99,11 +99,11 @@ class TestSerializer extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes
@ -232,11 +232,11 @@ class TestSerializer extends \PHPUnit\Framework\TestCase {
* @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_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @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::getRootNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes

2
tests/cases/TestXPathEvaluate.php

@ -41,10 +41,10 @@ class TestXPathEvaluate extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::locateNamespace
* @covers \MensBeam\HTML\DOM\Node::lookupNamespaceURI

2
tests/cases/TestXPathExpression.php

@ -40,10 +40,10 @@ class TestXPathExpression extends \PHPUnit\Framework\TestCase {
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS
* @covers \MensBeam\HTML\DOM\Node::__construct
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument
* @covers \MensBeam\HTML\DOM\Node::appendChild
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument
* @covers \MensBeam\HTML\DOM\Node::getInnerNode
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes
* @covers \MensBeam\HTML\DOM\Node::locateNamespace
* @covers \MensBeam\HTML\DOM\Node::lookupNamespaceURI

Loading…
Cancel
Save