Bug 1692721 - nsNativeBasicTheme should handle outline-offset like non-auto outline does. r=mstange

I thought we didn't support outline-offset on auto-style outline.

The rect we get is already inflated, so we just got to compute the
radius using that.

Differential Revision: https://phabricator.services.mozilla.com/D105125
This commit is contained in:
Emilio Cobos Álvarez 2021-02-16 10:25:32 +00:00
parent d9fd906046
commit ca89009775
5 changed files with 29 additions and 4 deletions

View File

@ -0,0 +1,14 @@
<!doctype html>
<style>
body { margin: 0 }
div {
width: 92px;
height: 92px;
border: 1px transparent;
border-radius: 1px;
outline: 1px auto;
outline-offset: 4px;
margin: 14px;
}
</style>
<div></div>

View File

@ -1,10 +1,12 @@
<!doctype html>
<style>
body { margin: 0 }
div {
width: 100px;
height: 100px;
border: 1px transparent;
outline: 1px auto;
margin: 10px;
}
</style>
<div></div>

View File

@ -1,11 +1,13 @@
<!doctype html>
<style>
body { margin: 0 }
div {
width: 100px;
height: 100px;
border: 1px transparent;
border-radius: 5px;
outline: 1px auto;
margin: 10px;
}
</style>
<div></div>

View File

@ -11,6 +11,7 @@ fuzzy-if(gtkWidget,0-136,0-120) fuzzy-if(Android,0-255,0-356) fuzzy-if(d2d,0-16,
pref(layout.css.outline-style-auto.enabled,true) skip-if(!gtkWidget&&!winWidget&&!cocoaWidget) == outline-auto-001.html outline-auto-001-ref.html # only works on platforms that supports StyleAppearance::FocusOutline
pref(layout.css.outline-style-auto.enabled,false) == outline-auto-001.html outline-auto-001-solid-ref.html
skip-if(nativeThemePref) != outline-auto-follows-border-radius-non-native.html outline-auto-follows-border-radius-non-native-notref.html
skip-if(nativeThemePref) == outline-auto-follows-border-radius-non-native-02.html outline-auto-follows-border-radius-non-native.html
== outline-initial-1a.html outline-initial-1-ref.html
== outline-initial-1b.html outline-initial-1-ref.html
== outline-on-table.html outline-on-table-ref.html

View File

@ -1395,13 +1395,19 @@ void nsNativeBasicTheme::PaintAutoStyleOutline(nsIFrame* aFrame,
StrokeOptions(width));
}
nsPresContext* pc = aFrame->PresContext();
const nscoord offset = aFrame->StyleOutline()->mOutlineOffset.ToAppUnits();
const Float devPixelOffset = pc->AppUnitsToFloatDevPixels(offset);
RectCornerRadii innerRadii;
nsCSSRendering::ComputePixelRadii(
cssRadii, aFrame->PresContext()->AppUnitsPerDevPixel(), &innerRadii);
nsCSSRendering::ComputePixelRadii(cssRadii, pc->AppUnitsPerDevPixel(),
&innerRadii);
RectCornerRadii outerRadii;
Float borderSizes[4] = {halfWidth, halfWidth, halfWidth, halfWidth};
nsCSSBorderRenderer::ComputeOuterRadii(innerRadii, borderSizes, &outerRadii);
const Float widths[4] = {
halfWidth + devPixelOffset, halfWidth + devPixelOffset,
halfWidth + devPixelOffset, halfWidth + devPixelOffset};
nsCSSBorderRenderer::ComputeOuterRadii(innerRadii, widths, &outerRadii);
RefPtr<Path> path =
MakePathForRoundedRect(*aDt, rect.ToUnknownRect(), outerRadii);
aDt->Stroke(path, ColorPattern(ToDeviceColor(innerColor)),