Revision 2d080f1a7dd986dcd3f33a7676d30f367217d988 authored by Eric Willigers on 03 October 2017, 02:21:05 UTC, committed by Chromium WPT Sync on 03 October 2017, 02:21:05 UTC
When offset-position is not 'auto', the path begins at offset-position.

When offset-position is not 'auto', but offset-path is 'none', we have a
simple translation to offset-position. In this case, offset-anchor uses
the same value as offset-position, but with percentages referring to
the element's width/height and not the containing block's width/height.

Spec:
https://drafts.fxtf.org/motion-1/#offset-position-property
https://drafts.fxtf.org/motion-1/#offset-anchor-property

Work remaining:
For this initial implementation, we use the parent layout object
instead of the true containing block.

(When an element is absolutely positioned and the parent element is the
containing block, these are the same.)

BUG=638055

Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: I53e5b576adebf65ede8ebd1dabe084713ebdf875
1 parent 85a1716
Raw File
getSelection.html
<!doctype html>
<title>getSelection() tests</title>
<div id=log></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
"use strict";

// TODO: Figure out more places where defaultView is or is not guaranteed to be
// null, and test whether getSelection() is null.
//
// TODO: Figure out a good way to test display: none iframes.

test(function() {
    // Sanity checks like this are to flag known browser bugs with clearer
    // error messages, instead of throwing inscrutable exceptions.
    assert_true("Selection" in window,
        "Sanity check: window must have Selection property");

    assert_true(window.getSelection() instanceof Selection);
}, "window.getSelection() instanceof Selection");

test(function() {
    assert_equals(window.getSelection(), window.getSelection());
}, "window.getSelection() === window.getSelection()");

test(function() {
    assert_true("Selection" in window,
        "Sanity check: window must have Selection property");
    // This sanity check (which occurs a number of times below, too) is because
    // document.getSelection() is supposed to return null if defaultView is
    // null, so we need to figure out whether defaultView is null or not before
    // we can make correct assertions about getSelection().
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");

    assert_equals(typeof document.getSelection(), "object",
        "document.getSelection() must be an object");
    assert_true(document.getSelection() instanceof Selection);
}, "document.getSelection() instanceof Selection");

test(function() {
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(document.getSelection(), document.getSelection());
}, "document.getSelection() === document.getSelection()");

test(function() {
    assert_not_equals(document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(window.getSelection(), document.getSelection());
}, "window.getSelection() === document.getSelection()");

// "Each selection is associated with a single range, which may be null and is
// initially null."
//
// "The rangeCount attribute must return 0 if the context object's range is
// null, otherwise 1."
test(function() {
    assert_equals(window.getSelection().rangeCount, 0,
        "window.getSelection().rangeCount must initially be 0");
    assert_equals(typeof document.getSelection(), "object",
        "Sanity check: document.getSelection() must be an object");
    assert_equals(document.getSelection().rangeCount, 0,
        "document.getSelection().rangeCount must initially be 0");
}, "Selection's range must initially be null");

test(function() {
    var doc = document.implementation.createHTMLDocument("");
    assert_equals(doc.defaultView, null,
        "Sanity check: defaultView of created HTML document must be null");
    assert_equals(doc.getSelection(), null);
}, "getSelection() on HTML document with null defaultView must be null");

test(function() {
    var xmlDoc = document.implementation.createDocument(null, "", null);

    assert_true("getSelection" in xmlDoc, "XML document must have getSelection()");

    assert_equals(xmlDoc.defaultView, null,
        "Sanity check: defaultView of created XML document must be null");
    assert_equals(xmlDoc.getSelection(), null);
}, "getSelection() on XML document with null defaultView must be null");


// Run a bunch of iframe tests, once immediately after the iframe is appended
// to the document and once onload.  This makes a difference, because browsers
// differ (at the time of this writing) in whether they load about:blank in
// iframes synchronously or not.  Per the HTML spec, there must be a browsing
// context associated with the iframe as soon as it's appended to the document,
// so there should be a selection too.
var iframe = document.createElement("iframe");
add_completion_callback(function() {
    document.body.removeChild(iframe);
});

var testDescs = [];
var testFuncs = [];
testDescs.push("window.getSelection() instanceof Selection in an iframe");
testFuncs.push(function() {
    assert_true("Selection" in iframe.contentWindow,
        "Sanity check: window must have Selection property");
    assert_not_equals(iframe.contentWindow.document.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_not_equals(iframe.contentWindow.getSelection(), null,
        "window.getSelection() must not be null");
    assert_true(iframe.contentWindow.getSelection() instanceof iframe.contentWindow.Selection);
});

testDescs.push("document.getSelection() instanceof Selection in an iframe");
testFuncs.push(function() {
    assert_true("Selection" in iframe.contentWindow,
        "Sanity check: window must have Selection property");
    assert_not_equals(iframe.contentDocument.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_not_equals(iframe.contentDocument.getSelection(), null,
        "document.getSelection() must not be null");
    assert_equals(typeof iframe.contentDocument.getSelection(), "object",
        "document.getSelection() must be an object");
    assert_true(iframe.contentDocument.getSelection() instanceof iframe.contentWindow.Selection);
});

testDescs.push("window.getSelection() === document.getSelection() in an iframe");
testFuncs.push(function() {
    assert_not_equals(iframe.contentDocument.defaultView, null,
        "Sanity check: document.defaultView must not be null");
    assert_equals(iframe.contentWindow.getSelection(), iframe.contentDocument.getSelection());
});

testDescs.push("getSelection() inside and outside iframe must return different objects");
testFuncs.push(function() {
    assert_not_equals(iframe.contentWindow.getSelection(), getSelection());
});

testDescs.push("getSelection() on HTML document with null defaultView must be null inside an iframe");
testFuncs.push(function() {
    var doc = iframe.contentDocument.implementation.createHTMLDocument("");
    assert_equals(doc.defaultView, null,
        "Sanity check: defaultView of created HTML document must be null");
    assert_equals(doc.getSelection(), null);
});

var asyncTests = [];
testDescs.forEach(function(desc) {
    asyncTests.push(async_test(desc + " onload"));
});

iframe.onload = function() {
    asyncTests.forEach(function(t, i) {
        t.step(testFuncs[i]);
        t.done();
    });
};

document.body.appendChild(iframe);

testDescs.forEach(function(desc, i) {
    test(testFuncs[i], desc + " immediately after appendChild");
});
</script>
back to top