summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-07-24 12:31:32 +0000
committerMoonchild <moonchild@palemoon.org>2022-07-24 17:25:36 +0000
commit071412ab291a9f6181780dd0e5e2316c4a292a7c (patch)
tree7bdd92955ce024d07f3ad13422f011a43d2b035e
parent5487515bcab438ae29fa6342583b8b5c5bde6b92 (diff)
downloaduxp-071412ab291a9f6181780dd0e5e2316c4a292a7c.tar.gz
Issue #1970 - Part 7: Restore proper spacing in select for CJK/asian1970-form-focusring-styling
The issue is that select elements may contain some non-Latin characters that need extra block-size to display than the one line-height calculated by using a Latin font spec in the style. Before this patch, when a control has an unconstrained block-size, we set the element's block-size to one line-height in Reflow(), which is intended to properly initialize `BlockReflowInput::mMinLineHeight` since it uses `line-height:-moz-block-height`. However, this simply prevents the display from choosing a larger block-size after the reflow occurs. Previously, this discrepancy was absorbed by the extra padding present to make select elements the same intrinsic size as buttons, but since we did away with that, we're losing the extra space and the font glyphs get clipped. This patch fixes the issue by carrying the computed line height over to the element's display so that its computed block-size is still unconstrained. This way it can accommodate taller characters in the display text. After this patch, a <select><option> containing non-Latin characters should have the same block-size as <button>, and no characters should be clipped.
-rw-r--r--layout/forms/nsComboboxControlFrame.cpp3
-rw-r--r--layout/forms/test/test_issue1970_manual.html35
-rw-r--r--layout/generic/ReflowInput.cpp11
-rw-r--r--layout/generic/ReflowInput.h5
4 files changed, 53 insertions, 1 deletions
diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp
index 459c6f7ecc..2d0395d7a1 100644
--- a/layout/forms/nsComboboxControlFrame.cpp
+++ b/layout/forms/nsComboboxControlFrame.cpp
@@ -1322,7 +1322,8 @@ nsComboboxDisplayFrame::Reflow(nsPresContext* aPresContext,
// Note that the only way we can have a computed block size here is
// if the combobox had a specified block size. If it didn't, size
// based on what our rows look like, for lack of anything better.
- state.SetComputedBSize(mComboBox->mListControlFrame->GetBSizeOfARow());
+ //state.SetComputedBSize(mComboBox->mListControlFrame->GetBSizeOfARow());
+ state.SetLineHeight(state.mParentReflowInput->GetLineHeight());
}
WritingMode wm = aReflowInput.GetWritingMode();
nscoord computedISize = mComboBox->mDisplayISize -
diff --git a/layout/forms/test/test_issue1970_manual.html b/layout/forms/test/test_issue1970_manual.html
new file mode 100644
index 0000000000..223c6e845d
--- /dev/null
+++ b/layout/forms/test/test_issue1970_manual.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<style>
+.fontA {
+ font-family: "Noto Sans";
+}
+.fontB {
+ font-family: "Noto Sans CJK TC";
+}
+.fontC {
+ font-family: "WenQuanYi Zen Hei";
+}
+</style>
+</head>
+<body>
+<p>No clipping of the font glyphs should occur.</p>
+<select>
+ <option>Latin Text jpg</option>
+</select>
+<select>
+ <option>漢字 jpg</option>
+</select>
+<select class="fontA">
+ <option>漢字 jpg</option>
+</select>
+<select class="fontB">
+ <option>漢字 jpg</option>
+</select>
+<select class="fontC">
+ <option>漢字 jpg</option>
+</select>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp
index f308ebcdf5..01f36cc9db 100644
--- a/layout/generic/ReflowInput.cpp
+++ b/layout/generic/ReflowInput.cpp
@@ -2813,6 +2813,17 @@ nscoord ReflowInput::GetLineHeight() const {
nsLayoutUtils::FontSizeInflationFor(mFrame));
}
+void ReflowInput::SetLineHeight(nscoord aLineHeight) {
+ MOZ_ASSERT(aLineHeight >= 0, "aLineHeight must be >= 0!");
+
+ if (mLineHeight != aLineHeight) {
+ mLineHeight = aLineHeight;
+ // Setting used line height can change a frame's block-size if mFrame's
+ // block-size behaves as auto.
+ InitResizeFlags(mFrame->PresContext(), mFrame->GetType());
+ }
+}
+
/* static */ nscoord
ReflowInput::CalcLineHeight(nsIContent* aContent,
nsStyleContext* aStyleContext,
diff --git a/layout/generic/ReflowInput.h b/layout/generic/ReflowInput.h
index d8e0518399..a70549d8eb 100644
--- a/layout/generic/ReflowInput.h
+++ b/layout/generic/ReflowInput.h
@@ -747,6 +747,11 @@ public:
* Get the used line-height property. The return value will be >= 0.
*/
nscoord GetLineHeight() const;
+
+ /**
+ * Set the used line-height. aLineHeight must be >= 0.
+ */
+ void SetLineHeight(nscoord aLineHeight);
/**
* Calculate the used line-height property without a reflow input instance.