Index: test/codegen/lib/html/element_add_test.dart |
diff --git a/test/codegen/lib/html/element_add_test.dart b/test/codegen/lib/html/element_add_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2c2ea01890149b3d52fb73f1b08d71c81d1ab585 |
--- /dev/null |
+++ b/test/codegen/lib/html/element_add_test.dart |
@@ -0,0 +1,270 @@ |
+// 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 |
+ |
+library ElementAddTest; |
+import 'package:unittest/unittest.dart'; |
+import 'package:unittest/html_config.dart'; |
+import 'util.dart'; |
+import 'dart:html'; |
+ |
+main() { |
+ useHtmlConfiguration(); |
+ |
+ 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); |
+ }); |
+ }); |
+} |