chromium/third_party/blink/web_tests/editing/selection/extend-after-mouse-selection.html

<!doctype html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../assert_selection.js"></script>
<script>
function doubleClick(selection) {
    const start = selection.document.querySelector('s');
    const end = selection.document.querySelector('e');

    eventSender.mouseMoveTo(
        selection.computeLeft(start),
        selection.computeTop(start) + 3);
    // Double-click to select at word-granularity to workaround eventSender
    // bug with selecting text at character granularity (i.e. that it just
    // doesn't work).
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseDown();
    eventSender.mouseMoveTo(
        selection.computeLeft(end),
        selection.computeTop(end) + 3);
    eventSender.mouseUp();
}

function extend(selection, direction, unit) {
    selection.modify('extend', direction, unit);
}

for (const behavior of ['android', 'mac', /*'unix', 'win'*/]) {
    const steps = [
        { input: 'a <s>bc</s><br>d <e>ef</e><br>ghi' },
        {
            // step 1
            action: selection => doubleClick(selection),
            mac: 'a <s>^bc</s><br>d <e>ef|</e><br>ghi',
            others: 'a <s>^bc</s><br>d <e>ef|</e><br>ghi',
        },
        {
            // step 2
            action: selection => extend(selection, 'backward', 'character'),
            mac: 'a| <s>bc</s><br>d <e>ef^</e><br>ghi',
            others: 'a <s>^bc</s><br>d <e>e|f</e><br>ghi',
        },
        {
            // step 3
            action: selection => extend(selection, 'forward', 'character'),
            mac: 'a <s>|bc</s><br>d <e>ef^</e><br>ghi',
            others: 'a <s>^bc</s><br>d <e>ef|</e><br>ghi',
        },
        {
            // step 4
            action: selection => extend(selection, 'forward', 'line'),
            mac: 'a <s>bc</s><br>d <e>|ef^</e><br>ghi',
            others: 'a <s>^bc</s><br>d <e>ef</e><br>ghi|',
        },
        {
            // step 5
            action: selection => extend(selection, 'backward', 'line'),
            mac: 'a <s>|bc</s><br>d <e>ef^</e><br>ghi',
            others: 'a <s>^bc</s><br>d <e>ef|</e><br>ghi',
        },
    ];
    for (let step = 1; step < steps.length; ++step) {
        selection_test(
            `<div>${steps[0].input}</div>`,
            selection => {
                if (!window.eventSender)
                    throw 'This test requires eventSender.';
                if (!window.internals)
                    throw 'This test requires internals.';
                internals.settings.setEditingBehavior(behavior);
                for (let i = 1; i <= step; ++i)
                    steps[i].action(selection);
            },
            behavior === 'mac'
                ? `<div>${steps[step].mac}</div>`
                : `<div>${steps[step].others}</div>`,
            `${behavior}: step ${step} ${steps[step].action}`);
    }
}
</script>