michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // This file tests features made available to the frameworker via the sandbox. michael@0: // For other frameworker tests, see browser_frameworker.js michael@0: michael@0: function makeWorkerUrl(runner) { michael@0: let prefix = "http://example.com/browser/toolkit/components/social/test/browser/echo.sjs?"; michael@0: if (typeof runner == "function") { michael@0: runner = "var run=" + runner.toSource() + ";run();"; michael@0: } michael@0: return prefix + encodeURI(runner); michael@0: } michael@0: michael@0: var getFrameWorkerHandle; michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: michael@0: let scope = {}; michael@0: Cu.import("resource://gre/modules/FrameWorker.jsm", scope); michael@0: getFrameWorkerHandle = scope.getFrameWorkerHandle; michael@0: michael@0: runTests(tests); michael@0: } michael@0: michael@0: let tests = { michael@0: testArrayUsingBuffer: function(cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: port.onmessage = function(e) { michael@0: if (e.data.topic == "go") { michael@0: let buffer = new ArrayBuffer(10); michael@0: // this one has always worked in the past, but worth checking anyway... michael@0: if (new Uint8Array(buffer).length != 10) { michael@0: port.postMessage({topic: "result", reason: "first length was not 10"}); michael@0: return; michael@0: } michael@0: let reader = new FileReader(); michael@0: reader.onload = function(event) { michael@0: if (new Uint8Array(buffer).length != 10) { michael@0: port.postMessage({topic: "result", reason: "length in onload handler was not 10"}); michael@0: return; michael@0: } michael@0: // all seems good! michael@0: port.postMessage({topic: "result", reason: "ok"}); michael@0: } michael@0: let blob = new Blob([buffer], {type: "binary"}); michael@0: reader.readAsArrayBuffer(blob); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testArray"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "result") { michael@0: is(e.data.reason, "ok", "check the array worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: worker.port.postMessage({topic: "go"}); michael@0: }, michael@0: michael@0: testArrayUsingReader: function(cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: port.onmessage = function(e) { michael@0: if (e.data.topic == "go") { michael@0: let buffer = new ArrayBuffer(10); michael@0: let reader = new FileReader(); michael@0: reader.onload = function(event) { michael@0: try { michael@0: if (new Uint8Array(reader.result).length != 10) { michael@0: port.postMessage({topic: "result", reason: "length in onload handler was not 10"}); michael@0: return; michael@0: } michael@0: // all seems good! michael@0: port.postMessage({topic: "result", reason: "ok"}); michael@0: } catch (ex) { michael@0: port.postMessage({topic: "result", reason: ex.toString()}); michael@0: } michael@0: } michael@0: let blob = new Blob([buffer], {type: "binary"}); michael@0: reader.readAsArrayBuffer(blob); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testArray"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "result") { michael@0: is(e.data.reason, "ok", "check the array worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: worker.port.postMessage({topic: "go"}); michael@0: }, michael@0: michael@0: testXHR: function(cbnext) { michael@0: // NOTE: this url MUST be in the same origin as worker_xhr.js fetches from! michael@0: let url = "https://example.com/browser/toolkit/components/social/test/browser/worker_xhr.js"; michael@0: let worker = getFrameWorkerHandle(url, undefined, "testXHR"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check the xhr test worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testLocalStorage: function(cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: try { michael@0: localStorage.setItem("foo", "1"); michael@0: } catch(e) { michael@0: port.postMessage({topic: "done", result: "FAILED to set localStorage, " + e.toString() }); michael@0: return; michael@0: } michael@0: michael@0: var ok; michael@0: try { michael@0: ok = localStorage["foo"] == 1; michael@0: } catch (e) { michael@0: port.postMessage({topic: "done", result: "FAILED to read localStorage, " + e.toString() }); michael@0: return; michael@0: } michael@0: port.postMessage({topic: "done", result: "ok"}); michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testLocalStorage", null, true); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check the localStorage test worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testNoLocalStorage: function(cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: try { michael@0: localStorage.setItem("foo", "1"); michael@0: } catch(e) { michael@0: port.postMessage({topic: "done", result: "ok"}); michael@0: return; michael@0: } michael@0: michael@0: port.postMessage({topic: "done", result: "FAILED because localStorage was exposed" }); michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testNoLocalStorage"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check that retrieving localStorage fails by default"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testBase64: function (cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: var ok = false; michael@0: try { michael@0: ok = btoa("1234") == "MTIzNA=="; michael@0: } catch(e) { michael@0: port.postMessage({topic: "done", result: "FAILED to call btoa, " + e.toString() }); michael@0: return; michael@0: } michael@0: if (!ok) { michael@0: port.postMessage({topic: "done", result: "FAILED calling btoa"}); michael@0: return; michael@0: } michael@0: michael@0: try { michael@0: ok = atob("NDMyMQ==") == "4321"; michael@0: } catch (e) { michael@0: port.postMessage({topic: "done", result: "FAILED to call atob, " + e.toString() }); michael@0: return; michael@0: } michael@0: if (!ok) { michael@0: port.postMessage({topic: "done", result: "FAILED calling atob"}); michael@0: return; michael@0: } michael@0: michael@0: port.postMessage({topic: "done", result: "ok"}); michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testBase64"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check the atob/btoa test worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testTimeouts: function (cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: michael@0: var timeout; michael@0: try { michael@0: timeout = setTimeout(function () { michael@0: port.postMessage({topic: "done", result: "FAILED cancelled timeout was called"}); michael@0: }, 100); michael@0: } catch (ex) { michael@0: port.postMessage({topic: "done", result: "FAILED calling setTimeout: " + ex}); michael@0: return; michael@0: } michael@0: michael@0: try { michael@0: clearTimeout(timeout); michael@0: } catch (ex) { michael@0: port.postMessage({topic: "done", result: "FAILED calling clearTimeout: " + ex}); michael@0: return; michael@0: } michael@0: michael@0: var counter = 0; michael@0: try { michael@0: timeout = setInterval(function () { michael@0: if (++counter == 2) { michael@0: clearInterval(timeout); michael@0: setTimeout(function () { michael@0: port.postMessage({topic: "done", result: "ok"}); michael@0: return; michael@0: }, 0); michael@0: } michael@0: }, 100); michael@0: } catch (ex) { michael@0: port.postMessage({topic: "done", result: "FAILED calling setInterval: " + ex}); michael@0: return; michael@0: } michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testTimeouts"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check that timeouts worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testWebSocket: function (cbnext) { michael@0: let run = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: michael@0: try { michael@0: var exampleSocket = new WebSocket("ws://mochi.test:8888/socketserver"); michael@0: } catch (e) { michael@0: port.postMessage({topic: "done", result: "FAILED calling WebSocket constructor: " + e}); michael@0: return; michael@0: } michael@0: michael@0: port.postMessage({topic: "done", result: "ok"}); michael@0: } michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(run), undefined, "testWebSocket"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "done") { michael@0: is(e.data.result, "ok", "check that websockets worked"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: }, michael@0: michael@0: testEventSource: function(cbnext) { michael@0: let worker = getFrameWorkerHandle("https://example.com/browser/toolkit/components/social/test/browser/worker_eventsource.js", undefined, "testEventSource"); michael@0: worker.port.onmessage = function(e) { michael@0: let m = e.data; michael@0: if (m.topic == "eventSourceTest") { michael@0: if (m.result.ok != undefined) michael@0: ok(m.result.ok, e.data.result.msg); michael@0: if (m.result.is != undefined) michael@0: is(m.result.is, m.result.match, m.result.msg); michael@0: if (m.result.info != undefined) michael@0: info(m.result.info); michael@0: } else if (e.data.topic == "pong") { michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: worker.port.postMessage({topic: "ping"}) michael@0: }, michael@0: michael@0: testIndexedDB: function(cbnext) { michael@0: let worker = getFrameWorkerHandle("https://example.com/browser/toolkit/components/social/test/browser/worker_social.js", undefined, "testIndexedDB"); michael@0: worker.port.onmessage = function(e) { michael@0: let m = e.data; michael@0: if (m.topic == "social.indexeddb-result") { michael@0: is(m.data.result, "ok", "created indexeddb"); michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: worker.port.postMessage({topic: "test-indexeddb-create"}) michael@0: }, michael@0: michael@0: testSubworker: function(cbnext) { michael@0: // the main "frameworker"... michael@0: let mainworker = function() { michael@0: onconnect = function(e) { michael@0: let port = e.ports[0]; michael@0: port.onmessage = function(e) { michael@0: if (e.data.topic == "go") { michael@0: let suburl = e.data.data; michael@0: let worker = new Worker(suburl); michael@0: worker.onmessage = function(sube) { michael@0: port.postMessage({topic: "sub-message", data: sube.data}); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: // The "subworker" that is actually a real, bona-fide worker. michael@0: let subworker = function() { michael@0: postMessage("hello"); michael@0: } michael@0: let worker = getFrameWorkerHandle(makeWorkerUrl(mainworker), undefined, "testSubWorker"); michael@0: worker.port.onmessage = function(e) { michael@0: if (e.data.topic == "sub-message" && e.data.data == "hello") { michael@0: worker.terminate(); michael@0: cbnext(); michael@0: } michael@0: } michael@0: worker.port.postMessage({topic: "go", data: makeWorkerUrl(subworker)}); michael@0: } michael@0: }