summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Butcher <[email protected]>2013-05-01 14:55:36 -0500
committerMatt Butcher <[email protected]>2013-05-01 14:55:36 -0500
commitc5099f50fd68f26741d061cff5a3ccd086e00cfe (patch)
tree54b5163ef9579f7eca00ea431a12d58d92c6f807
parentbae705bdea510398f654ffbfc25454b75c6e8a65 (diff)
Fixes for PI tests.
-rw-r--r--src/HTML5/Parser/DOMTreeBuilder.php11
-rw-r--r--test/HTML5/Parser/DOMTreeBuilderTest.php15
2 files changed, 25 insertions, 1 deletions
diff --git a/src/HTML5/Parser/DOMTreeBuilder.php b/src/HTML5/Parser/DOMTreeBuilder.php
index 4e2669c..686effc 100644
--- a/src/HTML5/Parser/DOMTreeBuilder.php
+++ b/src/HTML5/Parser/DOMTreeBuilder.php
@@ -266,6 +266,11 @@ class DOMTreeBuilder implements EventHandler {
}
public function processingInstruction($name, $data = NULL) {
+ // XXX: Ignore initial XML declaration, per the spec.
+ if ($this->insertMode == self::IM_INITIAL && 'xml' == strtolower($name)) {
+ return;
+ }
+
// Important: The processor may modify the current DOM tree however
// it sees fit.
if (isset($this->processor)) {
@@ -273,7 +278,13 @@ class DOMTreeBuilder implements EventHandler {
if (!empty($res)) {
$this->current = $res;
}
+ return;
}
+
+ // Otherwise, this is just a dumb PI element.
+ $node = $this->doc->createProcessingInstruction($name, $data);
+
+ $this->current->appendChild($node);
}
// ==========================================================================
diff --git a/test/HTML5/Parser/DOMTreeBuilderTest.php b/test/HTML5/Parser/DOMTreeBuilderTest.php
index 677bac6..53d1480 100644
--- a/test/HTML5/Parser/DOMTreeBuilderTest.php
+++ b/test/HTML5/Parser/DOMTreeBuilderTest.php
@@ -139,7 +139,20 @@ class DOMTreeBuilderTest extends \HTML5\Tests\TestCase {
}
public function testProcessingInstruction() {
- $this->markTestIncomplete("Incomplete.");
+ // Test the simple case, which is where PIs are inserted into the DOM.
+ $doc = $this->parse('<!DOCTYPE html><html><?foo bar?>');
+ $this->assertEquals(1, $doc->documentElement->childNodes->length);
+ $pi = $doc->documentElement->firstChild;
+ $this->assertInstanceOf('\DOMProcessingInstruction', $pi);
+ $this->assertEquals('foo', $pi->nodeName);
+ $this->assertEquals('bar', $pi->data);
+
+ // Leading xml PIs should be ignored.
+ $doc = $this->parse('<?xml version="1.0"?><!DOCTYPE html><html><head></head></html>');
+
+ $this->assertEquals(2, $doc->childNodes->length);
+ $this->assertInstanceOf('\DOMDocumentType', $doc->childNodes->item(0));
+ $this->assertInstanceOf('\DOMElement', $doc->childNodes->item(1));
}
public function testAutocloseP() {