133 lines
4.2 KiB
HTML
133 lines
4.2 KiB
HTML
<!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>
|