Skip to content

Commit 30dabdf

Browse files
karamhevery
authored andcommitted
refactor(core): remove testing-only DOM manipulation utils from DomAdapters (angular#32291)
PR Close angular#32291
1 parent ede5786 commit 30dabdf

File tree

14 files changed

+48
-101
lines changed

14 files changed

+48
-101
lines changed

packages/common/test/directives/ng_if_spec.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ import {expect} from '@angular/platform-browser/testing/src/matchers';
103103

104104
fixture.detectChanges();
105105
expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(3);
106-
expect(getDOM().getText(fixture.nativeElement))
107-
.toEqual('helloNumberhelloStringhelloFunction');
106+
expect(fixture.nativeElement.textContent).toEqual('helloNumberhelloStringhelloFunction');
108107

109108
getComponent().numberCondition = 0;
110109
fixture.detectChanges();

packages/core/test/application_ref_spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {ComponentRef} from '@angular/core/src/linker/component_factory';
1515
import {getLocaleId} from '@angular/core/src/render3';
1616
import {BrowserModule} from '@angular/platform-browser';
1717
import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter';
18-
import {dispatchEvent, getContent} from '@angular/platform-browser/testing/src/browser_util';
18+
import {createTemplate, dispatchEvent, getContent} from '@angular/platform-browser/testing/src/browser_util';
1919
import {expect} from '@angular/platform-browser/testing/src/matchers';
2020
import {onlyInIvy} from '@angular/private/testing';
2121

@@ -35,7 +35,7 @@ class SomeComponent {
3535
function createRootEl(selector = 'bootstrap-app') {
3636
const doc = TestBed.get(DOCUMENT);
3737
const rootEl = <HTMLElement>getDOM().firstChild(
38-
getContent(getDOM().createTemplate(`<${selector}></${selector}>`)));
38+
getContent(createTemplate(`<${selector}></${selector}>`)));
3939
const oldRoots = getDOM().querySelectorAll(doc, selector);
4040
for (let i = 0; i < oldRoots.length; i++) {
4141
getDOM().remove(oldRoots[i]);

packages/core/test/dom/dom_adapter_spec.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,6 @@ import {el, isTextNode, stringifyElement} from '@angular/platform-browser/testin
1717
defaultDoc = getDOM().supportsDOMEvents() ? document : getDOM().createHtmlDocument();
1818
});
1919

20-
it('should not coalesque text nodes', () => {
21-
const el1 = el('<div>a</div>');
22-
const el2 = el('<div>b</div>');
23-
getDOM().appendChild(el2, getDOM().firstChild(el1));
24-
expect(getDOM().childNodes(el2).length).toBe(2);
25-
26-
const el2Clone = getDOM().clone(el2);
27-
expect(getDOM().childNodes(el2Clone).length).toBe(2);
28-
});
29-
30-
it('should clone correctly', () => {
31-
const el1 = el('<div x="y">a<span>b</span></div>');
32-
const clone = getDOM().clone(el1);
33-
34-
expect(clone).not.toBe(el1);
35-
getDOM().setAttribute(clone, 'test', '1');
36-
expect(stringifyElement(clone)).toEqual('<div test="1" x="y">a<span>b</span></div>');
37-
expect(getDOM().getAttribute(el1, 'test')).toBeFalsy();
38-
39-
const cNodes = getDOM().childNodes(clone);
40-
const firstChild = cNodes[0];
41-
const secondChild = cNodes[1];
42-
expect(getDOM().parentElement(firstChild)).toBe(clone);
43-
expect(getDOM().nextSibling(firstChild)).toBe(secondChild);
44-
expect(isTextNode(firstChild)).toBe(true);
45-
46-
expect(getDOM().parentElement(secondChild)).toBe(clone);
47-
expect(getDOM().nextSibling(secondChild)).toBeFalsy();
48-
expect(getDOM().isElementNode(secondChild)).toBe(true);
49-
});
50-
5120
it('should be able to create text nodes and use them with the other APIs', () => {
5221
const t = getDOM().createTextNode('hello');
5322
expect(isTextNode(t)).toBe(true);

packages/core/test/linker/integration_spec.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,8 +1006,8 @@ function declareTests(config?: {useJit: boolean}) {
10061006
getDOM().dispatchEvent(fixture.debugElement.children[1].nativeElement, dispatchedEvent2);
10071007
expect(getDOM().isPrevented(dispatchedEvent)).toBe(true);
10081008
expect(getDOM().isPrevented(dispatchedEvent2)).toBe(false);
1009-
expect(getDOM().getChecked(fixture.debugElement.children[0].nativeElement)).toBeFalsy();
1010-
expect(getDOM().getChecked(fixture.debugElement.children[1].nativeElement)).toBeTruthy();
1009+
expect(fixture.debugElement.children[0].nativeElement.checked).toBeFalsy();
1010+
expect(fixture.debugElement.children[1].nativeElement.checked).toBeTruthy();
10111011
});
10121012
}
10131013

@@ -2689,15 +2689,14 @@ class ComponentWithoutView {
26892689
@Directive({selector: '[no-duplicate]'})
26902690
class DuplicateDir {
26912691
constructor(elRef: ElementRef) {
2692-
getDOM().setText(elRef.nativeElement, getDOM().getText(elRef.nativeElement) + 'noduplicate');
2692+
getDOM().setText(elRef.nativeElement, elRef.nativeElement.textContent + 'noduplicate');
26932693
}
26942694
}
26952695

26962696
@Directive({selector: '[no-duplicate]'})
26972697
class OtherDuplicateDir {
26982698
constructor(elRef: ElementRef) {
2699-
getDOM().setText(
2700-
elRef.nativeElement, getDOM().getText(elRef.nativeElement) + 'othernoduplicate');
2699+
getDOM().setText(elRef.nativeElement, elRef.nativeElement.textContent + 'othernoduplicate');
27012700
}
27022701
}
27032702

packages/core/test/view/text_spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, compViewDef, createAndGetRoot
1919
it('should create text nodes without parents', () => {
2020
const rootNodes = createAndGetRootNodes(compViewDef([textDef(0, null, ['a'])])).rootNodes;
2121
expect(rootNodes.length).toBe(1);
22-
expect(getDOM().getText(rootNodes[0])).toBe('a');
22+
expect(rootNodes[0].textContent).toBe('a');
2323
});
2424

2525
it('should create views with multiple root text nodes', () => {
@@ -36,8 +36,8 @@ import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, compViewDef, createAndGetRoot
3636
textDef(1, null, ['a']),
3737
])).rootNodes;
3838
expect(rootNodes.length).toBe(1);
39-
const textNode = getDOM().firstChild(rootNodes[0]);
40-
expect(getDOM().getText(textNode)).toBe('a');
39+
const textNode = getDOM().firstChild(rootNodes[0]) as Element;
40+
expect(textNode.textContent).toBe('a');
4141
});
4242

