Bug 1707116 - Make sure to consume the flusher when we hit the cascade data cache. r=boris

So that sheets are properly marked as committed. The issue is that we
have this "committed" optimization, to avoid doing work if somebody adds
and removes an stylesheet without us flushing in the meantime:

  https://searchfox.org/mozilla-central/rev/f018480dfed4fc583703a5770a6db9ab9dc0fb99/servo/components/style/stylesheet_set.rs#308-319

The "committed" bit is set when we consume the flusher (in each(..)).

However when we hit the cache, before this patch, we wouldn't consume
it, which means that we may fail to do some full rebuilds even though we
need them.

Fix it by making sure we call each() in that case.

We add a test (the test would show a red square before this patch, and a
lime square with the fix).

Differential Revision: https://phabricator.services.mozilla.com/D113206
This commit is contained in:
Emilio Cobos Álvarez 2021-04-28 00:40:18 +00:00
Родитель a344c0fa4c
Коммит b410f349c5
2 изменённых файлов: 30 добавлений и 0 удалений

Просмотреть файл

@ -139,6 +139,9 @@ where
debug!(" > {:?}", sheet);
}
}
// The line below ensures the "committed" bit is updated properly
// below.
collection.each(|_, _| true);
return Ok(Some(entry.clone()));
}

Просмотреть файл

@ -0,0 +1,27 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Shared style invalidation with removals</title>
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1707116">
<link rel="help" href="https://drafts.csswg.org/css-scoping/">
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<link rel="author" href="https://mozilla.org" title="Mozilla">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="host-1"></div>
<div id="host-2"></div>
<script>
const INITIALLY_COMMON_STYLE = `<style>:host { background-color: red !important }</style>`;
let helper = document.querySelector("#host-1");
let host = document.querySelector("#host-2");
test(function() {
helper.attachShadow({ mode: "open" }).innerHTML = INITIALLY_COMMON_STYLE;
assert_equals(getComputedStyle(helper).backgroundColor, "rgb(255, 0, 0)", "Common style should apply to helper");
host.attachShadow({ mode: "open" }).innerHTML = INITIALLY_COMMON_STYLE;
assert_equals(getComputedStyle(host).backgroundColor, "rgb(255, 0, 0)", "Common style should apply to host");
host.shadowRoot.innerHTML = `<style>:host { background-color: lime; width: 100px; height: 100px; }</style>`;
assert_equals(getComputedStyle(host).backgroundColor, "rgb(0, 255, 0)", "Common style should no longer apply to host");
});
</script>