/*
 * Copyright (c) 2014, 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.
 */
/**
 * @assertion 
 * @description 
 */
import "dart:html";
import "../../testharness.dart";

const String htmlEL1 = r'''
<style type="text/css">
#container {
    width: 200px;
    height: 100px;
    overflow: auto; 
}
#replacedElement {
    width: 200%;
    height: 100%;
}
</style>
''';

const String htmlEL2 = r'''
<div id="container">
    <img id="replacedElement" style="background:green"/>
</div>
''';

void main() {
    document.head.appendHtml(htmlEL1, treeSanitizer: new NullTreeSanitizer());
    document.body.appendHtml(htmlEL2, treeSanitizer: new NullTreeSanitizer());
    description(
'''Testcase for bug <a href="https://bugs.webkit.org/show_bug.cgi?id=11355">https://bugs.webkit.org/show_bug.cgi?id=11355</a>.
When a container having overflow:auto has a horizontal scrollbar,
the scrollbar is to be placed between the inner border edge and the outer padding edge.
Thus the content height of a replaced child inside the container must not include the height of the horizontal scollbars.
''');

    debug(
'''The height of the inner element box should be 100% of the containers height minus the height of horizontal scrollbar.
There should be no vertical scrollable content in the container<br>
''');
    shouldBe(document.getElementById("container").scrollHeight, document.getElementById("container").clientHeight);
    debug('Container height = Inner replaced element height + scrollbar height');
    shouldBeTrue(document.getElementById("container").offsetHeight > document.getElementById("replacedElement").offsetHeight);

    checkTestFailures();
}
