<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
                 type="text/css"?>

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        xmlns:html="http://www.w3.org/1999/xhtml"
        title="Accessibility Name Calculating Test.">

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

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

  <script type="application/javascript">
  <![CDATA[
    function doTest()
    {
      // aria-label

      // Simple label provided via ARIA
      testName("btn_simple_aria_label", "I am a button");

      // aria-label and aria-labelledby, expect aria-labelledby
      testName("btn_both_aria_labels", "text I am a button, two");

      //////////////////////////////////////////////////////////////////////////
      // aria-labelledby

      // Single relation. The value of 'aria-labelledby' contains the ID of
      // an element. Gets the name from text node of that element.
      testName("btn_labelledby_text", "text");

      // Multiple relations. The value of 'aria-labelledby' contains the IDs
      // of elements. Gets the name from text nodes of those elements.
      testName("btn_labelledby_texts", "text1 text2");

      // Trick cases. Self and recursive referencing.
      testName("rememberHistoryDays", "Remember 3 days");
      testName("historyDays", "Remember 3 days");
      testName("rememberAfter", "days");

      //////////////////////////////////////////////////////////////////////////
      // Name from subtree (single relation labelled_by).

      // Gets the name from text nodes contained by nested elements.
      testName("btn_labelledby_mixed", "no more text");

      // Gets the name from text nodes and selected item of menulist
      // (other items are ignored).
      testName("btn_labelledby_mixed_menulist",
               "no more text selected item more text");

      // Gets the name from text nodes contained by nested elements, ignores
      // hidden elements (bug 443081).
      testName("btn_labelledby_mixed_hidden_child", "no more text2");

      // Gets the name from hidden text nodes contained by nested elements,
      // (label element is hidden entirely), (bug 443081)
      testName("btn_labelledby_mixed_hidden", "lala more hidden text");


      //////////////////////////////////////////////////////////////////////////
      // Name from @label attribute.

      // Gets the name from @label attribute.
      testName("btn_labelattr", "labeled element");


      //////////////////////////////////////////////////////////////////////////
      // Name for nsIDOMXULSelectControlItemElement.

      // Gets the name from @label attribute.
      testName("li_nsIDOMXULSelectControlItemElement", "select control item");


      //////////////////////////////////////////////////////////////////////////
      // Name if the XUL element doesn't implement nsIDOMXULSelectControlElement
      // and has @label attribute.

      testName("box_not_nsIDOMXULSelectControlElement", "box");


      //////////////////////////////////////////////////////////////////////////
      // Name from the label element.

      // The label and button are placed on 2nd level relative common parent.
      testName("btn_label_1", "label1");

      // The label is on 1st, the button is on 5th level relative common parent.
      testName("btn_label_2", "label2");

      // The label and button are siblings.
      testName("btn_label_3", "label3");

      // Multiple labels for single button: XUL button takes the last one.
      testName("btn_label_4", "label5");

      // Label associated with HTML element.
      testName("input_label", "input label");


      //////////////////////////////////////////////////////////////////////////
      // tooltiptext (if nothing above isn't presented then tooltiptext is used)
      testName("box_tooltiptext", "tooltiptext label");


      //////////////////////////////////////////////////////////////////////////
      // Name from the @title attribute of <toolbaritem/> (original bug 237249).

      // Direct child of toolbaritem.
      testName("toolbaritem_child", null);

      // Child from subtree of toolbaritem.
      testName("toolbaritem_hboxbutton", "button");


      //////////////////////////////////////////////////////////////////////////
      // name from label inside toolbar button
      testName("toolbarbuttonwithlabel", "I am the button");


      //////////////////////////////////////////////////////////////////////////
      // Name from children

      // ARIA role button is presented allowing the name calculation from
      // children.
      testName("box_children", "14");

      // Button labelled by a text child.
      testName("button_text", "Text");

      // ARIA role option is presented allowing the name calculation from
      // the visible children (bug 443081)
      testName("lb_opt1_children_hidden", "i am visible");


      //////////////////////////////////////////////////////////////////////////
      // Name from aria-labelledby: menuitem label+ listitem label
      testName("li_labelledby", "Show an Alert The moment the event starts");

      //////////////////////////////////////////////////////////////////////////
      // groupbox labeling from first label
      testName("groupbox", "Some caption");

      SimpleTest.finish();
    }

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

  <hbox flex="1" style="overflow: auto;">

  <body xmlns="http://www.w3.org/1999/xhtml">
    <a target="_blank"
       href="https://bugzilla.mozilla.org/show_bug.cgi?id=444279"
       title="mochitest for accessible name calculating">
      Mozilla Bug 444279
    </a>
    <a target="_blank"
      href="https://bugzilla.mozilla.org/show_bug.cgi?id=441991"
      title="nsXULListitemAccessible::GetName prefers label \
      		   attribute over aria-labelledby and doesn't allow recursion">
      Mozilla Bug 441991
    </a>
  <p id="display"></p>
    <div id="content" style="display: none">
    </div>
    <pre id="test">
    </pre>
  </body>

  <vbox flex="1">

  <!-- aria-label, simple label -->
  <button id="btn_simple_aria_label" aria-label="I am a button"/>

  <!-- aria-label plus aria-labelledby -->
  <button id="btn_both_aria_labels" aria-label="I am a button, two"
          aria-labelledby="labelledby_text btn_both_aria_labels"/>

  <!-- aria-labelledby, single relation -->
  <description id="labelledby_text">text</description>
  <button id="btn_labelledby_text"
          aria-labelledby="labelledby_text"/>

  <!-- aria-labelledby, multiple relations -->
  <description id="labelledby_text1">text1</description>
  <description id="labelledby_text2">text2</description>
  <button id="btn_labelledby_texts"
          aria-labelledby="labelledby_text1 labelledby_text2"/>

  <!-- trick aria-labelledby -->
  <checkbox id="rememberHistoryDays"
            label="Remember "
            aria-labelledby="rememberHistoryDays historyDays rememberAfter"/>
  <html:input id="historyDays" value="3"
              aria-labelledby="rememberHistoryDays historyDays rememberAfter"/>
  <label id="rememberAfter">days</label>

  <!-- the name from subtree, mixed content -->
  <description id="labelledby_mixed">
    no<description>more text</description>
  </description>
  <button id="btn_labelledby_mixed"
          aria-labelledby="labelledby_mixed"/>

  <!-- the name from subtree, mixed/hidden content -->
  <description id="labelledby_mixed_hidden_child">no<description>more <description hidden="true">hidden</description>text2</description></description>
  <button id="btn_labelledby_mixed_hidden_child"
          aria-labelledby="labelledby_mixed_hidden_child"/>

  <!-- the name from subtree, mixed/completely hidden content -->
  <description id="labelledby_mixed_hidden"
               hidden="true">lala <description>more hidden </description>text</description>
  <button id="btn_labelledby_mixed_hidden"
          aria-labelledby="labelledby_mixed_hidden"/>
  <br/>

  <!-- the name from subtree, mixed content, ignore items of menulist -->
  <description id="labelledby_mixed_menulist">
    no<description>more text</description>
    <menulist>
      <menupopup>
        <menuitem label="selected item"/>
        <menuitem label="item"/>
      </menupopup>
    </menulist>
    more text
  </description>
  <button id="btn_labelledby_mixed_menulist"
          aria-labelledby="labelledby_mixed_menulist"/>

  <!-- @label -->
  <button id="btn_labelattr"
          label="labeled element"/>

  <!-- nsIDOMXULSelectControlItemElement -->
  <richlistbox>
    <richlistitem id="li_nsIDOMXULSelectControlItemElement">
      <label value="select control item"/>
    </richlistitem>
  </richlistbox>

  <!-- not nsIDOMXULSelectControlElement -->
  <box id="box_not_nsIDOMXULSelectControlElement" role="group" label="box"/>

  <!-- label element  -->
  <hbox>
    <box>
      <label control="btn_label_1">label1</label>
    </box>
    <label control="btn_label_2">label2</label>
    <box>
      <button id="btn_label_1"/>
      <box>
        <box>
          <box>
            <button id="btn_label_2"/>
          </box>
        </box>
      </box>
    </box>
    <label control="btn_label_3">label3</label>
    <button id="btn_label_3"/>

    <label control="btn_label_4">label4</label>
    <label control="btn_label_4">label5</label>
    <button id="btn_label_4"/>

    <label control="input_label">input label</label>
    <html:input id="input_label"/>
  </hbox>

  <!-- tooltiptext -->
  <box id="box_tooltiptext"
       role="group"
       tooltiptext="tooltiptext label"/>

  <!-- the name from @title of toolbaritem -->
  <!-- and the name from label of a toolbarbutton -->
  <toolbar>
    <toolbaritem title="ooospspss">
      <box id="toolbaritem_child"
           role="group"
           flex="1">
        <hbox role="button" id="toolbaritem_hboxbutton">
          <description value="button"/>
        </hbox>
      </box>
    </toolbaritem>
    <toolbarbutton id="toolbarbuttonwithlabel">
      <label flex="1">I am the button</label>
    </toolbarbutton>
  </toolbar>

  <!-- name from children -->
  <box id="box_children" role="button">14</box>
  <button id="button_text">Text</button>

  <!-- name from children, hidden children -->
  <vbox role="listbox" tabindex="0">
    <hbox id="lb_opt1_children_hidden" role="option" tabindex="0">
      <description>i am visible</description>
      <description style="display:none">i am hidden</description>
    </hbox>

    <!-- Name from caption sub tree -->
    <groupbox id="groupbox">
      <label>Some caption</label>
      <checkbox label="some checkbox label" />
    </groupbox>
  </vbox>

  <!-- bug 441991; create name from other menuitem label listitem's own label -->
  <hbox>
    <richlistbox>
      <richlistitem id="li_labelledby"
                    aria-labelledby="menuitem-DISPLAY li_labelledby">
        <label value="The moment the event starts"/>
      </richlistitem>
    </richlistbox>
    <menulist>
      <menupopup>
        <menuitem id="menuitem-DISPLAY"
                  value="DISPLAY"
                  label="Show an Alert"/>
        <menuitem id="menuitem-EMAIL"
                  value="EMAIL"
                  label="Send an E-mail"/>
      </menupopup>
    </menulist>
  </hbox>

  </vbox> <!-- close tests area -->
  </hbox> <!-- close main area -->
</window>