<!doctype html><!-- webkit-test-runner [ ResizeObserverEnabled=true ] -->
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/resizeTestHelper.js"></script>
<p>ResizeObserver svg tests</p>
<svg height="430" width="500" >
  <circle cx="10" cy="10" r="5" style="fill:orange;stroke:black;stroke-width:1" />
  <ellipse cx="10" cy="30" rx="5" ry="5" style="fill:orange;stroke:black;stroke-width:1"/>
  <foreignObject cy="50" width="100" height="20">
    <body>
      <p>Here is a paragraph that requires word wrap</p>
    </body>
  </foreignobject>
  <image xlink:href="" x="0" y="100" height="30" width="100" />
  <line x1="0" y1="50" x2="20" y2="70" stroke="black" stroke-width="2"/>
  <path d="M 0 100 L 100 100 L 50 150 z"
        style="fill:orange;stroke:black;stroke-width:1" />
  <polygon points="0,200 100,200 50,250" style="fill:orange;stroke:black;stroke-width:1" />
  <polyline points="0,300 100,300 50,350" style="fill:orange;stroke:black;stroke-width:1"/>
  <rect x="0" y="380" width="10" height="10" style="fill:orange; stroke:black; stroke-width:1" />
  <text x="0" y="400" font-size="20" font-family="Ahem">svg text tag</text>
  <g fill="white" stroke="green" stroke-width="5">
    <rect x="0" y="380" width="50" height="20" id="g_rect" />
  </g>
</svg>
<script>
'use strict';

setup({allow_uncaught_exception: true});

function test0() {
  let target = document.querySelector('circle');
  let helper = new ResizeTestHelper(
    "test0: observe svg:circle",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('r', 10);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
      }
    }
  ]);
  return helper.start();
}

function test1() {
  let target = document.querySelector('ellipse');
  let helper = new ResizeTestHelper(
    "test1: observe svg:ellipse",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('rx', 10);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 20);
        assert_equals(entries[0].contentRect.height, 10);
      }
    }
  ]);
  return helper.start();
}

function test2() {
  let target = document.querySelector('foreignObject');
  let helper = new ResizeTestHelper(
    "test2: observe svg:foreignObject",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('width', 200);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 200);
        assert_equals(entries[0].contentRect.height, 20);
      }
    }
  ]);
  return helper.start();
}

function test3() {
  let target = document.querySelector('image');
  let helper = new ResizeTestHelper(
    "test3: observe svg:image",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('height', 40);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 100);
        assert_equals(entries[0].contentRect.height, 40);
      }
    }
  ]);
  return helper.start();
}

function test4() {
  let target = document.querySelector('line');
  let helper = new ResizeTestHelper(
    "test4: observe svg:line",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('y2', 80);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 20);
        assert_equals(entries[0].contentRect.height, 30);
      }
    }
  ]);
  return helper.start();
}

function test5() {
  let target = document.querySelector('path');
  let helper = new ResizeTestHelper(
    "test5: observe svg:path",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('d', "M 0 100 L 100 100 L 50 160 z");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 100);
        assert_equals(entries[0].contentRect.height, 60);
      }
    }
  ]);
  return helper.start();
}

function test6() {
  let target = document.querySelector('polygon');
  let helper = new ResizeTestHelper(
    "test6: observe svg:polygon",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('points', "0,200 100,200 50,260");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 100);
        assert_equals(entries[0].contentRect.height, 60);
      }
    }
  ]);
  return helper.start();
}

function test7() {
  let target = document.querySelector('polyline');
  let helper = new ResizeTestHelper(
    "test7: observe svg:polyline",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('points', "0,300 100,300 50,360");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 100);
        assert_equals(entries[0].contentRect.height, 60);
      }
    }
  ]);
  return helper.start();
}

function test8() {
  let target = document.querySelector('rect');
  let helper = new ResizeTestHelper(
    "test8: observe svg:rect",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('width', "20");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 20);
        assert_equals(entries[0].contentRect.height, 10);
      }
    }
  ]);
  return helper.start();
}

function test9() {
  let target = document.querySelector('text');
  let helper = new ResizeTestHelper(
    "test9: observe svg:text",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('font-size', "25");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
      }
    }
  ]);
  return helper.start();
}


function test10() {
  let target = document.querySelector('svg');
  let helper = new ResizeTestHelper(
    "test10: observe svg:svg, top/left is 0 even with padding",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.top, 0);
        assert_equals(entries[0].contentRect.left, 0);
      }
    }
  ]);
  return helper.start();
}