4343
it('should add debug information to the renderer', () => {
@@ -61,7 +61,7 @@ import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, compViewDef, createAndGetRoot
6161

6262
Services.checkAndUpdateView(view);
6363

64-
expect(getDOM().getText(rootNodes[0])).toBe('0a1b2');
64+
expect(rootNodes[0].textContent).toBe('0a1b2');
6565
});
6666

6767
});

packages/platform-browser-dynamic/testing/src/dom_test_component_renderer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ export class DOMTestComponentRenderer extends TestComponentRenderer {
1919
constructor(@Inject(DOCUMENT) private _doc: any) { super(); }
2020

2121
insertRootElement(rootElId: string) {
22-
const rootEl = <HTMLElement>getDOM().firstChild(
23-
getContent(getDOM().createTemplate(`<div id="${rootElId}"></div>`)));
22+
const template = getDOM().getDefaultDocument().createElement('template');
23+
template.innerHTML = `<div id="${rootElId}"></div>`;
24+
const rootEl = <HTMLElement>getDOM().firstChild(getContent(template));
2425

2526
// TODO(juliemr): can/should this be optional?
2627
const oldRoots = getDOM().querySelectorAll(this._doc, '[id^=root]');

packages/platform-browser/src/browser/browser_adapter.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,6 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
146146
nextSibling(el: Node): Node|null { return el.nextSibling; }
147147
parentElement(el: Node): Node|null { return el.parentNode; }
148148
childNodes(el: any): Node[] { return el.childNodes; }
149-
childNodesAsList(el: Node): any[] {
150-
const childNodes = el.childNodes;
151-
const res = [];
152-
for (let i = 0; i < childNodes.length; i++) {
153-
res[i] = childNodes[i];
154-
}
155-
return res;
156-
}
157149
clearNodes(el: Node) {
158150
while (el.firstChild) {
159151
el.removeChild(el.firstChild);
@@ -168,17 +160,9 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
168160
return node;
169161
}
170162
insertBefore(parent: Node, ref: Node, node: Node) { parent.insertBefore(node, ref); }
171-
getText(el: Node): string|null { return el.textContent; }
172163
setText(el: Node, value: string) { el.textContent = value; }
173164
getValue(el: any): string { return el.value; }
174-
setValue(el: any, value: string) { el.value = value; }
175-
getChecked(el: any): boolean { return el.checked; }
176165
createComment(text: string): Comment { return this.getDefaultDocument().createComment(text); }
177-
createTemplate(html: any): HTMLElement {
178-
const t = this.getDefaultDocument().createElement('template');
179-
t.innerHTML = html;
180-
return t;
181-
}
182166
createElement(tagName: string, doc?: Document): HTMLElement {
183167
doc = doc || this.getDefaultDocument();
184168
return doc.createElement(tagName);
@@ -192,7 +176,6 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
192176
return doc.createTextNode(text);
193177
}
194178
getHost(el: HTMLElement): HTMLElement { return (<any>el).host; }
195-
clone(node: Node): Node { return node.cloneNode(true); }
196179
getElementsByTagName(element: any, name: string): HTMLElement[] {
197180
return element.getElementsByTagName(name);
198181
}

packages/platform-browser/src/browser/generic_browser_adapter.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,5 @@ import {DomAdapter} from '../dom/dom_adapter';
1919
export abstract class GenericBrowserDomAdapter extends DomAdapter {
2020
constructor() { super(); }
2121

22-
getDistributedNodes(el: HTMLElement): Node[] { return (<any>el).getDistributedNodes(); }
2322
supportsDOMEvents(): boolean { return true; }
2423
}

packages/platform-browser/src/dom/dom_adapter.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,31 +60,22 @@ export abstract class DomAdapter {
6060
abstract nextSibling(el: any): Node|null;
6161
abstract parentElement(el: any): Node|null;
6262
abstract childNodes(el: any): Node[];
63-
abstract childNodesAsList(el: any): Node[];
63+
64+
// Used by Meta
65+
abstract remove(el: any): Node;
66+
abstract getAttribute(element: any, attribute: string): string|null;
67+
68+
// Used by platform-server
6469
abstract clearNodes(el: any): any;
6570
abstract appendChild(el: any, node: any): any;
6671
abstract removeChild(el: any, node: any): any;
67-
abstract remove(el: any): Node;
6872
abstract insertBefore(parent: any, ref: any, node: any): any;
69-
abstract getText(el: any): string|null;
7073
abstract setText(el: any, value: string): any;
71-
abstract getValue(el: any): string;
72-
abstract setValue(el: any, value: string): any;
73-
abstract getChecked(el: any): boolean;
7474
abstract createComment(text: string): any;
75-
abstract createTemplate(html: any): HTMLElement;
7675
abstract createElement(tagName: any, doc?: any): HTMLElement;
7776
abstract createElementNS(ns: string, tagName: string, doc?: any): Element;
7877
abstract createTextNode(text: string, doc?: any): Text;
79-
abstract getHost(el: any): any;
80-
abstract getDistributedNodes(el: any): Node[];
81-
abstract clone /*<T extends Node>*/ (node: Node /*T*/): Node /*T*/;
8278
abstract getElementsByTagName(element: any, name: string): HTMLElement[];
83-
84-
// Used by Meta
85-
abstract getAttribute(element: any, attribute: string): string|null;
86-
87-
// Used by platform-server
8879
abstract addClass(element: any, className: string): any;
8980
abstract removeClass(element: any, className: string): any;
9081
abstract getStyle(element: any, styleName: string): any;
@@ -107,6 +98,7 @@ export abstract class DomAdapter {
10798

10899
// Used by Testability
109100
abstract isShadowRoot(node: any): boolean;
101+
abstract getHost(el: any): any;
110102

111103
// Used by KeyEventsPlugin
112104
abstract getEventKey(event: any): string;

packages/platform-browser/testing/src/browser_util.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export function dispatchEvent(element: any, eventType: any): void {
9595
}
9696

9797
export function el(html: string): HTMLElement {
98-
return <HTMLElement>getDOM().firstChild(getContent(getDOM().createTemplate(html)));
98+
return <HTMLElement>getDOM().firstChild(getContent(createTemplate(html)));
9999
}
100100

101101
export function normalizeCSS(css: string): string {
@@ -160,7 +160,7 @@ export function stringifyElement(el: any /** TODO #9100 */): string {
160160
} else if (isCommentNode(el)) {
161161
result += `<!--${el.nodeValue}-->`;
162162
} else {
163-
result += getDOM().getText(el);
163+
result += el.textContent;
164164
}
165165

166166
return result;
@@ -212,3 +212,18 @@ export function hasClass(element: any, className: string): boolean {
212212
export function sortedClassList(element: any): any[] {
213213
return Array.prototype.slice.call(element.classList, 0).sort();
214214
}
215+
216+
export function createTemplate(html: any): HTMLElement {
217+
const t = getDOM().getDefaultDocument().createElement('template');
218+
t.innerHTML = html;
219+
return t;
220+
}
221+
222+
export function childNodesAsList(el: Node): any[] {
223+
const childNodes = el.childNodes;
224+
const res = [];
225+
for (let i = 0; i < childNodes.length; i++) {
226+
res[i] = childNodes[i];
227+
}
228+
return res;
229+
}

0 commit comments

Comments
 (0)