| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Event constructors</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id="log"></div> |
| <script> |
| function assert_props(iface, event, defaults) { |
| assert_true(event instanceof self[iface]); |
| expected[iface].properties.forEach(function(p) { |
| var property = p[0], value = p[defaults ? 1 : 2]; |
| assert_true(property in event, |
| "Event " + format_value(event) + " should have a " + |
| property + " property"); |
| assert_equals(event[property], value, |
| "The value of the " + property + " property should be " + |
| format_value(value)); |
| }); |
| if ("parent" in expected[iface]) { |
| assert_props(expected[iface].parent, event, defaults); |
| } |
| } |
| |
| var EventModifierInit = [ |
| ["ctrlKey", false, true], |
| ["shiftKey", false, true], |
| ["altKey", false, true], |
| ["metaKey", false, true], |
| ]; |
| var expected = { |
| "Event": { |
| "properties": [ |
| ["bubbles", false, true], |
| ["cancelable", false, true], |
| ], |
| }, |
| |
| "UIEvent": { |
| "parent": "Event", |
| "properties": [ |
| ["view", null, window], |
| ["detail", 0, 7], |
| ], |
| }, |
| |
| "FocusEvent": { |
| "parent": "UIEvent", |
| "properties": [ |
| ["relatedTarget", null, document], |
| ], |
| }, |
| |
| "MouseEvent": { |
| "parent": "UIEvent", |
| "properties": EventModifierInit.concat([ |
| ["screenX", 0, 40], |
| ["screenY", 0, 40], |
| ["clientX", 0, 40], |
| ["clientY", 0, 40], |
| ["button", 0, 40], |
| ["buttons", 0, 40], |
| ["relatedTarget", null, document], |
| ]), |
| }, |
| |
| "WheelEvent": { |
| "parent": "MouseEvent", |
| "properties": [ |
| ["deltaX", 0.0, 3.1], |
| ["deltaY", 0.0, 3.1], |
| ["deltaZ", 0.0, 3.1], |
| ["deltaMode", 0, 40], |
| ], |
| }, |
| |
| "KeyboardEvent": { |
| "parent": "UIEvent", |
| "properties": EventModifierInit.concat([ |
| ["key", "", "string"], |
| ["code", "", "string"], |
| ["location", 0, 7], |
| ["repeat", false, true], |
| ["isComposing", false, true], |
| ["charCode", 0, 7], |
| ["keyCode", 0, 7], |
| ["which", 0, 7], |
| ]), |
| }, |
| |
| "CompositionEvent": { |
| "parent": "UIEvent", |
| "properties": [ |
| ["data", "", "string"], |
| ], |
| }, |
| }; |
| |
| Object.keys(expected).forEach(function(iface) { |
| test(function() { |
| var event = new self[iface]("type"); |
| assert_props(iface, event, true); |
| }, iface + " constructor (no argument)"); |
| |
| test(function() { |
| var event = new self[iface]("type", undefined); |
| assert_props(iface, event, true); |
| }, iface + " constructor (undefined argument)"); |
| |
| test(function() { |
| var event = new self[iface]("type", null); |
| assert_props(iface, event, true); |
| }, iface + " constructor (null argument)"); |
| |
| test(function() { |
| var event = new self[iface]("type", {}); |
| assert_props(iface, event, true); |
| }, iface + " constructor (empty argument)"); |
| |
| test(function() { |
| var dictionary = {}; |
| expected[iface].properties.forEach(function(p) { |
| var property = p[0], value = p[1]; |
| dictionary[property] = value; |
| }); |
| var event = new self[iface]("type", dictionary); |
| assert_props(iface, event, true); |
| }, iface + " constructor (argument with default values)"); |
| |
| test(function() { |
| function fill_in(iface, dictionary) { |
| if ("parent" in expected[iface]) { |
| fill_in(expected[iface].parent, dictionary) |
| } |
| expected[iface].properties.forEach(function(p) { |
| var property = p[0], value = p[2]; |
| dictionary[property] = value; |
| }); |
| } |
| |
| var dictionary = {}; |
| fill_in(iface, dictionary); |
| |
| var event = new self[iface]("type", dictionary); |
| assert_props(iface, event, false); |
| }, iface + " constructor (argument with non-default values)"); |
| }); |
| |
| test(function () { |
| assert_throws(new TypeError(), function() { |
| new UIEvent("x", { view: 7 }) |
| }); |
| }, "UIEvent constructor (view argument with wrong type)") |
| </script> |