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
|
/* 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/. */
"use strict";
const { Loader } = require("sdk/test/loader");
const { getMostRecentBrowserWindow, getInnerId } = require("sdk/window/utils");
const { openTab, closeTab, getBrowserForTab } = require("sdk/tabs/utils");
const { defer } = require("sdk/core/promise");
const { curry, identity, partial } = require("sdk/lang/functional");
const { nuke } = require("sdk/loader/sandbox");
const { open: openWindow, close: closeWindow } = require('sdk/window/helpers');
const openBrowserWindow = partial(openWindow, null, {features: {toolbar: true}});
var when = curry(function(options, tab) {
let type = options.type || options;
let capture = options.capture || false;
let target = getBrowserForTab(tab);
let { promise, resolve } = defer();
target.addEventListener(type, function handler(event) {
if (!event.target.defaultView.frameElement) {
target.removeEventListener(type, handler, capture);
resolve(tab);
}
}, capture);
return promise;
});
var use = use = value => () => value;
var open = curry((url, window) => openTab(window, url));
var close = function(tab) {
let promise = when("pagehide", tab);
closeTab(tab);
return promise;
}
exports["test dead object errors"] = function(assert, done) {
let system = require("sdk/system/events");
let loader = Loader(module);
let { events } = loader.require("sdk/content/events");
// The dead object error is properly reported on console but
// doesn't raise any test's exception
function onMessage({ subject }) {
let message = subject.wrappedJSObject;
let { level } = message;
let text = String(message.arguments[0]);
if (level === "error" && text.includes("can't access dead object"))
fail(text);
}
let cleanup = () => system.off("console-api-log-event", onMessage);
let fail = (reason) => {
cleanup();
assert.fail(reason);
}
loader.unload();
nuke(loader.sharedGlobalSandbox);
system.on("console-api-log-event", onMessage, true);
openBrowserWindow().
then(closeWindow).
then(() => assert.pass("checking dead object errors")).
then(cleanup).
then(done, fail);
};
// ignore *-document-global-created events that are not very consistent.
// only allow data uris that we create to ignore unwanted events, e.g.,
// about:blank, http:// requests from Fennec's `about:`home page that displays
// add-ons a user could install, local `searchplugins`, other chrome uris
// Calls callback if passes filter
function eventFilter (type, target, callback) {
if (target.URL.startsWith("data:text/html,") &&
type !== "chrome-document-global-created" &&
type !== "content-document-global-created")
callback();
}
require("test").run(exports);
|