<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Mouse Button Back/Forward</title>
        <link rel="author" title="Google" href="http://www.google.com/" />
        <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>
            var testMouseUp = async_test('Tests that when pointer is locked, the mouseup is preventable.');
            var received_back = false;
            var received_forward = false;
            const left_button = 0;
            const back_button = 3;
            const forward_button = 4;
            window.addEventListener('mouseup', function(e) {
              if (e.button == left_button) {
                document.body.requestPointerLock();
              } else if (e.button == back_button) {
                received_back = true;
                e.preventDefault();
              } else if (e.button == forward_button) {
                received_forward = true;
                e.preventDefault();
              }
              if (document.pointerLockElement && received_back && received_forward) {
                testMouseUp.done();
                document.exitPointerLock();
              }
            });

            // Inject mouse input
            var actions = new test_driver.Actions();
            actions.pointerMove(1, 1)
              .pointerDown({button: actions.ButtonType.LEFT})
              .pointerUp({button: actions.ButtonType.LEFT})
              .pointerDown({button: actions.ButtonType.BACK})
              .pointerUp({button: actions.ButtonType.BACK})
              .pointerDown({button: actions.ButtonType.FORWARD})
              .pointerUp({button: actions.ButtonType.FORWARD})
              .send();
        </script>

    </head>
    <body id="target">
        <h4>Test Description: Tests that the mouseup event is prevented.
            <ol>
                <li>Click the left mouse button to lock pointer</li>
                <li>Click the back mouse button</li>
                <li>Click the forward mouse button</li>
            </ol>
        </h4>
    </body>
</html>
