summaryrefslogtreecommitdiffstats
path: root/editor/composer/test/test_bug1266815.html
blob: 1c565fb2c107edbdfaf620c1fabea158dea4c278 (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
<!DOCTYPE html>
<html>
<head>
  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<script type="text/javascript">
// XXX(nika): Why are we using SpecialPowers here? If we're a chrome mochitest
// can't we avoid using the SpecialPowers wrappers?
const Cc = SpecialPowers.Cc;
const Ci = SpecialPowers.Ci;
const Cu = SpecialPowers.Cu;

const { ComponentUtils } = ChromeUtils.importESModule(
  "resource://gre/modules/ComponentUtils.sys.mjs"
);

const HELPERAPP_DIALOG_CID =
        SpecialPowers.wrap(SpecialPowers.Components)
        .ID(Cc["@mozilla.org/helperapplauncherdialog;1"].number);
const HELPERAPP_DIALOG_CONTRACT_ID = "@mozilla.org/helperapplauncherdialog;1";
const MOCK_HELPERAPP_DIALOG_CID =
        SpecialPowers.wrap(SpecialPowers.Components)
        .ID("{391832c8-5232-4676-b838-cc8ad373f3d8}");

var registrar = SpecialPowers.wrap(Components).manager
                .QueryInterface(Ci.nsIComponentRegistrar);

const HandlerService = Cc[
  "@mozilla.org/uriloader/handler-service;1"
].getService(Ci.nsIHandlerService);

const MIMEService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);

var helperAppDlgPromise = new Promise(function(resolve) {
  var mockHelperAppService;

  function HelperAppLauncherDialog() {
  }

  HelperAppLauncherDialog.prototype = {
    show(aLauncher, aWindowContext, aReason) {
      ok(true, "Whether showing Dialog");
      resolve();
      registrar.unregisterFactory(MOCK_HELPERAPP_DIALOG_CID,
                                  mockHelperAppService);
    },
    QueryInterface: ChromeUtils.generateQI(["nsIHelperAppLauncherDialog"]),
  };

  mockHelperAppService = ComponentUtils.generateSingletonFactory(HelperAppLauncherDialog);
  registrar.registerFactory(MOCK_HELPERAPP_DIALOG_CID, "",
                            HELPERAPP_DIALOG_CONTRACT_ID,
                            mockHelperAppService);
});

add_task(async function() {
  // ensure the download triggers the external app dialog
  const mimeInfo = MIMEService.getFromTypeAndExtension("application/octet-stream", "");
  mimeInfo.alwaysAskBeforeHandling = true;
  HandlerService.store(mimeInfo);

  SimpleTest.registerCleanupFunction(() => {
    HandlerService.remove(mimeInfo);
  });

  let promise = new Promise(function(resolve) {
    let iframe = document.createElement("iframe");
    iframe.onload = function() {
      is(iframe.contentDocument.getElementById("edit").innerText, "abc",
         "load iframe source");
      resolve();
    };
    iframe.id = "testframe";
    iframe.src = "data:text/html,<div id=edit contenteditable=true>abc</div>";
    document.body.appendChild(iframe);
  });

  await promise;

  let iframe = document.getElementById("testframe");
  let docShell = SpecialPowers.wrap(iframe.contentWindow).docShell;

  ok(docShell.hasEditingSession, "Should have editing session");

  document.getElementById("testframe").src =
    "data:application/octet-stream,TESTCONTENT";

  await helperAppDlgPromise;

  ok(docShell.hasEditingSession, "Should have editing session");
});
</script>
</body>
</html>