Skip to content

Commit 494d477

Browse files
mfeineispedrottimark
authored andcommitted
Check for existence of Element when comparing DOM-nody-things (#7786) (clean cherry pick version) (#7995)
* Check for existence of `Element` when comparing DOM-nody-things (#7786) * Fall back to deep equality for presumed DOM nodes if `Element` is not in scope (#7786) * Remove IE<9 specific fallback DOM node comparison (#7786) * Check for global DOM `Node` in `isDomNode` (#7786) In a real browser and JSDOM the check will use DOM-Level-3 `Node.isEqualNode` and for everything else a deep equality check should do the trick. * Check that `isEqualNode` is a function and remove duck typing from `isDomNode` (#7786) * Add changelog entry for streamlined DOM node comparisons in `expect` (#7786) * Correct visible PR number in CHANGELOG.md
1 parent 1983ad1 commit 494d477

4 files changed

Lines changed: 49 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
- `[expect]` Fix non-object received value in toHaveProperty ([#7986](https://github.com/facebook/jest/pull/7986))
3030
- `[jest-jasmine2]`: Throw explicit error when errors happen after test is considered complete ([#8005](https://github.com/facebook/jest/pull/8005))
3131
- `[jest-circus]`: Throw explicit error when errors happen after test is considered complete ([#8005](https://github.com/facebook/jest/pull/8005))
32+
- `[expect]` Remove duck typing and obsolete browser support code when comparing DOM nodes and use DOM-Level-3 API instead ([#7995](https://github.com/facebook/jest/pull/7995))
3233

3334
### Chore & Maintenance
3435

packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,6 +1996,28 @@ Expected: <green>{\\"a\\": 99}</>
19961996
Received: <red>{\\"a\\": 99}</>"
19971997
`;
19981998

1999+
exports[`.toEqual() {pass: false} expect({"nodeName": "div", "nodeType": 1}).not.toEqual({"nodeName": "div", "nodeType": 1}) 1`] = `
2000+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
2001+
2002+
Expected: <green>{\\"nodeName\\": \\"div\\", \\"nodeType\\": 1}</>
2003+
Received: <red>{\\"nodeName\\": \\"div\\", \\"nodeType\\": 1}</>"
2004+
`;
2005+
2006+
exports[`.toEqual() {pass: false} expect({"nodeName": "div", "nodeType": 1}).toEqual({"nodeName": "p", "nodeType": 1}) 1`] = `
2007+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2008+
2009+
Difference:
2010+
2011+
<green>- Expected</>
2012+
<red>+ Received</>
2013+
2014+
<dim> Object {</>
2015+
<green>- \\"nodeName\\": \\"p\\",</>
2016+
<red>+ \\"nodeName\\": \\"div\\",</>
2017+
<dim> \\"nodeType\\": 1,</>
2018+
<dim> }</>"
2019+
`;
2020+
19992021
exports[`.toEqual() {pass: false} expect({"target": {"nodeType": 1, "value": "a"}}).toEqual({"target": {"nodeType": 1, "value": "b"}}) 1`] = `
20002022
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
20012023

packages/expect/src/__tests__/matchers.test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,16 @@ describe('.toEqual()', () => {
417417
},
418418
},
419419
],
420+
[
421+
{
422+
nodeName: 'div',
423+
nodeType: 1,
424+
},
425+
{
426+
nodeName: 'p',
427+
nodeType: 1,
428+
},
429+
],
420430
].forEach(([a, b]) => {
421431
test(`{pass: false} expect(${stringify(a)}).toEqual(${stringify(
422432
b,
@@ -537,6 +547,16 @@ describe('.toEqual()', () => {
537547
},
538548
},
539549
],
550+
[
551+
{
552+
nodeName: 'div',
553+
nodeType: 1,
554+
},
555+
{
556+
nodeName: 'div',
557+
nodeType: 1,
558+
},
559+
],
540560
].forEach(([a, b]) => {
541561
test(`{pass: false} expect(${stringify(a)}).not.toEqual(${stringify(
542562
b,

packages/expect/src/jasmineUtils.ts

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,9 @@ function eq(
129129

130130
var aIsDomNode = isDomNode(a);
131131
var bIsDomNode = isDomNode(b);
132-
if (aIsDomNode && bIsDomNode) {
133-
// At first try to use DOM3 method isEqualNode
134-
if (a.isEqualNode) {
135-
return a.isEqualNode(b);
136-
}
137-
// IE8 doesn't support isEqualNode, try to use outerHTML && innerText
138-
var aIsElement = a instanceof Element;
139-
var bIsElement = b instanceof Element;
140-
if (aIsElement && bIsElement) {
141-
return a.outerHTML == b.outerHTML;
142-
}
143-
if (aIsElement || bIsElement) {
144-
return false;
145-
}
146-
return a.innerText == b.innerText && a.textContent == b.textContent;
147-
}
148-
if (aIsDomNode || bIsDomNode) {
149-
return false;
132+
// Use DOM3 method isEqualNode (IE>=9)
133+
if (aIsDomNode && typeof a.isEqualNode === 'function' && bIsDomNode) {
134+
return a.isEqualNode(b);
150135
}
151136

152137
// Used to detect circular references.
@@ -263,12 +248,9 @@ export function isA(typeName: string, value: unknown) {
263248
}
264249

265250
function isDomNode(obj: any): obj is Node {
266-
return (
267-
obj !== null &&
268-
typeof obj === 'object' &&
269-
typeof obj.nodeType === 'number' &&
270-
typeof obj.nodeName === 'string'
271-
);
251+
// In some test environments (e.g. "node") there is no `Node` even though
252+
// we might be comparing things that look like DOM nodes.
253+
return typeof Node !== 'undefined' && obj instanceof Node;
272254
}
273255

274256
export function fnNameFor(func: Function) {

0 commit comments

Comments
 (0)