Skip to content

Commit 97996d0

Browse files
[VarDumper] Fix dumping objects from the DOM extension
1 parent 9d3b7c6 commit 97996d0

File tree

3 files changed

+69
-384
lines changed

3 files changed

+69
-384
lines changed

src/Symfony/Component/VarDumper/Caster/DOMCaster.php

Lines changed: 30 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,6 @@ public static function castException(\DOMException|\Dom\Exception $e, array $a,
7777

7878
public static function castLength($dom, array $a, Stub $stub, bool $isNested): array
7979
{
80-
$a += [
81-
'length' => $dom->length,
82-
];
83-
8480
return $a;
8581
}
8682

@@ -96,69 +92,16 @@ public static function castImplementation(\DOMImplementation|\Dom\Implementation
9692

9793
public static function castNode(\DOMNode|\Dom\Node $dom, array $a, Stub $stub, bool $isNested): array
9894
{
99-
$a += [
100-
'nodeName' => $dom->nodeName,
101-
'nodeValue' => new CutStub($dom->nodeValue),
102-
'nodeType' => new ConstStub(self::NODE_TYPES[$dom->nodeType], $dom->nodeType),
103-
'parentNode' => new CutStub($dom->parentNode),
104-
'childNodes' => $dom->childNodes,
105-
'firstChild' => new CutStub($dom->firstChild),
106-
'lastChild' => new CutStub($dom->lastChild),
107-
'previousSibling' => new CutStub($dom->previousSibling),
108-
'nextSibling' => new CutStub($dom->nextSibling),
109-
'ownerDocument' => new CutStub($dom->ownerDocument),
110-
'baseURI' => $dom->baseURI ? new LinkStub($dom->baseURI) : $dom->baseURI,
111-
'textContent' => new CutStub($dom->textContent),
112-
];
113-
114-
if ($dom instanceof \DOMNode || $dom instanceof \Dom\Element) {
115-
$a += [
116-
'attributes' => $dom->attributes,
117-
'namespaceURI' => $dom->namespaceURI,
118-
'prefix' => $dom->prefix,
119-
'localName' => $dom->localName,
120-
];
121-
}
122-
123-
return $a;
95+
return self::castDom($dom, $a, $stub, $isNested);
12496
}
12597

12698
public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, bool $isNested): array
12799
{
128-
$a += [
129-
'nodeName' => $dom->nodeName,
130-
'nodeValue' => new CutStub($dom->nodeValue),
131-
'nodeType' => new ConstStub(self::NODE_TYPES[$dom->nodeType], $dom->nodeType),
132-
'prefix' => $dom->prefix,
133-
'localName' => $dom->localName,
134-
'namespaceURI' => $dom->namespaceURI,
135-
'ownerDocument' => new CutStub($dom->ownerDocument),
136-
'parentNode' => new CutStub($dom->parentNode),
137-
];
138-
139-
return $a;
100+
return self::castDom($dom, $a, $stub, $isNested);
140101
}
141102

142103
public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
143104
{
144-
$a += [
145-
'doctype' => $dom->doctype,
146-
'implementation' => $dom->implementation,
147-
'documentElement' => new CutStub($dom->documentElement),
148-
'encoding' => $dom->encoding,
149-
'xmlEncoding' => $dom->xmlEncoding,
150-
'xmlStandalone' => $dom->xmlStandalone,
151-
'xmlVersion' => $dom->xmlVersion,
152-
'strictErrorChecking' => $dom->strictErrorChecking,
153-
'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI,
154-
'formatOutput' => $dom->formatOutput,
155-
'validateOnParse' => $dom->validateOnParse,
156-
'resolveExternals' => $dom->resolveExternals,
157-
'preserveWhiteSpace' => $dom->preserveWhiteSpace,
158-
'recover' => $dom->recover,
159-
'substituteEntities' => $dom->substituteEntities,
160-
];
161-
162105
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
163106
$formatOutput = $dom->formatOutput;
164107
$dom->formatOutput = true;
@@ -171,18 +114,6 @@ public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, boo
171114

172115
public static function castXMLDocument(\Dom\XMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
173116
{
174-
$a += [
175-
'doctype' => $dom->doctype,
176-
'implementation' => $dom->implementation,
177-
'documentElement' => new CutStub($dom->documentElement),
178-
'inputEncoding' => $dom->inputEncoding,
179-
'xmlEncoding' => $dom->xmlEncoding,
180-
'xmlStandalone' => $dom->xmlStandalone,
181-
'xmlVersion' => $dom->xmlVersion,
182-
'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI,
183-
'formatOutput' => $dom->formatOutput,
184-
];
185-
186117
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
187118
$formatOutput = $dom->formatOutput;
188119
$dom->formatOutput = true;
@@ -195,14 +126,6 @@ public static function castXMLDocument(\Dom\XMLDocument $dom, array $a, Stub $st
195126

196127
public static function castHTMLDocument(\Dom\HTMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
197128
{
198-
$a += [
199-
'doctype' => $dom->doctype,
200-
'implementation' => $dom->implementation,
201-
'documentElement' => new CutStub($dom->documentElement),
202-
'inputEncoding' => $dom->inputEncoding,
203-
'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI,
204-
];
205-
206129
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
207130
$a += [Caster::PREFIX_VIRTUAL.'html' => $dom->saveHTML()];
208131
}
@@ -212,106 +135,74 @@ public static function castHTMLDocument(\Dom\HTMLDocument $dom, array $a, Stub $
212135

213136
public static function castCharacterData(\DOMCharacterData|\Dom\CharacterData $dom, array $a, Stub $stub, bool $isNested): array
214137
{
215-
$a += [
216-
'data' => $dom->data,
217-
'length' => $dom->length,
218-
];
219-
220138
return $a;
221139
}
222140

223141
public static function castAttr(\DOMAttr|\Dom\Attr $dom, array $a, Stub $stub, bool $isNested): array
224142
{
225-
$a += [
226-
'name' => $dom->name,
227-
'specified' => $dom->specified,
228-
'value' => $dom->value,
229-
'ownerElement' => $dom->ownerElement,
230-
];
231-
232-
if ($dom instanceof \DOMAttr) {
233-
$a += [
234-
'schemaTypeInfo' => $dom->schemaTypeInfo,
235-
];
236-
}
237-
238143
return $a;
239144
}
240145

241146
public static function castElement(\DOMElement|\Dom\Element $dom, array $a, Stub $stub, bool $isNested): array
242147
{
243-
$a += [
244-
'tagName' => $dom->tagName,
245-
];
246-
247-
if ($dom instanceof \DOMElement) {
248-
$a += [
249-
'schemaTypeInfo' => $dom->schemaTypeInfo,
250-
];
251-
}
252-
253148
return $a;
254149
}
255150

256151
public static function castText(\DOMText|\Dom\Text $dom, array $a, Stub $stub, bool $isNested): array
257152
{
258-
$a += [
259-
'wholeText' => $dom->wholeText,
260-
];
261-
262153
return $a;
263154
}
264155

265156
public static function castDocumentType(\DOMDocumentType|\Dom\DocumentType $dom, array $a, Stub $stub, bool $isNested): array
266157
{
267-
$a += [
268-
'name' => $dom->name,
269-
'entities' => $dom->entities,
270-
'notations' => $dom->notations,
271-
'publicId' => $dom->publicId,
272-
'systemId' => $dom->systemId,
273-
'internalSubset' => $dom->internalSubset,
274-
];
275-
276158
return $a;
277159
}
278160

279161
public static function castNotation(\DOMNotation|\Dom\Notation $dom, array $a, Stub $stub, bool $isNested): array
280162
{
281-
$a += [
282-
'publicId' => $dom->publicId,
283-
'systemId' => $dom->systemId,
284-
];
285-
286163
return $a;
287164
}
288165

289166
public static function castEntity(\DOMEntity|\Dom\Entity $dom, array $a, Stub $stub, bool $isNested): array
290167
{
291-
$a += [
292-
'publicId' => $dom->publicId,
293-
'systemId' => $dom->systemId,
294-
'notationName' => $dom->notationName,
295-
];
296-
297168
return $a;
298169
}
299170

300171
public static function castProcessingInstruction(\DOMProcessingInstruction|\Dom\ProcessingInstruction $dom, array $a, Stub $stub, bool $isNested): array
301172
{
302-
$a += [
303-
'target' => $dom->target,
304-
'data' => $dom->data,
305-
];
306-
307173
return $a;
308174
}
309175

310176
public static function castXPath(\DOMXPath|\Dom\XPath $dom, array $a, Stub $stub, bool $isNested): array
311177
{
312-
$a += [
313-
'document' => $dom->document,
314-
];
178+
return self::castDom($dom, $a, $stub, $isNested);
179+
}
180+
181+
public static function castDom($dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
182+
{
183+
foreach ($a as $k => $v) {
184+
if ('encoding' === $k && $dom instanceof \DOMEntity
185+
|| \in_array($k, ['actualEncoding', 'config', 'standalone', 'version'], true)
186+
) {
187+
continue; // deprecated properties
188+
}
189+
190+
$v = $dom->$k;
191+
192+
$a[$k] = match (true) {
193+
$v instanceof \DOMNode || $v instanceof \Dom\Node => new CutStub($v),
194+
'nodeType' === $k => new ConstStub(self::NODE_TYPES[$v], $v),
195+
'baseURI' === $k && $v,
196+
'documentURI' === $k && $v => new LinkStub($v),
197+
default => $v,
198+
};
199+
}
200+
201+
if ($dom instanceof \IteratorAggregate) {
202+
foreach ($dom as $k => $v) {
203+
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
204+
}
205+
}
315206

316207
return $a;
317208
}

src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -58,38 +58,25 @@ abstract class AbstractCloner implements ClonerInterface
5858

5959
'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'],
6060
'Dom\Exception' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'],
61-
'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
62-
'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
61+
'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
62+
'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
6363
'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'],
6464
'Dom\Implementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'],
65-
'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
66-
'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'],
67-
'Dom\Node' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'],
68-
'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'],
65+
'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
66+
'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
67+
'Dom\Node' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
68+
'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
6969
'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'],
7070
'Dom\XMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXMLDocument'],
7171
'Dom\HTMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castHTMLDocument'],
72-
'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
73-
'Dom\NodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
74-
'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
75-
'Dom\DTDNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
76-
'DOMCharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'],
77-
'Dom\CharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'],
78-
'DOMAttr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'],
79-
'Dom\Attr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'],
80-
'DOMElement' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'],
81-
'Dom\Element' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'],
82-
'DOMText' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'],
83-
'Dom\Text' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'],
84-
'DOMDocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'],
85-
'Dom\DocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'],
86-
'DOMNotation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'],
87-
'Dom\Notation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'],
88-
'DOMEntity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'],
89-
'Dom\Entity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'],
90-
'DOMProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'],
91-
'Dom\ProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'],
92-
'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'],
72+
'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
73+
'Dom\NodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
74+
'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
75+
'Dom\DTDNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
76+
'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
77+
'Dom\XPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
78+
'Dom\HTMLCollection' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
79+
'Dom\TokenList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
9380

9481
'XMLReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'],
9582

0 commit comments

Comments
 (0)