blob: 34a263f77c10e5b8797e3edd71c9c9e45d0266df [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
window.jsTestIsAsync = true;
// The events that we want to test, with the properties that each one uses.
var events = [
{ eventKind: "CustomEvent", propName: "detail" },
{ eventKind: "MessageEvent", propName: "data" },
{ eventKind: "PopStateEvent", propName: "state" },
{ eventKind: "ErrorEvent", propName: "error" },
];
// Types we can put in the property of the Event
var values = [
{ propValue: "document" },
{ propValue: '{"bar":1}' },
{ propValue: "5" },
{ propValue: '"hello"' },
{ propValue: "true" },
{ propValue: "[1,2,3]" }
];
function merge(obj1, obj2) {
var newObj = { };
for (var attrname in obj1) { newObj[attrname] = obj1[attrname]; }
for (var attrname in obj2) { newObj[attrname] = obj2[attrname]; }
return newObj;
}
// Format the tests so they look like [ { eventKind: ..., propValue: ... }, ... { eventKind: ..., propValue: ... } ]
var tests = events.map(function(event) {
return values.map(function(value) {
return merge(event, value);
})
});
tests = tests.reduce(function(a, b) {
return a.concat(b);
});
// We need to scan all the properies of value to ensure they all came from the current world.
// Assumes window.internals exists.
function checkAllPropertiesFromCurrentWorld(value) {
var allFromCurrentWorld = true;
while (allFromCurrentWorld && value && typeof value === "object") {
allFromCurrentWorld = allFromCurrentWorld && window.internals.isFromCurrentWorld(value);
for (var prop in value)
allFromCurrentWorld = allFromCurrentWorld && checkAllPropertiesFromCurrentWorld(value[prop], seenValues);
value = Object.getPrototypeOf(value);
}
return allFromCurrentWorld;
}
function addListener(eventKind, eventString, prop) {
document.addEventListener(eventString, function(event) {
eventValue = event
resultValue = event[prop]
if (window.internals) {
shouldBeTrue("window.internals.isFromCurrentWorld(event)");
shouldBeTrue("checkAllPropertiesFromCurrentWorld(resultValue)");
}
// The property defined in the isolated world should be undefined.
shouldBeUndefined("Object.pageDefinedVar");
window.postMessage("done", "*");
});
}
function sendDocumentEvent(eventKind, eventString, prop, value) {
var constructor = eval(eventKind);
var initializer = { };
initializer[prop] = value;
var newEvent = new constructor(eventString, initializer);
// Try to access the property in a different world to make sure caching issues do not occur
newEvent[prop];
document.dispatchEvent(newEvent);
}
function runScript(eventKind, propName, propValue, number) {
// Final string should have the form:
// document.pageDefinedVar = 1; (function sendDocumentObject(eventKind, propName, result) {...})(...);
// When evaluated in the isolated world, should initiate the event with the
// document object as the specificed property value.
var eventString = eventKind + number;
var script = "Object.pageDefinedVar = 1; "
+ "(" + sendDocumentEvent.toString() + ")('"
+ eventKind + "', '" + eventString + "', '" + propName + "', " + propValue + ");";
addListener(eventKind, eventString);
testRunner.evaluateScriptInIsolatedWorld(0, script);
}
// Run the tests whenever a notification arrives, which indicates that the
// previous test has finished.
window.addEventListener("message", function(message) {
runNextTest();
}, false);
// Keep a count to make a unique string
var count = 1;
var lastEventKind, lastPropertyName;
function runNextTest () {
var test = tests.pop();
if (!test) {
finishJSTest();
return;
}
if (test.eventKind !== lastEventKind) {
debug("");
debug("Testing " + test.eventKind + "." + test.propName);
lastEventKind = test.eventKind;
lastPropertyName = test.propName;
}
runScript(test.eventKind, test.propName, test.propValue, count++);
};
// This test is meaningless without testRunner.
if (window.testRunner) {
runNextTest();
}
</script>
</body>
<script src="../../resources/js-test-post.js"></script>
</html>