Permalink
Browse files

[DomCrawler] always pass base href to subcrawlers

Make sure that all relevant information is passed to created crawlers.
To avoid future regressions, this commit backports the approach taken by
@stof in #15934 to have a single place in the class that is responsible
to create subcrawler instances.
  • Loading branch information...
xabbuh committed Sep 30, 2015
1 parent f80e6c6 commit 3d9a748978f304632362564fba21272c7e66c9d0
Showing with 27 additions and 13 deletions.
  1. +27 −13 src/Symfony/Component/DomCrawler/Crawler.php
@@ -327,11 +327,11 @@ public function eq($position)
{
foreach ($this as $i => $node) {
if ($i == $position) {
return new static($node, $this->uri, $this->baseHref);
return $this->createSubCrawler($node);
}
}
return new static(null, $this->uri, $this->baseHref);
return $this->createSubCrawler(null);
}
/**
@@ -354,7 +354,7 @@ public function each(\Closure $closure)
{
$data = array();
foreach ($this as $i => $node) {
$data[] = $closure(new static($node, $this->uri, $this->baseHref), $i);
$data[] = $closure($this->createSubCrawler($node), $i);
}
return $data;
@@ -370,7 +370,7 @@ public function each(\Closure $closure)
*/
public function slice($offset = 0, $length = -1)
{
return new static(iterator_to_array(new \LimitIterator($this, $offset, $length)), $this->uri);
return $this->createSubCrawler(iterator_to_array(new \LimitIterator($this, $offset, $length)));
}
/**
@@ -386,12 +386,12 @@ public function reduce(\Closure $closure)
{
$nodes = array();
foreach ($this as $i => $node) {
if (false !== $closure(new static($node, $this->uri, $this->baseHref), $i)) {
if (false !== $closure($this->createSubCrawler($node), $i)) {
$nodes[] = $node;
}
}
return new static($nodes, $this->uri, $this->baseHref);
return $this->createSubCrawler($nodes);
}
/**
@@ -427,7 +427,7 @@ public function siblings()
throw new \InvalidArgumentException('The current node list is empty.');
}
return new static($this->sibling($this->getNode(0)->parentNode->firstChild), $this->uri, $this->baseHref);
return $this->createSubCrawler($this->sibling($this->getNode(0)->parentNode->firstChild));
}
/**
@@ -443,7 +443,7 @@ public function nextAll()
throw new \InvalidArgumentException('The current node list is empty.');
}
return new static($this->sibling($this->getNode(0)), $this->uri, $this->baseHref);
return $this->createSubCrawler($this->sibling($this->getNode(0)));
}
/**
@@ -459,7 +459,7 @@ public function previousAll()
throw new \InvalidArgumentException('The current node list is empty.');
}
return new static($this->sibling($this->getNode(0), 'previousSibling'), $this->uri, $this->baseHref);
return $this->createSubCrawler($this->sibling($this->getNode(0), 'previousSibling'));
}
/**
@@ -484,7 +484,7 @@ public function parents()
}
}
return new static($nodes, $this->uri, $this->baseHref);
return $this->createSubCrawler($nodes);
}
/**
@@ -502,7 +502,7 @@ public function children()
$node = $this->getNode(0)->firstChild;
return new static($node ? $this->sibling($node) : array(), $this->uri, $this->baseHref);
return $this->createSubCrawler($node ? $this->sibling($node) : array());
}
/**
@@ -631,7 +631,7 @@ public function filterXPath($xpath)
// If we dropped all expressions in the XPath while preparing it, there would be no match
if ('' === $xpath) {
return new static(null, $this->uri, $this->baseHref);
return $this->createSubCrawler(null);
}
return $this->filterRelativeXPath($xpath);
@@ -829,7 +829,7 @@ private function filterRelativeXPath($xpath)
{
$prefixes = $this->findNamespacePrefixes($xpath);
$crawler = new static(null, $this->uri, $this->baseHref);
$crawler = $this->createSubCrawler(null);
foreach ($this as $node) {
$domxpath = $this->createDOMXPath($node->ownerDocument, $prefixes);
@@ -999,4 +999,18 @@ private function findNamespacePrefixes($xpath)
return array();
}
/**
* Creates a crawler for some subnodes.
*
* @param \DOMElement|\DOMElement[]|\DOMNodeList|null $nodes
*
* @return static
*/
private function createSubCrawler($nodes)
{
$crawler = new static($nodes, $this->uri, $this->baseHref);
return $crawler;
}
}

0 comments on commit 3d9a748

Please sign in to comment.