<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=429659
-->
<head>
  <title>nsIAccessibleImage chrome tests</title>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>

  <script type="application/javascript"
          src="common.js"></script>
  <script type="application/javascript"
          src="role.js"></script>
  <script type="application/javascript"
          src="attributes.js"></script>
  <script type="application/javascript"
          src="layout.js"></script>

  <script type="application/javascript">
    function testCoordinates(aID, aAcc, aWidth, aHeight)
    {
      var screenX = {}, screenY = {}, windowX = {}, windowY = {}, parentX = {},
          parentY = {};

      // get screen coordinates.
      aAcc.getImagePosition(
               nsIAccessibleCoordinateType.COORDTYPE_SCREEN_RELATIVE,
               screenX, screenY);
      // get window coordinates.
      aAcc.getImagePosition(
               nsIAccessibleCoordinateType.COORDTYPE_WINDOW_RELATIVE,
               windowX, windowY);
      // get parent related coordinates.
      aAcc.getImagePosition(
               nsIAccessibleCoordinateType.COORDTYPE_PARENT_RELATIVE,
               parentX, parentY);
      // XXX For linked images, a negative parentY value is returned, and the
      // screenY coordinate is the link's screenY coordinate minus 1.
      // Until this is fixed, set parentY to -1 if it's negative.
      if (parentY.value < 0)
        parentY.value = -1;

      // See if asking image for child at image's screen coordinates gives
      // correct accessible. getChildAtPoint operates on screen coordinates.
      var tempAcc = null;
      try {
        tempAcc = aAcc.getChildAtPoint(screenX.value, screenY.value);
      } catch(e) {}
      is(tempAcc, aAcc,
         "Wrong accessible returned for position of " + aID + "!");

      // get image's parent.
      var imageParentAcc = null;
      try {
        imageParentAcc = aAcc.parent;
      } catch(e) {}
      ok(imageParentAcc, "no parent accessible for " + aID + "!");

      if (imageParentAcc) {
        // See if parent's screen coordinates plus image's parent relative
        // coordinates equal to image's screen coordinates.
        var parentAccX = {}, parentAccY = {}, parentAccWidth = {},
            parentAccHeight = {};
        imageParentAcc.getBounds(parentAccX, parentAccY, parentAccWidth,
                                 parentAccHeight);
        is(parentAccX.value + parentX.value, screenX.value,
           "Wrong screen x coordinate for " + aID + "!");
// XXX see bug 456344        is(parentAccY.value + parentY.value, screenY.value,
//           "Wrong screen y coordinate for " + aID + "!");
      }

      var [expected_w, expected_h] = CSSToDevicePixels(window, aWidth, aHeight);
      var width = {}, height = {};
      aAcc.getImageSize(width, height);
      is(width.value, expected_w, "Wrong width for " + aID + "!");
      is(height.value, expected_h, "wrong height for " + aID + "!");
    }

    function testThis(aID, aSRC, aWidth, aHeight,
                      aActionCount, aActionNames)
    {
      var acc = getAccessible(aID, [nsIAccessibleImage]);
      if (!acc)
        return;

      // Test role
      testRole(aID, ROLE_GRAPHIC);

      // test coordinates and size
      testCoordinates(aID, acc, aWidth, aHeight);

      // bug 429659: Make sure the SRC attribute is set for any image
      var attributes = {"src": aSRC};
      testAttrs(acc, attributes, true);

      var actionCount = aActionCount || 0;
      is(acc.actionCount, actionCount,
         "Wrong number of actions for " + aID + "!");
      if (actionCount) {
        for (index = 0; index < aActionNames.length; index++) {
          is(acc.getActionName(index), aActionNames[index],
             "Wrong action name for " + aID + ", index " + index +"!");
        }
      }
    }

    function doTest()
    {
      // Test non-linked image
      testThis("nonLinkedImage", "moz.png", 89, 38);

      // Test linked image
      var actionNamesArray = new Array("jump");
      testThis("linkedImage", "moz.png", 89, 38, 1,
               actionNamesArray);

      // Image with long desc
      var actionNamesArray = new Array("showlongdesc");
      testThis("longdesc", "moz.png", 89, 38, 1,
               actionNamesArray);

      // Image with invalid url in long desc
      testThis("invalidLongdesc", "moz.png", 89, 38, 0);

      // Image with click and long desc
      actionNamesArray = null;
      actionNamesArray = new Array("click", "showlongdesc");
      testThis("clickAndLongdesc", "moz.png",
               89, 38, 2, actionNamesArray);
      
      // Image with click
      actionNamesArray = null;
      actionNamesArray = new Array("click");
      testThis("click", "moz.png",
               89, 38, 1, actionNamesArray);
      
      // Image with long desc
      actionNamesArray = null;
      actionNamesArray = new Array("showlongdesc");
      testThis("longdesc2", "moz.png",
               89, 38, 1, actionNamesArray);

      // Image described by HTML:a@href with whitespaces
      actionNamesArray = null;
      actionNamesArray = new Array("showlongdesc");
      testThis("longdesc3", "moz.png",
               89, 38, 1, actionNamesArray);

      SimpleTest.finish();
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  </script>
</head>
<body>

  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=429659">Mozilla Bug 429659</a>
  <a target="_blank"
    href="https://bugzilla.mozilla.org/show_bug.cgi?id=652635"
    title="fall back missing @longdesc to aria-describedby pointing to a href">
     Mozilla Bug 652635
  </a>

  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>

  <br>Simple image:<br>
  <img id="nonLinkedImage" src="moz.png"/>
  <br>Linked image:<br>
  <a href="http://www.mozilla.org"><img id="linkedImage" src="moz.png"></a>
  <br>Image with longdesc:<br>
  <img id="longdesc" src="moz.png" longdesc="longdesc_src.html"
       alt="Image of Mozilla logo"/>
  <br>Image with invalid url in longdesc:<br>
  <img id="invalidLongdesc" src="moz.png" longdesc="longdesc src.html"
       alt="Image of Mozilla logo"/>
  <br>Image with click and longdesc:<br>
  <img id="clickAndLongdesc" src="moz.png" longdesc="longdesc_src.html"
       alt="Another image of Mozilla logo" onclick="alert('Clicked!');"/>

  <br>image described by a link to be treated as longdesc<br>
  <img id="longdesc2" src="moz.png" aria-describedby="describing_link"
       alt="Second Image of Mozilla logo"/>
  <a id="describing_link" href="longdesc_src.html">link to description of image</a>

  <br>Image described by a link to be treated as longdesc with whitespaces<br>
  <img id="longdesc3" src="moz.png" aria-describedby="describing_link2"
       alt="Second Image of Mozilla logo"/>
  <a id="describing_link2" href="longdesc src.html">link to description of image</a>

  <br>Image with click:<br>
  <img id="click" src="moz.png"
       alt="A third image of Mozilla logo" onclick="alert('Clicked, too!');"/>

</body>
</html>