blob: f0198005fed7450f7b9d65963de43d3f4fc7ddfa [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file
// @dart = 2.9
import 'dart:html';
import 'package:expect/minitest.dart';
import 'utils.dart';
main() {
var isSpanElement = predicate((x) => x is SpanElement, 'is a SpanElemt');
var isDivElement = predicate((x) => x is DivElement, 'is a DivElement');
var isText = predicate((x) => x is Text, 'is a Text');
void expectNoSuchMethod(void fn()) => expect(fn, throwsNoSuchMethodError);
group('append', () {
test('htmlelement', () {
var el = new DivElement();
el.append(new SpanElement());
expect(el.children.length, equals(1));
var span = el.children[0];
expect(span, isSpanElement);
el.append(new DivElement());
expect(el.children.length, equals(2));
// Validate that the first item is still first.
expect(el.children[0], equals(span));
expect(el.children[1], isDivElement);
});
test('documentFragment', () {
var fragment = new DocumentFragment();
fragment.append(new SpanElement());
expect(fragment.children.length, equals(1));
expect(fragment.children[0], isSpanElement);
});
});
group('appendHtml', () {
test('htmlelement', () {
var el = new DivElement();
el.appendHtml('<span></span>');
expect(el.children.length, equals(1));
var span = el.children[0];
expect(span, isSpanElement);
el.appendHtml('<div></div>');
expect(el.children.length, equals(2));
// Validate that the first item is still first.
expect(el.children[0], equals(span));
expect(el.children[1], isDivElement);
});
test('documentFragment', () {
var fragment = new DocumentFragment();
fragment.appendHtml('<span>something</span>');
expect(fragment.children.length, equals(1));
expect(fragment.children[0], isSpanElement);
});
test('html interpreted in correct context', () {
// appendHtml, in order to sanitize, needs to create a document fragment,
// but it needs to be created in the right context. If we try to append
// table components then the document fragment needs the table context
// or it will fail to create them.
var el = new TableElement();
el.appendHtml('<tr><td>foo</td></tr>');
expect(el.children.length, 1);
var section = el.children.first;
expect(section is TableSectionElement, isTrue);
var row = section.children.first;
expect(row is TableRowElement, isTrue);
var item = row.children.first;
expect(item is TableCellElement, isTrue);
expect(item.innerHtml, 'foo');
});
test("use body context for elements that are don't support it", () {
// Some elements can't be used as context for createContextualFragment,
// often because it doesn't make any sense. So adding children to a
// <br> has no real effect on the page, but we can do it. But the
// document fragment will have to be created in the body context. Verify
// that this doesn't throw and that the children show up.
var el = new BRElement();
el.appendHtml("<p>Stuff</p>");
expect(el.children.length, 1);
expect(el.children[0].outerHtml, "<p>Stuff</p>");
});
});
group('appendText', () {
test('htmlelement', () {
var el = new DivElement();
el.appendText('foo');
// No children were created.
expect(el.children.length, equals(0));
// One text node was added.
expect(el.nodes.length, equals(1));
});
test('htmlelement', () {
var el = new DivElement();
var twoNewLines = "\n\n";
el.appendText(twoNewLines);
// No children were created.
expect(el.children.length, equals(0));
// One text node was added.
expect(el.nodes.length, equals(1));
expect(el.nodes[0], isText);
expect(el.nodes[0].text, equals(twoNewLines));
expect(el.text, equals(twoNewLines));
});
test('documentFragment', () {
var fragment = new DocumentFragment();
fragment.appendText('foo');
// No children were created.
expect(fragment.children.length, equals(0));
// One text node was added.
expect(fragment.nodes.length, equals(1));
});
});
group('insertAdjacentElement', () {
test('beforebegin', () {
var parent = new DivElement();
var child = new DivElement();
var newChild = new SpanElement();
parent.children.add(child);
child.insertAdjacentElement('beforebegin', newChild);
expect(parent.children.length, 2);
expect(parent.children[0], isSpanElement);
});
test('afterend', () {
var parent = new DivElement();
var child = new DivElement();
var newChild = new SpanElement();
parent.children.add(child);
child.insertAdjacentElement('afterend', newChild);
expect(parent.children.length, 2);
expect(parent.children[1], isSpanElement);
});
test('afterbegin', () {
var parent = new DivElement();
var child = new DivElement();
var newChild = new SpanElement();
parent.children.add(child);
parent.insertAdjacentElement('afterbegin', newChild);
expect(parent.children.length, 2);
expect(parent.children[0], isSpanElement);
});
test('beforeend', () {
var parent = new DivElement();
var child = new DivElement();
var newChild = new SpanElement();
parent.children.add(child);
parent.insertAdjacentElement('beforeend', newChild);
expect(parent.children.length, 2);
expect(parent.children[1], isSpanElement);
});
});
group('insertAdjacentHtml', () {
test('beforebegin', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
child.insertAdjacentHtml('beforebegin', '<span></span>');
expect(parent.children.length, 2);
expect(parent.children[0], isSpanElement);
});
test('afterend', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
child.insertAdjacentHtml('afterend', '<span></span>');
expect(parent.children.length, 2);
expect(parent.children[1], isSpanElement);
});
test('afterbegin', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
parent.insertAdjacentHtml('afterbegin', '<span></span>');
expect(parent.children.length, 2);
expect(parent.children[0], isSpanElement);
});
test('beforeend', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
parent.insertAdjacentHtml('beforeend', '<span></span>');
expect(parent.children.length, 2);
expect(parent.children[1], isSpanElement);
});
});
group('insertAdjacentText', () {
test('beforebegin', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
child.insertAdjacentText('beforebegin', 'test');
expect(parent.nodes.length, 2);
expect(parent.nodes[0], isText);
});
test('afterend', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
child.insertAdjacentText('afterend', 'test');
expect(parent.nodes.length, 2);
expect(parent.nodes[1], isText);
});
test('afterbegin', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
parent.insertAdjacentText('afterbegin', 'test');
expect(parent.nodes.length, 2);
expect(parent.nodes[0], isText);
});
test('beforeend', () {
var parent = new DivElement();
var child = new DivElement();
parent.children.add(child);
parent.insertAdjacentText('beforeend', 'test');
expect(parent.nodes.length, 2);
expect(parent.nodes[1], isText);
});
});
}