chrome-devtools-frontend
Version:
Chrome DevTools UI
236 lines (191 loc) • 9.93 kB
text/typescript
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import './dom_extension.js';
function createSlot(parent: HTMLElement, name?: string) {
const slot = parent.createChild('slot');
if (name) {
slot.name = name;
}
return slot;
}
function createChild(parent: HTMLElement, tagName: keyof HTMLElementTagNameMap, name?: string, text = '') {
const child = parent.createChild(tagName, name);
if (name) {
child.slot = name;
}
child.textContent = text;
return child;
}
function traverseNextNode(parent: HTMLElement, stayWithin: HTMLElement): HTMLElement {
return parent.traverseNextNode(stayWithin) as HTMLElement;
}
describe('DataGrid', () => {
it('Traverse Node with Children', () => {
const component1 = document.createElement('div');
component1.classList.add('component1');
createChild(component1, 'div', 'component1-content', 'text 1');
createChild(component1, 'div', 'component2-content', 'text 2');
createChild(component1, 'span', undefined, 'text 3');
createChild(component1, 'span', 'component1-content', 'text 4');
// Now we have:
/*
* <div class="component1">
* <div class="component1-content" slot="component1-content">text 1</div>
* <div class="component2-content" slot="component2-content">text 2</div>
* <span>text 3</span><span class="component1-content" slot="component1-content">text 4</span>
* </div>
*/
let node: HTMLElement = component1;
assert.isNull(node.nodeValue, 'root node value is incorrect');
assert.strictEqual(node.nodeName, 'DIV', 'root node name is incorrect');
assert.strictEqual(node.className, 'component1', 'root node class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV', 'first child node name is incorrect');
assert.strictEqual(node.className, 'component1-content', 'first child class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'text 1', 'second child node value is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV', 'second child node name is incorrect');
assert.strictEqual(node.className, 'component2-content', 'second child class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'text 2', 'second child node value is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SPAN', 'third child node name is incorrect');
assert.strictEqual(node.className, '', 'third child class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'text 3', 'third child node value is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SPAN', 'forth child node name is incorrect');
assert.strictEqual(node.className, 'component1-content', 'forth child class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'text 4', 'forth child node value is incorrect');
});
it('Traverse Node with Shadows', () => {
const component1 = document.createElement('div');
component1.classList.add('component1');
const shadow1 = component1.attachShadow({mode: 'open'});
const shadow1Content = document.createElement('div');
shadow1Content.classList.add('shadow-component1');
shadow1.appendChild(shadow1Content);
const component2 = shadow1Content.createChild('div', 'component2');
const shadow2 = component2.attachShadow({mode: 'open'});
const shadow2Content = document.createElement('div');
shadow2Content.classList.add('shadow-component1');
shadow2.appendChild(shadow2Content);
const midDiv = createChild(shadow2Content, 'div', 'mid-div');
createChild(midDiv, 'div', undefined, 'component2-text');
// Now we have:
/*
* <div class="component1"></div>
* <div class="shadow-component1"><div class="component2"></div></div>
* <div class="shadow-component1"><div class="mid-div" slot="mid-div"><div>component2-text</div></div></div>
*/
let node: HTMLElement = component1;
assert.strictEqual(node.nodeName, 'DIV', 'root node name is incorrect');
assert.strictEqual(node.className, 'component1', 'root node class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, '#document-fragment', 'first document fragment node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV', 'first document fragment child node name is incorrect');
assert.strictEqual(node.className, 'shadow-component1', 'first document fragment child node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'component2');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, '#document-fragment');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'shadow-component1');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'mid-div');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, '');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, '#text');
assert.strictEqual(node.nodeValue, 'component2-text');
});
it('Traverse Node with Slots', () => {
const component1 = document.createElement('div');
component1.classList.add('component1');
const shadow1 = component1.attachShadow({mode: 'open'});
const shadow1Content = document.createElement('div');
shadow1Content.classList.add('shadow-component1');
shadow1.appendChild(shadow1Content);
createSlot(shadow1Content, 'component1-content');
createSlot(shadow1Content);
const component2 = shadow1Content.createChild('div', 'component2');
const shadow2 = component2.attachShadow({mode: 'open'});
createSlot(component2, 'component2-content');
createChild(component2, 'div', 'component2-content', 'component2 light dom text');
const shadow2Content = document.createElement('div');
shadow2Content.classList.add('shadow-component1');
shadow2.appendChild(shadow2Content);
const midDiv = createChild(shadow2Content, 'div', 'mid-div');
createChild(midDiv, 'div', undefined, 'component2-text');
createSlot(midDiv);
createSlot(midDiv, 'component2-content');
// Now we have:
/*
* <div class="component1"></div>
* <div class="shadow-component1">
* <slot name="component1-content"></slot>
* <slot></slot>
* <div class="component2">
* <slot name="component2-content"></slot>
* <div class="component2-content" slot="component2-content">component2 light dom text</div>
* </div>
* </div>
* <div class="shadow-component1">
* <div class="mid-div" slot="mid-div">
* <div>component2-text</div>
* <slot></slot>
* <slot name="component2-content"></slot>
* </div>
* </div>
*/
let node: HTMLElement = component1;
assert.strictEqual(node.nodeName, 'DIV', 'root node name is incorrect');
assert.strictEqual(node.className, 'component1', 'root node class is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, '#document-fragment', 'first document fragment node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV', 'first document fragment child node name is incorrect');
assert.strictEqual(node.className, 'shadow-component1', 'first document fragment child node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SLOT', 'first slot node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SLOT', 'second slot node name is incorrect');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'component2');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, '#document-fragment');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'shadow-component1');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'mid-div');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, '');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'component2-text');
assert.strictEqual(node.nodeName, '#text');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SLOT');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SLOT');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'SLOT');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeName, 'DIV');
assert.strictEqual(node.className, 'component2-content');
node = traverseNextNode(node, component1);
assert.strictEqual(node.nodeValue, 'component2 light dom text');
assert.strictEqual(node.nodeName, '#text');
});
});