diff --git a/dom/base/nsContentSink.cpp b/dom/base/nsContentSink.cpp index abbba90457..066ec84466 100644 --- a/dom/base/nsContentSink.cpp +++ b/dom/base/nsContentSink.cpp @@ -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()) { diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h index f9492fd049..f66c9ede1d 100644 --- a/dom/script/ScriptLoader.h +++ b/dom/script/ScriptLoader.h @@ -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); diff --git a/js/src/jsscript.h b/js/src/jsscript.h index 68e9884321..41d8e18ee0 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -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) { diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index ad52234a31..db5e01803b 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -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); } diff --git a/js/src/vm/Opcodes.h b/js/src/vm/Opcodes.h index ad140ff7bc..c5be5f6bef 100644 --- a/js/src/vm/Opcodes.h +++ b/js/src/vm/Opcodes.h @@ -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'. diff --git a/js/src/vm/TypeInference.cpp b/js/src/vm/TypeInference.cpp index a36926eb94..8ed6e885f8 100644 --- a/js/src/vm/TypeInference.cpp +++ b/js/src/vm/TypeInference.cpp @@ -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; diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index c683a19605..54f965e9d2 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -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(); diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index fa28ea5f87..825c564211 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -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; diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 2b4efd86ef..2f3f53b7fc 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -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; }; /** diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 4f95ddaeb0..9de0f13c00 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -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;