From 3caca43d305ee1b7d28e2f1088b2bea140a3a6fe Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 9 Jan 2021 19:19:39 +0000 Subject: [PATCH 01/16] Issue #1710 - Check for triggering principal URI in FTP subresource check. Resolves #1710 --- dom/security/nsContentSecurityManager.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dom/security/nsContentSecurityManager.cpp b/dom/security/nsContentSecurityManager.cpp index 298dc810ea..d33f962ecd 100644 --- a/dom/security/nsContentSecurityManager.cpp +++ b/dom/security/nsContentSecurityManager.cpp @@ -149,8 +149,16 @@ nsContentSecurityManager::CheckFTPSubresourceLoad(nsIChannel* aChannel) nsIPrincipal* triggeringPrincipal = loadInfo->TriggeringPrincipal(); nsCOMPtr tURI; triggeringPrincipal->GetURI(getter_AddRefs(tURI)); + if (!tURI) { + // We don't have a triggering principal URI, meaning this isn't actually + // a subresource, but rather a top-level document, i.e. something we can + // display in-browser and might be saving as-is. Allow the load. + return NS_OK; + } bool isTrigFtpURI = (NS_SUCCEEDED(tURI->SchemeIs("ftp", &isTrigFtpURI)) && isTrigFtpURI); if (isTrigFtpURI) { + // The document loading this resource is also on FTP, satisfying the SOP. + // Allow the load. return NS_OK; } From 325e57e916985c3f57e30c48ec26629aa94c797b Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Mon, 11 Jan 2021 09:31:44 -0500 Subject: [PATCH 02/16] Issue #1624 - Fix slot access intrinsics for objects with > 16 reserved slots Also flips ion inlining pref back on --- js/src/jit/MCallOptimize.cpp | 8 ++++++++ modules/libpref/init/all.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/js/src/jit/MCallOptimize.cpp b/js/src/jit/MCallOptimize.cpp index 0033e40b9c..182fa2fd5a 100644 --- a/js/src/jit/MCallOptimize.cpp +++ b/js/src/jit/MCallOptimize.cpp @@ -2618,6 +2618,10 @@ IonBuilder::inlineUnsafeSetReservedSlot(CallInfo& callInfo) return InliningStatus_NotInlined; uint32_t slot = uint32_t(arg->toConstant()->toInt32()); + // Don't inline if it's not a fixed slot. + if (slot >= NativeObject::MAX_FIXED_SLOTS) + return InliningStatus_NotInlined; + callInfo.setImplicitlyUsedUnchecked(); MStoreFixedSlot* store = @@ -2649,6 +2653,10 @@ IonBuilder::inlineUnsafeGetReservedSlot(CallInfo& callInfo, MIRType knownValueTy return InliningStatus_NotInlined; uint32_t slot = uint32_t(arg->toConstant()->toInt32()); + // Don't inline if it's not a fixed slot. + if (slot >= NativeObject::MAX_FIXED_SLOTS) + return InliningStatus_NotInlined; + callInfo.setImplicitlyUsedUnchecked(); MLoadFixedSlot* load = MLoadFixedSlot::New(alloc(), callInfo.getArg(0), slot); diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 94201fae8a..6d3bac2869 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -1272,7 +1272,7 @@ pref("javascript.options.strict.debug", false); pref("javascript.options.unboxed_objects", false); pref("javascript.options.baselinejit", true); pref("javascript.options.ion", true); -pref("javascript.options.ion.inlining", false); +pref("javascript.options.ion.inlining", true); pref("javascript.options.asmjs", true); pref("javascript.options.wasm", true); // wasm jit crashes in 32bit builds because of 64bit casts so From e993607a887f3acd42407da44290aa0282fe1660 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 6 Jan 2021 10:35:21 +0000 Subject: [PATCH 03/16] Issue #1705 - Part 1: Rename nsChangeHint_CSSOverflowChange to *ScrollbarChange. Prepare for scrollbar-width which should trigger the same kind of change. --- layout/base/RestyleManagerBase.cpp | 8 ++++---- layout/base/nsChangeHint.h | 4 ++-- layout/style/nsStyleStruct.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/layout/base/RestyleManagerBase.cpp b/layout/base/RestyleManagerBase.cpp index b4ac9803ad..433589dacb 100644 --- a/layout/base/RestyleManagerBase.cpp +++ b/layout/base/RestyleManagerBase.cpp @@ -171,7 +171,7 @@ RestyleManagerBase::ChangeHintToString(nsChangeHint aHint) "NeutralChange", "InvalidateRenderingObservers", "ReflowChangesSizeOrPosition", "UpdateComputedBSize", "UpdateUsesOpacity", "UpdateBackgroundPosition", - "AddOrRemoveTransform", "CSSOverflowChange", + "AddOrRemoveTransform", "ScrollbarChange", }; static_assert(nsChangeHint_AllHints == (1 << ArrayLength(names)) - 1, "Name list doesn't match change hints."); @@ -1111,11 +1111,11 @@ if (!mDestroyedFrames) { nsPresContext* presContext = PresContext(); nsCSSFrameConstructor* frameConstructor = presContext->FrameConstructor(); - // Handle nsChangeHint_CSSOverflowChange, by either updating the + // Handle nsChangeHint_ScrollbarChange, by either updating the // scrollbars on the viewport, or upgrading the change hint to frame-reconstruct. for (nsStyleChangeData& data : aChangeList) { - if (data.mHint & nsChangeHint_CSSOverflowChange) { - data.mHint &= ~nsChangeHint_CSSOverflowChange; + if (data.mHint & nsChangeHint_ScrollbarChange) { + data.mHint &= ~nsChangeHint_ScrollbarChange; bool doReconstruct = true; // assume the worst // Only bother with this if we're html/body, since: diff --git a/layout/base/nsChangeHint.h b/layout/base/nsChangeHint.h index eb2709de65..4f176896bc 100644 --- a/layout/base/nsChangeHint.h +++ b/layout/base/nsChangeHint.h @@ -225,7 +225,7 @@ enum nsChangeHint { * scrollframe, this is instead equivalent to nsChangeHint_AllReflowHints * (because the viewport always has an associated scrollframe). */ - nsChangeHint_CSSOverflowChange = 1 << 28, + nsChangeHint_ScrollbarChange = 1 << 28, // IMPORTANT NOTE: When adding new hints, consider whether you need // to add them to NS_HintsNotHandledForDescendantsIn() below. Please @@ -316,7 +316,7 @@ inline nsChangeHint operator^=(nsChangeHint& aLeft, nsChangeHint aRight) nsChangeHint_UpdatePostTransformOverflow | \ nsChangeHint_UpdateParentOverflow | \ nsChangeHint_ChildrenOnlyTransform | \ - nsChangeHint_CSSOverflowChange | \ + nsChangeHint_ScrollbarChange | \ nsChangeHint_RecomputePosition | \ nsChangeHint_UpdateContainingBlock | \ nsChangeHint_AddOrRemoveTransform | \ diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 073cfcd5e7..d2d89a57da 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -3264,7 +3264,7 @@ nsStyleDisplay::CalcDifference(const nsStyleDisplay& aNewData) const if (mOverflowX != aNewData.mOverflowX || mOverflowY != aNewData.mOverflowY) { - hint |= nsChangeHint_CSSOverflowChange; + hint |= nsChangeHint_ScrollbarChange; } /* Note: When mScrollBehavior, mScrollSnapTypeX, mScrollSnapTypeY, From 37650106354fa201d11e6d1b3e0d474017ecb62e Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 6 Jan 2021 12:47:56 +0000 Subject: [PATCH 04/16] Issue #1705 - Part 2: Add a ShowScrollbar enum to be used in ScrollReflowInput. Overflow properties have two purposes: 1. controlling whether the scrollbar should be shown; 2. controlling whether the content is scrollable. However, with the scrollbar-width property being added, scrollability and presence of a scrollbar are no longer tied together. This patch makes a separation between the value of overflow and the presence of a scrollbar by making it clear that for ScrollReflowInput, we only care about whether scrollbar should be shown. This should make it easier to write the logic involving presence of the scrollbar based on webdev choice. --- layout/generic/nsGfxScrollFrame.cpp | 86 +++++++++++++++++++---------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 5c316b8b5e..95e4b9bf4c 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -211,10 +211,32 @@ nsHTMLScrollFrame::GetType() const namespace mozilla { +enum class ShowScrollbar : uint8_t +{ + Auto, + Always, + Never, +}; + +static ShowScrollbar +ShouldShowScrollbar(uint8_t aOverflow) +{ + switch (aOverflow) { + case NS_STYLE_OVERFLOW_SCROLL: + return ShowScrollbar::Always; + case NS_STYLE_OVERFLOW_HIDDEN: + return ShowScrollbar::Never; + default: + case NS_STYLE_OVERFLOW_AUTO: + return ShowScrollbar::Auto; + } +} + struct MOZ_STACK_CLASS ScrollReflowInput { const ReflowInput& mReflowInput; nsBoxLayoutState mBoxState; - ScrollbarStyles mStyles; + ShowScrollbar mHScrollbar; + ShowScrollbar mVScrollbar; nsMargin mComputedBorder; // === Filled in by ReflowScrolledFrame === @@ -235,12 +257,15 @@ struct MOZ_STACK_CLASS ScrollReflowInput { bool mShowVScrollbar; ScrollReflowInput(nsIScrollableFrame* aFrame, - const ReflowInput& aState) : - mReflowInput(aState), + const ReflowInput& aState) + : mReflowInput(aState) // mBoxState is just used for scrollbars so we don't need to // worry about the reflow depth here - mBoxState(aState.mFrame->PresContext(), aState.mRenderingContext, 0), - mStyles(aFrame->GetScrollbarStyles()) { + , mBoxState(aState.mFrame->PresContext(), aState.mRenderingContext, 0) + { + ScrollbarStyles styles = aFrame->GetScrollbarStyles(); + mHScrollbar = ShouldShowScrollbar(styles.mHorizontal); + mVScrollbar = ShouldShowScrollbar(styles.mVertical); } }; @@ -328,8 +353,8 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, bool aAssumeHScroll, bool aAssumeVScroll, bool aForce) { - if ((aState->mStyles.mVertical == NS_STYLE_OVERFLOW_HIDDEN && aAssumeVScroll) || - (aState->mStyles.mHorizontal == NS_STYLE_OVERFLOW_HIDDEN && aAssumeHScroll)) { + if ((aState->mVScrollbar == ShowScrollbar::Never && aAssumeVScroll) || + (aState->mHScrollbar == ShowScrollbar::Never && aAssumeHScroll)) { NS_ASSERTION(!aForce, "Shouldn't be forcing a hidden scrollbar to show!"); return false; } @@ -399,9 +424,9 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, nscoord oneDevPixel = aState->mBoxState.PresContext()->DevPixelsToAppUnits(1); // If the style is HIDDEN then we already know that aAssumeHScroll is false - if (aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN) { + if (aState->mHScrollbar != ShowScrollbar::Never) { bool wantHScrollbar = - aState->mStyles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL || + aState->mHScrollbar == ShowScrollbar::Always || scrolledRect.XMost() >= visualScrollPortSize.width + oneDevPixel || scrolledRect.x <= -oneDevPixel; if (scrollPortSize.width < hScrollbarMinSize.width) @@ -411,9 +436,9 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, } // If the style is HIDDEN then we already know that aAssumeVScroll is false - if (aState->mStyles.mVertical != NS_STYLE_OVERFLOW_HIDDEN) { + if (aState->mVScrollbar != ShowScrollbar::Never) { bool wantVScrollbar = - aState->mStyles.mVertical == NS_STYLE_OVERFLOW_SCROLL || + aState->mVScrollbar == ShowScrollbar::Always || scrolledRect.YMost() >= visualScrollPortSize.height + oneDevPixel || scrolledRect.y <= -oneDevPixel; if (scrollPortSize.height < vScrollbarMinSize.height) @@ -597,19 +622,20 @@ nsHTMLScrollFrame::ReflowScrolledFrame(ScrollReflowInput* aState, bool nsHTMLScrollFrame::GuessHScrollbarNeeded(const ScrollReflowInput& aState) { - if (aState.mStyles.mHorizontal != NS_STYLE_OVERFLOW_AUTO) - // no guessing required - return aState.mStyles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL; - + if (aState.mHScrollbar != ShowScrollbar::Auto) { + // No guessing required + return aState.mHScrollbar == ShowScrollbar::Always; + } return mHelper.mHasHorizontalScrollbar; } bool nsHTMLScrollFrame::GuessVScrollbarNeeded(const ScrollReflowInput& aState) { - if (aState.mStyles.mVertical != NS_STYLE_OVERFLOW_AUTO) - // no guessing required - return aState.mStyles.mVertical == NS_STYLE_OVERFLOW_SCROLL; + if (aState.mVScrollbar != ShowScrollbar::Auto) { + // No guessing required + return aState.mVScrollbar == ShowScrollbar::Always; + } // If we've had at least one non-initial reflow, then just assume // the state of the vertical scrollbar will be what we determined @@ -684,8 +710,8 @@ nsHTMLScrollFrame::ReflowContents(ScrollReflowInput* aState, // XXX Is this check really sufficient to catch all the incremental cases // where the ideal case doesn't have a scrollbar? if ((aState->mReflowedContentsWithHScrollbar || aState->mReflowedContentsWithVScrollbar) && - aState->mStyles.mVertical != NS_STYLE_OVERFLOW_SCROLL && - aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_SCROLL) { + aState->mVScrollbar != ShowScrollbar::Always && + aState->mHScrollbar != ShowScrollbar::Always) { nsSize insideBorderSize = ComputeInsideBorderSize(aState, nsSize(kidDesiredSize.Width(), kidDesiredSize.Height())); @@ -725,8 +751,8 @@ nsHTMLScrollFrame::ReflowContents(ScrollReflowInput* aState, // enable and force the layout to stick even if it's inconsistent. // This just happens sometimes. TryLayout(aState, &kidDesiredSize, - aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN, - aState->mStyles.mVertical != NS_STYLE_OVERFLOW_HIDDEN, + aState->mHScrollbar != ShowScrollbar::Never, + aState->mVScrollbar != ShowScrollbar::Never, true); } @@ -982,10 +1008,10 @@ nsHTMLScrollFrame::AdjustForPerspective(nsRect& aScrollableOverflow) } void -nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, +nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) + nsReflowStatus& aStatus) { MarkInReflow(); DO_GLOBAL_REFLOW_COUNT("nsHTMLScrollFrame"); @@ -996,10 +1022,12 @@ nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, ScrollReflowInput state(this, aReflowInput); // sanity check: ensure that if we have no scrollbar, we treat it // as hidden. - if (!mHelper.mVScrollbarBox || mHelper.mNeverHasVerticalScrollbar) - state.mStyles.mVertical = NS_STYLE_OVERFLOW_HIDDEN; - if (!mHelper.mHScrollbarBox || mHelper.mNeverHasHorizontalScrollbar) - state.mStyles.mHorizontal = NS_STYLE_OVERFLOW_HIDDEN; + if (!mHelper.mVScrollbarBox || mHelper.mNeverHasVerticalScrollbar) { + state.mVScrollbar = ShowScrollbar::Never; + } + if (!mHelper.mHScrollbarBox || mHelper.mNeverHasHorizontalScrollbar) { + state.mHScrollbar = ShowScrollbar::Never; + } //------------ Handle Incremental Reflow ----------------- bool reflowHScrollbar = true; From 21f707390d03d4f566914d7ff27b6768275c24be Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 6 Jan 2021 16:31:36 +0000 Subject: [PATCH 05/16] Issue #1705 - Part 3: Rename ScrollbarStyles to ScrollStyles. ScrollbarStyles contains values of overflow, (over)scroll-behavior, etc. The only one which is marginally related to scroll _bars_ is overflow, which can be used to hide scrollbar (by making an element not scrollable) or enforce the scrollbar to display. It makes more sense to be called ScrollStyles as it's mainly concerning behavior of scrolling, not scrollbars. Also, with the addition of scrollbar width properties, the current name can be confusing. --- .../treeupdate/test_cssoverflow.html | 10 +++--- dom/animation/KeyframeEffectReadOnly.cpp | 2 +- dom/base/Element.cpp | 20 +++++------ dom/base/nsDocument.cpp | 2 +- dom/base/nsGlobalWindow.cpp | 6 ++-- dom/events/EventStateManager.cpp | 4 +-- gfx/layers/apz/util/APZCCallbackHelper.cpp | 4 +-- layout/base/RestyleManagerBase.cpp | 4 +-- .../{ScrollbarStyles.cpp => ScrollStyles.cpp} | 6 ++-- .../{ScrollbarStyles.h => ScrollStyles.h} | 18 +++++----- layout/base/moz.build | 4 +-- layout/base/nsCSSFrameConstructor.cpp | 10 +++--- layout/base/nsCSSFrameConstructor.h | 2 +- layout/base/nsLayoutUtils.cpp | 8 ++--- layout/base/nsPresContext.cpp | 28 +++++++-------- layout/base/nsPresContext.h | 18 +++++----- layout/base/nsPresShell.cpp | 4 +-- layout/forms/nsListControlFrame.cpp | 10 +++--- layout/forms/nsListControlFrame.h | 2 +- layout/generic/TextOverflow.cpp | 4 +-- layout/generic/nsFrame.cpp | 2 +- layout/generic/nsGfxScrollFrame.cpp | 34 +++++++++---------- layout/generic/nsGfxScrollFrame.h | 10 +++--- layout/generic/nsIScrollableFrame.h | 4 +-- layout/style/nsRuleNode.cpp | 2 +- layout/xul/nsListBoxBodyFrame.cpp | 4 +-- 26 files changed, 111 insertions(+), 111 deletions(-) rename layout/base/{ScrollbarStyles.cpp => ScrollStyles.cpp} (90%) rename layout/base/{ScrollbarStyles.h => ScrollStyles.h} (87%) diff --git a/accessible/tests/mochitest/treeupdate/test_cssoverflow.html b/accessible/tests/mochitest/treeupdate/test_cssoverflow.html index ed9edd66e5..911299af00 100644 --- a/accessible/tests/mochitest/treeupdate/test_cssoverflow.html +++ b/accessible/tests/mochitest/treeupdate/test_cssoverflow.html @@ -67,7 +67,7 @@ * Change scrollbar styles from hidden to auto. That makes us to create an * accessible for scroll area. */ - function changeScrollbarStyles(aContainerID, aScrollAreaID) + function changeScrollStyles(aContainerID, aScrollAreaID) { this.container = getAccessible(aContainerID); this.scrollAreaNode = getNode(aScrollAreaID); @@ -77,7 +77,7 @@ new invokerChecker(EVENT_REORDER, this.container) ]; - this.invoke = function changeScrollbarStyles_invoke() + this.invoke = function changeScrollStyles_invoke() { var accTree = { SECTION: [] }; @@ -86,7 +86,7 @@ this.scrollAreaNode.style.overflow = "auto"; } - this.finalCheck = function changeScrollbarStyles_finalCheck() + this.finalCheck = function changeScrollStyles_finalCheck() { var accTree = { SECTION: [ // container @@ -95,7 +95,7 @@ testAccessibleTree(this.container, accTree); } - this.getID = function changeScrollbarStyles_getID() + this.getID = function changeScrollStyles_getID() { return "change scrollbar styles " + prettyName(aScrollAreaID); } @@ -114,7 +114,7 @@ gQueue = new eventQueue(); gQueue.push(new changeScrollRange("container", "scrollarea")); - gQueue.push(new changeScrollbarStyles("container2", "scrollarea2")); + gQueue.push(new changeScrollStyles("container2", "scrollarea2")); gQueue.invoke(); // Will call SimpleTest.finish(); } diff --git a/dom/animation/KeyframeEffectReadOnly.cpp b/dom/animation/KeyframeEffectReadOnly.cpp index 179ed6cb4c..2efc747f09 100644 --- a/dom/animation/KeyframeEffectReadOnly.cpp +++ b/dom/animation/KeyframeEffectReadOnly.cpp @@ -1089,7 +1089,7 @@ KeyframeEffectReadOnly::CanThrottleTransformChanges(nsIFrame& aFrame) const return true; } - ScrollbarStyles ss = scrollable->GetScrollbarStyles(); + ScrollStyles ss = scrollable->GetScrollStyles(); if (ss.mVertical == NS_STYLE_OVERFLOW_HIDDEN && ss.mHorizontal == NS_STYLE_OVERFLOW_HIDDEN && scrollable->GetLogicalScrollPosition() == nsPoint(0, 0)) { diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index 940045ca70..9ba065238d 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -745,7 +745,7 @@ Element::Scroll(const CSSIntPoint& aScroll, const ScrollOptions& aOptions) if (aOptions.mBehavior == ScrollBehavior::Smooth) { scrollMode = nsIScrollableFrame::SMOOTH_MSD; } else if (aOptions.mBehavior == ScrollBehavior::Auto) { - ScrollbarStyles styles = sf->GetScrollbarStyles(); + ScrollStyles styles = sf->GetScrollStyles(); if (styles.mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH) { scrollMode = nsIScrollableFrame::SMOOTH_MSD; } @@ -834,7 +834,7 @@ Element::SetScrollTop(int32_t aScrollTop) nsIScrollableFrame* sf = GetScrollFrame(); if (sf) { nsIScrollableFrame::ScrollMode scrollMode = nsIScrollableFrame::INSTANT; - if (sf->GetScrollbarStyles().mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH) { + if (sf->GetScrollStyles().mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH) { scrollMode = nsIScrollableFrame::SMOOTH_MSD; } sf->ScrollToCSSPixels(CSSIntPoint(sf->GetScrollPositionCSSPixels().x, @@ -856,7 +856,7 @@ Element::SetScrollLeft(int32_t aScrollLeft) nsIScrollableFrame* sf = GetScrollFrame(); if (sf) { nsIScrollableFrame::ScrollMode scrollMode = nsIScrollableFrame::INSTANT; - if (sf->GetScrollbarStyles().mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH) { + if (sf->GetScrollStyles().mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH) { scrollMode = nsIScrollableFrame::SMOOTH_MSD; } @@ -1069,7 +1069,7 @@ ShadowRoot* Element::GetShadowRootByMode() const { /** - * 1. Let shadow be context object’s shadow root. + * 1. Let shadow be context object???s shadow root. * 2. If shadow is null or its mode is "closed", then return null. */ ShadowRoot* shadowRoot = GetShadowRoot(); @@ -1088,7 +1088,7 @@ already_AddRefed Element::AttachShadow(const ShadowRootInit& aInit, ErrorResult& aError) { /** - * 1. If context object’s namespace is not the HTML namespace, + * 1. If context object???s namespace is not the HTML namespace, * then throw a "NotSupportedError" DOMException. */ if (!IsHTMLElement()) { @@ -1097,7 +1097,7 @@ Element::AttachShadow(const ShadowRootInit& aInit, ErrorResult& aError) } /** - * 2. If context object’s local name is not + * 2. If context object???s local name is not * a valid custom element name, "article", "aside", "blockquote", * "body", "div", "footer", "h1", "h2", "h3", "h4", "h5", "h6", * "header", "main" "nav", "p", "section", or "span", @@ -1181,8 +1181,8 @@ Element::AttachShadowInternal(bool aClosed, ErrorResult& aError) /** * 4. Let shadow be a new shadow root whose node document is - * context object’s node document, host is context object, - * and mode is init’s mode. + * context object???s node document, host is context object, + * and mode is init???s mode. */ RefPtr shadowRoot = new ShadowRoot(this, aClosed, nodeInfo.forget(), protoBinding); @@ -1190,7 +1190,7 @@ Element::AttachShadowInternal(bool aClosed, ErrorResult& aError) shadowRoot->SetIsComposedDocParticipant(IsInComposedDoc()); /** - * 5. Set context object’s shadow root to shadow. + * 5. Set context object???s shadow root to shadow. */ SetShadowRoot(shadowRoot); @@ -1890,7 +1890,7 @@ Element::UnbindFromTree(bool aDeep, bool aNullParent) nsPresContext* presContext = presShell->GetPresContext(); if (presContext) { MOZ_ASSERT(this != - presContext->GetViewportScrollbarStylesOverrideNode(), + presContext->GetViewportScrollStylesOverrideNode(), "Leaving behind a raw pointer to this node (as having " "propagated scrollbar styles) - that's dangerous..."); } diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 0396848a99..0fed2db01a 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -10568,7 +10568,7 @@ UpdateViewportScrollbarOverrideForFullscreen(nsIDocument* aDoc) { if (nsIPresShell* presShell = aDoc->GetShell()) { if (nsPresContext* presContext = presShell->GetPresContext()) { - presContext->UpdateViewportScrollbarStylesOverride(); + presContext->UpdateViewportScrollStylesOverride(); } } } diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 4e80568f6a..38a58f947a 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -8264,7 +8264,7 @@ nsGlobalWindow::ScrollTo(const CSSIntPoint& aScroll, scroll.y = maxpx; } - bool smoothScroll = sf->GetScrollbarStyles().IsSmoothScroll(aOptions.mBehavior); + bool smoothScroll = sf->GetScrollStyles().IsSmoothScroll(aOptions.mBehavior); sf->ScrollToCSSPixels(scroll, smoothScroll ? nsIScrollableFrame::SMOOTH_MSD @@ -8320,7 +8320,7 @@ nsGlobalWindow::ScrollByLines(int32_t numLines, // It seems like it would make more sense for ScrollByLines to use // SMOOTH mode, but tests seem to depend on the synchronous behaviour. // Perhaps Web content does too. - bool smoothScroll = sf->GetScrollbarStyles().IsSmoothScroll(aOptions.mBehavior); + bool smoothScroll = sf->GetScrollStyles().IsSmoothScroll(aOptions.mBehavior); sf->ScrollBy(nsIntPoint(0, numLines), nsIScrollableFrame::LINES, smoothScroll @@ -8341,7 +8341,7 @@ nsGlobalWindow::ScrollByPages(int32_t numPages, // It seems like it would make more sense for ScrollByPages to use // SMOOTH mode, but tests seem to depend on the synchronous behaviour. // Perhaps Web content does too. - bool smoothScroll = sf->GetScrollbarStyles().IsSmoothScroll(aOptions.mBehavior); + bool smoothScroll = sf->GetScrollStyles().IsSmoothScroll(aOptions.mBehavior); sf->ScrollBy(nsIntPoint(0, numPages), nsIScrollableFrame::PAGES, smoothScroll diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index 2ca698024f..c8f1acdb55 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -2516,7 +2516,7 @@ EventStateManager::ComputeScrollTarget(nsIFrame* aTargetFrame, return frameToScroll; } - ScrollbarStyles ss = scrollableFrame->GetScrollbarStyles(); + ScrollStyles ss = scrollableFrame->GetScrollStyles(); bool hiddenForV = (NS_STYLE_OVERFLOW_HIDDEN == ss.mVertical); bool hiddenForH = (NS_STYLE_OVERFLOW_HIDDEN == ss.mHorizontal); if ((hiddenForV && hiddenForH) || @@ -2609,7 +2609,7 @@ EventStateManager::DoScrollText(nsIScrollableFrame* aScrollableFrame, ComputeScrollAmountForDefaultAction(aEvent, scrollAmountInDevPixels); // Don't scroll around the axis whose overflow style is hidden. - ScrollbarStyles overflowStyle = aScrollableFrame->GetScrollbarStyles(); + ScrollStyles overflowStyle = aScrollableFrame->GetScrollStyles(); if (overflowStyle.mHorizontal == NS_STYLE_OVERFLOW_HIDDEN) { actualDevPixelScrollAmount.x = 0; } diff --git a/gfx/layers/apz/util/APZCCallbackHelper.cpp b/gfx/layers/apz/util/APZCCallbackHelper.cpp index 2fda14719b..e1d4cdf549 100644 --- a/gfx/layers/apz/util/APZCCallbackHelper.cpp +++ b/gfx/layers/apz/util/APZCCallbackHelper.cpp @@ -92,10 +92,10 @@ ScrollFrameTo(nsIScrollableFrame* aFrame, const FrameMetrics& aMetrics, bool& aS // (by design). Note also that when we run into this case, even if both axes // have overflow:hidden, we want to set aSuccessOut to true, so that the displayport // follows the async scroll position rather than the gecko scroll position. - if (aFrame->GetScrollbarStyles().mVertical == NS_STYLE_OVERFLOW_HIDDEN) { + if (aFrame->GetScrollStyles().mVertical == NS_STYLE_OVERFLOW_HIDDEN) { targetScrollPosition.y = geckoScrollPosition.y; } - if (aFrame->GetScrollbarStyles().mHorizontal == NS_STYLE_OVERFLOW_HIDDEN) { + if (aFrame->GetScrollStyles().mHorizontal == NS_STYLE_OVERFLOW_HIDDEN) { targetScrollPosition.x = geckoScrollPosition.x; } diff --git a/layout/base/RestyleManagerBase.cpp b/layout/base/RestyleManagerBase.cpp index 433589dacb..192c0df99e 100644 --- a/layout/base/RestyleManagerBase.cpp +++ b/layout/base/RestyleManagerBase.cpp @@ -1137,9 +1137,9 @@ if (!mDestroyedFrames) { // to reconstruct - we can just reflow, because no scrollframe is being // added/removed. nsIContent* prevOverrideNode = - presContext->GetViewportScrollbarStylesOverrideNode(); + presContext->GetViewportScrollStylesOverrideNode(); nsIContent* newOverrideNode = - presContext->UpdateViewportScrollbarStylesOverride(); + presContext->UpdateViewportScrollStylesOverride(); if (data.mContent == prevOverrideNode || data.mContent == newOverrideNode) { diff --git a/layout/base/ScrollbarStyles.cpp b/layout/base/ScrollStyles.cpp similarity index 90% rename from layout/base/ScrollbarStyles.cpp rename to layout/base/ScrollStyles.cpp index cc9f0c57de..328657d3d6 100644 --- a/layout/base/ScrollbarStyles.cpp +++ b/layout/base/ScrollStyles.cpp @@ -3,12 +3,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "ScrollbarStyles.h" +#include "ScrollStyles.h" #include "nsStyleStruct.h" // for nsStyleDisplay and nsStyleBackground::Position namespace mozilla { - ScrollbarStyles::ScrollbarStyles(uint8_t aH, uint8_t aV, + ScrollStyles::ScrollStyles(uint8_t aH, uint8_t aV, const nsStyleDisplay* aDisplay) : mHorizontal(aH), mVertical(aV), mScrollBehavior(aDisplay->mScrollBehavior), @@ -19,7 +19,7 @@ namespace mozilla { mScrollSnapDestinationX(aDisplay->mScrollSnapDestination.mXPosition), mScrollSnapDestinationY(aDisplay->mScrollSnapDestination.mYPosition) {} - ScrollbarStyles::ScrollbarStyles(const nsStyleDisplay* aDisplay) + ScrollStyles::ScrollStyles(const nsStyleDisplay* aDisplay) : mHorizontal(aDisplay->mOverflowX), mVertical(aDisplay->mOverflowY), mScrollBehavior(aDisplay->mScrollBehavior), mScrollSnapTypeX(aDisplay->mScrollSnapTypeX), diff --git a/layout/base/ScrollbarStyles.h b/layout/base/ScrollStyles.h similarity index 87% rename from layout/base/ScrollbarStyles.h rename to layout/base/ScrollStyles.h index e6f0c6dde5..c5743ee6b9 100644 --- a/layout/base/ScrollbarStyles.h +++ b/layout/base/ScrollStyles.h @@ -3,8 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef ScrollbarStyles_h -#define ScrollbarStyles_h +#ifndef ScrollStyles_h +#define ScrollStyles_h #include #include "nsStyleConsts.h" // for NS_STYLE_SCROLL_SNAP_* @@ -16,7 +16,7 @@ struct nsStyleDisplay; namespace mozilla { -struct ScrollbarStyles +struct ScrollStyles { // Always one of NS_STYLE_OVERFLOW_SCROLL, NS_STYLE_OVERFLOW_HIDDEN, // or NS_STYLE_OVERFLOW_AUTO. @@ -34,7 +34,7 @@ struct ScrollbarStyles nsStyleCoord::CalcValue mScrollSnapDestinationX; nsStyleCoord::CalcValue mScrollSnapDestinationY; - ScrollbarStyles(uint8_t aH, uint8_t aV) + ScrollStyles(uint8_t aH, uint8_t aV) : mHorizontal(aH), mVertical(aV), mScrollBehavior(NS_STYLE_SCROLL_BEHAVIOR_AUTO), mScrollSnapTypeX(NS_STYLE_SCROLL_SNAP_TYPE_NONE), @@ -50,10 +50,10 @@ struct ScrollbarStyles mScrollSnapDestinationY.mHasPercent = false; } - explicit ScrollbarStyles(const nsStyleDisplay* aDisplay); - ScrollbarStyles(uint8_t aH, uint8_t aV, const nsStyleDisplay* aDisplay); - ScrollbarStyles() {} - bool operator==(const ScrollbarStyles& aStyles) const { + explicit ScrollStyles(const nsStyleDisplay* aDisplay); + ScrollStyles(uint8_t aH, uint8_t aV, const nsStyleDisplay* aDisplay); + ScrollStyles() {} + bool operator==(const ScrollStyles& aStyles) const { return aStyles.mHorizontal == mHorizontal && aStyles.mVertical == mVertical && aStyles.mScrollBehavior == mScrollBehavior && aStyles.mScrollSnapTypeX == mScrollSnapTypeX && @@ -63,7 +63,7 @@ struct ScrollbarStyles aStyles.mScrollSnapDestinationX == mScrollSnapDestinationX && aStyles.mScrollSnapDestinationY == mScrollSnapDestinationY; } - bool operator!=(const ScrollbarStyles& aStyles) const { + bool operator!=(const ScrollStyles& aStyles) const { return !(*this == aStyles); } bool IsHiddenInBothDirections() const { diff --git a/layout/base/moz.build b/layout/base/moz.build index 51cab4c6ba..86377e9db8 100644 --- a/layout/base/moz.build +++ b/layout/base/moz.build @@ -95,7 +95,7 @@ EXPORTS += [ 'nsRefreshDriver.h', 'nsStyleChangeList.h', 'nsStyleSheetService.h', - 'ScrollbarStyles.h', + 'ScrollStyles.h', 'StackArena.h', 'Units.h', 'UnitTransforms.h', @@ -162,7 +162,7 @@ SOURCES += [ 'RestyleManager.cpp', 'RestyleManagerBase.cpp', 'RestyleTracker.cpp', - 'ScrollbarStyles.cpp', + 'ScrollStyles.cpp', 'ServoRestyleManager.cpp', 'StackArena.cpp', 'StaticPresData.cpp', diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 45b95826c0..2cc5ec818d 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -2406,12 +2406,12 @@ nsCSSFrameConstructor::ConstructDocElementFrame(Element* aDocEle GetRootFrame()->SetStyleContextWithoutNotification(sc); } - // Make sure to call UpdateViewportScrollbarStylesOverride before + // Make sure to call UpdateViewportScrollStylesOverride before // SetUpDocElementContainingBlock, since it sets up our scrollbar state // properly. DebugOnly propagatedScrollFrom; if (nsPresContext* presContext = mPresShell->GetPresContext()) { - propagatedScrollFrom = presContext->UpdateViewportScrollbarStylesOverride(); + propagatedScrollFrom = presContext->UpdateViewportScrollStylesOverride(); } SetUpDocElementContainingBlock(aDocElement); @@ -4660,7 +4660,7 @@ nsCSSFrameConstructor::FindDisplayData(const nsStyleDisplay* aDisplay, if (aElement->IsHTMLElement(nsGkAtoms::body)) { if (nsPresContext* presContext = mPresShell->GetPresContext()) { propagatedScrollToViewport = - presContext->UpdateViewportScrollbarStylesOverride() == aElement; + presContext->UpdateViewportScrollStylesOverride() == aElement; } } @@ -4696,7 +4696,7 @@ nsCSSFrameConstructor::FindDisplayData(const nsStyleDisplay* aDisplay, // scrollframe so that it paginates correctly, but we don't want to set // the bit on the block that tells it to clip at paint time. if (mPresShell->GetPresContext()-> - ElementWouldPropagateScrollbarStyles(aElement)) { + ElementWouldPropagateScrollStyles(aElement)) { suppressScrollFrame = false; } } @@ -8133,7 +8133,7 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer, // source is a fullscreen element, and we have code elsewhere to update // scrollbars after fullscreen elements are removed -- specifically, it's // part of the fullscreen cleanup code called by Element::UnbindFromTree.) - presContext->UpdateViewportScrollbarStylesOverride(); + presContext->UpdateViewportScrollStylesOverride(); } // XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index 0de00a90ca..abdfbf7ce0 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -22,7 +22,7 @@ #include "nsCounterManager.h" #include "nsIAnonymousContentCreator.h" #include "nsFrameManager.h" -#include "ScrollbarStyles.h" +#include "ScrollStyles.h" struct nsFrameItems; class nsStyleContext; diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 86a11bce9e..ccdc5503f8 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -2023,7 +2023,7 @@ nsLayoutUtils::GetNearestScrollableFrameForDirection(nsIFrame* aFrame, for (nsIFrame* f = aFrame; f; f = nsLayoutUtils::GetCrossDocParentFrame(f)) { nsIScrollableFrame* scrollableFrame = do_QueryFrame(f); if (scrollableFrame) { - ScrollbarStyles ss = scrollableFrame->GetScrollbarStyles(); + ScrollStyles ss = scrollableFrame->GetScrollStyles(); uint32_t directions = scrollableFrame->GetPerceivedScrollingDirections(); if (aDirection == eVertical ? (ss.mVertical != NS_STYLE_OVERFLOW_HIDDEN && @@ -2050,7 +2050,7 @@ nsLayoutUtils::GetNearestScrollableFrame(nsIFrame* aFrame, uint32_t aFlags) return scrollableFrame; } } else { - ScrollbarStyles ss = scrollableFrame->GetScrollbarStyles(); + ScrollStyles ss = scrollableFrame->GetScrollStyles(); if ((aFlags & SCROLLABLE_INCLUDE_HIDDEN) || ss.mVertical != NS_STYLE_OVERFLOW_HIDDEN || ss.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN) { @@ -8255,11 +8255,11 @@ nsLayoutUtils::CalculateScrollableRectForFrame(nsIScrollableFrame* aScrollableFr contentBounds = aScrollableFrame->GetScrollRange(); nsPoint scrollPosition = aScrollableFrame->GetScrollPosition(); - if (aScrollableFrame->GetScrollbarStyles().mVertical == NS_STYLE_OVERFLOW_HIDDEN) { + if (aScrollableFrame->GetScrollStyles().mVertical == NS_STYLE_OVERFLOW_HIDDEN) { contentBounds.y = scrollPosition.y; contentBounds.height = 0; } - if (aScrollableFrame->GetScrollbarStyles().mHorizontal == NS_STYLE_OVERFLOW_HIDDEN) { + if (aScrollableFrame->GetScrollStyles().mHorizontal == NS_STYLE_OVERFLOW_HIDDEN) { contentBounds.x = scrollPosition.x; contentBounds.width = 0; } diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index 1d90b967a0..f7be42b5ff 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -1346,7 +1346,7 @@ nsPresContext::ScreenSizeInchesForFontInflation(bool* aChanged) } static bool -CheckOverflow(const nsStyleDisplay* aDisplay, ScrollbarStyles* aStyles) +CheckOverflow(const nsStyleDisplay* aDisplay, ScrollStyles* aStyles) { if (aDisplay->mOverflowX == NS_STYLE_OVERFLOW_VISIBLE && aDisplay->mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_AUTO && @@ -1362,17 +1362,17 @@ CheckOverflow(const nsStyleDisplay* aDisplay, ScrollbarStyles* aStyles) } if (aDisplay->mOverflowX == NS_STYLE_OVERFLOW_CLIP) { - *aStyles = ScrollbarStyles(NS_STYLE_OVERFLOW_HIDDEN, + *aStyles = ScrollStyles(NS_STYLE_OVERFLOW_HIDDEN, NS_STYLE_OVERFLOW_HIDDEN, aDisplay); } else { - *aStyles = ScrollbarStyles(aDisplay); + *aStyles = ScrollStyles(aDisplay); } return true; } static nsIContent* -GetPropagatedScrollbarStylesForViewport(nsPresContext* aPresContext, - ScrollbarStyles *aStyles) +GetPropagatedScrollStylesForViewport(nsPresContext* aPresContext, + ScrollStyles *aStyles) { nsIDocument* document = aPresContext->Document(); Element* docElement = document->GetRootElement(); @@ -1424,16 +1424,16 @@ GetPropagatedScrollbarStylesForViewport(nsPresContext* aPresContext, } nsIContent* -nsPresContext::UpdateViewportScrollbarStylesOverride() +nsPresContext::UpdateViewportScrollStylesOverride() { // Start off with our default styles, and then update them as needed. - mViewportStyleScrollbar = ScrollbarStyles(NS_STYLE_OVERFLOW_AUTO, + mViewportStyleScrollbar = ScrollStyles(NS_STYLE_OVERFLOW_AUTO, NS_STYLE_OVERFLOW_AUTO); mViewportScrollbarOverrideNode = nullptr; // Don't propagate the scrollbar state in printing or print preview. if (!IsPaginated()) { mViewportScrollbarOverrideNode = - GetPropagatedScrollbarStylesForViewport(this, &mViewportStyleScrollbar); + GetPropagatedScrollStylesForViewport(this, &mViewportStyleScrollbar); } nsIDocument* document = Document(); @@ -1445,7 +1445,7 @@ nsPresContext::UpdateViewportScrollbarStylesOverride() // affected across fullscreen change. if (fullscreenElement != document->GetRootElement() && fullscreenElement != mViewportScrollbarOverrideNode) { - mViewportStyleScrollbar = ScrollbarStyles(NS_STYLE_OVERFLOW_HIDDEN, + mViewportStyleScrollbar = ScrollStyles(NS_STYLE_OVERFLOW_HIDDEN, NS_STYLE_OVERFLOW_HIDDEN); } } @@ -1454,7 +1454,7 @@ nsPresContext::UpdateViewportScrollbarStylesOverride() } bool -nsPresContext::ElementWouldPropagateScrollbarStyles(Element* aElement) +nsPresContext::ElementWouldPropagateScrollStyles(Element* aElement) { MOZ_ASSERT(IsPaginated(), "Should only be called on paginated contexts"); if (aElement->GetParent() && !aElement->IsHTMLElement(nsGkAtoms::body)) { @@ -1462,13 +1462,13 @@ nsPresContext::ElementWouldPropagateScrollbarStyles(Element* aElement) return false; } - // Go ahead and just call GetPropagatedScrollbarStylesForViewport, but update - // a dummy ScrollbarStyles we don't care about. It'll do a bit of extra work, + // Go ahead and just call GetPropagatedScrollStylesForViewport, but update + // a dummy ScrollStyles we don't care about. It'll do a bit of extra work, // but saves us having to have more complicated code or more code duplication; // in practice we will make this call quite rarely, because we checked for all // the common cases above. - ScrollbarStyles dummy(NS_STYLE_OVERFLOW_AUTO, NS_STYLE_OVERFLOW_AUTO); - return GetPropagatedScrollbarStylesForViewport(this, &dummy) == aElement; + ScrollStyles dummy(NS_STYLE_OVERFLOW_AUTO, NS_STYLE_OVERFLOW_AUTO); + return GetPropagatedScrollStylesForViewport(this, &dummy) == aElement; } void diff --git a/layout/base/nsPresContext.h b/layout/base/nsPresContext.h index a2b9bb5337..10908a604a 100644 --- a/layout/base/nsPresContext.h +++ b/layout/base/nsPresContext.h @@ -35,7 +35,7 @@ #include "mozilla/AppUnits.h" #include "prclist.h" #include "nsThreadUtils.h" -#include "ScrollbarStyles.h" +#include "ScrollStyles.h" #include "nsIMessageManager.h" #include "mozilla/RestyleLogging.h" #include "Units.h" @@ -140,7 +140,7 @@ class nsPresContext : public nsIObserver, public mozilla::SupportsWeakPtr { public: typedef mozilla::LangGroupFontPrefs LangGroupFontPrefs; - typedef mozilla::ScrollbarStyles ScrollbarStyles; + typedef mozilla::ScrollStyles ScrollStyles; typedef mozilla::StaticPresData StaticPresData; NS_DECL_CYCLE_COLLECTING_ISUPPORTS @@ -716,19 +716,19 @@ public: * @return if scroll was propagated from some content node, the content node * it was propagated from. */ - nsIContent* UpdateViewportScrollbarStylesOverride(); + nsIContent* UpdateViewportScrollStylesOverride(); /** * Returns the cached result from the last call to - * UpdateViewportScrollbarStylesOverride() -- i.e. return the node + * UpdateViewportScrollStylesOverride() -- i.e. return the node * whose scrollbar styles we have propagated to the viewport (or nullptr if * there is no such node). */ - nsIContent* GetViewportScrollbarStylesOverrideNode() const { + nsIContent* GetViewportScrollStylesOverrideNode() const { return mViewportScrollbarOverrideNode; } - const ScrollbarStyles& GetViewportScrollbarStylesOverride() const + const ScrollStyles& GetViewportScrollStylesOverride() const { return mViewportStyleScrollbar; } @@ -737,7 +737,7 @@ public: * Check whether the given element would propagate its scrollbar styles to the * viewport in non-paginated mode. Must only be called if IsPaginated(). */ - bool ElementWouldPropagateScrollbarStyles(mozilla::dom::Element* aElement); + bool ElementWouldPropagateScrollStyles(mozilla::dom::Element* aElement); /** * Set and get methods for controlling the background drawing @@ -1312,13 +1312,13 @@ protected: // This is a non-owning pointer. May be null. If non-null, it's guaranteed // to be pointing to a node that's still alive, because we'll reset it in - // UpdateViewportScrollbarStylesOverride() as part of the cleanup code + // UpdateViewportScrollStylesOverride() as part of the cleanup code // when this node is removed from the document. (For and the root node, // this call happens in nsCSSFrameConstructor::ContentRemoved(). For // fullscreen elements, it happens in the fullscreen-specific cleanup // invoked by Element::UnbindFromTree().) nsIContent* MOZ_NON_OWNING_REF mViewportScrollbarOverrideNode; - ScrollbarStyles mViewportStyleScrollbar; + ScrollStyles mViewportStyleScrollbar; uint8_t mFocusRingWidth; diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 1fb2231723..9ba4ff462f 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -3331,7 +3331,7 @@ static void ScrollToShowRect(nsIScrollableFrame* aFrameAsScrollable, aHorizontal.mWhenToScroll == nsIPresShell::SCROLL_IF_NOT_VISIBLE) { lineSize = aFrameAsScrollable->GetLineScrollAmount(); } - ScrollbarStyles ss = aFrameAsScrollable->GetScrollbarStyles(); + ScrollStyles ss = aFrameAsScrollable->GetScrollStyles(); nsRect allowedRange(scrollPt, nsSize(0, 0)); bool needToScroll = false; uint32_t directions = aFrameAsScrollable->GetPerceivedScrollingDirections(); @@ -3388,7 +3388,7 @@ static void ScrollToShowRect(nsIScrollableFrame* aFrameAsScrollable, // a current smooth scroll operation. if (needToScroll) { nsIScrollableFrame::ScrollMode scrollMode = nsIScrollableFrame::INSTANT; - bool autoBehaviorIsSmooth = (aFrameAsScrollable->GetScrollbarStyles().mScrollBehavior + bool autoBehaviorIsSmooth = (aFrameAsScrollable->GetScrollStyles().mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH); bool smoothScroll = (aFlags & nsIPresShell::SCROLL_SMOOTH) || ((aFlags & nsIPresShell::SCROLL_SMOOTH_AUTO) && autoBehaviorIsSmooth); diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 7bd356a22b..4daa470a9e 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -614,17 +614,17 @@ nsListControlFrame::ReflowAsDropdown(nsPresContext* aPresContext, nsHTMLScrollFrame::Reflow(aPresContext, aDesiredSize, state, aStatus); } -ScrollbarStyles -nsListControlFrame::GetScrollbarStyles() const +ScrollStyles +nsListControlFrame::GetScrollStyles() const { // We can't express this in the style system yet; when we can, this can go away - // and GetScrollbarStyles can be devirtualized + // and GetScrollStyles can be devirtualized int32_t style = IsInDropDownMode() ? NS_STYLE_OVERFLOW_AUTO : NS_STYLE_OVERFLOW_SCROLL; if (GetWritingMode().IsVertical()) { - return ScrollbarStyles(style, NS_STYLE_OVERFLOW_HIDDEN); + return ScrollStyles(style, NS_STYLE_OVERFLOW_HIDDEN); } else { - return ScrollbarStyles(NS_STYLE_OVERFLOW_HIDDEN, style); + return ScrollStyles(NS_STYLE_OVERFLOW_HIDDEN, style); } } diff --git a/layout/forms/nsListControlFrame.h b/layout/forms/nsListControlFrame.h index d8df9ebd67..fa939d6c80 100644 --- a/layout/forms/nsListControlFrame.h +++ b/layout/forms/nsListControlFrame.h @@ -106,7 +106,7 @@ public: virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue) override; virtual void SetFocus(bool aOn = true, bool aRepaint = false) override; - virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override; + virtual mozilla::ScrollStyles GetScrollStyles() const override; virtual bool ShouldPropagateComputedBSizeToScrolledContent() const override; // for accessibility purposes diff --git a/layout/generic/TextOverflow.cpp b/layout/generic/TextOverflow.cpp index f4db27766d..3d78eaf911 100644 --- a/layout/generic/TextOverflow.cpp +++ b/layout/generic/TextOverflow.cpp @@ -305,8 +305,8 @@ TextOverflow::TextOverflow(nsDisplayListBuilder* aBuilder, mCanHaveInlineAxisScrollbar = false; if (mScrollableFrame) { auto scrollbarStyle = mBlockWM.IsVertical() ? - mScrollableFrame->GetScrollbarStyles().mVertical : - mScrollableFrame->GetScrollbarStyles().mHorizontal; + mScrollableFrame->GetScrollStyles().mVertical : + mScrollableFrame->GetScrollStyles().mHorizontal; mCanHaveInlineAxisScrollbar = scrollbarStyle != NS_STYLE_OVERFLOW_HIDDEN; if (!mAdjustForPixelSnapping) { // Scrolling to the end position can leave some text still overflowing due diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index a9e6354abe..5d05b71037 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -9188,7 +9188,7 @@ nsIFrame::IsFocusable(int32_t *aTabIndex, bool aWithMouse) // will be enough to make them keyboard scrollable. nsIScrollableFrame *scrollFrame = do_QueryFrame(this); if (scrollFrame && - !scrollFrame->GetScrollbarStyles().IsHiddenInBothDirections() && + !scrollFrame->GetScrollStyles().IsHiddenInBothDirections() && !scrollFrame->GetScrollRange().IsEqualEdges(nsRect(0, 0, 0, 0))) { // Scroll bars will be used for overflow isFocusable = true; diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 95e4b9bf4c..8e7b208e42 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -263,7 +263,7 @@ struct MOZ_STACK_CLASS ScrollReflowInput { // worry about the reflow depth here , mBoxState(aState.mFrame->PresContext(), aState.mRenderingContext, 0) { - ScrollbarStyles styles = aFrame->GetScrollbarStyles(); + ScrollStyles styles = aFrame->GetScrollStyles(); mHScrollbar = ShouldShowScrollbar(styles.mHorizontal); mVScrollbar = ShouldShowScrollbar(styles.mVertical); } @@ -808,7 +808,7 @@ nsHTMLScrollFrame::PlaceScrollArea(ScrollReflowInput& aState, nscoord nsHTMLScrollFrame::GetIntrinsicVScrollbarWidth(nsRenderingContext *aRenderingContext) { - ScrollbarStyles ss = GetScrollbarStyles(); + ScrollStyles ss = GetScrollStyles(); if (ss.mVertical != NS_STYLE_OVERFLOW_SCROLL || !mHelper.mVScrollbarBox) return 0; @@ -1161,7 +1161,7 @@ nsHTMLScrollFrame::AccessibleType() // Create an accessible regardless of focusable state because the state can be // changed during frame life cycle without any notifications to accessibility. if (mContent->IsRootOfNativeAnonymousSubtree() || - GetScrollbarStyles().IsHiddenInBothDirections()) { + GetScrollStyles().IsHiddenInBothDirections()) { return a11y::eNoType; } @@ -1320,7 +1320,7 @@ ScrollFrameHelper::WantAsyncScroll() const return true; } - ScrollbarStyles styles = GetScrollbarStylesFromFrame(); + ScrollStyles styles = GetScrollStylesFromFrame(); nscoord oneDevPixel = GetScrolledFrame()->PresContext()->AppUnitsPerDevPixel(); nsRect scrollRange = GetScrollRange(); bool isVScrollable = (scrollRange.height >= oneDevPixel) && @@ -1571,7 +1571,7 @@ nsXULScrollFrame::GetXULPrefSize(nsBoxLayoutState& aState) nsSize pref = mHelper.mScrolledFrame->GetXULPrefSize(aState); - ScrollbarStyles styles = GetScrollbarStyles(); + ScrollStyles styles = GetScrollStyles(); // scrolled frames don't have their own margins @@ -1604,7 +1604,7 @@ nsXULScrollFrame::GetXULMinSize(nsBoxLayoutState& aState) nsSize min = mHelper.mScrolledFrame->GetXULMinSizeForScrollArea(aState); - ScrollbarStyles styles = GetScrollbarStyles(); + ScrollStyles styles = GetScrollStyles(); if (mHelper.mVScrollbarBox && styles.mVertical == NS_STYLE_OVERFLOW_SCROLL) { @@ -2490,7 +2490,7 @@ bool ScrollFrameHelper::IsAlwaysActive() const // If we're overflow:hidden, then start as inactive until // we get scrolled manually. - ScrollbarStyles styles = GetScrollbarStylesFromFrame(); + ScrollStyles styles = GetScrollStylesFromFrame(); return (styles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN && styles.mVertical != NS_STYLE_OVERFLOW_HIDDEN); } @@ -3821,21 +3821,21 @@ static void HandleScrollPref(nsIScrollable *aScrollable, int32_t aOrientation, } } -ScrollbarStyles -ScrollFrameHelper::GetScrollbarStylesFromFrame() const +ScrollStyles +ScrollFrameHelper::GetScrollStylesFromFrame() const { nsPresContext* presContext = mOuter->PresContext(); if (!presContext->IsDynamic() && !(mIsRoot && presContext->HasPaginatedScrolling())) { - return ScrollbarStyles(NS_STYLE_OVERFLOW_HIDDEN, NS_STYLE_OVERFLOW_HIDDEN); + return ScrollStyles(NS_STYLE_OVERFLOW_HIDDEN, NS_STYLE_OVERFLOW_HIDDEN); } if (!mIsRoot) { const nsStyleDisplay* disp = mOuter->StyleDisplay(); - return ScrollbarStyles(disp); + return ScrollStyles(disp); } - ScrollbarStyles result = presContext->GetViewportScrollbarStylesOverride(); + ScrollStyles result = presContext->GetViewportScrollStylesOverride(); nsCOMPtr container = presContext->GetContainerWeak(); nsCOMPtr scrollable = do_QueryInterface(container); if (scrollable) { @@ -4004,7 +4004,7 @@ ScrollFrameHelper::ScrollBy(nsIntPoint aDelta, nsPoint newPos = mDestination + nsPoint(aDelta.x*deltaMultiplier.width, aDelta.y*deltaMultiplier.height); if (aSnap == nsIScrollableFrame::ENABLE_SNAP) { - ScrollbarStyles styles = GetScrollbarStylesFromFrame(); + ScrollStyles styles = GetScrollStylesFromFrame(); if (styles.mScrollSnapTypeY != NS_STYLE_SCROLL_SNAP_TYPE_NONE || styles.mScrollSnapTypeX != NS_STYLE_SCROLL_SNAP_TYPE_NONE) { nscoord appUnitsPerDevPixel = mOuter->PresContext()->AppUnitsPerDevPixel(); @@ -4412,7 +4412,7 @@ ScrollFrameHelper::CreateAnonymousContent( bool canHaveHorizontal; bool canHaveVertical; if (!mIsRoot) { - ScrollbarStyles styles = scrollable->GetScrollbarStyles(); + ScrollStyles styles = scrollable->GetScrollStyles(); canHaveHorizontal = styles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN; canHaveVertical = styles.mVertical != NS_STYLE_OVERFLOW_HIDDEN; if (!canHaveHorizontal && !canHaveVertical && !isResizable) { @@ -5094,7 +5094,7 @@ nsXULScrollFrame::XULLayout(nsBoxLayoutState& aState) (if we're the viewport and we added or removed a scrollbar). **************/ - ScrollbarStyles styles = GetScrollbarStyles(); + ScrollStyles styles = GetScrollStyles(); // Look at our style do we always have vertical or horizontal scrollbars? if (styles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL) @@ -5399,7 +5399,7 @@ bool ScrollFrameHelper::ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) { nsIScrollableFrame* sf = do_QueryFrame(mOuter); - ScrollbarStyles ss = sf->GetScrollbarStyles(); + ScrollStyles ss = sf->GetScrollStyles(); // Reflow when the change in overflow leads to one of our scrollbars // changing or might require repositioning the scrolled content due to @@ -6121,7 +6121,7 @@ ComputeScrollSnapInfo(const ScrollFrameHelper& aScrollFrame) { ScrollSnapInfo result; - ScrollbarStyles styles = aScrollFrame.GetScrollbarStylesFromFrame(); + ScrollStyles styles = aScrollFrame.GetScrollStylesFromFrame(); if (styles.mScrollSnapTypeY == NS_STYLE_SCROLL_SNAP_TYPE_NONE && styles.mScrollSnapTypeX == NS_STYLE_SCROLL_SNAP_TYPE_NONE) { diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h index 2968678563..41957d5e55 100644 --- a/layout/generic/nsGfxScrollFrame.h +++ b/layout/generic/nsGfxScrollFrame.h @@ -55,7 +55,7 @@ public: ScrollFrameHelper(nsContainerFrame* aOuter, bool aIsRoot); ~ScrollFrameHelper(); - mozilla::ScrollbarStyles GetScrollbarStylesFromFrame() const; + mozilla::ScrollStyles GetScrollStylesFromFrame() const; // If a child frame was added or removed on the scrollframe, // reload our child frame list. @@ -775,8 +775,8 @@ public: virtual nsIFrame* GetScrolledFrame() const override { return mHelper.GetScrolledFrame(); } - virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override { - return mHelper.GetScrollbarStylesFromFrame(); + virtual mozilla::ScrollStyles GetScrollStyles() const override { + return mHelper.GetScrollStylesFromFrame(); } virtual uint32_t GetScrollbarVisibility() const override { return mHelper.GetScrollbarVisibility(); @@ -1199,8 +1199,8 @@ public: virtual nsIFrame* GetScrolledFrame() const override { return mHelper.GetScrolledFrame(); } - virtual mozilla::ScrollbarStyles GetScrollbarStyles() const override { - return mHelper.GetScrollbarStylesFromFrame(); + virtual mozilla::ScrollStyles GetScrollStyles() const override { + return mHelper.GetScrollStylesFromFrame(); } virtual uint32_t GetScrollbarVisibility() const override { return mHelper.GetScrollbarVisibility(); diff --git a/layout/generic/nsIScrollableFrame.h b/layout/generic/nsIScrollableFrame.h index b7e3caf46a..4ad45a528d 100644 --- a/layout/generic/nsIScrollableFrame.h +++ b/layout/generic/nsIScrollableFrame.h @@ -12,7 +12,7 @@ #include "nsCoord.h" #include "DisplayItemClip.h" -#include "ScrollbarStyles.h" +#include "ScrollStyles.h" #include "mozilla/Maybe.h" #include "mozilla/gfx/Point.h" #include "nsIScrollbarMediator.h" @@ -63,7 +63,7 @@ public: * or NS_STYLE_OVERFLOW_AUTO) governing the horizontal and vertical * scrollbars for this frame. */ - virtual mozilla::ScrollbarStyles GetScrollbarStyles() const = 0; + virtual mozilla::ScrollStyles GetScrollStyles() const = 0; enum { HORIZONTAL = 0x01, VERTICAL = 0x02 }; /** diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 9721b4bed6..504b66ac21 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -424,7 +424,7 @@ static nsSize CalcViewportUnitsScale(nsPresContext* aPresContext) nsIScrollableFrame* scrollFrame = aPresContext->PresShell()->GetRootScrollFrameAsScrollable(); if (scrollFrame) { - ScrollbarStyles styles(scrollFrame->GetScrollbarStyles()); + ScrollStyles styles(scrollFrame->GetScrollStyles()); if (styles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL || styles.mVertical == NS_STYLE_OVERFLOW_SCROLL) { diff --git a/layout/xul/nsListBoxBodyFrame.cpp b/layout/xul/nsListBoxBodyFrame.cpp index 8c4a5e2fdd..0ff07bd912 100644 --- a/layout/xul/nsListBoxBodyFrame.cpp +++ b/layout/xul/nsListBoxBodyFrame.cpp @@ -296,7 +296,7 @@ nsListBoxBodyFrame::GetXULMinSizeForScrollArea(nsBoxLayoutState& aBoxLayoutState result.height = 0; nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetScrollableFrameFor(this); if (scrollFrame && - scrollFrame->GetScrollbarStyles().mVertical == NS_STYLE_OVERFLOW_AUTO) { + scrollFrame->GetScrollStyles().mVertical == NS_STYLE_OVERFLOW_AUTO) { nsMargin scrollbars = scrollFrame->GetDesiredScrollbarSizes(&aBoxLayoutState); result.width += scrollbars.left + scrollbars.right; @@ -316,7 +316,7 @@ nsListBoxBodyFrame::GetXULPrefSize(nsBoxLayoutState& aBoxLayoutState) nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetScrollableFrameFor(this); if (scrollFrame && - scrollFrame->GetScrollbarStyles().mVertical == NS_STYLE_OVERFLOW_AUTO) { + scrollFrame->GetScrollStyles().mVertical == NS_STYLE_OVERFLOW_AUTO) { nsMargin scrollbars = scrollFrame->GetDesiredScrollbarSizes(&aBoxLayoutState); pref.width += scrollbars.left + scrollbars.right; } From 8e08d8bfd37d533e38cfffdb80ccd11455b2e1f9 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 6 Jan 2021 23:57:26 +0000 Subject: [PATCH 06/16] Issue #1705 - Part 4: Add scrollbar-width CSS keyword to CSS parser. This should be all parts needed to add a brand new enum keyword including getting the computed style from it... --- devtools/shared/css/generated/properties-db.js | 1 + layout/style/nsCSSKeywordList.h | 1 + layout/style/nsCSSPropList.h | 10 ++++++++++ layout/style/nsCSSProps.cpp | 6 ++++++ layout/style/nsCSSProps.h | 1 + layout/style/nsComputedDOMStyle.cpp | 10 ++++++++++ layout/style/nsComputedDOMStyle.h | 1 + layout/style/nsComputedDOMStylePropertyList.h | 1 + layout/style/nsRuleNode.cpp | 9 +++++++++ layout/style/nsStyleConsts.h | 7 +++++++ layout/style/nsStyleStruct.cpp | 9 +++++++++ layout/style/nsStyleStruct.h | 1 + layout/style/test/property_database.js | 12 ++++++++++++ modules/libpref/init/all.js | 3 +++ 14 files changed, 72 insertions(+) diff --git a/devtools/shared/css/generated/properties-db.js b/devtools/shared/css/generated/properties-db.js index d149995d9e..bb88befb7e 100644 --- a/devtools/shared/css/generated/properties-db.js +++ b/devtools/shared/css/generated/properties-db.js @@ -3038,6 +3038,7 @@ exports.CSS_PROPERTIES = { "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", + "scrollbar-width", "shape-outside", "shape-rendering", "-moz-stack-sizing", diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h index 86ba59142f..689ff47eb6 100644 --- a/layout/style/nsCSSKeywordList.h +++ b/layout/style/nsCSSKeywordList.h @@ -509,6 +509,7 @@ CSS_KEY(scrollbar, scrollbar) CSS_KEY(scrollbar-small, scrollbar_small) CSS_KEY(scrollbar-horizontal, scrollbar_horizontal) CSS_KEY(scrollbar-vertical, scrollbar_vertical) +CSS_KEY(scrollbar-width, scrollbar_width) CSS_KEY(se-resize, se_resize) CSS_KEY(select-after, select_after) CSS_KEY(select-all, select_all) diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index 658ea68d7a..e78dafcc5c 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -3709,6 +3709,16 @@ CSS_PROP_DISPLAY( kScrollSnapTypeKTable, CSS_PROP_NO_OFFSET, eStyleAnimType_Discrete) +CSS_PROP_USERINTERFACE( + scrollbar-width, + scrollbar_width, + ScrollbarWidth, + CSS_PROPERTY_PARSE_VALUE, + "layout.css.scrollbar-width.enabled", + VARIANT_HK, + kScrollbarWidthKTable, + CSS_PROP_NO_OFFSET, + eStyleAnimType_Discrete) CSS_PROP_DISPLAY( shape-outside, shape_outside, diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index e0cda24884..b6ffe7952a 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -2009,6 +2009,12 @@ const KTableEntry nsCSSProps::kScrollSnapTypeKTable[] = { { eCSSKeyword_UNKNOWN, -1 } }; +const KTableEntry nsCSSProps::kScrollbarWidthKTable[] = { + { eCSSKeyword_auto, StyleScrollbarWidth::Auto }, + { eCSSKeyword_thin, StyleScrollbarWidth::Thin }, + { eCSSKeyword_none, StyleScrollbarWidth::None } +}; + const KTableEntry nsCSSProps::kStackSizingKTable[] = { { eCSSKeyword_ignore, NS_STYLE_STACK_SIZING_IGNORE }, { eCSSKeyword_stretch_to_fit, NS_STYLE_STACK_SIZING_STRETCH_TO_FIT }, diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index 34d457c087..7b8c56860c 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -856,6 +856,7 @@ public: static const KTableEntry kRubyPositionKTable[]; static const KTableEntry kScrollBehaviorKTable[]; static const KTableEntry kScrollSnapTypeKTable[]; + static const KTableEntry kScrollbarWidthKTable[]; static const KTableEntry kSpeakKTable[]; static const KTableEntry kSpeakHeaderKTable[]; static const KTableEntry kSpeakNumeralKTable[]; diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 748f990b77..7ac5fa604e 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -3305,6 +3305,16 @@ nsComputedDOMStyle::DoGetScrollSnapTypeY() return val.forget(); } +already_AddRefed +nsComputedDOMStyle::DoGetScrollbarWidth() +{ + RefPtr val = new nsROCSSPrimitiveValue; + val->SetIdent( + nsCSSProps::ValueToKeywordEnum(StyleUserInterface()->mScrollbarWidth, + nsCSSProps::kScrollbarWidthKTable)); + return val.forget(); +} + already_AddRefed nsComputedDOMStyle::GetScrollSnapPoints(const nsStyleCoord& aCoord) { diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h index 35a6142688..38a61e23c5 100644 --- a/layout/style/nsComputedDOMStyle.h +++ b/layout/style/nsComputedDOMStyle.h @@ -492,6 +492,7 @@ private: already_AddRefed DoGetCursor(); already_AddRefed DoGetForceBrokenImageIcon(); already_AddRefed DoGetIMEMode(); + already_AddRefed DoGetScrollbarWidth(); already_AddRefed DoGetUserFocus(); already_AddRefed DoGetUserInput(); already_AddRefed DoGetUserModify(); diff --git a/layout/style/nsComputedDOMStylePropertyList.h b/layout/style/nsComputedDOMStylePropertyList.h index 6a18a7ad0a..ec223cda4c 100644 --- a/layout/style/nsComputedDOMStylePropertyList.h +++ b/layout/style/nsComputedDOMStylePropertyList.h @@ -226,6 +226,7 @@ COMPUTED_STYLE_PROP(scroll_snap_points_x, ScrollSnapPointsX) COMPUTED_STYLE_PROP(scroll_snap_points_y, ScrollSnapPointsY) COMPUTED_STYLE_PROP(scroll_snap_type_x, ScrollSnapTypeX) COMPUTED_STYLE_PROP(scroll_snap_type_y, ScrollSnapTypeY) +COMPUTED_STYLE_PROP(scrollbar_width, ScrollbarWidth) COMPUTED_STYLE_PROP(shape_outside, ShapeOutside) //// COMPUTED_STYLE_PROP(size, Size) COMPUTED_STYLE_PROP(tab_size, TabSize) diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 504b66ac21..04715aa99a 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -1394,6 +1394,7 @@ struct SetEnumValueHelper DEFINE_ENUM_CLASS_SETTER(StyleFillRule, Nonzero, Evenodd) DEFINE_ENUM_CLASS_SETTER(StyleFloat, None, InlineEnd) DEFINE_ENUM_CLASS_SETTER(StyleFloatEdge, ContentBox, MarginBox) + DEFINE_ENUM_CLASS_SETTER(StyleScrollbarWidth, Auto, None) DEFINE_ENUM_CLASS_SETTER(StyleTextJustify, None, InterCharacter) DEFINE_ENUM_CLASS_SETTER(StyleUserFocus, None, SelectMenu) DEFINE_ENUM_CLASS_SETTER(StyleUserSelect, None, MozText) @@ -5235,6 +5236,14 @@ nsRuleNode::ComputeUserInterfaceData(void* aStartStruct, // caret-color: auto, color, inherit setComplexColor(aRuleData->ValueForCaretColor(), &nsStyleUserInterface::mCaretColor); + + // scrollbar-width: auto, thin, none + SetValue(*aRuleData->ValueForScrollbarWidth(), + ui->mScrollbarWidth, + conditions, + SETVAL_ENUMERATED, + parentUI->mScrollbarWidth, + StyleScrollbarWidth::Auto); COMPUTE_END_INHERITED(UserInterface, ui) } diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index e6a0cc65a3..308a66647b 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -187,6 +187,13 @@ enum class StyleFloatEdge : uint8_t { MarginBox, }; +// scrollbar-width +enum class StyleScrollbarWidth : uint8_t { + Auto, + Thin, + None, +}; + // shape-box for shape-outside enum class StyleShapeOutsideShapeBox : uint8_t { NoBox, diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index d2d89a57da..acf287ea8a 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -4024,6 +4024,7 @@ nsStyleUserInterface::nsStyleUserInterface(StyleStructContext aContext) , mPointerEvents(NS_STYLE_POINTER_EVENTS_AUTO) , mCursor(NS_STYLE_CURSOR_AUTO) , mCaretColor(StyleComplexColor::Auto()) + , mScrollbarWidth(StyleScrollbarWidth::Auto) { MOZ_COUNT_CTOR(nsStyleUserInterface); } @@ -4036,6 +4037,7 @@ nsStyleUserInterface::nsStyleUserInterface(const nsStyleUserInterface& aSource) , mCursor(aSource.mCursor) , mCursorImages(aSource.mCursorImages) , mCaretColor(aSource.mCaretColor) + , mScrollbarWidth(aSource.mScrollbarWidth) { MOZ_COUNT_CTOR(nsStyleUserInterface); } @@ -4087,6 +4089,13 @@ nsStyleUserInterface::CalcDifference(const nsStyleUserInterface& aNewData) const if (mCaretColor != aNewData.mCaretColor) { hint |= nsChangeHint_RepaintFrame; } + + if (mScrollbarWidth != aNewData.mScrollbarWidth) { + // For scrollbar-width change, we need some special handling similar + // to overflow properties. Specifically, we may need to reconstruct + // the scrollbar or force reflow of the viewport scrollbar. + hint |= nsChangeHint_ScrollbarChange; + } return hint; } diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 831808edfd..35ff071a55 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -3417,6 +3417,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUserInterface uint8_t mCursor; // [inherited] See nsStyleConsts.h nsTArray mCursorImages; // [inherited] images and coords mozilla::StyleComplexColor mCaretColor; // [inherited] + mozilla::StyleScrollbarWidth mScrollbarWidth; inline uint8_t GetEffectivePointerEvents(nsIFrame* aFrame) const; }; diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 635431e8fb..1d5dc989f5 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -7944,6 +7944,18 @@ for (var prop in gCSSProperties) { } } +if (IsCSSPropertyPrefEnabled("layout.css.scrollbar-width.enabled")) { + gCSSProperties["scrollbar-width"] = { + domProp: "scrollbarWidth", + inherited: false, + type: CSS_TYPE_LONGHAND, + initial_values: [ "auto" ], + other_values: [ "none", "thin" ], + invalid_values: [ "1px" ] + }; +} + + if (false) { // TODO These properties are chrome-only, and are not exposed via CSSOM. // We may still want to find a way to test them. See bug 1206999. diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 6d3bac2869..c8f3314161 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -2483,6 +2483,9 @@ pref("layout.css.isolation.enabled", true); // Is support for CSS Filters enabled? pref("layout.css.filters.enabled", true); +// Is support for scrollbar-width property enabled? +pref("layout.css.scrollbar-width.enabled", false); + // Set the threshold distance in CSS pixels below which scrolling will snap to // an edge, when scroll snapping is set to "proximity". pref("layout.css.scroll-snap.proximity-threshold", 200); From 7060aae250973434def4e06563ec05e879f54c26 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 8 Jan 2021 14:15:50 +0000 Subject: [PATCH 07/16] Issue #1705 - Part 5: Implement scrollbar-width:none for all target platforms. --- layout/generic/nsGfxScrollFrame.cpp | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 8e7b208e42..d1053da86d 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -1054,6 +1054,15 @@ nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, reflowScrollCorner = showResizer == mHelper.mCollapsedResizer; mHelper.mCollapsedResizer = !showResizer; } + + // Hide the scrollbar when the scrollbar-width is set to none. + // This is only needed for root element because scrollbars of non- + // root elements with "scrollbar-width: none" is already suppressed + // in ScrollFrameHelper::CreateAnonymousContent. + if (this->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::None) { + state.mVScrollbar = ShowScrollbar::Never; + state.mHScrollbar = ShowScrollbar::Never; + } } nsRect oldScrollAreaBounds = mHelper.mScrollPort; @@ -4404,24 +4413,30 @@ ScrollFrameHelper::CreateAnonymousContent( nsIScrollableFrame *scrollable = do_QueryFrame(mOuter); - // If we're the scrollframe for the root, then we want to construct - // our scrollbar frames no matter what. That way later dynamic - // changes to propagated overflow styles will show or hide - // scrollbars on the viewport without requiring frame reconstruction - // of the viewport (good!). bool canHaveHorizontal; bool canHaveVertical; - if (!mIsRoot) { - ScrollStyles styles = scrollable->GetScrollStyles(); - canHaveHorizontal = styles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN; - canHaveVertical = styles.mVertical != NS_STYLE_OVERFLOW_HIDDEN; + if (mIsRoot) { + // If we're the scrollframe for the root, then we want to construct + // our scrollbar frames no matter what. That way, later dynamic + // changes to propagated overflow styles will show or hide + // scrollbars on the viewport without requiring frame reconstruction + // of the viewport (which is a Good Thing(tm)!). + canHaveHorizontal = true; + canHaveVertical = true; + } else { + if (mOuter->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::None) { + // If scrollbar-width is none, don't generate scrollbars. + canHaveHorizontal = false; + canHaveVertical = false; + } else { + ScrollStyles styles = scrollable->GetScrollStyles(); + canHaveHorizontal = styles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN; + canHaveVertical = styles.mVertical != NS_STYLE_OVERFLOW_HIDDEN; + } if (!canHaveHorizontal && !canHaveVertical && !isResizable) { // Nothing to do. return NS_OK; } - } else { - canHaveHorizontal = true; - canHaveVertical = true; } // The anonymous
used by never gets scrollbars. From 953cd5b6b266120e2bbd85163ed60843255b7725 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 8 Jan 2021 14:40:49 +0000 Subject: [PATCH 08/16] Issue #1705 - Part 6: Remove scrollbarbutton min-{width|height} rule from theme. This would interfere with implementing thin scrollbars. Almost all widgets provide a non-overridable size for scrollbar buttons, so it makes no sense to specify min size for them. It is probably(?) a layout bug that min size properties can override the value returned by GetMinimumWidgetSize even if aIsOverridable is set to false, but removing this rule is simpler than locating and fixing the issue in layout code ;) --- toolkit/themes/windows/global/xulscrollbars.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/toolkit/themes/windows/global/xulscrollbars.css b/toolkit/themes/windows/global/xulscrollbars.css index 6d8f1c8c82..53f2376059 100644 --- a/toolkit/themes/windows/global/xulscrollbars.css +++ b/toolkit/themes/windows/global/xulscrollbars.css @@ -72,8 +72,6 @@ thumb[orient="horizontal"] { scrollbarbutton { background: -moz-Dialog no-repeat 50% 50%; - min-width: 16px; - min-height: 16px; } scrollbarbutton:hover:active, scrollbarbutton[active="true"] { From 32df94bf3bb5601934aa235deed971973eaf28b7 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 8 Jan 2021 16:33:36 +0000 Subject: [PATCH 09/16] Issue #1705 - Part 7: Implement scrollbar-width:thin on Windows. --- widget/windows/nsNativeThemeWin.cpp | 41 +++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index 1b5788387a..84772c25f4 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -1569,6 +1569,12 @@ GetThemeDpiScaleFactor(nsIFrame* aFrame) return 1.0; } +static bool +IsScrollbarWidthThin(nsIFrame* aFrame) +{ + return aFrame->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::Thin; +} + NS_IMETHODIMP nsNativeThemeWin::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, @@ -2999,14 +3005,21 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, break; case NS_THEME_SCROLLBARBUTTON_UP: case NS_THEME_SCROLLBARBUTTON_DOWN: - (*aResult).width = ::GetSystemMetrics(SM_CXVSCROLL); - (*aResult).height = ::GetSystemMetrics(SM_CYVSCROLL); + // Get scrollbar button metrics from the system, except in the case of + // thin scrollbars, where we leave them at 0 (collapsing them to invisible) + if (!IsScrollbarWidthThin(aFrame)) { + (*aResult).width = ::GetSystemMetrics(SM_CXVSCROLL); + (*aResult).height = ::GetSystemMetrics(SM_CYVSCROLL); + } *aIsOverridable = false; break; case NS_THEME_SCROLLBARBUTTON_LEFT: case NS_THEME_SCROLLBARBUTTON_RIGHT: - (*aResult).width = ::GetSystemMetrics(SM_CXHSCROLL); - (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); + // See comment above. + if (!IsScrollbarWidthThin(aFrame)) { + (*aResult).width = ::GetSystemMetrics(SM_CXHSCROLL); + (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); + } *aIsOverridable = false; break; case NS_THEME_SCROLLBAR_VERTICAL: @@ -3082,8 +3095,14 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, (*aResult).height = ::GetSystemMetrics(SM_CYVTHUMB); // Without theming, divide the thumb size by two in order to look more // native - if (!GetTheme(aWidgetType)) - (*aResult).height >>= 1; + if (!GetTheme(aWidgetType)) { + (*aResult).height /= 2; + } + // If scrollbar-width is thin, divide the thickness by three to make + // it more compact. + if (IsScrollbarWidthThin(aFrame)) { + (*aResult).width /= 3; + } *aIsOverridable = false; break; case NS_THEME_SCROLLBARTHUMB_HORIZONTAL: @@ -3091,8 +3110,14 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); // Without theming, divide the thumb size by two in order to look more // native - if (!GetTheme(aWidgetType)) - (*aResult).width >>= 1; + if (!GetTheme(aWidgetType)) { + (*aResult).width /= 2; + } + // If scrollbar-width is thin, divide the thickness by three to make + // it more compact. + if (IsScrollbarWidthThin(aFrame)) { + (*aResult).height /= 3; + } *aIsOverridable = false; break; case NS_THEME_SCROLLBAR_HORIZONTAL: From 2d99d18c2124eab9d56b91f0df3645f15910cd81 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 9 Jan 2021 23:20:31 +0000 Subject: [PATCH 10/16] Issue #1705 - Part 8: Implement scrollbar-width:thin on GTK. --- widget/gtk/nsNativeThemeGTK.cpp | 78 +++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 24 deletions(-) diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp index 89b8ab7dc8..cb4e7debf2 100644 --- a/widget/gtk/nsNativeThemeGTK.cpp +++ b/widget/gtk/nsNativeThemeGTK.cpp @@ -1098,6 +1098,12 @@ nsNativeThemeGTK::GetExtraSizeForWidget(nsIFrame* aFrame, uint8_t aWidgetType, return true; } +static bool +IsScrollbarWidthThin(nsIFrame* aFrame) +{ + return aFrame->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::Thin; +} + NS_IMETHODIMP nsNativeThemeGTK::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, @@ -1419,32 +1425,39 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext, case NS_THEME_SCROLLBARBUTTON_UP: case NS_THEME_SCROLLBARBUTTON_DOWN: { - if (gtk_check_version(3,20,0) == nullptr) { - moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, - &(aResult->width), &(aResult->height)); - } else { - MozGtkScrollbarMetrics metrics; - moz_gtk_get_scrollbar_metrics(&metrics); + if (!IsScrollbarWidthThin(aFrame)) { + // Get scrollbar button metrics from the system, except in the case of + // thin scrollbars, where we leave them at 0 (collapse) + if (gtk_check_version(3,20,0) == nullptr) { + moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, + &(aResult->width), &(aResult->height)); + } else { + MozGtkScrollbarMetrics metrics; + moz_gtk_get_scrollbar_metrics(&metrics); - aResult->width = metrics.slider_width; - aResult->height = metrics.stepper_size; + aResult->width = metrics.slider_width; + aResult->height = metrics.stepper_size; + } } - *aIsOverridable = false; } break; case NS_THEME_SCROLLBARBUTTON_LEFT: case NS_THEME_SCROLLBARBUTTON_RIGHT: { - if (gtk_check_version(3,20,0) == nullptr) { - moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, - &(aResult->width), &(aResult->height)); - } else { - MozGtkScrollbarMetrics metrics; - moz_gtk_get_scrollbar_metrics(&metrics); + if (!IsScrollbarWidthThin(aFrame)) { + // Get scrollbar button metrics from the system, except in the case of + // thin scrollbars, where we leave them at 0 (collapse) + if (gtk_check_version(3,20,0) == nullptr) { + moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, + &(aResult->width), &(aResult->height)); + } else { + MozGtkScrollbarMetrics metrics; + moz_gtk_get_scrollbar_metrics(&metrics); - aResult->width = metrics.stepper_size; - aResult->height = metrics.slider_width; + aResult->width = metrics.stepper_size; + aResult->height = metrics.slider_width; + } } *aIsOverridable = false; } @@ -1514,6 +1527,24 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext, } break; case NS_THEME_SCROLLBARTHUMB_VERTICAL: + { + if (gtk_check_version(3,20,0) == nullptr) { + moz_gtk_get_widget_min_size(NativeThemeToGtkTheme(aWidgetType, aFrame), + &(aResult->width), &(aResult->height)); + } else { + MozGtkScrollbarMetrics metrics; + moz_gtk_get_scrollbar_metrics(&metrics); + + aResult->width = metrics.slider_width; + aResult->height = metrics.min_slider_size; + } + if (IsScrollbarWidthThin(aFrame)) { + // If thin scrollbars, divide the thickness by 3 + aResult->width /= 3; + } + *aIsOverridable = false; + } + break; case NS_THEME_SCROLLBARTHUMB_HORIZONTAL: { if (gtk_check_version(3,20,0) == nullptr) { @@ -1523,13 +1554,12 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext, MozGtkScrollbarMetrics metrics; moz_gtk_get_scrollbar_metrics(&metrics); - if (aWidgetType == NS_THEME_SCROLLBARTHUMB_VERTICAL) { - aResult->width = metrics.slider_width; - aResult->height = metrics.min_slider_size; - } else { - aResult->height = metrics.slider_width; - aResult->width = metrics.min_slider_size; - } + aResult->height = metrics.slider_width; + aResult->width = metrics.min_slider_size; + } + if (IsScrollbarWidthThin(aFrame)) { + // If thin scrollbars, divide the thickness by 3 + aResult->height /= 3; } *aIsOverridable = false; } From b523c3be801841a356839d033f172c9fad73e0c0 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 9 Jan 2021 23:21:36 +0000 Subject: [PATCH 11/16] Issue #1705 - Part 9: Implement scrollbar-width:thin on Mac (cocoa). --- widget/cocoa/nsNativeThemeCocoa.mm | 63 +++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index f93e40f7b5..ce87d1996c 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -2279,6 +2279,12 @@ IsHiDPIContext(nsPresContext* aContext) 2 * aContext->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom(); } +static bool +IsScrollbarWidthThin(nsIFrame* aFrame) +{ + return aFrame->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::Thin; +} + NS_IMETHODIMP nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, @@ -3392,13 +3398,24 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsPresContext* aPresContext, // Find our parent scrollbar frame in order to find out whether we're in // a small or a large scrollbar. nsIFrame *scrollbarFrame = GetParentScrollbarFrame(aFrame); - if (!scrollbarFrame) + if (!scrollbarFrame) { return NS_ERROR_FAILURE; - + } + bool isSmall = (scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL); bool isHorizontal = (aWidgetType == NS_THEME_SCROLLBARTHUMB_HORIZONTAL); - int32_t& minSize = isHorizontal ? aResult->width : aResult->height; - minSize = isSmall ? kSmallScrollbarThumbMinSize : kRegularScrollbarThumbMinSize; + int32_t& minSize = isSmall ? kSmallScrollbarThumbMinSize : kRegularScrollbarThumbMinSize; + if (IsScrollbarWidthThin(aFrame)) { + minSize /= 2; + } + if (isHorizontal) { + aResult->width = kRegularScrollbarThumbMinSize; + aResult->height = minSize; + } else { + aResult->width = minSize; + aResult->height = kRegularScrollbarThumbMinSize; + } + break; } @@ -3419,6 +3436,9 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsPresContext* aPresContext, else { aResult->SizeTo(16, 16); } + if (IsScrollbarWidthThin(aFrame)) { + aResult->SizeTo(8, 8); + } break; } @@ -3435,6 +3455,9 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsPresContext* aPresContext, kThemeMetricScrollBarWidth; SInt32 scrollbarWidth = 0; ::GetThemeMetric(themeMetric, &scrollbarWidth); + if (IsScrollbarWidthThin(aFrame)) { + scrollbarWidth /= 2; + } aResult->SizeTo(scrollbarWidth, scrollbarWidth); break; } @@ -3467,22 +3490,26 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsPresContext* aPresContext, case NS_THEME_SCROLLBARBUTTON_LEFT: case NS_THEME_SCROLLBARBUTTON_RIGHT: { - nsIFrame *scrollbarFrame = GetParentScrollbarFrame(aFrame); - if (!scrollbarFrame) return NS_ERROR_FAILURE; + if (!IsScrollbarWidthThin(aFrame)) { + // Get scrollbar button metrics from the system, except in the case of + // thin scrollbars, where we leave them at 0 (collapse) - // Since there is no NS_THEME_SCROLLBARBUTTON_UP_SMALL we need to ask the parent what appearance style it has. - int32_t themeMetric = (scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL) ? - kThemeMetricSmallScrollBarWidth : - kThemeMetricScrollBarWidth; - SInt32 scrollbarWidth = 0; - ::GetThemeMetric(themeMetric, &scrollbarWidth); + nsIFrame *scrollbarFrame = GetParentScrollbarFrame(aFrame); + if (!scrollbarFrame) return NS_ERROR_FAILURE; - // It seems that for both sizes of scrollbar, the buttons are one pixel "longer". - if (aWidgetType == NS_THEME_SCROLLBARBUTTON_LEFT || aWidgetType == NS_THEME_SCROLLBARBUTTON_RIGHT) - aResult->SizeTo(scrollbarWidth+1, scrollbarWidth); - else - aResult->SizeTo(scrollbarWidth, scrollbarWidth+1); - + // Since there is no NS_THEME_SCROLLBARBUTTON_UP_SMALL we need to ask the parent what appearance style it has. + int32_t themeMetric = (scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL) ? + kThemeMetricSmallScrollBarWidth : + kThemeMetricScrollBarWidth; + SInt32 scrollbarWidth = 0; + ::GetThemeMetric(themeMetric, &scrollbarWidth); + + // It seems that for both sizes of scrollbar, the buttons are one pixel "longer". + if (aWidgetType == NS_THEME_SCROLLBARBUTTON_LEFT || aWidgetType == NS_THEME_SCROLLBARBUTTON_RIGHT) + aResult->SizeTo(scrollbarWidth+1, scrollbarWidth); + else + aResult->SizeTo(scrollbarWidth, scrollbarWidth+1); + } *aIsOverridable = false; break; } From 4461ea7a07b3015380bb532fb0fe8022a069c774 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Tue, 12 Jan 2021 13:07:40 +0000 Subject: [PATCH 12/16] Issue #1705 - Part 9b: Revert overzealous changes on Mac (cocoa). --- widget/cocoa/nsNativeThemeCocoa.mm | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index ce87d1996c..056c453f2a 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -3404,18 +3404,8 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsPresContext* aPresContext, bool isSmall = (scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL); bool isHorizontal = (aWidgetType == NS_THEME_SCROLLBARTHUMB_HORIZONTAL); - int32_t& minSize = isSmall ? kSmallScrollbarThumbMinSize : kRegularScrollbarThumbMinSize; - if (IsScrollbarWidthThin(aFrame)) { - minSize /= 2; - } - if (isHorizontal) { - aResult->width = kRegularScrollbarThumbMinSize; - aResult->height = minSize; - } else { - aResult->width = minSize; - aResult->height = kRegularScrollbarThumbMinSize; - } - + int32_t& minSize = isHorizontal ? aResult->width : aResult->height; + minSize = isSmall ? kSmallScrollbarThumbMinSize : kRegularScrollbarThumbMinSize; break; } From 6ee59c813d585a89d41ff4a656bdcc7c37559291 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sun, 10 Jan 2021 18:18:12 +0000 Subject: [PATCH 13/16] [Pale-Moon] [SSUAO] Update overrides for YouTube --- application/palemoon/branding/shared/pref/uaoverrides.inc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/palemoon/branding/shared/pref/uaoverrides.inc b/application/palemoon/branding/shared/pref/uaoverrides.inc index 6771feca35..fc086d662f 100644 --- a/application/palemoon/branding/shared/pref/uaoverrides.inc +++ b/application/palemoon/branding/shared/pref/uaoverrides.inc @@ -34,8 +34,9 @@ pref("@GUAO_PREF@.outlook.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLI pref("@GUAO_PREF@.web.de","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ (Pale Moon)"); pref("@GUAO_PREF@.yahoo.com","Mozilla/5.0 (%OS_SLICE% rv:99.9) @GK_SLICE@ Firefox/99.9"); pref("@GUAO_PREF@.calendar.yahoo.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ (Pale Moon)"); -pref("@GUAO_PREF@.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:60.0) @GK_SLICE@ Firefox/60.0 @PM_SLICE@"); -pref("@GUAO_PREF@.gaming.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:42.0) @GK_SLICE@ Firefox/42.0"); +pref("@GUAO_PREF@.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:60.0) @GK_SLICE@ Firefox/60.0"); +pref("@GUAO_PREF@.studio.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:71.0) @GK_SLICE@ Firefox/71.0"); +pref("@GUAO_PREF@.gaming.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:71.0) @GK_SLICE@ Firefox/71.0"); // For Amazon Prime videos pref("@GUAO_PREF@.www.amazon.com","Mozilla/5.0 (%OS_SLICE% rv:45.9) @GK_SLICE@ Firefox/45.9 (Pale Moon)"); From ef13be6ef88f7e58d3eab316fae2c67d6e206010 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 13 Jan 2021 02:26:18 +0000 Subject: [PATCH 14/16] [Pale-Moon] Issue #1845 - Pref detach&tear-off tab handling. Resolves #1845 --- application/palemoon/app/profile/palemoon.js | 4 ++++ application/palemoon/base/content/tabbrowser.xml | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/application/palemoon/app/profile/palemoon.js b/application/palemoon/app/profile/palemoon.js index 0b6410fb4e..5b4648d130 100644 --- a/application/palemoon/app/profile/palemoon.js +++ b/application/palemoon/app/profile/palemoon.js @@ -477,6 +477,10 @@ pref("browser.tabs.showAudioPlayingIcon", true); // This should match Chromium's audio indicator delay. pref("browser.tabs.delayHidingAudioPlayingIconMS", 3000); +// Whether dragging a tab off the tab bar to tear it off into its own +// window is enabled. +pref("browser.tabs.allowTabDetach", true); + pref("browser.allTabs.previews", true); pref("browser.allTabs.hidePinnedTabs", false); pref("browser.ctrlTab.previews", true); diff --git a/application/palemoon/base/content/tabbrowser.xml b/application/palemoon/base/content/tabbrowser.xml index 83780eba7e..61e0baa52b 100644 --- a/application/palemoon/base/content/tabbrowser.xml +++ b/application/palemoon/base/content/tabbrowser.xml @@ -4831,6 +4831,11 @@ return; } + // Check if tab detaching is enabled + if (!Services.prefs.getBoolPref("browser.tabs.allowTabDetach")) { + return; + } + // Disable detach within the browser toolbox var eX = event.screenX; var eY = event.screenY; From 7827259c9fb96b3959a731eddeb79cb73acecbd9 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sun, 10 Jan 2021 18:18:42 +0000 Subject: [PATCH 15/16] [Basilisk] [SSUAO] Update overrides for YouTube --- .../basilisk/branding/shared/uaoverrides.inc | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/application/basilisk/branding/shared/uaoverrides.inc b/application/basilisk/branding/shared/uaoverrides.inc index cfc803dae6..fdee1c48a7 100644 --- a/application/basilisk/branding/shared/uaoverrides.inc +++ b/application/basilisk/branding/shared/uaoverrides.inc @@ -1,38 +1,39 @@ -#define GUAO_PREF general.useragent.override - -#define GRE_VERSION @MOZILLA_UAVERSION_U@ -#define GRE_VERSION_SLICE Goanna/@GRE_VERSION@ -#define GRE_DATE_SLICE Goanna/20170101 -#define APP_SLICE Basilisk/@MOZ_APP_VERSION@ - -#define GK_VERSION 52.9 -#define GK_SLICE Gecko/20100101 -#define FX_SLICE Firefox/@GK_VERSION@ - +#define GUAO_PREF general.useragent.override + +#define GRE_VERSION @MOZILLA_UAVERSION_U@ +#define GRE_VERSION_SLICE Goanna/@GRE_VERSION@ +#define GRE_DATE_SLICE Goanna/20170101 +#define APP_SLICE Basilisk/@MOZ_APP_VERSION@ + +#define GK_VERSION 52.9 +#define GK_SLICE Gecko/20100101 +#define FX_SLICE Firefox/@GK_VERSION@ + // %OS_SLICE% macro is resolved at runtime, see MoonchildProductions/UXP#1473 - -// Mozilla overrides + +// Mozilla overrides pref("@GUAO_PREF@.accounts.firefox.com", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@"); pref("@GUAO_PREF@.addons.mozilla.org", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@"); - -// Required for domains that have proven unresponsive to requests from users + +// Required for domains that have proven unresponsive to requests from users pref("@GUAO_PREF@.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:62.0) @GK_SLICE@ Firefox/62.0 @APP_SLICE@"); pref("@GUAO_PREF@.gaming.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:62.0) @GK_SLICE@ Firefox/62.0"); +pref("@GUAO_PREF@.studio.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:71.0) @GK_SLICE@ Firefox/71.0 @APP_SLICE@"); pref("@GUAO_PREF@.netflix.com","Mozilla/5.0 (%OS_SLICE% rv:42.0) @GK_SLICE@ Firefox/42.0 @APP_SLICE@"); - -// The never-ending Facebook debacle... - -// UA-Sniffing domains below are pending responses from their operators - temp workaround -// Daily motion only likes strict Firefox UAs + +// The never-ending Facebook debacle... + +// UA-Sniffing domains below are pending responses from their operators - temp workaround +// Daily motion only likes strict Firefox UAs pref("@GUAO_PREF@.dailymotion.com","Mozilla/5.0 (%OS_SLICE% rv:52.0) @GK_SLICE@ Firefox/52.0"); - -// The following requires native mode. Or it blocks.. "too old firefox", breakage, etc. - -// UA-Sniffing domains below have indicated no interest in supporting Pale Moon (BOO!) + +// The following requires native mode. Or it blocks.. "too old firefox", breakage, etc. + +// UA-Sniffing domains below have indicated no interest in supporting Pale Moon (BOO!) pref("@GUAO_PREF@.whatsapp.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0"); - -// UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon - -// The following domains do not like the Goanna slice + +// UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon + +// The following domains do not like the Goanna slice pref("@GUAO_PREF@.hitbox.tv","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@"); pref("@GUAO_PREF@.yuku.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@"); From 9afad4faa905209922b24874fb2b41d169b07f09 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 13 Jan 2021 02:27:31 +0000 Subject: [PATCH 16/16] [Basilisk] [Tabbed browser] Pref detach&tear-off of tabs. See MoonchildProductions/Pale-Moon#1845 --- application/basilisk/app/profile/basilisk.js | 4 ++++ application/basilisk/base/content/tabbrowser.xml | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/application/basilisk/app/profile/basilisk.js b/application/basilisk/app/profile/basilisk.js index ac55e21308..198d9d41c4 100644 --- a/application/basilisk/app/profile/basilisk.js +++ b/application/basilisk/app/profile/basilisk.js @@ -414,6 +414,10 @@ pref("browser.tabs.delayHidingAudioPlayingIconMS", 3000); pref("browser.tabs.dontfocusfordialogs", true); +// Whether dragging a tab off the tab bar to tear it off into its own +// window is enabled. +pref("browser.tabs.allowTabDetach", true); + pref("browser.ctrlTab.previews", false); // By default, do not export HTML at shutdown. diff --git a/application/basilisk/base/content/tabbrowser.xml b/application/basilisk/base/content/tabbrowser.xml index 02bccc477c..17ca983c58 100644 --- a/application/basilisk/base/content/tabbrowser.xml +++ b/application/basilisk/base/content/tabbrowser.xml @@ -6373,6 +6373,11 @@ return; } + // Check if tab detaching is enabled + if (!Services.prefs.getBoolPref("browser.tabs.allowTabDetach")) { + return; + } + // Disable detach within the browser toolbox var eX = event.screenX; var eY = event.screenY;