diff --git a/lib/DOM/Element.php b/lib/DOM/Element.php index f746961..e2d32f4 100644 --- a/lib/DOM/Element.php +++ b/lib/DOM/Element.php @@ -22,11 +22,11 @@ class Element extends \DOMElement { return $value; } - public function getAttributeNS($namespaceURI, $qualifiedName) { + public function getAttributeNS($namespaceURI, $localName) { // Newer versions of the DOM spec have getAttributeNS return an empty string // only when the attribute exists and is empty, otherwise null. This fixes that. - $value = parent::getAttributeNS($namespaceURI, $qualifiedName); - if ($value === '' && !$this->hasAttribute($qualifiedName)) { + $value = parent::getAttributeNS($namespaceURI, $localName); + if ($value === '' && !$this->hasAttributeNS($namespaceURI, $localName)) { return null; } @@ -47,11 +47,15 @@ class Element extends \DOMElement { } public function hasAttribute($name) { - $out = parent::hasAttribute($name); - if (!$out && strpos($name, "xmlns:") === 0 && $this->hasAttributeNS(Parser::XMLNS_NAMESPACE, substr($name, 6))) { - return true; + if (!parent::hasAttribute($name)) { + foreach ($this->attributes as $a) { + if ($a->nodeName === $name) { + return true; + } + } + return false; } - return $out; + return true; } public function setAttribute($name, $value) { diff --git a/tests/cases/TestDOM.php b/tests/cases/TestDOM.php index 32ab4db..a7027b9 100644 --- a/tests/cases/TestDOM.php +++ b/tests/cases/TestDOM.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace MensBeam\HTML\TestCase; use MensBeam\HTML\Document; +use MensBeam\HTML\Parser; use MensBeam\HTML\TemplateElement; class TestDOM extends \PHPUnit\Framework\TestCase { @@ -256,4 +257,51 @@ class TestDOM extends \PHPUnit\Framework\TestCase { [false, null, "fake_ns", "TEST:TESTU00003ATEST"], ]; } + + /** + * @covers \MensBeam\HTML\Element::hasAttribute + * @covers \MensBeam\HTML\Element::getAttribute + * @covers \MensBeam\HTML\Element::getAttributeNS + */ + public function testCheckForAttribute(): void { + $d = new Document; + $d->appendChild($d->createElement("html")); + $e = $d->documentElement; + $e->setAttribute("ook", "eek"); + $e->setAttributeNS(Parser::XML_NAMESPACE, "xml:base", "http://example.com/"); + $e->setAttributeNS(Parser::XMLNS_NAMESPACE, "xmlns:xlink", Parser::XLINK_NAMESPACE); + $e->setAttributeNS("fake_ns", "ook:eek", "ack"); + // perform boolean tests + $this->assertFalse($e->hasAttribute("blah")); + $this->assertFalse($e->hasAttribute("OOK"));; + $this->assertFalse($e->hasAttribute("eek")); + $this->assertFalse($e->hasAttribute("ack")); + $this->assertTrue($e->hasAttribute("ook")); + $this->assertTrue($e->hasAttribute("xml:base")); + $this->assertTrue($e->hasAttribute("xmlns:xlink")); + $this->assertTrue($e->hasAttribute("ook:eek")); + $this->assertFalse($e->hasAttributeNS(null, "blah")); + $this->assertFalse($e->hasAttributeNS(null, "OOK")); + $this->assertFalse($e->hasAttributeNS(null, "eek")); + $this->assertTrue($e->hasAttributeNS(null, "ook")); + $this->assertTrue($e->hasAttributeNS(Parser::XML_NAMESPACE, "base")); + $this->assertTrue($e->hasAttributeNS(Parser::XMLNS_NAMESPACE, "xlink")); + $this->assertTrue($e->hasAttributeNS("fake_ns", "eek")); + // perform retrival tests + //$this->assertNull($e->getAttribute("blah")); + //$this->assertNull($e->getAttribute("OOK")); + //$this->assertNull($e->getAttribute("eek")); + //$this->assertNull($e->getAttribute("ack")); + //$this->assertSame("eek", $e->getAttribute("ook")); + //$this->assertSame("http://example.com/", $e->getAttribute("xml:base")); + //$this->assertSame(Parser::XLINK_NAMESPACE, $e->getAttribute("xmlns:xlink")); + //$this->assertSame("ack", $e->getAttribute("ook:eek")); + //$this->assertNull($e->getAttributeNS(null, "blah")); + //$this->assertNull($e->getAttributeNS(null, "OOK")); + //$this->assertNull($e->getAttributeNS(null, "ack")); + //$this->assertSame("eek", $e->getAttributeNS(null, "ook")); + //$this->assertSame("http://example.com/", $e->getAttributeNS(Parser::XML_NAMESPACE, "base")); + //$this->assertSame(Parser::XLINK_NAMESPACE, $e->getAttributeNS(Parser::XMLNS_NAMESPACE, "xlink")); + //$this->assertSame("ack", $e->getAttributeNS("fake_ns", "eek")); + } }