chromium/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_fractional_coordinates.html

<!doctype html>
<html>
    <head>
        <title>Pointer Events coordinates with fractional values</title>
        <meta name="viewport" content="width=device-width">
        <meta name="variant" content="?mouse">
        <meta name="variant" content="?touch">
        <meta name="variant" content="?pen">
        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <script type="text/javascript" src="pointerevent_support.js"></script>
        <style>
            #innerFrame {
                transform: scale(5);
                width: 60px;
                height: 60px;
                margin-left: 120px;
                margin-top: 120px;
                border: 0.01px solid black;
            }
        </style>
        <script>
            "use strict";
            const input = location.search.substring(1);
            const eventList = [
                "pointerdown",
                "pointerup",
                "pointermove",
                "pointerover",
                "pointerout",
                "pointerenter",
                "pointerleave",
                "click"
            ];
            let eventsWithFractions = {};
            let clickedTargetList = [];

            function resetTestState() {
                eventsWithFractions = {};
                clickedTargetList = [];
            }

            function checkPointerEventCoordinates(event) {
              if (event.clientX != Math.floor(event.clientX) ||
                    event.clientY != Math.floor(event.clientY))
                eventsWithFractions[event.type] = true;
            }

            function testInputType(inputSource) {
              const scale = 5;
              const width = 3;
              const height = 3;
              const targetFrame = document.querySelector('#innerFrame');
              const frameRect = targetFrame.getBoundingClientRect();
              const frameLeft = frameRect.left;
              const frameTop = frameRect.top;

              const targets = [{x: 10, y: 10}, {x: 30, y: 50}, {x: 50, y: 30}]
              const xPositions = []
              const yPositions = []
              for (let i = 0; i < targets.length; i++) {
                xPositions.push((targets[i].x + width / 2.0) * scale + frameLeft);
                yPositions.push((targets[i].y + height / 2.0) * scale + frameTop);
              }
              return sendInputAt(inputSource, xPositions[0], yPositions[0]).then(function() {
                return sendInputAt(inputSource, xPositions[1], yPositions[1]);
              }).then(function() {
                return sendInputAt(inputSource, xPositions[2], yPositions[2]);
              });
            }

            function sendInputAt(inputSource, xPosition, yPosition) {
              if (inputSource == "touch") {
                return new test_driver.Actions()
                  .addPointer("touchPointer1", "touch")
                  .pointerMove(Math.ceil(xPosition), Math.ceil(yPosition))
                  .pointerDown()
                  .pointerMove(Math.ceil(xPosition + 1), Math.ceil(yPosition + 1))
                  .pointerUp()
                  .send();
              } else {
                return new test_driver.Actions()
                  .pointerMove(Math.ceil(xPosition), Math.ceil(yPosition))
                  .pointerDown()
                  .pointerUp()
                  .send();
              }
            }

            function run() {
                const test_pointerEvent = setup_pointerevent_test("pointerevent events in capturing", [input]);
                const innerFrame = document.getElementById('innerFrame');
                const innerDocument = innerFrame.contentDocument;
                ['s1', 's2', 's3'].forEach(function(id){
                    const target = innerDocument.getElementById(id);
                    eventList.forEach(function(eventName) {
                        on_event(target, eventName, checkPointerEventCoordinates);
                    });

                    on_event(target, "click", function (event) {
                      if (!(event.target.id in clickedTargetList)) {
                          clickedTargetList.push(event.target.id);
                      }
                      if (clickedTargetList.length == 3) {
                          test(function () {
                            eventList.forEach(function(eventName){
                                if (eventName == "click") {
                                    assert_false(eventName in eventsWithFractions,
                                        eventName + " should not have fractional coordinates");
                                } else {
                                    assert_true(eventName in eventsWithFractions,
                                        eventName + " should have fractional coordinates");
                                }
                            });
                            // At this point, we know that `eventsWithFractions` contains all
                            // of `eventList` except "click".  The assert below rules out any
                            // extra entry in `eventsWithFractions`.
                            assert_equals(Object.keys(eventsWithFractions).length,
                                  eventList.length - 1,
                                  "eventsWithFractions list does not have any redundant entry");
                          }, expectedPointerType);
                          test_pointerEvent.done();
                      }
                    });
                });

                testInputType(input);
            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Events coordinates support fractional value</h1>
        <h2 id="pointerTypeDescription"></h2>
        <h4>
            Test Description: This test checks pointer events has fractional client coordinates
            <ol>
                 <li>Move your pointer over one black square</li>
                 <li>Press down the pointer (i.e. press left button with mouse or touch the screen with finger or pen).</li>
                 <li>Release the pointer.</li>
                 <li>Move to next black square and repreat 2 and 3</li>
            </ol>

            Test passes if pointer events has fractional coordinates.
        </h4>
        <iframe id=innerFrame src="resources/pointerevent_fractional_coordinates-iframe.html"></iframe>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
            <p>Refresh the page to run the tests again with a different pointer type.</p>
        </div>
        <div id="log"></div>
    </body>
</html>