зеркало из https://github.com/mozilla/gecko-dev.git
Bug 840124 - implement postMessage API for remote report (tests) r=jaws, f=gps+gavin
This commit is contained in:
Родитель
38ea348462
Коммит
61b5560525
|
@ -316,7 +316,10 @@ _BROWSER_FILES = \
|
|||
browser_pluginCrashCommentAndURL.js \
|
||||
pluginCrashCommentAndURL.html \
|
||||
browser_private_no_prompt.js \
|
||||
browser_blob-channelname.js
|
||||
browser_blob-channelname.js \
|
||||
browser_aboutHealthReport.js \
|
||||
healthreport_testPostMessage.html \
|
||||
healthreport_testRemoteCommands.html \
|
||||
$(NULL)
|
||||
|
||||
# Disable test on Windows due to frequent failures (bug 841341)
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
||||
"resource://gre/modules/commonjs/sdk/core/promise.js");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
||||
"resource://gre/modules/Task.jsm");
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
// Ensure we don't pollute prefs for next tests.
|
||||
try {
|
||||
Services.prefs.clearUserPref("datareporting.healthreport.about.reportUrl");
|
||||
let policy = Cc["@mozilla.org/datareporting/service;1"]
|
||||
.getService(Ci.nsISupports)
|
||||
.wrappedJSObject
|
||||
.policy;
|
||||
policy.recordHealthReportUploadEnabled(true,
|
||||
"Resetting after tests.");
|
||||
} catch (ex) {}
|
||||
});
|
||||
|
||||
let gTests = [
|
||||
|
||||
{
|
||||
desc: "Test the remote commands",
|
||||
setup: function ()
|
||||
{
|
||||
Services.prefs.setCharPref("datareporting.healthreport.about.reportUrl",
|
||||
"https://example.com/browser/browser/base/content/test/healthreport_testRemoteCommands.html");
|
||||
},
|
||||
run: function ()
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
|
||||
let policy = Cc["@mozilla.org/datareporting/service;1"]
|
||||
.getService(Ci.nsISupports)
|
||||
.wrappedJSObject
|
||||
.policy;
|
||||
|
||||
let results = 0;
|
||||
try {
|
||||
let win = gBrowser.contentWindow;
|
||||
win.addEventListener("message", function testLoad(e) {
|
||||
if (e.data.type == "testResult") {
|
||||
ok(e.data.pass, e.data.info);
|
||||
results++;
|
||||
}
|
||||
else if (e.data.type == "testsComplete") {
|
||||
is(results, e.data.count, "Checking number of results received matches the number of tests that should have run");
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
}, false, true);
|
||||
|
||||
} catch(e) {
|
||||
ok(false, "Failed to get all commands");
|
||||
deferred.reject();
|
||||
}
|
||||
return deferred.promise;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
]; // gTests
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
// xxxmpc leaving this here until we resolve bug 854038 and bug 854060
|
||||
requestLongerTimeout(10);
|
||||
|
||||
Task.spawn(function () {
|
||||
for (let test of gTests) {
|
||||
info(test.desc);
|
||||
test.setup();
|
||||
|
||||
yield promiseNewTabLoadEvent("about:healthreport");
|
||||
|
||||
yield test.run();
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
|
||||
finish();
|
||||
});
|
||||
}
|
||||
|
||||
function promiseNewTabLoadEvent(aUrl, aEventType="load")
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
let tab = gBrowser.selectedTab = gBrowser.addTab(aUrl);
|
||||
tab.linkedBrowser.addEventListener(aEventType, function load(event) {
|
||||
tab.linkedBrowser.removeEventListener(aEventType, load, true);
|
||||
let iframe = tab.linkedBrowser.contentDocument.getElementById("remote-report");
|
||||
iframe.addEventListener("load", function frameLoad(e) {
|
||||
iframe.removeEventListener("load", frameLoad, false);
|
||||
deferred.resolve();
|
||||
}, false);
|
||||
}, true);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<script>
|
||||
|
||||
function init() {
|
||||
window.addEventListener("message", receiveMessage, false);
|
||||
}
|
||||
|
||||
function receiveMessage(event) {
|
||||
acknowledgeMessage(event.data.type);
|
||||
}
|
||||
|
||||
function acknowledgeMessage(type) {
|
||||
var data = {type: type};
|
||||
window.parent.postMessage(data, "*");
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,128 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<script>
|
||||
|
||||
function init() {
|
||||
window.addEventListener("message", function process(e) {doTest(e)}, false);
|
||||
doTest();
|
||||
}
|
||||
|
||||
function checkSubmissionValue(payload, expectedValue) {
|
||||
return payload.enabled == expectedValue;
|
||||
}
|
||||
|
||||
function validatePayload(payload) {
|
||||
payload = JSON.parse(payload);
|
||||
|
||||
// xxxmpc - this is some pretty low-bar validation, but we have plenty of tests of that API elsewhere
|
||||
if (!payload.thisPingDate)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
var tests = [
|
||||
{
|
||||
info: "Checking initial value is enabled",
|
||||
event: "RequestCurrentPrefs",
|
||||
payloadType: "prefs",
|
||||
validateResponse: function(payload) {
|
||||
return checkSubmissionValue(payload, true);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying disabling works",
|
||||
event: "DisableDataSubmission",
|
||||
payloadType: "prefs",
|
||||
validateResponse: function(payload) {
|
||||
return checkSubmissionValue(payload, false);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying we're still disabled",
|
||||
event: "RequestCurrentPrefs",
|
||||
payloadType: "prefs",
|
||||
validateResponse: function(payload) {
|
||||
return checkSubmissionValue(payload, false);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying we can get a payload while submission is disabled",
|
||||
event: "RequestCurrentPayload",
|
||||
payloadType: "payload",
|
||||
validateResponse: function(payload) {
|
||||
return validatePayload(payload);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying enabling works",
|
||||
event: "EnableDataSubmission",
|
||||
payloadType: "prefs",
|
||||
validateResponse: function(payload) {
|
||||
return checkSubmissionValue(payload, true);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying we're still re-enabled",
|
||||
event: "RequestCurrentPrefs",
|
||||
payloadType: "prefs",
|
||||
validateResponse: function(payload) {
|
||||
return checkSubmissionValue(payload, true);
|
||||
},
|
||||
},
|
||||
{
|
||||
info: "Verifying we can get a payload after re-enabling",
|
||||
event: "RequestCurrentPayload",
|
||||
payloadType: "payload",
|
||||
validateResponse: function(payload) {
|
||||
return validatePayload(payload);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
var currentTest = -1;
|
||||
function doTest(evt) {
|
||||
if (evt) {
|
||||
if (currentTest < 0 || !evt.data.content)
|
||||
return; // not yet testing
|
||||
|
||||
var test = tests[currentTest];
|
||||
if (evt.data.type != test.payloadType)
|
||||
return; // skip unrequested events
|
||||
|
||||
var error = JSON.stringify(evt.data.content);
|
||||
var pass = false;
|
||||
try {
|
||||
pass = test.validateResponse(evt.data.content)
|
||||
} catch (e) {}
|
||||
reportResult(test.info, pass, error);
|
||||
}
|
||||
// start the next test if there are any left
|
||||
if (tests[++currentTest])
|
||||
sendToBrowser(tests[currentTest].event);
|
||||
else
|
||||
reportFinished();
|
||||
}
|
||||
|
||||
function reportResult(info, pass, error) {
|
||||
var data = {type: "testResult", info: info, pass: pass, error: error};
|
||||
window.parent.postMessage(data, "*");
|
||||
}
|
||||
|
||||
function reportFinished(cmd) {
|
||||
var data = {type: "testsComplete", count: tests.length};
|
||||
window.parent.postMessage(data, "*");
|
||||
}
|
||||
|
||||
function sendToBrowser(type) {
|
||||
var event = new CustomEvent("RemoteHealthReportCommand", {detail: {command: type}, bubbles: true});
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче