102 lines
3.4 KiB
JavaScript
102 lines
3.4 KiB
JavaScript
import cockpit from "cockpit";
|
|
import QUnit from "qunit-tests";
|
|
|
|
/* This is *NOT* a development guide, we take lots of shortcuts here */
|
|
|
|
/* Top level window */
|
|
function parent_window(assert) {
|
|
const done = assert.async();
|
|
assert.expect(7);
|
|
window.assert = assert; // for the child frame
|
|
|
|
document.getElementById("qunit-header").innerHTML = "Cockpit Parent Frame";
|
|
window.name = "cockpit1";
|
|
let initialized = false;
|
|
let frame;
|
|
|
|
cockpit.transport.filter(function (message, channel, control) { // eslint-disable-line array-callback-return
|
|
if (initialized)
|
|
frame.postMessage(message, cockpit.transport.origin);
|
|
});
|
|
|
|
window.addEventListener("message", event => {
|
|
const message = event.data;
|
|
if (message.length === 0) {
|
|
done();
|
|
} else if (message.indexOf && message.indexOf('"init"') !== -1) {
|
|
initialized = true;
|
|
frame.postMessage('\n{ "command": "init", "version": 1, "a": "b", "host" : "frame_host" }',
|
|
cockpit.transport.origin);
|
|
} else {
|
|
const ret = cockpit.transport.inject(message);
|
|
if (!ret) console.error("inject failed");
|
|
}
|
|
}, false);
|
|
|
|
/* This keeps coming up in tests ... how to open the transport */
|
|
const chan = cockpit.channel({ payload: "resource2" });
|
|
chan.addEventListener("close", () => {
|
|
assert.equal(cockpit.transport.host, "localhost", "parent cockpit.transport.host");
|
|
const iframe = document.createElement("iframe");
|
|
iframe.setAttribute("name", "cockpit1:blah");
|
|
iframe.setAttribute("src", window.location.href + "?sub");
|
|
document.body.appendChild(iframe);
|
|
frame = window.frames["cockpit1:blah"];
|
|
});
|
|
}
|
|
|
|
function child_frame() {
|
|
const assert = window.parent.assert;
|
|
|
|
let spawn_done = false;
|
|
let binary_done = false;
|
|
|
|
const promise = cockpit.spawn(["/bin/sh", "-c", "echo hi"], { host: "localhost" })
|
|
.then(resp => {
|
|
assert.equal(resp, "hi\n", "framed channel got output");
|
|
})
|
|
.always(() => {
|
|
assert.equal(promise.state(), "resolved", "framed channel closed");
|
|
assert.equal(cockpit.transport.host, "frame_host", "framed cockpit.transport.host");
|
|
spawn_done = true;
|
|
if (spawn_done && binary_done) {
|
|
cockpit.transport.close();
|
|
}
|
|
});
|
|
|
|
const channel = cockpit.channel({
|
|
payload: "echo",
|
|
binary: true,
|
|
host: "localhost"
|
|
});
|
|
channel.addEventListener("message", function(ev, payload) {
|
|
assert.equal(typeof payload[0], "number", "binary channel got a byte array");
|
|
|
|
let match = true;
|
|
for (let i = 0; i < payload.length; i++) {
|
|
if (payload[i] !== i)
|
|
match = false;
|
|
}
|
|
assert.equal(match, true, "binary channel got back right data");
|
|
channel.close();
|
|
});
|
|
channel.addEventListener("close", (ev, options) => {
|
|
assert.notOk(options.reason, "binary channel close cleanly");
|
|
binary_done = true;
|
|
if (spawn_done && binary_done)
|
|
cockpit.transport.close();
|
|
});
|
|
|
|
const view = new Array(8);
|
|
for (let i = 0; i < 8; i++)
|
|
view[i] = i;
|
|
channel.send(view);
|
|
}
|
|
|
|
if (window.parent === window) {
|
|
QUnit.test("framed", parent_window);
|
|
QUnit.start();
|
|
} else {
|
|
child_frame();
|
|
}
|