<!DOCTYPE html>

<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<style>
#test1 {
    color: text;
}
</style>

<div id="test1"></div>

<script>
function test_prop(element, prop, expected) {
    assert_equals(window.getComputedStyle(element).getPropertyValue(prop), expected);
}

function test_color_is_white(id) {
    test_prop(document.getElementById("test1"), "color", "rgb(255, 255, 255)");
}

function test_color_is_black(id) {
    test_prop(document.getElementById("test1"), "color", "rgb(0, 0, 0)");
}

test(function() {
    // The semantic text color should be black.
    test_color_is_black("test1");
}, "Element colors are correct in light color scheme with only light supported color scheme");

test(function() {
    if (window.internals)
        internals.settings.setUseDarkAppearance(true);
}, "Dark color scheme enabled");

test(function() {
    // The semantic text color should be black, and not change.
    test_color_is_black("test1");
}, "Element colors are correct in dark color scheme with only light supported color scheme");

test(function() {
    if (window.internals)
        internals.settings.setUseDarkAppearance(false);
}, "Light color scheme enabled");

test(function() {
    document.body.style.setProperty("color-scheme", "light dark");
    test_prop(document.body, "color-scheme", "light dark");
}, "Color schemes changed to light and dark");

test(function() {
    // The semantic text color should be black.
    test_color_is_black("test1");
}, "Element colors are correct in light color scheme with light and dark supported color scheme");

test(function() {
    if (window.internals)
        internals.settings.setUseDarkAppearance(true);
}, "Dark color scheme enabled");

test(function() {
    // The semantic text color should be white.
    test_color_is_white("test1");
}, "Element colors are correct in dark color scheme with light and dark supported color scheme");

test(function() {
    if (window.internals)
        internals.settings.setUseDarkAppearance(false);
}, "Light color scheme enabled");

test(function() {
    document.body.style.setProperty("color-scheme", "dark");
    test_prop(document.body, "color-scheme", "dark");
}, "Color schemes changed to dark");

test(function() {
    // The semantic text color should be white.
    test_color_is_white("test1");
}, "Element colors are correct in light color scheme with only dark supported color scheme");

test(function() {
    if (window.internals)
        internals.settings.setUseDarkAppearance(true);
}, "Dark color scheme enabled");

test(function() {
    // The semantic text color should be white still.
    test_color_is_white("test1");
}, "Element colors are correct in dark color scheme with only dark supported color scheme");

test(function() {
    document.body.style.setProperty("color-scheme", "light foo");
    test_prop(document.body, "color-scheme", "light");
}, "Color schemes changed to light and a bogus value");

test(function() {
    // The semantic text color should be black again.
    test_color_is_black("test1");
}, "Element colors are correct in dark color scheme with only light supported color scheme");

test(function() {
    document.body.style.setProperty("color-scheme", "auto");
    test_prop(document.body, "color-scheme", "auto");
}, "Color schemes changed to auto value");

test(function() {
    // The semantic text color should be black still.
    test_color_is_black("test1");
}, "Element colors are correct in dark color scheme with implicit light supported color scheme");

test(function() {
    let meta = document.createElement("meta");
    meta.id = "test-meta";
    meta.name = "color-scheme";
    meta.content = "light dark";
    document.head.appendChild(meta);
}, "Color schemes changed to light and dark via <meta> element");

test(function() {
    // The semantic text color should be white now.
    test_color_is_white("test1");
}, "Element colors are correct in dark color scheme with light and dark supported color scheme via <meta> element");

test(function() {
    document.body.style.setProperty("color-scheme", "light");
    test_prop(document.body, "color-scheme", "light");
}, "Color schemes changed to light value");

test(function() {
    // The semantic text color should be black again.
    test_color_is_black("test1");
}, "Element colors are correct in dark color scheme with explicit light, overriding <meta> element");

test(function() {
    document.getElementById("test-meta").remove();
}, "Remove test meta element");

test(function() {
    document.body.style.setProperty("color-scheme", "light dark");
    test_prop(document.body, "color-scheme", "light dark");
}, "Color schemes changed to light and dark");

test(function() {
    // The semantic text color should be white now.
    test_color_is_white("test1");
}, "Element colors are correct in dark color scheme with light and dark supported color scheme");

test(function() {
    document.body.style.setProperty("color-scheme", "foo dark");
    test_prop(document.body, "color-scheme", "dark");
}, "Color schemes changed to a bogus value and dark");

test(function() {
    // The semantic text color should be white still.
    test_color_is_white("test1");
}, "Element colors are correct in dark color scheme with dark supported color scheme");
</script>
