CSS: inline-block with a display:block <input> child element has a wrong baseline (HTML forms)

This commit is contained in:
janekptacijarabaci 2017-08-17 21:08:44 +02:00 committed by Roy Tam
commit 67a10f51a0
20 changed files with 990 additions and 29 deletions

View file

@ -5,26 +5,22 @@
#include "nsFieldSetFrame.h"
#include "mozilla/gfx/2D.h"
#include "nsCSSAnonBoxes.h"
#include "nsLayoutUtils.h"
#include "nsLegendFrame.h"
#include "nsCSSRendering.h"
#include <algorithm>
#include "nsIFrame.h"
#include "nsPresContext.h"
#include "mozilla/RestyleManager.h"
#include "nsGkAtoms.h"
#include "nsStyleConsts.h"
#include "nsDisplayList.h"
#include "nsRenderingContext.h"
#include "nsIScrollableFrame.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/Likely.h"
#include "mozilla/Maybe.h"
#include "nsCSSAnonBoxes.h"
#include "nsCSSRendering.h"
#include "nsDisplayList.h"
#include "nsGkAtoms.h"
#include "nsIFrameInlines.h"
#include "nsLayoutUtils.h"
#include "nsLegendFrame.h"
#include "nsRenderingContext.h"
#include "nsStyleConsts.h"
using namespace mozilla;
using namespace mozilla::gfx;
using namespace mozilla::image;
using namespace mozilla::layout;
nsContainerFrame*
@ -126,7 +122,7 @@ void
nsDisplayFieldSetBorderBackground::Paint(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx)
{
DrawResult result = static_cast<nsFieldSetFrame*>(mFrame)->
image::DrawResult result = static_cast<nsFieldSetFrame*>(mFrame)->
PaintBorder(aBuilder, *aCtx, ToReferenceFrame(), mVisibleRect);
nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
@ -210,7 +206,7 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
contentDisplayItems.MoveTo(aLists);
}
DrawResult
image::DrawResult
nsFieldSetFrame::PaintBorder(
nsDisplayListBuilder* aBuilder,
nsRenderingContext& aRenderingContext,
@ -695,9 +691,50 @@ nsFieldSetFrame::AccessibleType()
#endif
nscoord
nsFieldSetFrame::GetLogicalBaseline(WritingMode aWritingMode) const
nsFieldSetFrame::GetLogicalBaseline(WritingMode aWM) const
{
switch (StyleDisplay()->mDisplay) {
case mozilla::StyleDisplay::Grid:
case mozilla::StyleDisplay::InlineGrid:
case mozilla::StyleDisplay::Flex:
case mozilla::StyleDisplay::InlineFlex:
return BaselineBOffset(aWM, BaselineSharingGroup::eFirst,
AlignmentContext::eInline);
default:
return BSize(aWM) - BaselineBOffset(aWM, BaselineSharingGroup::eLast,
AlignmentContext::eInline);
}
}
bool
nsFieldSetFrame::GetVerticalAlignBaseline(WritingMode aWM,
nscoord* aBaseline) const
{
nsIFrame* inner = GetInner();
return inner->BStart(aWritingMode, GetParent()->GetSize()) +
inner->GetLogicalBaseline(aWritingMode);
MOZ_ASSERT(!inner->GetWritingMode().IsOrthogonalTo(aWM));
if (!inner->GetVerticalAlignBaseline(aWM, aBaseline)) {
return false;
}
nscoord innerBStart = inner->BStart(aWM, GetSize());
*aBaseline += innerBStart;
return true;
}
bool
nsFieldSetFrame::GetNaturalBaselineBOffset(WritingMode aWM,
BaselineSharingGroup aBaselineGroup,
nscoord* aBaseline) const
{
nsIFrame* inner = GetInner();
MOZ_ASSERT(!inner->GetWritingMode().IsOrthogonalTo(aWM));
if (!inner->GetNaturalBaselineBOffset(aWM, aBaselineGroup, aBaseline)) {
return false;
}
nscoord innerBStart = inner->BStart(aWM, GetSize());
if (aBaselineGroup == BaselineSharingGroup::eFirst) {
*aBaseline += innerBStart;
} else {
*aBaseline += BSize(aWM) - (innerBStart + inner->BSize(aWM));
}
return true;
}