| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library template_element_test; | 5 library template_element_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 import 'dart:html'; | 9 import 'dart:html'; |
| 10 import 'dart:math' as math; | 10 import 'dart:math' as math; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 root.innerHtml = s; | 56 root.innerHtml = s; |
| 57 testDiv.append(div); | 57 testDiv.append(div); |
| 58 | 58 |
| 59 for (var node in root.queryAll('*')) { | 59 for (var node in root.queryAll('*')) { |
| 60 if (node.isTemplate) TemplateElement.decorate(node); | 60 if (node.isTemplate) TemplateElement.decorate(node); |
| 61 } | 61 } |
| 62 | 62 |
| 63 return root; | 63 return root; |
| 64 } | 64 } |
| 65 | 65 |
| 66 recursivelySetTemplateModel(element, model) { | |
| 67 for (var node in element.queryAll('*')) { | |
| 68 if (node.isTemplate) node.model = model; | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 dispatchEvent(type, target) { | |
| 73 target.dispatchEvent(new Event(type, cancelable: false)); | |
| 74 } | |
| 75 | |
| 76 var expando = new Expando('observeTest'); | 66 var expando = new Expando('observeTest'); |
| 77 void addExpandos(node) { | 67 void addExpandos(node) { |
| 78 while (node != null) { | 68 while (node != null) { |
| 79 expando[node] = node.text; | 69 expando[node] = node.text; |
| 80 node = node.nextNode; | 70 node = node.nextNode; |
| 81 } | 71 } |
| 82 } | 72 } |
| 83 | 73 |
| 84 void checkExpandos(node) { | 74 void checkExpandos(node) { |
| 85 expect(node, isNotNull); | 75 expect(node, isNotNull); |
| (...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 // https://github.com/toolkitchen/mdv/issues/8 | 1564 // https://github.com/toolkitchen/mdv/issues/8 |
| 1575 observeTest('UnbindingInNestedBind', () { | 1565 observeTest('UnbindingInNestedBind', () { |
| 1576 var div = createTestHtml( | 1566 var div = createTestHtml( |
| 1577 '<template bind="{{outer}}" if="{{outer}}" syntax="testHelper">' | 1567 '<template bind="{{outer}}" if="{{outer}}" syntax="testHelper">' |
| 1578 '<template bind="{{inner}}" if="{{inner}}">' | 1568 '<template bind="{{inner}}" if="{{inner}}">' |
| 1579 '{{ age }}' | 1569 '{{ age }}' |
| 1580 '</template>' | 1570 '</template>' |
| 1581 '</template>'); | 1571 '</template>'); |
| 1582 | 1572 |
| 1583 var syntax = new UnbindingInNestedBindSyntax(); | 1573 var syntax = new UnbindingInNestedBindSyntax(); |
| 1584 TemplateElement.syntax['testHelper'] = syntax; | 1574 var model = toSymbolMap({ |
| 1585 try { | 1575 'outer': { |
| 1586 var model = toSymbolMap({ | 1576 'inner': { |
| 1587 'outer': { | 1577 'age': 42 |
| 1588 'inner': { | |
| 1589 'age': 42 | |
| 1590 } | |
| 1591 } | 1578 } |
| 1592 }); | 1579 } |
| 1580 }); |
| 1593 | 1581 |
| 1594 recursivelySetTemplateModel(div, model); | 1582 recursivelySetTemplateModel(div, model, syntax); |
| 1595 | 1583 |
| 1596 deliverChanges(model); | 1584 deliverChanges(model); |
| 1597 expect(syntax.count, 1); | 1585 expect(syntax.count, 1); |
| 1598 | 1586 |
| 1599 var inner = model[sym('outer')][sym('inner')]; | 1587 var inner = model[sym('outer')][sym('inner')]; |
| 1600 model[sym('outer')] = null; | 1588 model[sym('outer')] = null; |
| 1601 | 1589 |
| 1602 deliverChanges(model); | 1590 deliverChanges(model); |
| 1603 expect(syntax.count, 1); | 1591 expect(syntax.count, 1); |
| 1604 | 1592 |
| 1605 model[sym('outer')] = toSymbols({'inner': {'age': 2}}); | 1593 model[sym('outer')] = toSymbols({'inner': {'age': 2}}); |
| 1606 syntax.expectedAge = 2; | 1594 syntax.expectedAge = 2; |
| 1607 | 1595 |
| 1608 deliverChanges(model); | 1596 deliverChanges(model); |
| 1609 expect(syntax.count, 2); | 1597 expect(syntax.count, 2); |
| 1610 } finally { | |
| 1611 TemplateElement.syntax.remove('testHelper'); | |
| 1612 } | |
| 1613 }); | 1598 }); |
| 1614 | 1599 |
| 1615 // https://github.com/toolkitchen/mdv/issues/8 | 1600 // https://github.com/toolkitchen/mdv/issues/8 |
| 1616 observeTest('DontCreateInstancesForAbandonedIterators', () { | 1601 observeTest('DontCreateInstancesForAbandonedIterators', () { |
| 1617 var div = createTestHtml( | 1602 var div = createTestHtml( |
| 1618 '<template bind="{{}} {{}}">' | 1603 '<template bind="{{}} {{}}">' |
| 1619 '<template bind="{{}}">Foo' | 1604 '<template bind="{{}}">Foo' |
| 1620 '</template>' | 1605 '</template>' |
| 1621 '</template>'); | 1606 '</template>'); |
| 1622 recursivelySetTemplateModel(div, null); | 1607 recursivelySetTemplateModel(div, null); |
| 1623 performMicrotaskCheckpoint(); | 1608 performMicrotaskCheckpoint(); |
| 1624 }); | 1609 }); |
| 1625 | 1610 |
| 1626 observeTest('CreateInstance', () { | 1611 observeTest('CreateInstance', () { |
| 1627 TemplateElement.syntax['Test'] = new TestBindingSyntax(); | 1612 var div = createTestHtml( |
| 1628 try { | 1613 '<template bind="{{a}}">' |
| 1629 var div = createTestHtml( | 1614 '<template bind="{{b}}">' |
| 1630 '<template bind="{{a}}">' | 1615 '{{ foo }}:{{ replaceme }}' |
| 1631 '<template bind="{{b}}">' | 1616 '</template>' |
| 1632 '{{ foo }}:{{ replaceme }}' | 1617 '</template>'); |
| 1633 '</template>' | 1618 var outer = div.nodes.first; |
| 1634 '</template>'); | 1619 var model = toSymbolMap({'b': {'foo': 'bar'}}); |
| 1635 var outer = div.nodes.first; | |
| 1636 var model = toSymbolMap({'b': {'foo': 'bar'}}); | |
| 1637 | 1620 |
| 1638 var host = new DivElement(); | 1621 var host = new DivElement(); |
| 1639 var instance = outer.createInstance(model, 'Test'); | 1622 var instance = outer.createInstance(model, new TestBindingSyntax()); |
| 1640 expect(outer.content.nodes.first, instance.nodes.first.ref); | 1623 expect(outer.content.nodes.first, instance.nodes.first.ref); |
| 1641 expect(instance.firstChild.attributes['syntax'], 'Test'); | |
| 1642 | 1624 |
| 1643 host.append(instance); | 1625 host.append(instance); |
| 1644 performMicrotaskCheckpoint(); | 1626 performMicrotaskCheckpoint(); |
| 1645 expect(host.firstChild.nextNode.text, 'bar:replaced'); | 1627 expect(host.firstChild.nextNode.text, 'bar:replaced'); |
| 1646 } finally { | |
| 1647 TemplateElement.syntax.remove('Test'); | |
| 1648 } | |
| 1649 }); | 1628 }); |
| 1650 | 1629 |
| 1651 observeTest('Bootstrap', () { | 1630 observeTest('Bootstrap', () { |
| 1652 var div = new DivElement(); | 1631 var div = new DivElement(); |
| 1653 div.innerHtml = | 1632 div.innerHtml = |
| 1654 '<template>' | 1633 '<template>' |
| 1655 '<div></div>' | 1634 '<div></div>' |
| 1656 '<template>' | 1635 '<template>' |
| 1657 'Hello' | 1636 'Hello' |
| 1658 '</template>' | 1637 '</template>' |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 expect(called, false); | 1672 expect(called, false); |
| 1694 | 1673 |
| 1695 recursivelySetTemplateModel(div, null); | 1674 recursivelySetTemplateModel(div, null); |
| 1696 performMicrotaskCheckpoint(); | 1675 performMicrotaskCheckpoint(); |
| 1697 expect(called, true); | 1676 expect(called, true); |
| 1698 | 1677 |
| 1699 sub.cancel(); | 1678 sub.cancel(); |
| 1700 }); | 1679 }); |
| 1701 } | 1680 } |
| 1702 | 1681 |
| 1703 class TestBindingSyntax extends CustomBindingSyntax { | 1682 class TestBindingSyntax extends BindingDelegate { |
| 1704 getBinding(model, String path, name, node) { | 1683 getBinding(model, String path, name, node) { |
| 1705 if (path.trim() == 'replaceme') return new ObservableBox('replaced'); | 1684 if (path.trim() == 'replaceme') return new ObservableBox('replaced'); |
| 1706 return null; | 1685 return null; |
| 1707 } | 1686 } |
| 1708 } | 1687 } |
| 1709 | 1688 |
| 1710 class UnbindingInNestedBindSyntax extends CustomBindingSyntax { | 1689 class UnbindingInNestedBindSyntax extends BindingDelegate { |
| 1711 int expectedAge = 42; | 1690 int expectedAge = 42; |
| 1712 int count = 0; | 1691 int count = 0; |
| 1713 | 1692 |
| 1714 getBinding(model, path, name, node) { | 1693 getBinding(model, path, name, node) { |
| 1715 if (name != 'text' || path != 'age') | 1694 if (name != 'text' || path != 'age') |
| 1716 return; | 1695 return; |
| 1717 | 1696 |
| 1718 expect(model[sym('age')], expectedAge); | 1697 expect(model[sym('age')], expectedAge); |
| 1719 count++; | 1698 count++; |
| 1720 } | 1699 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 k = k is String ? sym(k) : _deepToSymbol(k); | 1739 k = k is String ? sym(k) : _deepToSymbol(k); |
| 1761 result[k] = _deepToSymbol(v); | 1740 result[k] = _deepToSymbol(v); |
| 1762 }); | 1741 }); |
| 1763 return result; | 1742 return result; |
| 1764 } | 1743 } |
| 1765 if (value is Iterable) { | 1744 if (value is Iterable) { |
| 1766 return value.map(_deepToSymbol).toList(); | 1745 return value.map(_deepToSymbol).toList(); |
| 1767 } | 1746 } |
| 1768 return value; | 1747 return value; |
| 1769 } | 1748 } |
| OLD | NEW |