mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 261037. Support scrolled fieldsets. r=mats
--HG-- extra : rebase_source : 248521189921b2a46f0805582a3789b27c26ecbd
This commit is contained in:
parent
33d1e614b3
commit
201d29edb6
@ -502,8 +502,8 @@ Element::GetScrollFrame(nsIFrame **aStyledFrame, bool aFlushLayout)
|
||||
|
||||
// menu frames implement GetScrollTargetFrame but we don't want
|
||||
// to use it here. Similar for comboboxes.
|
||||
if (frame->GetType() != nsGkAtoms::menuFrame &&
|
||||
frame->GetType() != nsGkAtoms::comboboxControlFrame) {
|
||||
nsIAtom* type = frame->GetType();
|
||||
if (type != nsGkAtoms::menuFrame && type != nsGkAtoms::comboboxControlFrame) {
|
||||
nsIScrollableFrame *scrollFrame = frame->GetScrollTargetFrame();
|
||||
if (scrollFrame)
|
||||
return scrollFrame;
|
||||
|
@ -3050,39 +3050,50 @@ nsCSSFrameConstructor::ConstructFieldSetFrame(nsFrameConstructorState& aState,
|
||||
nsIContent* const content = aItem.mContent;
|
||||
nsStyleContext* const styleContext = aItem.mStyleContext;
|
||||
|
||||
nsIFrame* newFrame = NS_NewFieldSetFrame(mPresShell, styleContext);
|
||||
nsIFrame* fieldsetFrame = NS_NewFieldSetFrame(mPresShell, styleContext);
|
||||
|
||||
// Initialize it
|
||||
InitAndRestoreFrame(aState, content,
|
||||
aState.GetGeometricParent(aStyleDisplay, aParentFrame),
|
||||
newFrame);
|
||||
fieldsetFrame);
|
||||
|
||||
// Resolve style and initialize the frame
|
||||
nsRefPtr<nsStyleContext> fieldsetContentStyle;
|
||||
fieldsetContentStyle = mPresShell->StyleSet()->
|
||||
ResolveAnonymousBoxStyle(nsCSSAnonBoxes::fieldsetContent, styleContext);
|
||||
|
||||
const nsStyleDisplay* fieldsetContentDisplay = fieldsetContentStyle->StyleDisplay();
|
||||
bool isScrollable = fieldsetContentDisplay->IsScrollableOverflow();
|
||||
nsIFrame* scrollFrame = nullptr;
|
||||
if (isScrollable) {
|
||||
fieldsetContentStyle =
|
||||
BeginBuildingScrollFrame(aState, content, fieldsetContentStyle,
|
||||
fieldsetFrame, nsCSSAnonBoxes::scrolledContent,
|
||||
false, scrollFrame);
|
||||
}
|
||||
|
||||
nsIFrame* blockFrame = NS_NewBlockFrame(mPresShell, fieldsetContentStyle,
|
||||
NS_BLOCK_FLOAT_MGR |
|
||||
NS_BLOCK_MARGIN_ROOT);
|
||||
InitAndRestoreFrame(aState, content, newFrame, blockFrame);
|
||||
InitAndRestoreFrame(aState, content,
|
||||
scrollFrame ? scrollFrame : fieldsetFrame, blockFrame);
|
||||
|
||||
aState.AddChild(newFrame, aFrameItems, content, styleContext, aParentFrame);
|
||||
aState.AddChild(fieldsetFrame, aFrameItems, content, styleContext, aParentFrame);
|
||||
|
||||
// Process children
|
||||
nsFrameConstructorSaveState absoluteSaveState;
|
||||
nsFrameItems childItems;
|
||||
|
||||
newFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
|
||||
if (newFrame->IsPositioned()) {
|
||||
aState.PushAbsoluteContainingBlock(newFrame, newFrame, absoluteSaveState);
|
||||
blockFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
|
||||
if (fieldsetFrame->IsPositioned()) {
|
||||
aState.PushAbsoluteContainingBlock(blockFrame, fieldsetFrame, absoluteSaveState);
|
||||
}
|
||||
|
||||
ProcessChildren(aState, content, styleContext, blockFrame, true,
|
||||
childItems, true, aItem.mPendingBinding);
|
||||
|
||||
nsFrameItems fieldsetKids;
|
||||
fieldsetKids.AddChild(blockFrame);
|
||||
fieldsetKids.AddChild(scrollFrame ? scrollFrame : blockFrame);
|
||||
|
||||
for (nsFrameList::Enumerator e(childItems); !e.AtEnd(); e.Next()) {
|
||||
nsIFrame* child = e.get();
|
||||
@ -3094,21 +3105,25 @@ nsCSSFrameConstructor::ConstructFieldSetFrame(nsFrameConstructorState& aState,
|
||||
// GetAdjustedParentFrame() below depends on this frame order.
|
||||
childItems.RemoveFrame(child);
|
||||
// Make sure to reparent the legend so it has the fieldset as the parent.
|
||||
fieldsetKids.InsertFrame(newFrame, nullptr, child);
|
||||
fieldsetKids.InsertFrame(fieldsetFrame, nullptr, child);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isScrollable) {
|
||||
FinishBuildingScrollFrame(scrollFrame, blockFrame);
|
||||
}
|
||||
|
||||
// Set the inner frame's initial child lists
|
||||
blockFrame->SetInitialChildList(kPrincipalList, childItems);
|
||||
|
||||
// Set the outer frame's initial child list
|
||||
newFrame->SetInitialChildList(kPrincipalList, fieldsetKids);
|
||||
fieldsetFrame->SetInitialChildList(kPrincipalList, fieldsetKids);
|
||||
|
||||
newFrame->AddStateBits(NS_FRAME_MAY_HAVE_GENERATED_CONTENT);
|
||||
fieldsetFrame->AddStateBits(NS_FRAME_MAY_HAVE_GENERATED_CONTENT);
|
||||
|
||||
// Our new frame returned is the outer frame, which is the fieldset frame.
|
||||
return newFrame;
|
||||
return fieldsetFrame;
|
||||
}
|
||||
|
||||
static nsIFrame*
|
||||
@ -3262,6 +3277,17 @@ nsCSSFrameConstructor::FindDataByTag(nsIAtom* aTag,
|
||||
#define COMPLEX_TAG_CREATE(_tag, _func) \
|
||||
{ &nsGkAtoms::_tag, FULL_CTOR_FCDATA(0, _func) }
|
||||
|
||||
static bool
|
||||
IsFrameForFieldSet(nsIFrame* aFrame, nsIAtom* aFrameType)
|
||||
{
|
||||
nsIAtom* pseudo = aFrame->StyleContext()->GetPseudo();
|
||||
if (pseudo == nsCSSAnonBoxes::fieldsetContent ||
|
||||
pseudo == nsCSSAnonBoxes::scrolledContent) {
|
||||
return IsFrameForFieldSet(aFrame->GetParent(), aFrame->GetParent()->GetType());
|
||||
}
|
||||
return aFrameType == nsGkAtoms::fieldSetFrame;
|
||||
}
|
||||
|
||||
/* static */
|
||||
const nsCSSFrameConstructor::FrameConstructionData*
|
||||
nsCSSFrameConstructor::FindHTMLData(Element* aElement,
|
||||
@ -3284,9 +3310,7 @@ nsCSSFrameConstructor::FindHTMLData(Element* aElement,
|
||||
"Unexpected parent for fieldset content anon box");
|
||||
if (aTag == nsGkAtoms::legend &&
|
||||
(!aParentFrame ||
|
||||
(aParentFrame->GetType() != nsGkAtoms::fieldSetFrame &&
|
||||
aParentFrame->StyleContext()->GetPseudo() !=
|
||||
nsCSSAnonBoxes::fieldsetContent) ||
|
||||
!IsFrameForFieldSet(aParentFrame, aParentFrame->GetType()) ||
|
||||
!aElement->GetParent() ||
|
||||
!aElement->GetParent()->IsHTML(nsGkAtoms::fieldset) ||
|
||||
aStyleContext->StyleDisplay()->IsFloatingStyle() ||
|
||||
@ -5919,13 +5943,8 @@ nsCSSFrameConstructor::IsValidSibling(nsIFrame* aSibling,
|
||||
{
|
||||
nsIFrame* parentFrame = aSibling->GetParent();
|
||||
nsIAtom* parentType = nullptr;
|
||||
nsIAtom* grandparentType = nullptr;
|
||||
if (parentFrame) {
|
||||
parentType = parentFrame->GetType();
|
||||
nsIFrame* grandparentFrame = parentFrame->GetParent();
|
||||
if (grandparentFrame) {
|
||||
grandparentType = grandparentFrame->GetType();
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t siblingDisplay = aSibling->GetDisplay();
|
||||
@ -5984,9 +6003,7 @@ nsCSSFrameConstructor::IsValidSibling(nsIFrame* aSibling,
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (nsGkAtoms::fieldSetFrame == parentType ||
|
||||
(nsGkAtoms::fieldSetFrame == grandparentType &&
|
||||
nsGkAtoms::blockFrame == parentType)) {
|
||||
else if (IsFrameForFieldSet(parentFrame, parentType)) {
|
||||
// Legends can be sibling of legends but not of other content in the fieldset
|
||||
nsIAtom* sibType = aSibling->GetContentInsertionFrame()->GetType();
|
||||
bool legendContent = aContent->IsHTML(nsGkAtoms::legend);
|
||||
@ -7083,7 +7100,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer,
|
||||
// fieldsets have multiple insertion points.
|
||||
NS_ASSERTION(isSingleInsert || frameType != nsGkAtoms::fieldSetFrame,
|
||||
"Unexpected parent");
|
||||
if (frameType == nsGkAtoms::fieldSetFrame &&
|
||||
if (IsFrameForFieldSet(parentFrame, frameType) &&
|
||||
aStartChild->Tag() == nsGkAtoms::legend) {
|
||||
// Just reframe the parent, since figuring out whether this
|
||||
// should be the new legend and then handling it is too complex.
|
||||
|
@ -2825,7 +2825,8 @@ static int32_t gNoiseIndent = 0;
|
||||
/* static */ nscoord
|
||||
nsLayoutUtils::IntrinsicForContainer(nsRenderingContext *aRenderingContext,
|
||||
nsIFrame *aFrame,
|
||||
IntrinsicWidthType aType)
|
||||
IntrinsicWidthType aType,
|
||||
uint32_t aFlags)
|
||||
{
|
||||
NS_PRECONDITION(aFrame, "null frame");
|
||||
NS_PRECONDITION(aType == MIN_WIDTH || aType == PREF_WIDTH, "bad type");
|
||||
@ -2919,15 +2920,17 @@ nsLayoutUtils::IntrinsicForContainer(nsRenderingContext *aRenderingContext,
|
||||
// fall through
|
||||
}
|
||||
case NS_STYLE_BOX_SIZING_PADDING: {
|
||||
const nsStylePadding* stylePadding = aFrame->StylePadding();
|
||||
nscoord pad;
|
||||
if (GetAbsoluteCoord(stylePadding->mPadding.GetTop(), pad) ||
|
||||
GetPercentHeight(stylePadding->mPadding.GetTop(), aFrame, pad)) {
|
||||
heightTakenByBoxSizing += pad;
|
||||
}
|
||||
if (GetAbsoluteCoord(stylePadding->mPadding.GetBottom(), pad) ||
|
||||
GetPercentHeight(stylePadding->mPadding.GetBottom(), aFrame, pad)) {
|
||||
heightTakenByBoxSizing += pad;
|
||||
if (!(aFlags & IGNORE_PADDING)) {
|
||||
const nsStylePadding* stylePadding = aFrame->StylePadding();
|
||||
nscoord pad;
|
||||
if (GetAbsoluteCoord(stylePadding->mPadding.GetTop(), pad) ||
|
||||
GetPercentHeight(stylePadding->mPadding.GetTop(), aFrame, pad)) {
|
||||
heightTakenByBoxSizing += pad;
|
||||
}
|
||||
if (GetAbsoluteCoord(stylePadding->mPadding.GetBottom(), pad) ||
|
||||
GetPercentHeight(stylePadding->mPadding.GetBottom(), aFrame, pad)) {
|
||||
heightTakenByBoxSizing += pad;
|
||||
}
|
||||
}
|
||||
// fall through
|
||||
}
|
||||
@ -2978,18 +2981,22 @@ nsLayoutUtils::IntrinsicForContainer(nsRenderingContext *aRenderingContext,
|
||||
// percentages do not operate linearly.
|
||||
// Doing this is ok because although percentages aren't handled
|
||||
// linearly, they are handled monotonically.
|
||||
nscoord coordOutsideWidth = offsets.hPadding;
|
||||
float pctOutsideWidth = offsets.hPctPadding;
|
||||
|
||||
nscoord coordOutsideWidth = 0;
|
||||
float pctOutsideWidth = 0;
|
||||
float pctTotal = 0.0f;
|
||||
|
||||
if (boxSizing == NS_STYLE_BOX_SIZING_PADDING) {
|
||||
min += coordOutsideWidth;
|
||||
result = NSCoordSaturatingAdd(result, coordOutsideWidth);
|
||||
pctTotal += pctOutsideWidth;
|
||||
if (!(aFlags & IGNORE_PADDING)) {
|
||||
coordOutsideWidth += offsets.hPadding;
|
||||
pctOutsideWidth += offsets.hPctPadding;
|
||||
|
||||
coordOutsideWidth = 0;
|
||||
pctOutsideWidth = 0.0f;
|
||||
if (boxSizing == NS_STYLE_BOX_SIZING_PADDING) {
|
||||
min += coordOutsideWidth;
|
||||
result = NSCoordSaturatingAdd(result, coordOutsideWidth);
|
||||
pctTotal += pctOutsideWidth;
|
||||
|
||||
coordOutsideWidth = 0;
|
||||
pctOutsideWidth = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
coordOutsideWidth += offsets.hBorder;
|
||||
|
@ -988,9 +988,13 @@ public:
|
||||
* and margin.
|
||||
*/
|
||||
enum IntrinsicWidthType { MIN_WIDTH, PREF_WIDTH };
|
||||
enum {
|
||||
IGNORE_PADDING = 0x01
|
||||
};
|
||||
static nscoord IntrinsicForContainer(nsRenderingContext* aRenderingContext,
|
||||
nsIFrame* aFrame,
|
||||
IntrinsicWidthType aType);
|
||||
IntrinsicWidthType aType,
|
||||
uint32_t aFlags = 0);
|
||||
|
||||
/*
|
||||
* Convert nsStyleCoord to nscoord when percentages depend on the
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "nsStyleConsts.h"
|
||||
#include "nsDisplayList.h"
|
||||
#include "nsRenderingContext.h"
|
||||
#include "nsIScrollableFrame.h"
|
||||
#include "mozilla/Likely.h"
|
||||
|
||||
using namespace mozilla;
|
||||
@ -78,6 +79,10 @@ public:
|
||||
return nsContainerFrame::IsFrameOfType(aFlags &
|
||||
~nsIFrame::eCanContainOverflowContainers);
|
||||
}
|
||||
virtual nsIScrollableFrame* GetScrollTargetFrame() MOZ_OVERRIDE
|
||||
{
|
||||
return do_QueryFrame(GetInner());
|
||||
}
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE;
|
||||
@ -356,10 +361,14 @@ nsFieldSetFrame::GetIntrinsicWidth(nsRenderingContext* aRenderingContext,
|
||||
}
|
||||
|
||||
if (nsIFrame* inner = GetInner()) {
|
||||
// Ignore padding on the inner, since the padding will be applied to the
|
||||
// outer instead, and the padding computed for the inner is wrong
|
||||
// for percentage padding.
|
||||
contentWidth =
|
||||
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, inner, aType);
|
||||
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, inner, aType,
|
||||
nsLayoutUtils::IGNORE_PADDING);
|
||||
}
|
||||
|
||||
|
||||
return std::max(legendWidth, contentWidth);
|
||||
}
|
||||
|
||||
@ -444,7 +453,10 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
|
||||
// We don't allow fieldsets to break vertically. If we did, we'd
|
||||
// need logic here to push and pull overflow frames.
|
||||
nsSize availSize(aReflowState.ComputedWidth(), NS_UNCONSTRAINEDSIZE);
|
||||
// Since we're not applying our padding in this frame, we need to add it here
|
||||
// to compute the available width for our children.
|
||||
nsSize availSize(aReflowState.ComputedWidth() + aReflowState.mComputedPadding.LeftRight(),
|
||||
NS_UNCONSTRAINEDSIZE);
|
||||
NS_ASSERTION(!inner ||
|
||||
nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
|
||||
inner,
|
||||
@ -459,8 +471,7 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
"Bogus availSize.width; should be bigger");
|
||||
|
||||
// get our border and padding
|
||||
const nsMargin &borderPadding = aReflowState.mComputedBorderPadding;
|
||||
nsMargin border = borderPadding - aReflowState.mComputedPadding;
|
||||
nsMargin border = aReflowState.mComputedBorderPadding - aReflowState.mComputedPadding;
|
||||
|
||||
// Figure out how big the legend is if there is one.
|
||||
// get the legend's margin
|
||||
@ -481,7 +492,7 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
legendMargin = legend->GetUsedMargin();
|
||||
mLegendRect.width = legendDesiredSize.width + legendMargin.left + legendMargin.right;
|
||||
mLegendRect.height = legendDesiredSize.height + legendMargin.top + legendMargin.bottom;
|
||||
mLegendRect.x = borderPadding.left;
|
||||
mLegendRect.x = 0;
|
||||
mLegendRect.y = 0;
|
||||
|
||||
nscoord oldSpace = mLegendSpace;
|
||||
@ -513,16 +524,22 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
// reflow the content frame only if needed
|
||||
if (reflowInner) {
|
||||
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, inner,
|
||||
availSize);
|
||||
availSize, -1, -1, nsHTMLReflowState::CALLER_WILL_INIT);
|
||||
// Override computed padding, in case it's percentage padding
|
||||
kidReflowState.Init(aPresContext, -1, -1, nullptr,
|
||||
&aReflowState.mComputedPadding);
|
||||
// Our child is "height:100%" but we actually want its height to be reduced
|
||||
// by the amount of content-height the legend is eating up, unless our
|
||||
// height is unconstrained (in which case the child's will be too).
|
||||
if (aReflowState.ComputedHeight() != NS_UNCONSTRAINEDSIZE) {
|
||||
kidReflowState.SetComputedHeight(std::max(0, aReflowState.ComputedHeight() - mLegendSpace));
|
||||
kidReflowState.SetComputedHeight(
|
||||
std::max(0, aReflowState.ComputedHeight() - mLegendSpace));
|
||||
}
|
||||
|
||||
kidReflowState.mComputedMinHeight =
|
||||
std::max(0, aReflowState.mComputedMinHeight - mLegendSpace);
|
||||
if (aReflowState.mComputedMinHeight > 0) {
|
||||
kidReflowState.mComputedMinHeight =
|
||||
std::max(0, aReflowState.mComputedMinHeight - mLegendSpace);
|
||||
}
|
||||
|
||||
if (aReflowState.mComputedMaxHeight != NS_UNCONSTRAINEDSIZE) {
|
||||
kidReflowState.mComputedMaxHeight =
|
||||
@ -533,7 +550,7 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
// Reflow the frame
|
||||
NS_ASSERTION(kidReflowState.mComputedMargin == nsMargin(0,0,0,0),
|
||||
"Margins on anonymous fieldset child not supported!");
|
||||
nsPoint pt(borderPadding.left, borderPadding.top + mLegendSpace);
|
||||
nsPoint pt(border.left, border.top + mLegendSpace);
|
||||
ReflowChild(inner, aPresContext, kidDesiredSize, kidReflowState,
|
||||
pt.x, pt.y, 0, aStatus);
|
||||
|
||||
@ -542,37 +559,45 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
NS_FRAME_TRACE_REFLOW_OUT("FieldSet::Reflow", aStatus);
|
||||
}
|
||||
|
||||
nsRect contentRect(0,0,0,0);
|
||||
nsRect contentRect;
|
||||
if (inner) {
|
||||
// We don't support margins on inner, so our "content rect" is just
|
||||
// its rect.
|
||||
// We don't support margins on inner, so our content rect is just the
|
||||
// inner's border-box.
|
||||
contentRect = inner->GetRect();
|
||||
}
|
||||
|
||||
// use the computed width if the inner content does not fill it
|
||||
if (aReflowState.ComputedWidth() > contentRect.width) {
|
||||
contentRect.width = aReflowState.ComputedWidth();
|
||||
// Our content rect must fill up the available width
|
||||
if (availSize.width > contentRect.width) {
|
||||
contentRect.width = availSize.width;
|
||||
}
|
||||
|
||||
if (legend) {
|
||||
// if the content rect is larger then the legend we can align the legend
|
||||
if (contentRect.width > mLegendRect.width) {
|
||||
// the legend is postioned horizontally within the inner's content rect
|
||||
// (so that padding on the fieldset affects the legend position).
|
||||
nsRect innerContentRect = contentRect;
|
||||
innerContentRect.Deflate(aReflowState.mComputedPadding);
|
||||
// if the inner content rect is larger than the legend, we can align the legend
|
||||
if (innerContentRect.width > mLegendRect.width) {
|
||||
int32_t align = static_cast<nsLegendFrame*>
|
||||
(legend->GetContentInsertionFrame())->GetAlign();
|
||||
|
||||
switch(align) {
|
||||
switch (align) {
|
||||
case NS_STYLE_TEXT_ALIGN_RIGHT:
|
||||
mLegendRect.x = contentRect.width - mLegendRect.width + borderPadding.left;
|
||||
mLegendRect.x = innerContentRect.XMost() - mLegendRect.width;
|
||||
break;
|
||||
case NS_STYLE_TEXT_ALIGN_CENTER:
|
||||
// Note: rounding removed; there doesn't seem to be any need
|
||||
mLegendRect.x = contentRect.width / 2 - mLegendRect.width / 2 + borderPadding.left;
|
||||
mLegendRect.x = innerContentRect.width / 2 - mLegendRect.width / 2 + innerContentRect.x;
|
||||
break;
|
||||
default:
|
||||
mLegendRect.x = innerContentRect.x;
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
// otherwise make place for the legend
|
||||
contentRect.width = mLegendRect.width;
|
||||
mLegendRect.x = innerContentRect.x;
|
||||
innerContentRect.width = mLegendRect.width;
|
||||
contentRect.width = mLegendRect.width + aReflowState.mComputedPadding.LeftRight();
|
||||
}
|
||||
// place the legend
|
||||
nsRect actualLegendRect(mLegendRect);
|
||||
@ -594,16 +619,16 @@ nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
||||
// Return our size and our result
|
||||
if (aReflowState.ComputedHeight() == NS_INTRINSICSIZE) {
|
||||
aDesiredSize.height = mLegendSpace +
|
||||
borderPadding.TopBottom() +
|
||||
contentRect.height;
|
||||
border.TopBottom() +
|
||||
(inner ? inner->GetRect().height : 0);
|
||||
} else {
|
||||
nscoord min = borderPadding.TopBottom() + mLegendRect.height;
|
||||
nscoord min = border.TopBottom() + mLegendRect.height;
|
||||
aDesiredSize.height =
|
||||
aReflowState.ComputedHeight() + borderPadding.TopBottom();
|
||||
aReflowState.ComputedHeight() + aReflowState.mComputedBorderPadding.TopBottom();
|
||||
if (aDesiredSize.height < min)
|
||||
aDesiredSize.height = min;
|
||||
}
|
||||
aDesiredSize.width = contentRect.width + borderPadding.LeftRight();
|
||||
aDesiredSize.width = contentRect.width + border.LeftRight();
|
||||
aDesiredSize.SetOverflowAreasToDesiredBounds();
|
||||
if (legend)
|
||||
ConsiderChildOverflow(aDesiredSize.mOverflowAreas, legend);
|
||||
@ -681,9 +706,6 @@ nsFieldSetFrame::ReparentFrameList(const nsFrameList& aFrameList)
|
||||
nscoord
|
||||
nsFieldSetFrame::GetBaseline() const
|
||||
{
|
||||
// We know inner is a block, so calling GetBaseline() on it will do
|
||||
// the right thing (that being to return the baseline of the last line).
|
||||
nsIFrame* inner = GetInner();
|
||||
NS_ASSERTION(nsLayoutUtils::GetAsBlock(inner), "Unexpected inner");
|
||||
return inner->GetPosition().y + inner->GetBaseline();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html style="height: 100%">
|
||||
<html class="reftest-wait" style="height: 100%">
|
||||
<head>
|
||||
<script>
|
||||
function doIt() {
|
||||
@ -8,10 +8,12 @@
|
||||
"position: absolute; left: 0; right: 0; top: 0; " +
|
||||
"bottom: 0; background: green");
|
||||
document.getElementById("x").appendChild(d);
|
||||
document.documentElement.removeAttribute("class");
|
||||
}
|
||||
window.addEventListener("MozReftestInvalidate", doIt);
|
||||
</script>
|
||||
</head>
|
||||
<body style="height: 100%" onload="doIt()">
|
||||
<body style="height: 100%">
|
||||
<fieldset id="x" style="position: relative; display: table; width: 50%;
|
||||
height: 50%; top: 25%; left: 25%">
|
||||
</fieldset>
|
||||
|
@ -0,0 +1,24 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
fieldset {
|
||||
background:pink;
|
||||
overflow:hidden;
|
||||
height:100px;
|
||||
}
|
||||
legend::after { content:"legend"; }
|
||||
p {
|
||||
background:lime;
|
||||
height:20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<fieldset id="f1"><legend></legend><p></p></fieldset>
|
||||
<br>
|
||||
<fieldset id="f2"><legend></legend><p></p></fieldset>
|
||||
<br>
|
||||
<fieldset id="f3"><legend></legend></fieldset>
|
||||
</body>
|
||||
</html>
|
33
layout/reftests/forms/fieldset/dynamic-legend-scroll-1.html
Normal file
33
layout/reftests/forms/fieldset/dynamic-legend-scroll-1.html
Normal file
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html class="reftest-wait">
|
||||
<head>
|
||||
<style>
|
||||
fieldset {
|
||||
background:pink;
|
||||
overflow:hidden;
|
||||
height:100px;
|
||||
}
|
||||
legend::after { content:"legend"; }
|
||||
p {
|
||||
background:lime;
|
||||
height:20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<fieldset id="f1"><p></p></fieldset>
|
||||
<br>
|
||||
<fieldset id="f2"><p></p></fieldset>
|
||||
<br>
|
||||
<fieldset id="f3"></fieldset>
|
||||
<script>
|
||||
function doTest() {
|
||||
f1.appendChild(document.createElement('legend'));
|
||||
f2.insertBefore(document.createElement('legend'), f2.firstChild);
|
||||
f3.appendChild(document.createElement('legend'));
|
||||
document.documentElement.removeAttribute("class");
|
||||
}
|
||||
window.addEventListener("MozReftestInvalidate", doTest);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
21
layout/reftests/forms/fieldset/fieldset-hidden-1-ref.html
Normal file
21
layout/reftests/forms/fieldset/fieldset-hidden-1-ref.html
Normal file
@ -0,0 +1,21 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="width:200px; height:200px; padding:0">
|
||||
<legend>Legend</legend>
|
||||
<div style="overflow:hidden; height:100%;">
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
</div>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
19
layout/reftests/forms/fieldset/fieldset-hidden-1.html
Normal file
19
layout/reftests/forms/fieldset/fieldset-hidden-1.html
Normal file
@ -0,0 +1,19 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="overflow:hidden; width:200px; height:200px; padding:0">
|
||||
<legend>Legend</legend>
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="width:0; padding:0;">
|
||||
<div style="width:400px; height:200px;"></div>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="padding:50px; float:left;">
|
||||
<div style="width:300px; height:100px;"></div>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,52 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html><head>
|
||||
<meta charset="utf-8">
|
||||
<title>Testcase for bug 261037</title>
|
||||
<style type="text/css">
|
||||
fieldset, div {
|
||||
background:pink;
|
||||
overflow:auto;
|
||||
height:100px;
|
||||
margin:0; padding:0; border:0;
|
||||
}
|
||||
p {
|
||||
background:blue;
|
||||
height:100px;
|
||||
margin:0; padding:0;
|
||||
}
|
||||
.overflow {
|
||||
height:110px;
|
||||
}
|
||||
.abs {
|
||||
position:absolute;
|
||||
width:100px;
|
||||
top:250px;
|
||||
}
|
||||
p.abs {
|
||||
top:0;left:0;
|
||||
}
|
||||
.b { border:10px solid black; }
|
||||
.p { padding: 7px 0; }
|
||||
.p p { height:114px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div><p></p></div>
|
||||
<br>
|
||||
<div><p class="overflow"></p></div>
|
||||
<br>
|
||||
<div class="abs"><p class="abs"></p></div>
|
||||
<br>
|
||||
<div class="abs" style="left:120px"><p class="abs overflow"></p></div>
|
||||
<br>
|
||||
<div class="abs b" style="left:240px"><p class="abs"></p></div>
|
||||
<br>
|
||||
<div class="abs b" style="left:370px"><p class="abs overflow"></p></div>
|
||||
<br>
|
||||
<div class="abs b p" style="left:510px"><p class="abs"></p></div>
|
||||
<br>
|
||||
<div class="abs b p" style="left:640px"><p class="abs overflow"></p></div>
|
||||
|
||||
</body>
|
||||
</html>
|
52
layout/reftests/forms/fieldset/fieldset-overflow-auto-1.html
Normal file
52
layout/reftests/forms/fieldset/fieldset-overflow-auto-1.html
Normal file
@ -0,0 +1,52 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html><head>
|
||||
<meta charset="utf-8">
|
||||
<title>Testcase for bug 261037</title>
|
||||
<style type="text/css">
|
||||
fieldset, div {
|
||||
background:pink;
|
||||
overflow:auto;
|
||||
height:100px;
|
||||
margin:0; padding:0; border:0;
|
||||
}
|
||||
p {
|
||||
background:blue;
|
||||
height:100px;
|
||||
margin:0; padding:0;
|
||||
}
|
||||
.overflow {
|
||||
height:110px;
|
||||
}
|
||||
.abs {
|
||||
position:absolute;
|
||||
width:100px;
|
||||
top:250px;
|
||||
}
|
||||
p.abs {
|
||||
top:0;left:0;
|
||||
}
|
||||
.b { border:10px solid black; }
|
||||
.p { padding: 7px 0; }
|
||||
.p p { height:114px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<fieldset><p></p></fieldset>
|
||||
<br>
|
||||
<fieldset><p class="overflow"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs"><p class="abs"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs" style="left:120px"><p class="abs overflow"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs b" style="left:240px"><p class="abs"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs b" style="left:370px"><p class="abs overflow"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs b p" style="left:510px"><p class="abs"></p></fieldset>
|
||||
<br>
|
||||
<fieldset class="abs b p" style="left:640px"><p class="abs overflow"></p></fieldset>
|
||||
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,19 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<div style="width:700px; border:2px solid green; overflow:hidden">
|
||||
<fieldset style="padding:140px; width:400px;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
<fieldset style="padding:140px; display:inline;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
<fieldset style="padding:140px; float:left;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,19 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<div style="width:700px; border:2px solid green; overflow:hidden">
|
||||
<fieldset style="padding:20%; width:400px;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
<fieldset style="padding:20%; display:inline;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
<fieldset style="padding:20%; float:left;">
|
||||
<legend>Legend</legend>
|
||||
TextTextTextTextTextText
|
||||
</fieldset>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="width:200px; height:200px; padding:0">
|
||||
<legend>Legend</legend>
|
||||
<div style="overflow:scroll; height:100%">
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
8
layout/reftests/forms/fieldset/fieldset-scroll-1.html
Normal file
8
layout/reftests/forms/fieldset/fieldset-scroll-1.html
Normal file
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="overflow:scroll; width:200px; height:200px; padding:0">
|
||||
<legend>Legend</legend>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
24
layout/reftests/forms/fieldset/fieldset-scrolled-1-ref.html
Normal file
24
layout/reftests/forms/fieldset/fieldset-scrolled-1-ref.html
Normal file
@ -0,0 +1,24 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="width:200px; height:200px; padding:0">
|
||||
<legend style="overflow:hidden">Legend</legend>
|
||||
<div id="d" style="overflow:hidden; height:100%;">
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
</div>
|
||||
</fieldset>
|
||||
<script>
|
||||
d.scrollTop = 20;
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
27
layout/reftests/forms/fieldset/fieldset-scrolled-1.html
Normal file
27
layout/reftests/forms/fieldset/fieldset-scrolled-1.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html class="reftest-wait">
|
||||
<body>
|
||||
<fieldset id="f" style="overflow:hidden; width:200px; height:200px; padding:0">
|
||||
<legend style="overflow:hidden">Legend</legend>
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
<p>Hello Kitty
|
||||
</fieldset>
|
||||
<script>
|
||||
f.scrollTop = 0;
|
||||
function doTest() {
|
||||
f.scrollTop = 20;
|
||||
document.documentElement.removeAttribute("class");
|
||||
}
|
||||
window.addEventListener("MozReftestInvalidate", doTest);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset style="position:relative; overflow:hidden; width:500px; height:500px;">
|
||||
<legend>Legend</legend>
|
||||
<div style="height:1000px;">
|
||||
<div style="position:absolute; left:20px; top:20px; background:yellow;">Abs-pos</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
14
layout/reftests/forms/fieldset/positioned-container-1.html
Normal file
14
layout/reftests/forms/fieldset/positioned-container-1.html
Normal file
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<fieldset id="f" style="position:relative; overflow:hidden; width:500px; height:500px;">
|
||||
<legend>Legend</legend>
|
||||
<div style="height:1000px;">
|
||||
<div style="position:absolute; left:20px; top:50px; background:yellow;">Abs-pos</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<script>
|
||||
f.scrollTop = 30;
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
8
layout/reftests/forms/fieldset/reftest.list
Normal file
8
layout/reftests/forms/fieldset/reftest.list
Normal file
@ -0,0 +1,8 @@
|
||||
== dynamic-legend-scroll-1.html dynamic-legend-scroll-1-ref.html
|
||||
== fieldset-hidden-1.html fieldset-hidden-1-ref.html
|
||||
== fieldset-intrinsic-width-1.html fieldset-intrinsic-width-1-ref.html
|
||||
== fieldset-percentage-padding-1.html fieldset-percentage-padding-1-ref.html
|
||||
== fieldset-scroll-1.html fieldset-scroll-1-ref.html
|
||||
== fieldset-scrolled-1.html fieldset-scrolled-1-ref.html
|
||||
== fieldset-overflow-auto-1.html fieldset-overflow-auto-1-ref.html
|
||||
== positioned-container-1.html positioned-container-1-ref.html
|
@ -6,6 +6,9 @@ include button/reftest.list
|
||||
# legend element
|
||||
include legend/reftest.list
|
||||
|
||||
# fieldset element
|
||||
include fieldset/reftest.list
|
||||
|
||||
# placeholder
|
||||
include placeholder/reftest.list
|
||||
|
||||
|
@ -14,6 +14,9 @@
|
||||
display: block;
|
||||
unicode-bidi: inherit;
|
||||
text-overflow: inherit;
|
||||
overflow: inherit;
|
||||
padding: inherit;
|
||||
position: inherit;
|
||||
height: 100%; /* Need this so percentage heights of kids work right */
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user