зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1758029: Gracefully bail out of canvas SVG-filter invalidation codepath, if the canvas has been unlinked due to cycle collection. r=jwatt
Differential Revision: https://phabricator.services.mozilla.com/D140419
This commit is contained in:
Родитель
bfa9c70d05
Коммит
9f74bc949f
|
@ -864,7 +864,10 @@ class SVGFilterObserverListForCanvasContext final
|
||||||
|
|
||||||
void SVGFilterObserverListForCanvasContext::OnRenderingChange() {
|
void SVGFilterObserverListForCanvasContext::OnRenderingChange() {
|
||||||
if (!mContext) {
|
if (!mContext) {
|
||||||
MOZ_CRASH("GFX: This should never be called without a context");
|
NS_WARNING(
|
||||||
|
"GFX: This should never be called without a context, except during "
|
||||||
|
"cycle collection (when DetachFromContext has been called)");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// Refresh the cached FilterDescription in mContext->CurrentState().filter.
|
// Refresh the cached FilterDescription in mContext->CurrentState().filter.
|
||||||
// If this filter is not at the top of the state stack, we'll refresh the
|
// If this filter is not at the top of the state stack, we'll refresh the
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="reftest-wait">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<style>
|
||||||
|
body { background: gray; }
|
||||||
|
canvas { border: 2px solid black;}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<img id="img"
|
||||||
|
onload="go()"
|
||||||
|
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
<script>
|
||||||
|
const ctx = canvas.getContext("2d", { desynchronized: true });
|
||||||
|
const SVG_FILTER = `
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<filter id="posterize">
|
||||||
|
<feComponentTransfer>
|
||||||
|
<feFuncR type="discrete" tableValues="0,1" />
|
||||||
|
<feFuncG type="discrete" tableValues="0,1" />
|
||||||
|
<feFuncB type="discrete" tableValues="0,1" />
|
||||||
|
<feFuncA type="discrete" tableValues="0,1" />
|
||||||
|
</feComponentTransfer>
|
||||||
|
</filter>
|
||||||
|
</svg>`;
|
||||||
|
|
||||||
|
const FILTER1 = `url('data:image/svg+xml;utf8,${SVG_FILTER.replace(/\n/g, "")
|
||||||
|
.replace(/\s+/g, " ")
|
||||||
|
.trim()}#posterize') grayscale(50%) brightness(50%)`;
|
||||||
|
function go() {
|
||||||
|
canvas.width = img.naturalWidth;
|
||||||
|
canvas.height = img.naturalHeight;
|
||||||
|
|
||||||
|
ctx.imageSmoothingEnabled = true;
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
ctx.filter = FILTER1;
|
||||||
|
ctx.drawImage(img, 0, 0);
|
||||||
|
setTimeout(() => { document.documentElement.removeAttribute("class")}, 0);
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -238,3 +238,4 @@ load 1609663.html
|
||||||
skip-if(Android) load 1671950.html # No print-preview support on android
|
skip-if(Android) load 1671950.html # No print-preview support on android
|
||||||
load 1678947.html
|
load 1678947.html
|
||||||
load 1693032.html
|
load 1693032.html
|
||||||
|
load 1758029-1.html
|
||||||
|
|
Загрузка…
Ссылка в новой задаче