| var All_Pointer_Events = [ |
| "pointerdown", |
| "pointerup", |
| "pointercancel", |
| "pointermove", |
| "pointerover", |
| "pointerout", |
| "pointerenter", |
| "pointerleave", |
| "gotpointercapture", |
| "lostpointercapture"]; |
| |
| // Check for conformance to PointerEvent interface |
| // TA: 1.1, 1.2, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 1.12, 1.13 |
| function check_PointerEvent(event, testNamePrefix) { |
| if (testNamePrefix === undefined) |
| testNamePrefix = ""; |
| |
| // Use expectedPointerType if set otherwise just use the incoming event pointerType in the test name. |
| var pointerTestName = testNamePrefix + ' ' + (expectedPointerType == null ? event.pointerType : expectedPointerType) + ' ' + event.type; |
| |
| if (expectedPointerType != null) { |
| test(function () { |
| assert_equals(event.pointerType, expectedPointerType, "pointerType should be the one specified in the test page."); |
| }, pointerTestName + " event pointerType is correct."); |
| } |
| |
| test(function () { |
| assert_true(event instanceof event.target.ownerDocument.defaultView.PointerEvent, "event is a PointerEvent event"); |
| }, pointerTestName + " event is a PointerEvent event"); |
| |
| |
| // Check attributes for conformance to WebIDL: |
| // * attribute exists |
| // * has proper type |
| // * if the attribute is "readonly", it cannot be changed |
| // TA: 1.1, 1.2 |
| var idl_type_check = { |
| "long": function (v) { return typeof v === "number" && Math.round(v) === v; }, |
| "float": function (v) { return typeof v === "number"; }, |
| "string": function (v) { return typeof v === "string"; }, |
| "boolean": function (v) { return typeof v === "boolean" }, |
| "object": function (v) { return typeof v === "object" } |
| }; |
| [ |
| ["readonly", "long", "pointerId"], |
| ["readonly", "float", "width"], |
| ["readonly", "float", "height"], |
| ["readonly", "float", "pressure"], |
| ["readonly", "long", "tiltX"], |
| ["readonly", "long", "tiltY"], |
| ["readonly", "string", "pointerType"], |
| ["readonly", "boolean", "isPrimary"], |
| ["readonly", "long", "detail", 0], |
| ["readonly", "object", "fromElement", null], |
| ["readonly", "object", "toElement", null] |
| ].forEach(function (attr) { |
| var readonly = attr[0]; |
| var type = attr[1]; |
| var name = attr[2]; |
| var value = attr[3]; |
| |
| // existence check |
| test(function () { |
| assert_true(name in event, name + " attribute in " + event.type + " event"); |
| }, pointerTestName + "." + name + " attribute exists"); |
| |
| // readonly check |
| if (readonly === "readonly") { |
| test(function () { |
| assert_readonly(event.type, name, event.type + "." + name + " cannot be changed"); |
| }, pointerTestName + "." + name + " is readonly"); |
| } |
| |
| // type check |
| test(function () { |
| assert_true(idl_type_check[type](event[name]), name + " attribute of type " + type); |
| }, pointerTestName + "." + name + " IDL type " + type + " (JS type was " + typeof event[name] + ")"); |
| |
| // value check if defined |
| if (value !== undefined) { |
| test(function () { |
| assert_equals(event[name], value, name + " attribute value"); |
| }, pointerTestName + "." + name + " value is " + value + "."); |
| } |
| }); |
| |
| |
| // Check the pressure value |
| // TA: 1.6, 1.7, 1.8 |
| test(function () { |
| // TA: 1.6 |
| assert_greater_than_equal(event.pressure, 0, "pressure is greater than or equal to 0"); |
| assert_less_than_equal(event.pressure, 1, "pressure is less than or equal to 1"); |
| |
| if (event.buttons === 0) { |
| assert_equals(event.pressure, 0, "pressure is 0 for mouse with no buttons pressed"); |
| } |
| |
| // TA: 1.7, 1.8 |
| if (event.pointerType === "mouse") { |
| if (event.buttons !== 0) { |
| assert_equals(event.pressure, 0.5, "pressure is 0.5 for mouse with a button pressed"); |
| } |
| } |
| }, pointerTestName + ".pressure value is valid"); |
| |
| // Check mouse-specific properties |
| if (event.pointerType === "mouse") { |
| // TA: 1.9, 1.10, 1.13 |
| test(function () { |
| assert_equals(event.width, 1, "width of mouse should be 1"); |
| assert_equals(event.height, 1, "height of mouse should be 1"); |
| assert_equals(event.tiltX, 0, event.type + ".tiltX is 0 for mouse"); |
| assert_equals(event.tiltY, 0, event.type + ".tiltY is 0 for mouse"); |
| assert_true(event.isPrimary, event.type + ".isPrimary is true for mouse"); |
| }, pointerTestName + " properties for pointerType = mouse"); |
| // Check properties for pointers other than mouse |
| } |
| } |
| |
| function showPointerTypes() { |
| var complete_notice = document.getElementById("complete-notice"); |
| var pointertype_log = document.getElementById("pointertype-log"); |
| var pointertypes = Object.keys(detected_pointertypes); |
| pointertype_log.innerHTML = pointertypes.length ? |
| pointertypes.join(",") : "(none)"; |
| complete_notice.style.display = "block"; |
| } |
| |
| function showLoggedEvents() { |
| var event_log_elem = document.getElementById("event-log"); |
| event_log_elem.innerHTML = event_log.length ? event_log.join(", ") : "(none)"; |
| |
| var complete_notice = document.getElementById("complete-notice"); |
| complete_notice.style.display = "block"; |
| } |
| |
| function failOnScroll() { |
| assert_true(false, |
| "scroll received while shouldn't"); |
| } |
| |
| function updateDescriptionNextStep() { |
| document.getElementById('desc').innerHTML = "Test Description: Try to scroll text RIGHT."; |
| } |
| |
| function updateDescriptionComplete() { |
| document.getElementById('desc').innerHTML = "Test Description: Test complete"; |
| } |
| |
| function updateDescriptionSecondStepTouchActionElement(target, scrollReturnInterval) { |
| window.step_timeout(function() { |
| objectScroller(target, 'up', 0);} |
| , scrollReturnInterval); |
| document.getElementById('desc').innerHTML = "Test Description: Try to scroll element RIGHT moving your outside of the red border"; |
| } |
| |
| function updateDescriptionThirdStepTouchActionElement(target, scrollReturnInterval, callback = null) { |
| window.step_timeout(function() { |
| objectScroller(target, 'left', 0); |
| if (callback) { |
| callback(); |
| } |
| }, scrollReturnInterval); |
| document.getElementById('desc').innerHTML = "Test Description: Try to scroll element DOWN then RIGHT starting your touch inside of the element. Then tap complete button"; |
| } |
| |
| function updateDescriptionFourthStepTouchActionElement(target, scrollReturnInterval) { |
| document.getElementById('desc').innerHTML = "Test Description: Try to scroll element RIGHT starting your touch inside of the element"; |
| } |
| |
| function objectScroller(target, direction, value) { |
| if (direction == 'up') { |
| target.scrollTop = 0; |
| } else if (direction == 'left') { |
| target.scrollLeft = 0; |
| } |
| } |
| |
| function sPointerCapture(e) { |
| try { |
| target0.setPointerCapture(e.pointerId); |
| } |
| catch(e) { |
| } |
| } |
| |
| function rPointerCapture(e) { |
| try { |
| captureButton.value = 'Set Capture'; |
| target0.releasePointerCapture(e.pointerId); |
| } |
| catch(e) { |
| } |
| } |
| |
| var globalPointerEventTest = null; |
| var expectedPointerType = null; |
| const ALL_POINTERS = ['mouse', 'touch', 'pen']; |
| const HOVERABLE_POINTERS = ['mouse', 'pen']; |
| const NOHOVER_POINTERS = ['touch']; |
| |
| function MultiPointerTypeTest(testName, types) { |
| this.testName = testName; |
| this.types = types; |
| this.currentTypeIndex = 0; |
| this.currentTest = null; |
| this.createNextTest(); |
| } |
| |
| MultiPointerTypeTest.prototype.step = function(op) { |
| this.currentTest.step(op); |
| } |
| |
| MultiPointerTypeTest.prototype.skip = function() { |
| var prevTest = this.currentTest; |
| this.createNextTest(); |
| prevTest.timeout(); |
| } |
| |
| MultiPointerTypeTest.prototype.done = function() { |
| if (this.currentTest.status != 1) { |
| var prevTest = this.currentTest; |
| this.createNextTest(); |
| if (prevTest != null) |
| prevTest.done(); |
| } |
| } |
| |
| MultiPointerTypeTest.prototype.step = function(stepFunction) { |
| this.currentTest.step(stepFunction); |
| } |
| |
| MultiPointerTypeTest.prototype.createNextTest = function() { |
| if (this.currentTypeIndex < this.types.length) { |
| var pointerTypeDescription = document.getElementById('pointerTypeDescription'); |
| document.getElementById('pointerTypeDescription').innerHTML = "Follow the test instructions with <span style='color: red'>" + this.types[this.currentTypeIndex] + "</span>. If you don't have the device <a href='javascript:;' onclick='globalPointerEventTest.skip()'>skip it</a>."; |
| this.currentTest = async_test(this.types[this.currentTypeIndex] + ' ' + this.testName); |
| expectedPointerType = this.types[this.currentTypeIndex]; |
| this.currentTypeIndex++; |
| } else { |
| document.getElementById('pointerTypeDescription').innerHTML = ""; |
| } |
| resetTestState(); |
| } |
| |
| function setup_pointerevent_test(testName, supportedPointerTypes) { |
| return globalPointerEventTest = new MultiPointerTypeTest(testName, supportedPointerTypes); |
| } |
| |
| function checkPointerEventType(event) { |
| assert_equals(event.pointerType, expectedPointerType, "pointerType should be the same as the requested device."); |
| } |
| |
| function touchScrollInTarget(target, direction) { |
| var x_delta = 0; |
| var y_delta = 0; |
| if (direction == "down") { |
| x_delta = 0; |
| y_delta = -10; |
| } else if (direction == "up") { |
| x_delta = 0; |
| y_delta = 10; |
| } else if (direction == "right") { |
| x_delta = -10; |
| y_delta = 0; |
| } else if (direction == "left") { |
| x_delta = 10; |
| y_delta = 0; |
| } else { |
| throw("scroll direction '" + direction + "' is not expected, direction should be 'down', 'up', 'left' or 'right'"); |
| } |
| return new test_driver.Actions() |
| .addPointer("pointer1", "touch") |
| .pointerMove(0, 0, {origin: target}) |
| .pointerDown() |
| .pointerMove(x_delta, y_delta, {origin: target}) |
| .pointerMove(2 * x_delta, 2 * y_delta, {origin: target}) |
| .pointerMove(3 * x_delta, 3 * y_delta, {origin: target}) |
| .pointerMove(4 * x_delta, 4 * y_delta, {origin: target}) |
| .pointerMove(5 * x_delta, 5 * y_delta, {origin: target}) |
| .pointerMove(6 * x_delta, 6 * y_delta, {origin: target}) |
| .pause(100) |
| .pointerUp() |
| .send(); |
| } |