summaryrefslogtreecommitdiffstats
path: root/widget/tests/test_bug466599.xul
blob: a70f47add7ca6571e52f38b2e86dd38424eb1cec (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
104
105
106
107
108
109
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
<?xml-stylesheet type="text/css" href="/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 type="application/javascript"
          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() {
  const Ci = Components.interfaces;
  return window.QueryInterface(Ci.nsIInterfaceRequestor)
               .getInterface(Ci.nsIWebNavigation)
               .QueryInterface(Ci.nsILoadContext);
}

function copyToClipboard(txt)
{
  var clipid = Components.interfaces.nsIClipboard;
  var clip =
    Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(clipid);
  if (!clip)
    return false;
  var trans =
    Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
  if (!trans)
    return false;
  trans.init(getLoadContext());
  trans.addDataFlavor('text/html');
  var str =
    Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.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 = Components.interfaces.nsIClipboard;
  var clip =
    Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(clipid);
  if (!clip)
    return;
  var trans =
    Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
  if (!trans)
    return;
  trans.init(getLoadContext());
  trans.addDataFlavor('text/html');
  clip.getData(trans,clipid.kGlobalClipboard);
  var str = new Object();
  var strLength = new Object();
  trans.getTransferData("text/html",str,strLength);
  if (str)
    str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
  if (str)
    pastetext = str.data.substring(0,strLength.value / 2);
  return pastetext;
}

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");

  $("display").innerHTML = 
    '<em>source:</em> <pre>' + encodeHtmlEntities(source) + '</pre><br/>' +
    '<em>result:</em> <pre>' + encodeHtmlEntities(result) + '</pre>';
}

  ]]>
  </script>
</window>