Bug 1696721 part 3 - Fix intrinsic isize calculation for ruby frame. r=dholbert

Differential Revision: https://phabricator.services.mozilla.com/D109228
This commit is contained in:
Xidorn Quan 2021-03-23 10:26:17 +00:00
parent 91de536124
commit 735ba70f94
3 changed files with 116 additions and 6 deletions

View File

@ -16,6 +16,7 @@
#include "mozilla/WritingModes.h" #include "mozilla/WritingModes.h"
#include "nsLineLayout.h" #include "nsLineLayout.h"
#include "nsPresContext.h" #include "nsPresContext.h"
#include "nsContainerFrameInlines.h"
#include "nsRubyBaseContainerFrame.h" #include "nsRubyBaseContainerFrame.h"
#include "nsRubyTextContainerFrame.h" #include "nsRubyTextContainerFrame.h"
@ -59,23 +60,25 @@ nsresult nsRubyFrame::GetFrameName(nsAString& aResult) const {
/* virtual */ /* virtual */
void nsRubyFrame::AddInlineMinISize(gfxContext* aRenderingContext, void nsRubyFrame::AddInlineMinISize(gfxContext* aRenderingContext,
nsIFrame::InlineMinISizeData* aData) { nsIFrame::InlineMinISizeData* aData) {
for (nsIFrame* frame = this; frame; frame = frame->GetNextInFlow()) { auto handleChildren = [aRenderingContext](auto frame, auto data) {
for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd(); for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd();
e.Next()) { e.Next()) {
e.GetBaseContainer()->AddInlineMinISize(aRenderingContext, aData); e.GetBaseContainer()->AddInlineMinISize(aRenderingContext, data);
} }
} };
DoInlineIntrinsicISize(aData, handleChildren);
} }
/* virtual */ /* virtual */
void nsRubyFrame::AddInlinePrefISize(gfxContext* aRenderingContext, void nsRubyFrame::AddInlinePrefISize(gfxContext* aRenderingContext,
nsIFrame::InlinePrefISizeData* aData) { nsIFrame::InlinePrefISizeData* aData) {
for (nsIFrame* frame = this; frame; frame = frame->GetNextInFlow()) { auto handleChildren = [aRenderingContext](auto frame, auto data) {
for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd(); for (RubySegmentEnumerator e(static_cast<nsRubyFrame*>(frame)); !e.AtEnd();
e.Next()) { e.Next()) {
e.GetBaseContainer()->AddInlinePrefISize(aRenderingContext, aData); e.GetBaseContainer()->AddInlinePrefISize(aRenderingContext, data);
} }
} };
DoInlineIntrinsicISize(aData, handleChildren);
aData->mLineIsEmpty = false; aData->mLineIsEmpty = false;
} }

View File

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>Intrinsic ISize calculation of ruby</title>
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
<style>
.ruby {
border-left: 5px solid blue;
border-right: 10px solid blue;
padding: 0 20px 0 10px;
margin: 0 10px 0 20px;
}
div {
display: inline-block;
border: 1px solid black;
font-kerning: none; /* disable kerning, because in the reference file
it might occur across <span> boundaries */
}
.ruby > span {
white-space: nowrap;
}
</style>
<div style="width: min-content">
<span class="ruby"><span>ABC</span><span>DEF</span></span>
</div>
<div style="width: max-content">
<span class="ruby"><span>ABC</span><span>DEF</span></span>
</div>
<br>
<div style="width: min-content">
XYZ<span class="ruby"><span>ABC</span><span>DEF</span></span>XYZ
</div>
<div style="width: max-content">
XYZ<span class="ruby"><span>ABC</span><span>DEF</span></span>XYZ
</div>
<br>
<div style="width: min-content">
<span class="ruby"><span>あい</span><span>うえ</span></span>
</div>
<div style="width: max-content">
<span class="ruby"><span>あい</span><span>うえ</span></span>
</div>
<br>
<div style="width: min-content">
<span class="ruby"><span>あい</span><span>うえ</span></span>
</div>
<div style="width: max-content">
<span class="ruby"><span>あい</span><span>うえ</span></span>
</div>
<br>

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>Intrinsic ISize calculation of ruby</title>
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#line-breaks">
<link rel="match" href="ruby-intrinsic-isize-003-ref.html">
<style>
ruby {
border-left: 5px solid blue;
border-right: 10px solid blue;
padding: 0 20px 0 10px;
margin: 0 10px 0 20px;
}
div {
display: inline-block;
border: 1px solid black;
font-kerning: none; /* disable kerning, because in the reference file
it might occur across <span> boundaries */
}
</style>
<div style="width: min-content">
<ruby><rb>ABC<rb>DEF</ruby>
</div>
<div style="width: max-content">
<ruby><rb>ABC<rb>DEF</ruby>
</div>
<br>
<div style="width: min-content">
XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ
</div>
<div style="width: max-content">
XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ
</div>
<br>
<div style="width: min-content">
<ruby><rb>あい<rb>うえ</ruby>
</div>
<div style="width: max-content">
<ruby><rb>あい<rb>うえ</ruby>
</div>
<br>
<div style="width: min-content">
<ruby><rb>あい<rb>うえ</ruby>
</div>
<div style="width: max-content">
<ruby><rb>あい<rb>うえ</ruby>
</div>
<br>