Commit 15a8dbe6 authored by Fredrik Söderqvist's avatar Fredrik Söderqvist Committed by Chromium LUCI CQ

Fix SVG filter data invalidation for empty containers

Empty containers will fail to create FilterData because they have an
empty bounding box. When children were added to the container, making
the bounding box non-empty we would fail to mark the paint properties as
needing update because of the check for existing FilterData in
SVGElementResourceClient::InvalidateFilterData().

Instead always dispose of the filter data and mark paint properties for
update, and use the |filter_data_dirty_| flag as an early-out check.

Since we can now call InvalidateFilterData() directly in
SVGElementResourceClient::ResourceElementChanged(), fold
ClearFilterData() into InvalidateFilterData().

Bug: 1154050
Change-Id: I01c8ebac4f62532e2c17aabc3d998d7601dbb71b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2566992Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#832391}
parent 1d88beef
......@@ -698,16 +698,14 @@ void SVGElementResourceClient::ResourceElementChanged() {
LayoutObject* layout_object = element_->GetLayoutObject();
if (!layout_object)
return;
ClearFilterData();
// TODO(fs): If the resource element (for a filter) doesn't actually change
// we don't need to perform the associated invalidations.
InvalidateFilterData();
if (layout_object->Parent()) {
SVGResourcesCache::UpdateResources(*layout_object);
LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation(
*layout_object, true);
}
// TODO(fs): If the resource element (for a filter) doesn't actually change
// we don't need to perform the associated invalidations.
layout_object->SetNeedsPaintPropertyUpdate();
MarkFilterDataDirty();
}
void SVGElementResourceClient::ResourceDestroyed(
......@@ -773,20 +771,17 @@ void SVGElementResourceClient::UpdateFilterData(
}
void SVGElementResourceClient::InvalidateFilterData() {
if (!ClearFilterData())
// If we performed an "optimized" invalidation via FilterPrimitiveChanged(),
// we could have set |filter_data_dirty_| but not cleared |filter_data_|.
if (filter_data_dirty_ && !filter_data_)
return;
if (FilterData* filter_data = filter_data_.Release())
filter_data->Dispose();
LayoutObject* layout_object = element_->GetLayoutObject();
layout_object->SetNeedsPaintPropertyUpdate();
MarkFilterDataDirty();
}
bool SVGElementResourceClient::ClearFilterData() {
FilterData* filter_data = filter_data_.Release();
if (filter_data)
filter_data->Dispose();
return !!filter_data;
}
void SVGElementResourceClient::MarkFilterDataDirty() {
DCHECK(element_->GetLayoutObject());
DCHECK(element_->GetLayoutObject()->NeedsPaintPropertyUpdate());
......
......@@ -225,7 +225,6 @@ class SVGElementResourceClient final
void UpdateFilterData(CompositorFilterOperations&);
void InvalidateFilterData();
bool ClearFilterData();
void MarkFilterDataDirty();
void Trace(Visitor*) const override;
......
<!doctype html>
<html class="reftest-wait">
<title>Adding content to a previously empty filtered container</title>
<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty">
<link rel="match" href="reference/green-100x100.html">
<link rel="bookmark" href="https://crbug.com/1154050">
<script src="/common/rendering-utils.js"></script>
<script src="/common/reftest-wait.js"></script>
<svg>
<filter id="f" color-interpolation-filters="sRGB">
<feComponentTransfer><feFuncA/></feComponentTransfer>
</filter>
<rect width="100" height="100" fill="red"/>
<g id="target" filter="url(#f)"/>
</svg>
<script>
waitForAtLeastOneFrame().then(() => {
const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
rect.setAttribute('fill', 'green');
rect.setAttribute('width', '100');
rect.setAttribute('height', '100');
document.getElementById('target').appendChild(rect);
takeScreenshot();
});
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment