<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
                 type="text/css"?>
<window title="Test ChromeUtils functions" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <!-- ChromeUtils.js depends on EventUtils.js -->
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
  <script type="text/javascript">
  var start = new Date();
  </script>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/ChromeUtils.js"></script>
  <script type="text/javascript">
  var loadTime = new Date();
  </script>
  <script type="application/javascript">
  <![CDATA[
    info("\nProfile::ChromeUtilsLoadTime: " + (loadTime - start) + "\n");
    var testFile = Components.classes["@mozilla.org/file/directory_service;1"].
                      getService(Components.interfaces.nsIProperties).
                      get("CurWorkD", Components.interfaces.nsIFile);
    var regularDtForDrag1 = null;
    var gSetDropEffect = true;
    var gData;
    var gEnter = false;
    var gOver  = false;
    var dragDrop = [[
      { type    : "text/plain",
        data    : "This is a test" }
    ]];
    // this is the expected data arrays
    // for testing drag of 2 items create 2 inner arrays
    var drag1 = [[
      { type  : "text/uri-list",
        data  : "http://www.mozilla.org/" }
    ]];
    var drag2items = [[
      { type  : "text/uri-list",
        data  : "http://www.mozilla.org/" }
      ],[
      { type  : "text/uri-list",
        data  : "http://www.mozilla.org/" }
    ]];
    var drag1WrongFlavor = [[
      { type  : "text/plain",
        data  : "this is text/plain" }
    ]];
    var drag2 = [[
      { type  : "text/plain",
        data  : "this is text/plain" },
      { type  : "text/uri-list",
        data  : "http://www.mozilla.org/" }
    ]];
    var drag2WrongOrder = [[
      { type  : "text/uri-list",
        data  : "http://www.mozilla.org/" },
      { type  : "text/plain",
        data  : "this is text/plain" }
    ]];
    var dragfile = [[
      { type    : "application/x-moz-file",
        data    : testFile,
        eqTest  : function(actualData, expectedData) {return expectedData.equals(actualData);} },
      { type    : "Files",
        data    : null }
    ]];
    
    function doOnDrop(aEvent) {
      gData = aEvent.dataTransfer.getData(dragDrop[0][0].type);
      aEvent.preventDefault(); // cancels event and keeps dropEffect
                               // as was before event.
    }
    
    function doOnDragStart(aEvent) {
      var dt = aEvent.dataTransfer;
      switch (aEvent.currentTarget.id) {
        case "drag2" :
          dt.setData("text/plain", "this is text/plain");
        case "drag1" :
          regularDtForDrag1 = dt;
          dt.setData("text/uri-list", "http://www.mozilla.org/");
          break;
        case "dragfile" :
          dt.mozSetDataAt("application/x-moz-file", testFile, 0);
          break;
      }
        dt.effectAllowed = "all";
    }

    function doOnDragEnter(aEvent) {
      gEnter = true;
      aEvent.dataTransfer.effectAllowed = "all";
      aEvent.preventDefault(); // sets target this element
    }
    
    function doOnDragOver(aEvent) {
      gOver = true;
      if (gSetDropEffect)
        aEvent.dataTransfer.dropEffect = "copy";
      aEvent.preventDefault();
    }

    SimpleTest.waitForExplicitFinish();
    function test() {
      var startTime = new Date();
      var result;

      /* test synthesizeDragStart */
      result = synthesizeDragStart($("drag1"), drag1, window);
      is(result, null, "drag1 is text/uri-list");
      result = synthesizeDragStart($("drag1"), drag1WrongFlavor, window);
      isnot(result, null, "drag1 is not text/plain");
      result = synthesizeDragStart($("drag1"), drag2items, window);
      isnot(result, null, "drag1 is not 2 items");
      result = synthesizeDragStart($("drag2"), drag2, window);
      is(result, null, "drag2 is ordered text/plain then text/uri-list");
      result = synthesizeDragStart($("drag2"), drag1, window);
      isnot(result, null, "drag2 is not one flavor");
      result = synthesizeDragStart($("drag2"), drag2WrongOrder, window);
      isnot(result, null, "drag2 is not ordered text/uri-list then text/plain");
      result = synthesizeDragStart($("dragfile"), dragfile, window);
      is(result, null, "dragfile is nsIFile");
      result = synthesizeDragStart($("drag1"), null, window);
      is(result, regularDtForDrag1, "synthesizeDragStart accepts null expectedDragData");
     
      /* test synthesizeDrop */
      result = synthesizeDrop($("dragDrop"), $("dragDrop"), dragDrop, null, window);
      ok(gEnter, "Fired dragenter");
      ok(gOver,  "Fired dragover");
      is(result, "copy", "copy is dropEffect");
      is(gData, dragDrop[0][0].data, "Received valid drop data");

      gSetDropEffect = false;
      result = synthesizeDrop($("dragDrop"), $("dragDrop"), dragDrop, "link", window);
      is(result, "link", "link is dropEffect");
      gSetDropEffect = true;

      $("textB").focus();
      var content = synthesizeQueryTextContent(0, 100);
      ok(content, "synthesizeQueryTextContent should not be null");
      ok(content.succeeded, "synthesizeQueryTextContent should succeed");
      is(content.text, "I haz a content", "synthesizeQueryTextContent should be 'I haz a content': " + content.text);

      content = synthesizeQueryCaretRect(0);
      ok(content, "synthesizeQueryCaretRect should not be null");
      ok(content.succeeded, "synthesizeQueryCaretRect should succeed");

      content = synthesizeQueryTextRect(0, 100);
      ok(content, "synthesizeQueryTextRect should not be null");
      ok(content.succeeded, "synthesizeQueryTextRect should succeed");

      content = synthesizeQueryEditorRect();
      ok(content, "synthesizeQueryEditorRect should not be null");
      ok(content.succeeded, "synthesizeQueryEditorRect should succeed");

      content = synthesizeCharAtPoint(0, 0);
      ok(content, "synthesizeCharAtPoint should not be null");
      ok(content.succeeded, "synthesizeCharAtPoint should succeed");

      content = synthesizeSelectionSet(0, 100);
      ok(content, "synthesizeSelectionSet should not be null");
      is(content, true, "synthesizeSelectionSet should succeed");

      var endTime = new Date();
      info("\nProfile::ChromeUtilsRunTime: " + (endTime-startTime) + "\n");
      SimpleTest.finish();
    };
  ]]>
  </script>

  <body xmlns="http://www.w3.org/1999/xhtml" onload="setTimeout('test()', 0)">
    <input id="textB" value="I haz a content"/>
    <p id="display"></p>
    <div id="content" style="display:none;"></div>
    <pre id="test"></pre>
    <div id="drag1" ondragstart="doOnDragStart(event);">Need some space here</div>
    <p id="display"></p>
    <div id="content" style="display:none;"></div>
    <pre id="test"></pre>
    <div id="dragDrop" ondragover  ="doOnDragOver(event);"
                    ondragenter ="doOnDragEnter(event);"
                    ondragleave ="doOnDragLeave(event);"
                    ondrop      ="doOnDrop(event);">
    Need some depth and height to drag here
    </div>
    <div id="drag2" ondragstart="doOnDragStart(event);">Need more space</div>
    <div id="dragfile" ondragstart="doOnDragStart(event);">Sure why not here too</div>
  </body>
</window>
