<html>
    <head>
        <script>
            if (window.testRunner)
                testRunner.dumpAsText();

            function log(frame, success, isWidth, size) {
              if (window.testRunner) {
                alert(frame.name + ' resized correctly = ' + (success ? 'true' : 'false'));
              } else {
                frame.document.close();
                if (success)
                    frame.document.write('<p>Success!</p>');
                else {
                    var rect = frame.frameElement.getBoundingClientRect();
                    frame.document.write('<p>Resize until ');
                    frame.document.write(isWidth ? 'width:' : 'height:');
                    frame.document.write(isWidth ? rect.width : rect.height);
                    frame.document.write(' = ' + size + '</p>');
                }
              }
            }

            function checkProgress() {
                if (!window.testRunner)
                    checkSuccess();
            }

            function init() {
                if (window.testRunner) {
                    //Move the One/* vertical resizer ten pixels west...
                    eventSender.mouseMoveTo(90, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(100, 400);
                    eventSender.mouseUp();

                    //Move the Two/Three horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 70);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 80);
                    eventSender.mouseUp();

                    //Move the Three/Four horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 126);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 136);
                    eventSender.mouseUp();

                    //Move the Four/Five horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 275);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 285);
                    eventSender.mouseUp();

                    //Move the Five/Six horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 392);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 402);
                    eventSender.mouseUp();

                    //Move the Six/Seven vertical resizer 200 pixels east...
                    eventSender.mouseMoveTo(788, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(588, 400);
                    eventSender.mouseUp();

                    //Move the Seven/Eight vertical resizer 100 pixels east...
                    eventSender.mouseMoveTo(794, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(694, 400);
                    eventSender.mouseUp();

                    checkSuccess();
                } else {
                    checkProgress();
                }
            }
            function checkSuccess() {
                    log(One, One.frameElement.getBoundingClientRect().width == 100, true, 100)
                    log(Two, Two.frameElement.getBoundingClientRect().height == 80, false, 80)
                    log(Three, Three.frameElement.getBoundingClientRect().height == 50, false, 50)
                    log(Four, Four.frameElement.getBoundingClientRect().height == 143, false, 143)
                    log(Five, Five.frameElement.getBoundingClientRect().height == 111, false, 111)
                    log(Six, Six.frameElement.getBoundingClientRect().height == 192, false, 192)
                    log(Seven, Seven.frameElement.getBoundingClientRect().width == 100, true, 100)
                    log(Eight, Eight.frameElement.getBoundingClientRect().width == 100, true, 100)
            }

            window.onload = init;
        </script>
    </head>
        <frameset cols='90,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
            <frame framemargin=0 frameborder=1 name="One" framespacing=1 />
            <frameset rows='70,50,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                <frame framemargin=0 frameborder=1 name="Two" framespacing=1 />
                <frame framemargin=0 frameborder=1 name="Three" framespacing=1 />
                <frameset cols='*,0,0' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                    <frameset rows='30%,25%,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                        <frame framemargin=0 frameborder=1 name="Four" framespacing=1 />
                        <frame framemargin=0 frameborder=1 name="Five" framespacing=1 />
                        <frame framemargin=0 frameborder=1 name="Six" framespacing=1 />
                    </frameset>
                    <frame framemargin=0 frameborder=1 name="Seven" framespacing=1 />
                    <frame framemargin=0 frameborder=1 name="Eight" framespacing=1 />
                </frameset>
            </frameset>
        </frameset>
</html>
