<!DOCTYPE HTML>
<html>
<body>
<script src="../resources/js-test.js"></script>

<div id="container" style="position: relative; top: 100px; left: 600px; width:400px; height: 400px;" role="group" tabindex="0">

<svg role="group" id="svgroot">

  <circle role="button" aria-label="face" id="face" r="200" cx="200" cy="200" stroke="red" stroke-width="1" fill="yellow" />
  <ellipse role="button" aria-label="left-eye" id="left-eye" cx="120" cy="180" rx="18" ry="33" fill="black"/>
  <ellipse role="button" aria-label="right-eye" id="right-eye" cx="280" cy="120" rx="18" ry="33" fill="black"/>
  <ellipse role="button" aria-label="nose" id="nose" cx="200" cy="220" rx="8" ry="15" fill="black"/>
  <path role="button" aria-label="smile" id="smile" stroke-width="10" stroke="black" fill="none" stroke-linecap="round" d="M120,280 Q200,330 290,280"/>
  <text x="150" y="130" fill="red">Test</text>  
  <image x="20" y="20" width="300" height="80" aria-label="Test Image" xlink:href="resources/cake.png" />

</svg>
</div>


<div id="console"></div>
<script>

description("This test ensures the accessibility bounds of embedded SVG objects are correct.")

// Return the page's relative coordinates. If we rely on the x() or y() of the accessibility object, then 
// accessibility transforms are applied that fail because there is no window available
function pageX(element) {
    return element.clickPointX - element.width/2;
}

function pageY(element) {
    return element.clickPointY - element.height/2;
}

if (window.testRunner && window.accessibilityController) {
    testRunner.dumpAsText();
 
    var container = accessibilityController.accessibleElementById("svgroot");

    var x = pageX(container) - 1;
    var y = pageY(container) - 1;

    debug("container location: (" + x + ", " + y + ")");

    var face = container.childAtIndex(0);
    debug('Face role: ' + face.role);
    debug('Face label: ' + face.name);
    debug('FaceX: ' + Math.floor(pageX(face) - x));
    debug('FaceY: ' + Math.floor(Math.abs(pageY(face) - y)));
    debug('<br>');

    var eye = container.childAtIndex(1);
    debug('Eye role: ' + eye.role);
    debug('Eye label: ' + eye.name);
    debug('EyeX: ' + (pageX(eye) - x));
    debug('EyeY: ' + Math.abs(pageY(eye) - y));
    debug('<br>');

    var nose = container.childAtIndex(3);
    debug('Nose role: ' + nose.role);
    debug('Nose label: ' + nose.name);
    debug('NoseX: ' + (pageX(nose) - x));
    debug('NoseY: ' + Math.abs(pageY(nose) - y));
    debug('<br>');

    var mouth = container.childAtIndex(4);
    debug('Mouth role: ' + mouth.role);
    debug('Mouth label: ' + mouth.name);
    debug('MouthX: ' + Math.floor(pageX(mouth) - x));
    debug('MouthY: ' + Math.floor(Math.abs(pageY(mouth) - y)));
    debug('<br>');

    // Text varies by about 1 - 2 pixels depending on the platform,
    // so just print the text coordinates divided by 10.
    var text = container.childAtIndex(5).childAtIndex(0);
    debug('Text role: ' + text.role);
    debug('TextX/10: ' + Math.floor((pageX(text) - x) / 10));
    debug('TextY/10: ' + Math.floor(Math.abs(pageY(text) - y) / 10));
    debug('<br>');

    var image = container.childAtIndex(6);
    debug('Image role: ' + image.role);
    debug('Image label: ' + image.name);
    debug('ImageX: ' + (pageX(image) - x));
    debug('ImageY: ' + Math.abs(pageY(image) - y));
}

</script>

</body>
</html>
