<!DOCTYPE html><!-- webkit-test-runner [ ModelElementEnabled=true ] -->
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
test(() => {
    const model = document.createElement("model");
    assert_idl_attribute(model, "width", "width is defined");
    assert_idl_attribute(model, "height", "width is defined");
}, "HTMLModelElement has width and height properties");

test(() => {
    const model = document.createElement("model");
    model.setAttribute("width", "100");
    model.setAttribute("height", "200");
    assert_equals(model.width, 100, "width attribute value is reflected by HTMLModelElement width property");
    assert_equals(model.height, 200, "height attribute value is reflected by HTMLModelElement height property");
}, "HTMLModelElement width and height properties reflect width and height attribute values");

test(() => {
    const model = document.createElement("model");
    model.width = 100;
    model.height = 200;
    assert_equals(model.getAttribute("width"), "100", "HTMLModelElement width property value is reflected by width attribute");
    assert_equals(model.getAttribute("height"), "200", "HTMLModelElement height property value is reflected by height attribute");
}, "<model> width and height attributes reflect HTMLModelElement width and height properties");

test(() => {
    const model = document.createElement("model");
    document.body.append(model);
    assert_equals(getComputedStyle(model).width, "300px", "default width is 300");
    assert_equals(getComputedStyle(model).height, "150px", "default height is 150");
    model.remove();
}, "<model> has default CSS size when no width or height attribute is used");

test(() => {
    const model = document.createElement("model");
    model.width = "400";
    model.height = "100";
    document.body.append(model);
    assert_equals(getComputedStyle(model).width, "400px", "automatic size is influenced by width attribute");
    assert_equals(getComputedStyle(model).height, "100px", "automatic size is influenced by height attribute");
    model.remove();
}, "<model> width and height attributes influence automatic size");

test(() => {
    const model = document.createElement("model");
    model.style.width = "200px";
    model.style.height = "50px";
    model.width = "400";
    model.height = "100";
    document.body.append(model);
    assert_equals(getComputedStyle(model).width, "200px", "non-auto width value wins over width attribute");
    assert_equals(getComputedStyle(model).height, "50px", "non-auto height value wins over height attribute");
    model.remove();
}, "<model> width and height attributes do not win over non-auto width and height property values");

test(() => {
    const model = document.createElement("model");
    model.width = 200;
    model.style.aspectRatio = "1 / 2";
    document.body.append(model);
    assert_equals(getComputedStyle(model).height, "400px", "aspect-ratio influences size");
    model.remove();
}, "<model> size computation takes aspect-ratio property into account");
</script>
