Merge remote-tracking branch 'origin/tracking' into custom

This commit is contained in:
roytam1 2024-10-24 07:39:14 +08:00
commit 7df6fa1c80
10 changed files with 65 additions and 44 deletions

View file

@ -663,8 +663,8 @@ nsContentSink::ProcessLinkHeader(const nsAString& aLinkData)
}
} else if (attr.LowerCaseEqualsLiteral("referrerpolicy")) {
// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#referrer-policy-attribute
// Specs says referrer policy attribute is an enumerated attribute,
// case insensitive and includes the empty string
// The spec says that the referrer policy attribute is an enumerated attribute,
// case insensitive and includes the empty string.
// We will parse the value with AttributeReferrerPolicyFromString
// later, which will handle parsing it as an enumerated attribute.
if (referrerPolicy.IsEmpty()) {

View file

@ -620,8 +620,8 @@ private:
/**
* Given a script element, get the referrer policy should be applied to load
* requests.
* Given a script element, get the referrer policy that should be applied to
* load requests.
*/
mozilla::net::ReferrerPolicy GetReferrerPolicy(nsIScriptElement* aElement);

View file

@ -1871,8 +1871,11 @@ class JSScript : public js::gc::TenuredCell
}
js::PropertyName* getName(jsbytecode* pc) const {
MOZ_ASSERT(containsPC(pc) && containsPC(pc + sizeof(uint32_t)));
return getAtom(GET_UINT32_INDEX(pc))->asPropertyName();
if (containsPC(pc) && containsPC(pc + sizeof(uint32_t))) {
return getAtom(GET_UINT32_INDEX(pc))->asPropertyName();
} else {
return nullptr;
}
}
JSObject* getObject(size_t index) {

View file

@ -1960,8 +1960,13 @@ CASE(JSOP_RETRVAL)
/* Resume execution in the calling frame. */
if (MOZ_LIKELY(interpReturnOK)) {
TypeScript::Monitor(cx, script, REGS.pc, REGS.sp[-1]);
if (JSOp(*REGS.pc) == JSOP_RESUME) {
ADVANCE_AND_DISPATCH(JSOP_RESUME_LENGTH);
}
TypeScript::Monitor(cx, script, REGS.pc, REGS.sp[-1]);
MOZ_ASSERT(CodeSpec[*REGS.pc].length == JSOP_CALL_LENGTH);
ADVANCE_AND_DISPATCH(JSOP_CALL_LENGTH);
}

View file

@ -2106,7 +2106,7 @@
* Operands: resume kind (GeneratorObject::ResumeKind)
* Stack: gen, val => rval
*/ \
macro(JSOP_RESUME, 205,"resume", NULL, 3, 2, 1, JOF_UINT8|JOF_INVOKE) \
macro(JSOP_RESUME, 205,"resume", NULL, 2, 2, 1, JOF_UINT16|JOF_INVOKE) \
/*
* Pops the top two values on the stack as 'obj' and 'v', pushes 'v' to
* 'obj'.

View file

@ -3335,9 +3335,7 @@ js::TypeMonitorResult(JSContext* cx, JSScript* script, jsbytecode* pc, TypeSet::
void
js::TypeMonitorResult(JSContext* cx, JSScript* script, jsbytecode* pc, const js::Value& rval)
{
/* Allow the non-TYPESET scenario to simplify stubs used in compound opcodes. */
if (!(CodeSpec[*pc].format & JOF_TYPESET))
return;
MOZ_ASSERT(CodeSpec[*pc].format & JOF_TYPESET);
if (!script->hasBaselineScript())
return;

View file

@ -855,8 +855,6 @@ nsCSSRendering::PaintOutline(nsPresContext* aPresContext,
const nsRect& aBorderArea,
nsStyleContext* aStyleContext)
{
nscoord twipsRadii[8];
// Get our style context's color struct.
const nsStyleOutline* ourOutline = aStyleContext->StyleOutline();
MOZ_ASSERT(ourOutline != NS_STYLE_BORDER_STYLE_NONE,
@ -898,24 +896,6 @@ nsCSSRendering::PaintOutline(nsPresContext* aPresContext,
if (innerRect.Contains(aDirtyRect))
return;
nsRect outerRect = innerRect;
outerRect.Inflate(width, width);
// get the radius for our outline
nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aBorderArea.Size(),
outerRect.Size(), Sides(), twipsRadii);
// Get our conversion values
nscoord twipsPerPixel = aPresContext->DevPixelsToAppUnits(1);
// get the outer rectangles
Rect oRect(NSRectToRect(outerRect, twipsPerPixel));
// convert the radii
nsMargin outlineMargin(width, width, width, width);
RectCornerRadii outlineRadii;
ComputePixelRadii(twipsRadii, twipsPerPixel, &outlineRadii);
if (outlineStyle == NS_STYLE_BORDER_STYLE_AUTO) {
if (nsLayoutUtils::IsOutlineStyleAutoEnabled()) {
nsITheme* theme = aPresContext->GetTheme();
@ -935,6 +915,36 @@ nsCSSRendering::PaintOutline(nsPresContext* aPresContext,
outlineStyle = NS_STYLE_BORDER_STYLE_SOLID;
}
RectCornerRadii outlineRadii;
nsRect outerRect = innerRect;
outerRect.Inflate(width, width);
const nscoord oneDevPixel = aPresContext->AppUnitsPerDevPixel();
Rect oRect(NSRectToRect(outerRect, oneDevPixel));
const Float outlineWidths[4] = {
Float(width) / oneDevPixel, Float(width) / oneDevPixel,
Float(width) / oneDevPixel, Float(width) / oneDevPixel};
// convert the radii
nscoord twipsRadii[8];
// get the radius for our outline
if (nsLayoutUtils::HasNonZeroCorner(ourOutline->mOutlineRadius)) {
nsIFrame::ComputeBorderRadii(ourOutline->mOutlineRadius, aBorderArea.Size(),
outerRect.Size(), Sides(), twipsRadii);
ComputePixelRadii(twipsRadii, oneDevPixel, &outlineRadii);
} else if (aForFrame->GetBorderRadii(twipsRadii)) {
RectCornerRadii innerRadii;
ComputePixelRadii(twipsRadii, oneDevPixel, &innerRadii);
Float devPixelOffset = aPresContext->AppUnitsToFloatDevPixels(offset);
const Float widths[4] = {
outlineWidths[0] + devPixelOffset, outlineWidths[1] + devPixelOffset,
outlineWidths[2] + devPixelOffset, outlineWidths[3] + devPixelOffset};
nsCSSBorderRenderer::ComputeOuterRadii(innerRadii, widths, &outlineRadii);
}
uint8_t outlineStyles[4] = { outlineStyle, outlineStyle,
outlineStyle, outlineStyle };
@ -947,12 +957,7 @@ nsCSSRendering::PaintOutline(nsPresContext* aPresContext,
outlineColor,
outlineColor };
// convert the border widths
Float outlineWidths[4] = { Float(width / twipsPerPixel),
Float(width / twipsPerPixel),
Float(width / twipsPerPixel),
Float(width / twipsPerPixel) };
Rect dirtyRect = NSRectToRect(aDirtyRect, twipsPerPixel);
Rect dirtyRect = NSRectToRect(aDirtyRect, oneDevPixel);
nsIDocument* document = nullptr;
nsIContent* content = aForFrame->GetContent();

View file

@ -3757,18 +3757,23 @@ nsDisplayOutline::Paint(nsDisplayListBuilder* aBuilder,
mFrame->StyleContext());
}
bool nsDisplayOutline::HasRadius() const {
if (nsLayoutUtils::HasNonZeroCorner(mFrame->StyleOutline()->mOutlineRadius)) {
return true;
}
return nsLayoutUtils::HasNonZeroCorner(mFrame->StyleBorder()->mBorderRadius);
}
bool
nsDisplayOutline::IsInvisibleInRect(const nsRect& aRect)
{
const nsStyleOutline* outline = mFrame->StyleOutline();
nsRect borderBox(ToReferenceFrame(), mFrame->GetSize());
if (borderBox.Contains(aRect) &&
!nsLayoutUtils::HasNonZeroCorner(outline->mOutlineRadius)) {
if (outline->mOutlineOffset >= 0) {
// aRect is entirely inside the border-rect, and the outline isn't
// rendered inside the border-rect, so the outline is not visible.
return true;
}
if (borderBox.Contains(aRect) && !HasRadius() &&
outline->mOutlineOffset >= 0) {
// aRect is entirely inside the border-rect, and the outline isn't
// rendered inside the border-rect, so the outline is not visible.
return true;
}
return false;

View file

@ -3220,6 +3220,9 @@ public:
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) override;
virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) override;
NS_DISPLAY_DECL_NAME("Outline", TYPE_OUTLINE)
private:
bool HasRadius() const;
};
/**

View file

@ -510,6 +510,8 @@ nsStyleBorder::CalcDifference(const nsStyleBorder& aNewData) const
}
}
// Note that border radius is used as a fallback for outline radius, if set.
// Any optimizations here should apply to both.
if (mBorderRadius != aNewData.mBorderRadius ||
!mBorderColors != !aNewData.mBorderColors) {
return nsChangeHint_RepaintFrame;