dom/tests/mochitest/general/test_clipboard_events.html

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4   <title>Test for Clipboard Events</title>
     5   <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
     6   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     7   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
     8   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     9 </head>
    10 <body>
    11 <p id="display"></p>
    12 <div id="content" style="border: 3px solid black; padding: 3em;">CONTENT TEXT<input id="content-input" value="INPUT TEXT"></div>
    13 <button id="button">Button</button>
    15 <div id="syntheticSpot" oncut="compareSynthetic(event, 'cut')"
    16                         oncopy="compareSynthetic(event, 'copy')"
    17                         onpaste="compareSynthetic(event, 'paste')">Spot</div>
    19 <pre id="test">
    20 <script class="testbody" type="text/javascript;version=1.7">
    22 var content = document.getElementById("content");
    23 var contentInput = document.getElementById("content-input");
    24 var clipboardInitialValue = "empty";
    26 // Test that clearing and reading the clipboard works.  A random number
    27 // is used to make sure that leftover clipboard values from a previous
    28 // test run don't cause a false-positive test.
    29 var cb_text = "empty_" + Math.random();
    30 setClipboardText(cb_text);
    32 is(getClipboardText(), cb_text, "set/get clipboard text failed");
    34 // Some test functions need to be run with delays.
    35 var delayedTests = [];
    37 var cachedCutData, cachedCopyData, cachedPasteData;
    39 // Ensure window focus before running tests, otherwise key events can
    40 // misfire.  We set the onfocus event handler here to actually begin
    41 // running tests, and call window.focus() afterwards.
    42 window.onfocus = function()
    43 {
    44   window.onfocus = null;
    46   // A list of test functions to run.  Before each test function is run, the
    47   // clipboard is initialized to clipboardInitialValue, and the contents of
    48   // div#content are set as the window's selection.
    49   var testFunctions = [
    50     test_dom_oncopy,
    51     test_dom_oncut,
    52     test_dom_onpaste,
    53     test_dom_oncopy_abort,
    54     test_input_oncopy,
    55     test_input_oncut,
    56     test_input_onpaste,
    57     test_input_oncopy_abort,
    58     test_input_oncut_abort,
    59     test_input_onpaste_abort,
    60     test_input_cut_dataTransfer,
    61     test_input_cut_abort_dataTransfer,
    62     test_input_copy_dataTransfer,
    63     test_input_paste_dataTransfer,
    64     test_input_paste_abort_dataTransfer,
    65     test_input_copypaste_dataTransfer_multiple,
    66     test_input_copy_button_dataTransfer,
    67     test_eventspref_disabled
    68     ];
    70   // Run the main tests.  This will also populate the delayedTests array
    71   for (let i = 0; i < testFunctions.length; i++) {
    72     // Init clipboard
    73     setClipboardText(clipboardInitialValue);
    75     // Reset value of contentInput.
    76     contentInput.value = "INPUT TEXT";
    78     var func = testFunctions[i];
    79     func();
    80   }
    82   // Check if the cached clipboard data can be accessed or modified
    83   // and whether it modifies the real clipboard
    84   checkCachedDataTransfer(cachedCutData, "cut");
    85   checkCachedDataTransfer(cachedCopyData, "copy");
    86   checkCachedDataTransfer(cachedPasteData, "paste");
    88   checkSyntheticEvents();
    90   SimpleTest.finish();
    91 }
    93 // Calling .focus begins the test run.
    94 SimpleTest.waitForExplicitFinish();
    95 window.focus();
    97 function getLoadContext() {
    98   return SpecialPowers.wrap(window).QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor)
    99                .getInterface(SpecialPowers.Ci.nsIWebNavigation)
   100                .QueryInterface(SpecialPowers.Ci.nsILoadContext);
   101 }
   103 function getClipboardText() {
   104   return SpecialPowers.getClipboardData("text/unicode");
   105 }
   108 function setClipboardText(text) {
   109   var helper = SpecialPowers.Cc["@mozilla.org/widget/clipboardhelper;1"]
   110     .getService(SpecialPowers.Ci.nsIClipboardHelper);
   111   helper.copyString(text);
   112 }
   114 function selectContentDiv() {
   115   // Set selection
   116   var selection = window.getSelection();
   117   selection.removeAllRanges();
   118   selection.selectAllChildren(content);
   119 }
   121 function selectContentInput() {
   122   contentInput.select();
   123   contentInput.focus();
   124 }
   126 function test_dom_oncopy() {
   127   // Setup an oncopy event handler, fire copy.  Ensure that the event
   128   // handler was called, and the clipboard contents have set to CONTENT TEXT.
   129   // Test firing oncopy event on ctrl-c:
   130   selectContentDiv();
   132   var oncopy_fired = false;
   133   content.oncopy = function() { oncopy_fired = true; };
   134   try {
   135     synthesizeKey("c", {accelKey: 1});
   136     ok(oncopy_fired, "copy event firing on DOM element");
   137     is(getClipboardText(), "CONTENT TEXT",
   138       "copy on DOM element set clipboard correctly");
   139   } finally {
   140     content.oncopy = null;
   141   }
   142 }
   144 function test_dom_oncut() {
   145   // Setup an oncut event handler, fire cut.  Ensure that the event handler
   146   // was called.  The <div> doesn't handle a cut, so ensure that the
   147   // clipboard text is clipboardInitialValue, NOT "CONTENT TEXT".
   148   selectContentDiv();
   149   var oncut_fired = false;
   150   content.oncut = function() { oncut_fired = true; };
   151   try {
   152     synthesizeKey("x", {accelKey: 1});
   153     ok(!oncut_fired, "cut event firing on DOM element")
   154     is(getClipboardText(), clipboardInitialValue,
   155       "cut on DOM element did not modify clipboard");
   156   } finally {
   157     content.oncut = null;
   158   }
   159 }
   162 function test_dom_onpaste() {
   163   // Setup an onpaste event handler, fire paste.  Ensure that the event
   164   // handler was called.
   165   selectContentDiv();
   166   var onpaste_fired = false;
   167   content.onpaste = function() { onpaste_fired = true; };
   168   try {
   169     synthesizeKey("v", {accelKey: 1});
   170     ok(!onpaste_fired, "paste event firing on DOM element");
   171   } finally {
   172     content.onpaste = null;
   173   }
   174 }
   177 function test_dom_oncopy_abort() {
   178   // Setup an oncopy event handler that aborts the copy, and fire the copy
   179   // event.  Ensure that the event handler was fired, and the clipboard
   180   // contents have not been modified.
   181   selectContentDiv();
   182   var oncopy_fired = false;
   183   content.oncopy = function() { oncopy_fired = true; return false; };
   184   try {
   185     synthesizeKey("c", {accelKey: 1});
   186     ok(oncopy_fired, "copy event (to-be-cancelled) firing on DOM element");
   187     is(getClipboardText(), clipboardInitialValue,
   188       "aborted copy on DOM element did not modify clipboard");
   189   } finally {
   190     content.oncopy = null;
   191   }
   192 }
   195 function test_input_oncopy() {
   196   // Setup an oncopy event handler, fire copy.  Ensure that the event
   197   // handler was called, and the clipboard contents have been set to 'PUT TE',
   198   // which is the part that is selected below.
   199   selectContentInput();
   200   contentInput.focus();
   201   contentInput.setSelectionRange(2, 8);
   203   var oncopy_fired = false;
   204   contentInput.oncopy = function() { oncopy_fired = true; };
   205   try {
   206     synthesizeKey("c", {accelKey: 1});
   207     ok(oncopy_fired, "copy event firing on plaintext editor");
   208     is(getClipboardText(), "PUT TE",
   209       "copy on plaintext editor set clipboard correctly");
   210   } finally {
   211     contentInput.oncopy = null;
   212   }
   213 }
   216 function test_input_oncut() {
   217   // Setup an oncut event handler, and fire cut.  Ensure that the event
   218   // handler was fired, the clipboard contains the INPUT TEXT, and
   219   // that the input itself is empty.
   220   selectContentInput();
   221   var oncut_fired = false;
   222   contentInput.oncut = function() { oncut_fired = true; };
   223   try {
   224     synthesizeKey("x", {accelKey: 1});
   225     ok(oncut_fired, "cut event firing on plaintext editor");
   226     is(getClipboardText(), "INPUT TEXT",
   227       "cut on plaintext editor set clipboard correctly");
   228     is(contentInput.value, "",
   229       "cut on plaintext editor emptied editor");
   230   } finally {
   231     contentInput.oncut = null;
   232   }
   233 }
   236 function test_input_onpaste() {
   237   // Setup an onpaste event handler, and fire paste.  Ensure that the event
   238   // handler was fired, the clipboard contents didn't change, and that the
   239   // input value did change (ie. paste succeeded).
   240   selectContentInput();
   241   var onpaste_fired = false;
   242   contentInput.onpaste = function() { onpaste_fired = true; };
   243   try {
   244     synthesizeKey("v", {accelKey: 1});
   245     ok(onpaste_fired, "paste event firing on plaintext editor");
   246     is(getClipboardText(), clipboardInitialValue,
   247       "paste on plaintext editor did not modify clipboard contents");
   248     is(contentInput.value, clipboardInitialValue,
   249       "paste on plaintext editor did modify editor value");
   250   } finally {
   251     contentInput.onpaste = null;
   252   }
   253 }
   256 function test_input_oncopy_abort() {
   257   // Setup an oncopy event handler, fire copy.  Ensure that the event
   258   // handler was called, and that the clipboard value did NOT change.
   259   selectContentInput();
   260   var oncopy_fired = false;
   261   contentInput.oncopy = function() { oncopy_fired = true; return false; };
   262   try {
   263     synthesizeKey("c", {accelKey: 1});
   264     ok(oncopy_fired, "copy event (to-be-cancelled) firing on plaintext editor");
   265     is(getClipboardText(), clipboardInitialValue,
   266       "aborted copy on plaintext editor did not modify clipboard");
   267   } finally {
   268     contentInput.oncopy = null;
   269   }
   270 }
   273 function test_input_oncut_abort() {
   274   // Setup an oncut event handler, and fire cut.  Ensure that the event
   275   // handler was fired, the clipboard contains the INPUT TEXT, and
   276   // that the input itself is empty.
   277   selectContentInput();
   278   var oncut_fired = false;
   279   contentInput.oncut = function() { oncut_fired = true; return false; };
   280   try {
   281     synthesizeKey("x", {accelKey: 1});
   282     ok(oncut_fired, "cut event (to-be-cancelled) firing on plaintext editor");
   283     is(getClipboardText(), clipboardInitialValue,
   284       "aborted cut on plaintext editor did not modify clipboard.");
   285     is(contentInput.value, "INPUT TEXT",
   286       "aborted cut on plaintext editor did not modify editor contents");
   287   } finally {
   288     contentInput.oncut = null;
   289   }
   290 }
   293 function test_input_onpaste_abort() {
   294   // Setup an onpaste event handler, and fire paste.  Ensure that the event
   295   // handler was fired, the clipboard contents didn't change, and that the
   296   // input value did change (ie. paste succeeded).
   297   selectContentInput();
   298   var onpaste_fired = false;
   299   contentInput.onpaste = function() { onpaste_fired = true; return false; };
   300   try {
   301     synthesizeKey("v", {accelKey: 1});
   302     ok(onpaste_fired,
   303       "paste event (to-be-cancelled) firing on plaintext editor");
   304     is(getClipboardText(), clipboardInitialValue,
   305       "aborted paste on plaintext editor did not modify clipboard");
   306     is(contentInput.value, "INPUT TEXT",
   307       "aborted paste on plaintext editor did not modify modified editor value");
   308   } finally {
   309     contentInput.onpaste = null;
   310   }
   311 }
   314 function test_input_cut_dataTransfer() {
   315   // Cut using event.dataTransfer. The event is not cancelled so the default
   316   // cut should occur
   317   selectContentInput();
   318   contentInput.oncut = function(event) {
   319     ok(event instanceof ClipboardEvent, "cut event is a ClipboardEvent");
   320     ok(event.clipboardData instanceof DataTransfer, "cut event dataTransfer is a DataTransfer");
   321     is(event.target, contentInput, "cut event target");
   322     is(event.clipboardData.mozItemCount, 0, "cut event mozItemCount");
   323     is(event.clipboardData.getData("text/plain"), "", "cut event getData");
   324     event.clipboardData.setData("text/plain", "This is some dataTransfer text");
   325     cachedCutData = event.clipboardData;
   326   };
   327   try {
   328     synthesizeKey("x", {accelKey: 1});
   329     is(getClipboardText(), "INPUT TEXT",
   330       "cut using dataTransfer on plaintext editor set clipboard correctly");
   331     is(contentInput.value, "",
   332       "cut using dataTransfer on plaintext editor cleared input");
   333   } finally {
   334     contentInput.oncut = null;
   335   }
   336 }
   339 function test_input_cut_abort_dataTransfer() {
   340   // Cut using event.dataTransfer but cancel the event. The data should be
   341   // put on the clipboard but since we don't modify the input value, the input
   342   // should have the same value.
   343   selectContentInput();
   344   contentInput.oncut = function(event) {
   345     event.clipboardData.setData("text/plain", "Cut dataTransfer text");
   346     return false;
   347   };
   348   try {
   349     synthesizeKey("x", {accelKey: 1});
   350     is(getClipboardText(), "Cut dataTransfer text",
   351       "aborted cut using dataTransfer on plaintext editor set clipboard correctly");
   352     is(contentInput.value, "INPUT TEXT",
   353       "aborted cut using dataTransfer on plaintext editor did not modify input");
   354   } finally {
   355     contentInput.oncut = null;
   356   }
   357 }
   360 function test_input_copy_dataTransfer() {
   361   // Copy using event.dataTransfer
   362   selectContentInput();
   363   contentInput.oncopy = function(event) {
   364     ok(event instanceof ClipboardEvent, "copy event is a ClipboardEvent");
   365     ok(event.clipboardData instanceof DataTransfer, "copy event dataTransfer is a DataTransfer");
   366     is(event.target, contentInput, "copy event target");
   367     is(event.clipboardData.mozItemCount, 0, "copy event mozItemCount");
   368     is(event.clipboardData.getData("text/plain"), "", "copy event getData");
   369     event.clipboardData.setData("text/plain", "Copied dataTransfer text");
   370     cachedCopyData = event.clipboardData;
   371   };
   372   try {
   373     synthesizeKey("c", {accelKey: 1});
   374     is(getClipboardText(), "INPUT TEXT",
   375       "copy using dataTransfer on plaintext editor set clipboard correctly");
   376     is(contentInput.value, "INPUT TEXT",
   377       "copy using dataTransfer on plaintext editor did not modify input");
   378   } finally {
   379     contentInput.oncopy = null;
   380   }
   381 }
   384 function test_input_copy_abort_dataTransfer() {
   385   // Copy using event.dataTransfer but cancel the event.
   386   selectContentInput();
   387   contentInput.oncopy = function(event) {
   388     event.clipboardData.setData("text/plain", "Copy dataTransfer text");
   389     return false;
   390   };
   391   try {
   392     synthesizeKey("x", {accelKey: 1});
   393     is(getClipboardText(), "Copy dataTransfer text",
   394       "aborted copy using dataTransfer on plaintext editor set clipboard correctly");
   395     is(contentInput.value, "INPUT TEXT",
   396       "aborted copy using dataTransfer on plaintext editor did not modify input");
   397   } finally {
   398     contentInput.oncopy = null;
   399   }
   400 }
   403 function test_input_paste_dataTransfer() {
   404   // Paste using event.dataTransfer
   405   selectContentInput();
   406   contentInput.onpaste = function(event) {
   407     ok(event instanceof ClipboardEvent, "paste event is an ClipboardEvent");
   408     ok(event.clipboardData instanceof DataTransfer, "paste event dataTransfer is a DataTransfer");
   409     is(event.target, contentInput, "paste event target");
   410     is(event.clipboardData.mozItemCount, 1, "paste event mozItemCount");
   411     is(event.clipboardData.getData("text/plain"), clipboardInitialValue, "paste event getData");
   412     cachedPasteData = event.clipboardData;
   413   };
   414   try {
   415     synthesizeKey("v", {accelKey: 1});
   416     is(getClipboardText(), clipboardInitialValue,
   417       "paste using dataTransfer on plaintext editor did not modify clipboard contents");
   418     is(contentInput.value, clipboardInitialValue,
   419       "paste using dataTransfer on plaintext editor modified input");
   420   } finally {
   421     contentInput.onpaste = null;
   422   }
   423 }
   426 function test_input_paste_abort_dataTransfer() {
   427   // Paste using event.dataTransfer but cancel the event
   428   selectContentInput();
   429   contentInput.onpaste = function(event) {
   430     is(event.clipboardData.getData("text/plain"), clipboardInitialValue, "get data on aborted paste");
   431     contentInput.value = "Alternate Paste";
   432     return false;
   433   };
   434   try {
   435     synthesizeKey("v", {accelKey: 1});
   436     is(getClipboardText(), clipboardInitialValue,
   437       "aborted paste using dataTransfer on plaintext editor did not modify clipboard contents");
   438     is(contentInput.value, "Alternate Paste",
   439       "aborted paste using dataTransfer on plaintext editor modified input");
   440   } finally {
   441     contentInput.onpaste = null;
   442   }
   443 }
   445 function test_input_copypaste_dataTransfer_multiple() {
   446   // Cut several types of data and paste it again
   447   contentInput.value = "This is a line of text";
   448   contentInput.oncopy = function(event) {
   449     var cd = event.clipboardData;
   450     cd.setData("text/plain", "would be a phrase");
   452     var exh = false;
   453     try { cd.mozSetDataAt("text/plain", "Text", 1); } catch (ex) { exh = true; }
   454     ok(exh, "exception occured mozSetDataAt 1");
   455     exh = false;
   456     try { cd.mozTypesAt(1); } catch (ex) { exh = true; }
   457     ok(exh, "exception occured mozTypesAt 1");
   458     exh = false;
   459     try { cd.mozGetDataAt("text/plain", 1); } catch (ex) { exh = true; }
   460     ok(exh, "exception occured mozGetDataAt 1");
   461     exh = false;
   462     try { cd.mozClearDataAt("text/plain", 1); } catch (ex) { exh = true; }
   463     ok(exh, "exception occured mozClearDataAt 1");
   465     cd.setData("text/x-moz-url", "http://www.mozilla.org");
   466     cd.mozSetDataAt("text/x-custom", "Custom Text", 0);
   467     is(cd.mozItemCount, 1, "mozItemCount after set multiple types");
   468     return false;
   469   };
   471   try {
   472     selectContentInput();
   473     synthesizeKey("c", {accelKey: 1});
   474   }
   475   finally {
   476     contentInput.oncopy = null;
   477   }
   479   is(getClipboardText(), "would be a phrase", "copy multiple types text");
   481   contentInput.setSelectionRange(5, 14);
   483   contentInput.onpaste = function(event) {
   484     var cd = event.clipboardData;
   485     is(cd.mozItemCount, 1, "paste after copy multiple types mozItemCount");
   486     is(cd.getData("text/plain"), "would be a phrase", "paste text/plain multiple types");
   488     // Firefox for Android's clipboard code doesn't handle x-moz-url. Therefore
   489     // disabling the following test. Enable this once bug #840101 is fixed.
   490     if (navigator.appVersion.indexOf("Android") == -1) {
   491       is(cd.getData("text/x-moz-url"), "http://www.mozilla.org", "paste text/x-moz-url multiple types");
   492     }
   493     // this is empty because only the built-in types are supported at the moment
   494     is(cd.getData("text/x-custom"), "", "paste text/custom multiple types");
   496     exh = false;
   497     try { cd.setData("text/plain", "Text on Paste"); } catch (ex) { exh = true; }
   498     ok(exh, "exception occured setData on paste");
   500     is(cd.getData("text/plain"), "would be a phrase", "text/plain data unchanged");
   501   };
   502   try {
   503     synthesizeKey("v", {accelKey: 1});
   504     is(contentInput.value, "This would be a phrase of text",
   505       "default paste after copy multiple types");
   506   } finally {
   507     contentInput.onpaste = null;
   508   }
   509 }
   511 function test_input_copy_button_dataTransfer() {
   512   // Copy using event.dataTransfer when a button is focused.
   513   var button = document.getElementById("button");
   514   button.focus();
   515   button.oncopy = function(event) {
   516     ok(false, "should not be firing copy event on button");
   517     return false;
   518   };
   519   try {
   520     // copy should not occur here because buttons don't have any controller
   521     // for the copy command
   522     synthesizeKey("c", {accelKey: 1});
   523     is(getClipboardText(), clipboardInitialValue,
   524       "copy using dataTransfer on plaintext editor set clipboard correctly for button");
   526     selectContentDiv();
   527     synthesizeKey("c", {accelKey: 1});
   528     is(getClipboardText(), "CONTENT TEXT",
   529       "copy using dataTransfer with selection on plaintext editor set clipboard correctly for button");
   531   } finally {
   532     document.documentElement.oncopy = null;
   533   }
   534 }
   536 function test_eventspref_disabled() {
   537   // Disable clipboard events
   538   SpecialPowers.setBoolPref("dom.event.clipboardevents.enabled", false);
   540   var event_fired = false;
   541   contentInput.oncut = function() { event_fired = true; };
   542   contentInput.oncopy = function() { event_fired = true; };
   543   contentInput.onpaste = function() { event_fired = true; };
   544   try {
   545     selectContentInput();
   546     contentInput.setSelectionRange(1, 4);
   547     synthesizeKey("x", {accelKey: 1});
   548     is(contentInput.value, "IT TEXT", "cut changed text when preference is disabled");
   549     is(getClipboardText(), "NPU", "cut changed clipboard when preference is disabled");
   550     ok(!event_fired, "cut event did not fire when preference is disabled")
   552     event_fired = false;
   553     contentInput.setSelectionRange(3, 6);
   554     synthesizeKey("c", {accelKey: 1});
   555     is(getClipboardText(), "TEX", "copy changed clipboard when preference is disabled");
   556     ok(!event_fired, "copy event did not fire when preference is disabled")
   558     event_fired = false;
   559     contentInput.setSelectionRange(0, 2);
   560     synthesizeKey("v", {accelKey: 1});
   561     is(contentInput.value, "TEX TEXT", "paste changed text when preference is disabled");
   562     ok(!event_fired, "paste event did not fire when preference is disabled")
   563   } finally {
   564     contentInput.oncut = null;
   565     contentInput.oncopy = null;
   566     contentInput.onpaste = null;
   567   }
   569   SpecialPowers.clearUserPref("dom.event.clipboardevents.enabled");
   570 }
   572 let expectedData = [];
   574 // Check to make that synthetic events do not change the clipboard
   575 function checkSyntheticEvents()
   576 {
   577   let syntheticSpot = document.getElementById("syntheticSpot");
   578   setClipboardText(clipboardInitialValue);
   580   // No dataType specified
   581   let event = new ClipboardEvent("cut", { data: "something" });
   582   expectedData = { type: "cut", data: null }
   583   compareSynthetic(event, "before");
   584   syntheticSpot.dispatchEvent(event);
   585   ok(expectedData.eventFired, "cut event fired");
   586   compareSynthetic(event, "after");
   588   event = new ClipboardEvent("cut", { dataType: "text/plain", data: "something" });
   589   expectedData = { type: "cut", dataType: "text/plain", data: "something" }
   590   compareSynthetic(event, "before");
   591   syntheticSpot.dispatchEvent(event);
   592   ok(expectedData.eventFired, "cut event fired");
   593   compareSynthetic(event, "after");
   595   event = new ClipboardEvent("copy", { dataType: "text/plain", data: "something" });
   596   expectedData = { type: "copy", dataType: "text/plain", data: "something" }
   597   compareSynthetic(event, "before");
   598   syntheticSpot.dispatchEvent(event);
   599   ok(expectedData.eventFired, "copy event fired");
   600   compareSynthetic(event, "after");
   602   event = new ClipboardEvent("copy", { dataType: "text/plain" });
   603   expectedData = { type: "copy", dataType: "text/plain", data: "" }
   604   compareSynthetic(event, "before");
   605   syntheticSpot.dispatchEvent(event);
   606   ok(expectedData.eventFired, "copy event fired");
   607   compareSynthetic(event, "after");
   609   event = new ClipboardEvent("paste", { dataType: "text/plain", data: "something" });
   610   expectedData = { type: "paste", dataType: "text/plain", data: "something" }
   611   compareSynthetic(event, "before");
   612   syntheticSpot.dispatchEvent(event);
   613   ok(expectedData.eventFired, "paste event fired");
   614   compareSynthetic(event, "after");
   616   event = new ClipboardEvent("paste", { dataType: "application/unknown", data: "unknown" });
   617   expectedData = { type: "paste", dataType: "application/unknown", data: "unknown" }
   618   compareSynthetic(event, "before");
   619   syntheticSpot.dispatchEvent(event);
   620   ok(expectedData.eventFired, "paste event fired");
   621   compareSynthetic(event, "after");
   622 }
   624 function compareSynthetic(event, eventtype)
   625 {
   626   let step = (eventtype == "cut" || eventtype == "copy" || eventtype == "paste") ? "during" : eventtype;
   627   if (step == "during") {
   628     is(eventtype, expectedData.type, "synthetic " + eventtype + " event fired");
   629   }
   631   ok(event.clipboardData instanceof DataTransfer, "clipboardData is assigned");
   633   is(event.type, expectedData.type, "synthetic " + eventtype + " event type");
   634   if (expectedData.data === null) {
   635     is(event.clipboardData.mozItemCount, 0, "synthetic " + eventtype + " empty data");
   636   }
   637   else {
   638     is(event.clipboardData.mozItemCount, 1, "synthetic " + eventtype + " item count");
   639     is(event.clipboardData.types.length, 1, "synthetic " + eventtype + " types length");
   640     is(event.clipboardData.getData(expectedData.dataType), expectedData.data,
   641        "synthetic " + eventtype + " data");
   642   }
   644   is(getClipboardText(), "empty", "event does not change the clipboard " + step + " dispatch");
   646   if (step == "during") {
   647     expectedData.eventFired = true;
   648   }
   649 }
   651 function checkCachedDataTransfer(cd, eventtype)
   652 {
   653   var testprefix = "cached " + eventtype + " dataTransfer";
   655   setClipboardText("Some Clipboard Text");
   657   var oldtext = cd.getData("text/plain");
   658   ok(oldtext != "Some Clipboard Text", "clipboard get using " + testprefix);
   660   var exh = false;
   661   try { cd.mozSetDataAt("text/plain", "Test Cache Data", 0); } catch (ex) { exh = true; }
   662   ok(eventtype == "paste" ? exh : !exh, "exception occured setting " + testprefix);
   664   var newtext = (eventtype == "paste") ? cd.getData("text/plain") :
   665                                          cd.mozGetDataAt("text/plain", 0);
   666   is(newtext, (eventtype == "paste") ? "" : "Test Cache Data",
   667      " clipboardData not changed using " + testprefix);
   669   is(getClipboardText(), "Some Clipboard Text", "clipboard not changed using " + testprefix);
   671   var exh = false;
   672   try { cd.mozClearDataAt("text/plain", 0); } catch (ex) { exh = true; }
   673   ok(eventtype == "paste" ? exh : !exh, "exception occured clearing " + testprefix);
   675   is(getClipboardText(), "Some Clipboard Text", "clipboard not changed using " + testprefix);
   676 }
   678 </script>
   679 </pre>
   680 </body>
   681 </html>

mercurial