From 60c344a56bc6123dae5219169ccf56b654612c9e Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Thu, 2 Feb 2023 15:45:53 +0800 Subject: [PATCH] Issue #2104 - Part 1: Implement "clip" attribute value for XUL string cropping This implements the "clip" attribute value for the "crop" attribute found in XUL label elements. It functions similarly to having the text-overflow property set to an empty string or "". This shouldn't break previously established behavior as it only adds a new value to be checked. The behavior of the "none" attribute value in the documentation (https://udn.realityripple.com/docs/Archive/Mozilla/XUL/Attribute/crop) is incorrect. The "none" attribute value literally means "don't crop anything" if you'd check the code and is also equivalent to not setting the "crop" attribute at all. This has always been the case since Firefox 2 (earliest version I checked) and apparently, this section of the documentation was copied verbatim from XULPlanet without even checking if it's correct. --- layout/xul/nsTextBoxFrame.cpp | 11 +++++++++-- layout/xul/nsTextBoxFrame.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/layout/xul/nsTextBoxFrame.cpp b/layout/xul/nsTextBoxFrame.cpp index e1650e0d00..4c420f9323 100644 --- a/layout/xul/nsTextBoxFrame.cpp +++ b/layout/xul/nsTextBoxFrame.cpp @@ -230,7 +230,8 @@ nsTextBoxFrame::UpdateAttributes(nsIAtom* aAttribute, if (aAttribute == nullptr || aAttribute == nsGkAtoms::crop) { static nsIContent::AttrValuesArray strings[] = {&nsGkAtoms::left, &nsGkAtoms::start, &nsGkAtoms::center, - &nsGkAtoms::right, &nsGkAtoms::end, &nsGkAtoms::none, nullptr}; + &nsGkAtoms::right, &nsGkAtoms::end, &nsGkAtoms::none, + &nsGkAtoms::clip, nullptr}; CroppingStyle cropType; switch (mContent->FindAttrValueIn(kNameSpaceID_None, nsGkAtoms::crop, strings, eCaseMatters)) { @@ -248,6 +249,9 @@ nsTextBoxFrame::UpdateAttributes(nsIAtom* aAttribute, case 5: cropType = CropNone; break; + case 6: + cropType = CropClip; + break; default: cropType = CropAuto; break; @@ -647,7 +651,9 @@ nsTextBoxFrame::CalculateTitleForWidth(nsRenderingContext& aRenderingContext, } const nsDependentString& kEllipsis = nsContentUtils::GetLocalizedEllipsis(); - if (mCropType != CropNone) { + if (mCropType == CropClip) { + mCroppedTitle.Truncate(); + } else if (mCropType != CropNone) { // start with an ellipsis mCroppedTitle.Assign(kEllipsis); @@ -681,6 +687,7 @@ nsTextBoxFrame::CalculateTitleForWidth(nsRenderingContext& aRenderingContext, case CropAuto: case CropNone: case CropRight: + case CropClip: { ClusterIterator iter(mTitle.Data(), mTitle.Length()); const char16_t* dataBegin = iter; diff --git a/layout/xul/nsTextBoxFrame.h b/layout/xul/nsTextBoxFrame.h index e12b97b32d..4ca4013c4b 100644 --- a/layout/xul/nsTextBoxFrame.h +++ b/layout/xul/nsTextBoxFrame.h @@ -25,7 +25,7 @@ public: NS_IMETHOD DoXULLayout(nsBoxLayoutState& aBoxLayoutState) override; virtual void MarkIntrinsicISizesDirty() override; - enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter, CropAuto }; + enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter, CropClip, CropAuto }; friend nsIFrame* NS_NewTextBoxFrame(nsIPresShell* aPresShell, nsStyleContext* aContext);