summaryrefslogtreecommitdiffstats
path: root/widget/tests/test_bug466599.xhtml
blob: b75fef0cc138e61209fe385527420ce3a2c937ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=466599
-->
<window title="Mozilla Bug 466599"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        onload="initAndRunTests()">
  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>

  <!-- test results are displayed in the html:body -->
  <body xmlns="http://www.w3.org/1999/xhtml">
    <p id="display"></p>
    <div id="content" style="display: none"></div>
    <pre id="test"></pre>
  </body>

  <!-- test code goes here -->
  <script class="testbody" type="application/javascript">
  <![CDATA[

  /** Test for Bug 466599 **/

function getLoadContext() {
  return window.docShell.QueryInterface(Ci.nsILoadContext);
}

function copyToClipboard(txt)
{
  var clipid = Ci.nsIClipboard;
  var clip =
    Cc['@mozilla.org/widget/clipboard;1'].createInstance(clipid);
  if (!clip)
    return false;
  var trans =
    Cc['@mozilla.org/widget/transferable;1'].createInstance(Ci.nsITransferable);
  if (!trans)
    return false;
  trans.init(getLoadContext());
  trans.addDataFlavor('text/html');
  var str =
    Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
  var copytext = txt;
  str.data = copytext;
  trans.setTransferData("text/html",str,copytext.length*2);
  if (!clip)
    return false;
  clip.setData(trans,null,clipid.kGlobalClipboard);
  return true;
}

function readFromClipboard()
{
  var clipid = Ci.nsIClipboard;
  var clip =
    Cc['@mozilla.org/widget/clipboard;1'].createInstance(clipid);
  if (!clip)
    return "";
  var trans =
    Cc['@mozilla.org/widget/transferable;1'].createInstance(Ci.nsITransferable);
  if (!trans)
    return "";
  trans.init(getLoadContext());
  trans.addDataFlavor('text/html');
  clip.getData(trans,clipid.kGlobalClipboard);
  var str = {};
  trans.getTransferData("text/html",str);
  if (str)
    str = str.value.QueryInterface(Ci.nsISupportsString);
  return str?.data;
}

function encodeHtmlEntities(s)
{
  var result = '';
  for (var i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    result += {'<':'&lt;', '>':'&gt;', '&':'&amp;', '"':'&quot;'}[c] || c;
  }
  return result;
}

function initAndRunTests()
{
  var source = '<p>Lorem ipsum</p>';
  var expect = new RegExp('<html>.*charset=utf-8.*' + source + '.*</html>', 'im');

  var result = copyToClipboard(source);
  ok(result, "copied HTML data to system pasteboard");

  result = readFromClipboard();
  ok(expect.test(result), "data on system pasteboard is wrapped with charset metadata");

  // eslint-disable-next-line no-unsanitized/property
  $("display").innerHTML =
    '<em>source:</em> <pre>' + encodeHtmlEntities(source) + '</pre><br/>' +
    '<em>result:</em> <pre>' + encodeHtmlEntities(result) + '</pre>';
}

  ]]>
  </script>
</window>