<?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"?>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=420499
-->
<window title="Mozilla Bug 420499" onload="setTimeout(focusInput, 500);"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>

  

    <menu id="menu" label="Menu">
      <menupopup id="file-popup">
        <!-- <textbox id="some-text" maxlength="10" value="some text"/> -->
        <menu label="submenu">
          <menupopup id="file-popup-inner">

            <menuitem label="Item1"/>
            <menuitem label="Item2"/>
            <textbox id="some-text" maxlength="10" value="some more text"/>
          </menupopup>
        </menu>
        <menuitem label="Item3"/>
        <menuitem label="Item4"/>
      </menupopup>
    </menu>

    <popupset>
      <popup id="contextmenu">
        <menuitem label="Cut"/>
        <menuitem label="Copy"/>
        <menuitem label="Paste"/>
      </popup>
      <tooltip id="tooltip" orient="vertical">
        <description value="This is a tooltip"/>
      </tooltip>
    </popupset>
  
  <!-- test results are displayed in the html:body -->
  <body xmlns="http://www.w3.org/1999/xhtml" bgcolor="white">
  
  <p id="par1">Paragraph 1</p>
  <p id="par2">Paragraph 2</p>
  <p id="par3">Paragraph 3</p>
  <p id="par4">Paragraph 4</p>
  <p id="par5">Paragraph 5</p>

  <input type="text" id="text-input" maxlength="10" value="some more text"/> <br />

  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=420499"
     target="_blank">Mozilla Bug 420499</a>
  </body>

  <!-- test code goes here -->
  <script type="application/javascript"><![CDATA[
    
    /** Test for Bug 420499 **/
    SimpleTest.waitForExplicitFinish();

    function getSelectionController() {
      return document.docShell
        .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
        .getInterface(Components.interfaces.nsISelectionDisplay)
        .QueryInterface(Components.interfaces.nsISelectionController);
    }

    function isCaretVisible() {
      window.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
      var docShell = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                            .getInterface(Components.interfaces.nsIWebNavigation)
                            .QueryInterface(Components.interfaces.nsIDocShell);
      var selCon = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
        .getInterface(Components.interfaces.nsISelectionDisplay)
        .QueryInterface(Components.interfaces.nsISelectionController);
      return selCon.caretVisible;
    }
    
    function focusInput() {
      ok(!isCaretVisible(), "Caret shouldn't be visible");
      $("text-input").focus();
      ok(isCaretVisible(), "Caret should be visible when input focused");
      window.addEventListener("popupshown", popupMenuShownHandler, false);
      $("menu").open = true;
    }
    
    function popupMenuShownHandler() {
      window.removeEventListener("popupshown", popupMenuShownHandler, false);
      ok(!isCaretVisible(), "Caret shouldn't be visible when menu open");
      window.addEventListener("popuphidden", ensureParagraphFocused, false);
      $("menu").open = false;
    }
    
    function ensureParagraphFocused() {
      window.removeEventListener("popuphidden", ensureParagraphFocused, false);
      ok(isCaretVisible(), "Caret should have returned to previous focus");
      window.addEventListener("popupshown", popupMenuShownHandler2, false);
      $("contextmenu").openPopup($('text-input'), "topleft" , -1 , -1 , true, true);
    }

    function popupMenuShownHandler2() {
      window.removeEventListener("popupshown", popupMenuShownHandler2, false);
      ok(isCaretVisible(), "Caret should be visible when context menu open");
      window.addEventListener("popuphidden", ensureParagraphFocused2, false);
      document.getElementById("contextmenu").hidePopup();
    }

    function ensureParagraphFocused2() {
      window.removeEventListener("popuphidden", ensureParagraphFocused2, false);
      ok(isCaretVisible(), "Caret should still be visible");
      window.addEventListener("popupshown", tooltipShownHandler, false);
      $("tooltip").openPopup($('text-input'), "topleft" , -1 , -1 , false, true);
    }

    function tooltipShownHandler() {
      window.removeEventListener("popupshown", tooltipShownHandler, false);
      ok(isCaretVisible(), "Caret should be visible when tooltip is visible");
      window.addEventListener("popuphidden", ensureParagraphFocused3, false);
      document.getElementById("tooltip").hidePopup();
    }

    function ensureParagraphFocused3() {
      window.removeEventListener("popuphidden", ensureParagraphFocused2, false);
      ok(isCaretVisible(), "Caret should still be visible");
      SimpleTest.finish();
    }
  ]]></script>
</window>