summaryrefslogtreecommitdiff
path: root/src/HTML5/Parser/DOMTreeBuilder.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/HTML5/Parser/DOMTreeBuilder.php')
-rw-r--r--src/HTML5/Parser/DOMTreeBuilder.php23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/HTML5/Parser/DOMTreeBuilder.php b/src/HTML5/Parser/DOMTreeBuilder.php
index 731d1d8..b9e587f 100644
--- a/src/HTML5/Parser/DOMTreeBuilder.php
+++ b/src/HTML5/Parser/DOMTreeBuilder.php
@@ -145,6 +145,8 @@ class DOMTreeBuilder implements EventHandler
*/
protected $quirks = true;
+ protected $errors = array();
+
public function __construct($isFragment = false, array $options = array())
{
$this->options = $options;
@@ -156,7 +158,7 @@ class DOMTreeBuilder implements EventHandler
$dt = $impl->createDocumentType('html');
// $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt);
$this->doc = $impl->createDocument(null, null, $dt);
- $this->doc->errors = array();
+ $this->errors = array();
$this->current = $this->doc; // ->documentElement;
@@ -195,7 +197,6 @@ class DOMTreeBuilder implements EventHandler
*/
public function fragment()
{
- $this->frag->errors = $this->doc->errors;
return $this->frag;
}
@@ -337,6 +338,9 @@ class DOMTreeBuilder implements EventHandler
// to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes
// see https://bugs.php.net/bug.php?id=67459
$this->pushes[spl_object_hash($ele)] = array($pushes, $ele);
+
+ // SEE https://github.com/facebook/hhvm/issues/2962
+ $ele->setAttribute('html5-php-fake-id-attribute', spl_object_hash($ele));
}
foreach ($attributes as $aName => $aVal) {
@@ -438,7 +442,13 @@ class DOMTreeBuilder implements EventHandler
return;
}
- $cid = spl_object_hash($this->current);
+ // https://github.com/facebook/hhvm/issues/2962
+ if ($cid = $this->current->getAttribute('html5-php-fake-id-attribute')) {
+ $this->current->removeAttribute('html5-php-fake-id-attribute');
+ } else {
+ $cid = spl_object_hash($this->current);
+ }
+
// remove the namespaced definded by current node
if (isset($this->pushes[$cid])) {
for ($i = 0; $i < $this->pushes[$cid][0]; $i ++) {
@@ -501,7 +511,12 @@ class DOMTreeBuilder implements EventHandler
public function parseError($msg, $line = 0, $col = 0)
{
- $this->doc->errors[] = sprintf("Line %d, Col %d: %s", $line, $col, $msg);
+ $this->errors[] = sprintf("Line %d, Col %d: %s", $line, $col, $msg);
+ }
+
+ public function getErrors()
+ {
+ return $this->errors;
}
public function cdata($data)