<!DOCTYPE HTML>
<title>GlobalEventHandlers Touch Interface Tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(function() {
    var touch_event_list = ['ontouchstart', 'ontouchmove', 'ontouchend', 'ontouchcancel'];
    var global_event_handlers = [window, HTMLElement.prototype, SVGElement.prototype, Document.prototype];
    for (var i in touch_event_list) {
        for (var j in global_event_handlers) {
            assert_true(touch_event_list[i] in global_event_handlers[j], "Touch event " + touch_event_list[i] + " in " + global_event_handlers[j].constructor.name);
        }
    }
}, "Touch events in GlobalEventHandlers");

test(function() {
    var touch_event_list = ['ontouchstart', 'ontouchmove', 'ontouchend', 'ontouchcancel'];
    var global_event_handlers = [window, HTMLElement.prototype, SVGElement.prototype, Document.prototype];
    for (var i in touch_event_list) {
        for (var j in global_event_handlers) {
            assert_true(global_event_handlers[j].hasOwnProperty(touch_event_list[i]), "GlobalEventHandler " + global_event_handlers[j].constructor.name + " hasOwnProperty " + touch_event_list[i]);
        }
    }
}, "Touch events are GlobalEventHandlers' own property");

test(function() {
    var touch_event_list = ['ontouchstart', 'ontouchmove', 'ontouchend', 'ontouchcancel'];
    var non_global_event_handlers = [Element.prototype];
    for (var i in touch_event_list) {
        for (var j in non_global_event_handlers) {
            assert_false(touch_event_list[i] in non_global_event_handlers[j], "Touch event " + touch_event_list[i] + " not in " + non_global_event_handlers[j].constructor.name);
        }
    }
}, "Touch events not in Element.prototype");
</script>
