| <root style="width: 300px"> |
| <parent style='background-color: lightblue;'> |
| <child style='background-color: pink;'> |
| <grandchild style='background-color: red; width: 25px; height: 25px;'></grandchild> |
| </child> |
| <child2 style='background-color: salmon; height: 25px;' /> |
| </parent> |
| </root> |
| |
| <intrinsic-container> |
| <intrinsic> |
| <intrinsic-child style="width: 10px; height: 10px; background-color: lightblue;" /> |
| </intrinsic> |
| </intrinsic-container> |
| |
| <script> |
| import "../resources/third_party/unittest/unittest.dart"; |
| import "../resources/unit.dart"; |
| |
| import 'dart:async'; |
| import 'dart:sky'; |
| |
| void main() { |
| initUnit(); |
| |
| test("should have the right sizes after layout", () { |
| Completer completer = new Completer(); |
| |
| var first = true; |
| |
| var parent = document.querySelector('parent'); |
| var firstChild = parent.firstElementChild; |
| var secondChild = parent.lastElementChild; |
| var grandChild = document.querySelector('grandchild'); |
| |
| parent.setLayoutManager(() { |
| if (first) { |
| parent.width = 200.0; |
| } else { |
| parent.width = 150.0; |
| } |
| |
| firstChild.width = 100.0; |
| firstChild.layout(); |
| firstChild.x = 100.0; |
| firstChild.y = 50.0; |
| firstChild.height = 50.0; |
| |
| // The second element correctly gets it's width from it's container. |
| // TODO(ojan): Change the layout method to take in availableWidth |
| // so code doesn't need to mess with setNeedsLayout dirty bits |
| // in the middle of layout and so the parent and child don't need |
| // to coordinate as much about expectations. |
| secondChild.setNeedsLayout(); |
| secondChild.layout(); |
| |
| parent.height = 100.0; |
| }, () {}); |
| |
| void assertNonChangingValues() { |
| expect(parent.offsetHeight, equals(100)); |
| expect(parent.offsetTop, equals(0)); |
| expect(parent.offsetLeft, equals(0)); |
| |
| expect(firstChild.offsetWidth, equals(100)); |
| expect(firstChild.offsetHeight, equals(50)); |
| expect(firstChild.offsetTop, equals(50)); |
| expect(firstChild.offsetLeft, equals(100)); |
| |
| expect(secondChild.offsetHeight, equals(25)); |
| expect(secondChild.offsetTop, equals(0)); |
| expect(secondChild.offsetLeft, equals(0)); |
| |
| expect(grandChild.offsetWidth, equals(25)); |
| expect(grandChild.offsetHeight, equals(25)); |
| expect(secondChild.offsetTop, equals(0)); |
| expect(secondChild.offsetLeft, equals(0)); |
| }; |
| |
| window.requestAnimationFrame((_) { |
| expect(parent.offsetWidth, equals(200)); |
| expect(secondChild.offsetWidth, equals(200)); |
| assertNonChangingValues(); |
| |
| first = false; |
| parent.setNeedsLayout(); |
| |
| window.requestAnimationFrame((_) { |
| expect(parent.offsetWidth, equals(150)); |
| expect(secondChild.offsetWidth, equals(150)); |
| assertNonChangingValues(); |
| |
| parent.setLayoutManager(() { |
| parent.width = 250.0; |
| }, () {}); |
| |
| window.requestAnimationFrame((_) { |
| expect(parent.offsetWidth, equals(250)); |
| assertNonChangingValues(); |
| |
| parent.setLayoutManager(null, null); |
| |
| window.requestAnimationFrame((_) { |
| expect(parent.offsetWidth, equals(300)); |
| expect(parent.offsetHeight, equals(50)); |
| expect(parent.offsetTop, equals(0)); |
| expect(parent.offsetLeft, equals(0)); |
| |
| expect(firstChild.offsetWidth, equals(300)); |
| expect(firstChild.offsetHeight, equals(25)); |
| expect(firstChild.offsetTop, equals(0)); |
| expect(firstChild.offsetLeft, equals(0)); |
| |
| expect(secondChild.offsetWidth, equals(300)); |
| expect(secondChild.offsetHeight, equals(25)); |
| expect(secondChild.offsetTop, equals(25)); |
| expect(secondChild.offsetLeft, equals(0)); |
| |
| expect(grandChild.offsetWidth, equals(25)); |
| expect(grandChild.offsetHeight, equals(25)); |
| expect(grandChild.offsetTop, equals(0)); |
| expect(grandChild.offsetLeft, equals(0)); |
| |
| completer.complete(); |
| }); |
| }); |
| }); |
| }); |
| |
| return completer.future; |
| }); |
| |
| test("intrinsic sizes should apply", () { |
| Completer completer = new Completer(); |
| |
| var intrinsic = document.querySelector('intrinsic'); |
| var intrinsicChild = document.querySelector('intrinsic-child'); |
| |
| intrinsic.setLayoutManager(() { |
| intrinsicChild.layout(); |
| }, () { |
| intrinsic.minContentWidth = intrinsicChild.minContentWidth + 5; |
| intrinsic.maxContentWidth = intrinsicChild.maxContentWidth + 7; |
| }); |
| |
| window.requestAnimationFrame((_) { |
| var container = document.querySelector('intrinsic-container'); |
| container.style['width'] = '-webkit-min-content'; |
| expect(container.offsetWidth, equals(15)); |
| container.style['width'] = '-webkit-max-content'; |
| expect(container.offsetWidth, equals(17)); |
| completer.complete(); |
| }); |
| |
| return completer.future; |
| }); |
| } |
| </script> |