<!DOCTYPE html>
<html>
<head>
<title>Shadow DOM: Link elements should load stylesheets inside shadow trees</title>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="Link elements should load inside shadow trees">
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
</head>
<body>
<script>

function wait_for_onload(element, callback = null) {
    return new Promise(function (resolve, reject) {
        element.onload = resolve;
        element.onerror = reject;
        setTimeout(() => reject('timeout'), 100);
        if (callback)
            return callback();
    });
}

let test_iframe;
function create_iframe() {
    if (test_iframe)
        test_iframe.remove();

    test_iframe = document.createElement('iframe');
    return wait_for_onload().then(() => test_iframe.contentWindow, () => {
        document.body.appendChild(test_iframe);
    }).then(function () {
        const doc = test_iframe.contentWindow.document;
        doc.open();
        doc.write('<!DOCTYPE html><html><head><body>');
        doc.close();
        return test_iframe.contentWindow;
    });
}

add_result_callback(() => {
    if (test_iframe)
        test_iframe.remove();
});

function test_stylesheet_load_in_connected_shadow_tree(mode) {
    promise_test(() => {
        return create_iframe().then(contentWindow => {
            const doc = contentWindow.document;
            const host = doc.createElement('div');
            const link = doc.createElement('link');
            return wait_for_onload(link, () => {
                link.rel = 'stylesheet';
                link.href = 'resources/green-host.css';
                host.attachShadow({mode: mode}).appendChild(link);
                contentWindow.document.body.appendChild(host);
            });
        });
    }, `Link elements should load stylesheets inside a connected shadow tree with ${mode} mode`);
}

test_stylesheet_load_in_connected_shadow_tree('closed');
test_stylesheet_load_in_connected_shadow_tree('open');

function test_stylesheet_do_not_load_in_disconnected_shadow_tree(mode) {
    promise_test(() => {
        return create_iframe().then((contentWindow) => {
            const doc = contentWindow.document;
            const host = doc.createElement('div');
            const link = doc.createElement('link');
            return wait_for_onload(link, () => {
                link.rel = 'stylesheet';
                link.href = 'resources/green-host.css';
                host.attachShadow({mode: mode}).appendChild(link);
            });
        }).then(() => {
            assert_true(false, 'stylesheet must not load inside a disconnected shadow tree');
        }, (error) => {
            assert_equals(error, 'timeout');
        });
    }, `Link elements must not load stylesheets inside a disconnceted shadow tree with ${mode} mode`);
}

test_stylesheet_do_not_load_in_disconnected_shadow_tree('closed');
test_stylesheet_do_not_load_in_disconnected_shadow_tree('open');

function test_loaded_stylesheet_rule_in_shadow_tree_applies_to_div(mode) {
    promise_test(() => {
        let div;
        return create_iframe().then(function (contentWindow) {
            const doc = contentWindow.document;
            const host = doc.createElement('div');
            const shadowRoot = host.attachShadow({mode: mode});
            shadowRoot.innerHTML = '<link rel="stylesheet" href="resources/green-host.css"><div>';
            div = shadowRoot.querySelector('div');
            return wait_for_onload(shadowRoot.querySelector('link'), () => { doc.body.appendChild(host) });
        }).then(() => {
            assert_equals(getComputedStyle(div).color, 'rgb(0, 128, 0)');
        });
    }, `Style rules loaded inside a shadow tree with ${mode} mode must apply to a div in the shadow tree`);
}

test_loaded_stylesheet_rule_in_shadow_tree_applies_to_div('closed');
test_loaded_stylesheet_rule_in_shadow_tree_applies_to_div('open');

function test_loaded_stylesheet_rule_in_shadow_tree_applies_to_host(mode) {
    promise_test(() => {
        let host;
        return create_iframe().then(function (contentWindow) {
            const doc = contentWindow.document;
            host = doc.createElement('div');
            const shadowRoot = host.attachShadow({mode: mode});
            shadowRoot.innerHTML = '<link rel="stylesheet" href="resources/green-host.css"><div>';
            return wait_for_onload(shadowRoot.querySelector('link'), () => { doc.body.appendChild(host) });
        }).then(() => {
            assert_equals(getComputedStyle(host).color, 'rgb(0, 128, 0)');
        });
    }, `:host style rules loaded inside a shadow tree with ${mode} mode must apply to the host element`);
}

test_loaded_stylesheet_rule_in_shadow_tree_applies_to_host('closed');
test_loaded_stylesheet_rule_in_shadow_tree_applies_to_host('open');
</script>
</html>
</body>