function test11() {
  // <svg>
  //   <view></view>
  //   <defs>
  //     <linearGradient>
  //       <stop></stop>
  //     </linearGradient>
  //   </defs>
  // </svg>
  const svgNS = "http://www.w3.org/2000/svg";
  let svg = document.createElementNS(svgNS, 'svg');
  document.body.appendChild(svg);

  let view = document.createElementNS(svgNS, 'view');
  svg.appendChild(view);

  let defs = document.createElementNS(svgNS, 'defs');
  let linearGradient = document.createElementNS(svgNS, 'linearGradient');
  let stop = document.createElementNS(svgNS, 'stop');
  linearGradient.appendChild(stop);
  defs.appendChild(linearGradient);
  svg.appendChild(defs);

  let helper = new ResizeTestHelper(
    "test11: observe svg non-displayable element",
  [
    {
      setup: observer => {
        observer.observe(view);
      },
      notify: (entries, observer) => {
        assert_unreached("no entries should be observed on <view> Element");
      },
      timeout: () => {
        // expected
      }
    },
    {
      setup: observer => {
        observer.observe(stop);
      },
      notify: (entries, observer) => {
        assert_unreached("no entries should be observed on <stop> Element");
      },
      timeout: () => {
        // expected
      }
    },
  ]);
  return helper.start(() => svg.remove());
}

function test12() {
  let target = document.querySelector('rect');
  let helper = new ResizeTestHelper(
    "test12: observe svg:rect content box",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('width', 45);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 45);
        assert_equals(entries[0].contentRect.height, 10);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 45);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 10);
      }
    }
  ]);
  return helper.start();
}

function test13() {
  let target = document.querySelector('rect');
  let helper = new ResizeTestHelper(
    "test13: observe svg:rect border box",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('width', 20);
        target.setAttribute('height', 20);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 20);
        assert_equals(entries[0].contentRect.height, 20);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 20);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 20);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 20);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 20);
      }
    }
  ]);
  return helper.start();
}

function test14() {
  let target = document.querySelector('#g_rect');
  let helper = new ResizeTestHelper(
    "test14: observe g:rect content and border box",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 50);
        assert_equals(entries[0].contentRect.height, 20);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 20);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 20);
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('width', 15);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 15);
        assert_equals(entries[0].contentRect.height, 20);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 15);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 20);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 15);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 20);
      }
    }
  ]);
  return helper.start();
}

function test15() {
  let target = document.querySelector('text');
  let helper = new ResizeTestHelper(
    "test15: observe svg:text content and border box",
  [
    {
      setup: observer => {
        observer.observe(target);
      },
      notify: (entries, observer) => {
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        target.setAttribute('font-size', "30");
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 360);
        assert_equals(entries[0].contentRect.height, 30);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 360);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 30);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 360);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 30);
      }
    }
  ]);
  return helper.start();
}

function test16() {
  let target = document.querySelector('#g_rect');
  let helper = new ResizeTestHelper(
    "test16: observe g:rect content, border and device-pixel-content boxes",
  [
    {
      setup: observer => {
        observer.observe(target, {box: "device-pixel-content-box"});
        target.setAttribute('width', 50);
        document.body.style.zoom = 0.1;
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 50);
        assert_equals(entries[0].contentRect.height, 20);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 20);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 20);
        assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 5);
        assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 2);
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        observer.observe(target, {box: "device-pixel-content-box"});
        target.setAttribute('height', 30);
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 50);
        assert_equals(entries[0].contentRect.height, 30);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 30);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 30);
        assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 5);
        assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 3);
        return true;  // Delay next step
      }
    },
    {
      setup: observer => {
        document.body.style.zoom = 10;
      },
      notify: (entries, observer) => {
        assert_equals(entries.length, 1);
        assert_equals(entries[0].contentRect.width, 50);
        assert_equals(entries[0].contentRect.height, 30);
        assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].contentBoxSize[0].blockSize, 30);
        assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
        assert_equals(entries[0].borderBoxSize[0].blockSize, 30);
        assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 500);
        assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 300);
      },
    }
  ]);
  return helper.start();
}

let guard;
test(_ => {
  assert_own_property(window, "ResizeObserver");
  guard = async_test('guard');
}, "ResizeObserver implemented")

test0()
  .then(() => { return test1(); })
  .then(() => { return test2(); })
  .then(() => { return test3(); })
  .then(() => { return test4(); })
  .then(() => { return test5(); })
  .then(() => { return test6(); })
  .then(() => { return test7(); })
  .then(() => { return test8(); })
  .then(() => { return test9(); })
  .then(() => { return test10(); })
  .then(() => { return test11(); })
  .then(() => { return test12(); })
  .then(() => { return test13(); })
  .then(() => { return test14(); })
  .then(() => { return test15(); })
  .then(() => { return test16(); })
  .then(() => { guard.done(); });

</script>
