<!doctype html>
<title>&lt;link disabled&gt;, HTMLLinkElement.disabled and CSSStyleSheet.disabled interactions</title>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<link rel="help" href="https://html.spec.whatwg.org/#attr-link-disabled">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link title="alt" rel="stylesheet" disabled href="data:text/css,html { background: green }">
<script>
function assert_applies(applies) {
  (applies ? assert_equals : assert_not_equals)(getComputedStyle(document.documentElement).backgroundColor, "rgb(0, 128, 0)");
}

const link = document.querySelector("link[disabled]");

test(function() {
  assert_equals(document.styleSheets.length, 0);
  assert_applies(false);
}, "<link disabled> prevents the stylesheet from being in document.styleSheets (from parser)");

async_test(function(t) {
  assert_true(link.disabled);

  link.onload = t.step_func_done(function() {
    assert_equals(document.styleSheets.length, 1);
    let sheet = document.styleSheets[0];
    assert_equals(sheet.ownerNode, link);
    assert_applies(true);

    link.disabled = true;
    assert_equals(sheet.ownerNode, null);
    assert_false(sheet.disabled);
    assert_applies(false);
    assert_true(link.hasAttribute("disabled"));

    assert_equals(document.styleSheets.length, 0);
    assert_applies(false);
  });

  link.disabled = false;
  assert_true(!link.hasAttribute("disabled"));
  assert_false(link.disabled);
}, "HTMLLinkElement.disabled reflects the <link disabled> attribute, and behaves consistently");
</script>
