Files
palemoon27/layout/mathml/nsMathMLSelectedFrame.cpp
T
roytam1 37477b2115 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1161049 patch 2 - Add comments reflecting what CanPerformOnCompositorThread doesn't check. r=birtles (09854c55c)
- Bug 1161049 patch 3 - Don't send animations to a layer if we're not using off-main-thread compositing. r=mstange (927242bde)
- Bug 1148418 - Make nsDisplayBackgroundColor::Paint use a higher precision floating point type to avoid scrolling artifacts. r=mattwoodrow (3641d43be)
- Bug 1148418 - Follow-up to avoid unused variable warning. r=bustage CLOSED TREE (83d4dd8fe)
- Bug 804975 - Part 2: Add a RuleNodeCacheConditions class and use it instead of a boolean canStoreInRuleTree during style computation. r=dbaron (fce3718c4)
- Bug 804975 - Part 3: Support conditional cached reset structs on rule nodes. r=dbaron (a2a049f56)
- Bug 804975 - Part 4: Cache reset structs on rule nodes for different font-size or writing mode values. r=dbaron (9bac1c6db)
- Bug 77999 - Unified build fix followup. (a2c95b3b4)
- Bug 1169440 patch 1 - Add bitwise operators to nsChangeHint. r=heycam (d30d0a0a2)
- Bug 1169440 patch 2 - Rename style struct MaxDifferenceNeverInherited to DifferenceAlwaysHandledForDescendants. r=heycam (7d1e2cdae)
- Bug 1156988 - Update RestyleManager::{Change,Restyle}HintToString for recent changes. r=dbaron (547e61dd6)
- Bug 1169440 patch 3 - Add nsChangeHint_ReflowChangesSizeOrPosition. r=heycam (0076ee033)
- Bug 1177076 patch 1 - Add logical values for the caption-side property (though not yet handled by layout code). r=heycam (4e8bd065d)
- Bug 1131000. Implement nsMathMLSelectedFrame::ComputeSize to delegate size computation to the selected frame. r=mats (49581cdd7)
- Bug 1172774: for a box with a writing mode orthogonal to its containing block, calculate positioning values (margin, padding and offsets) in the writing mode of the containing block, r=jfkthame (505cd7afb)
- Bug 1177076 patch 2 - Convert nsTableOuterFrame to work with logical coordinates. r=dholbert (300c5cfae)
- Bug 1151993 - Reftest for inline-sizing of orthogonal block frames. r=smontagu (c17e188b1)
- Bug 1144501 - Reftest for sizing of orthogonal frame after block-end margin. r=smontagu (d27d90068)
- Bug 1156021 - Reftest for text-indent specified as percent in vertical writing mode. r=dbaron (d25854ee0)
- Bug 1158549 - Reftest for size constraints in vertical writing mode. r=smontagu (b1d7f74aa)
- Bug 1157752 - Reftest for vertical mode with upright orientation overriding bidi directionality. r=smontagu (b7aedaf06)
- Bug 1152941 - Reftest for orthogonal block with potentially overflowing content. r=dbaron (0fe1d83f4)
- Bug 1077521 - Initial testcases for vertical writing-mode tables. r=smontagu (dbacaf74c)
- Bug 1077521 - Reftest for rowspan in vertical table. r=smontagu (e4b6134bf)
- Bug 1077521 - Reftest for colspan in vertical table. r=smontagu (ece444c32)
- Bug 1177606 - Reftests for vertical tables with specified width. (d7f9ddc3a)
- Bug 1157569 - Reftests for vertical-mode table with border-collapse. r=dholbert (0b9b7eeae)
- Tests for bug 1173958. r=jfkthame (64278818c)
- Bug 1139306: Add a small amount of fuzz to a test on Android, r=tn (b879499c6)
- Bug 1140160 - Handle insertions into a <fieldset> child with display:contents correctly. r=roc (39a24c684)
- partial 1138442 (3d04520fd)
- Bug 1153757 - Tweak DoGetParentStyleContext to exclude pseudos with a non-primary frame from using a display:contents parent as the style context parent. r=heycam (caa35c9ac)
- part of 1144080 (465618308)
- reapply 932958 (f098ad575)
- part of 1153574 (8e4532dc5)
- Bug 1169331 - Always clip rotated buffer quadrant drawing to the fill rect. r=jrmuizel (4693f9c1c)
- Bug 1174332 - Correctly compute box-shadow bounds on themed frames with overflow. r=roc (489b069a5)
- Bug 1169525 - Add the on-demand SVG style sheets when a foreignObjectis encountered within a single style update. r=jwatt (ebe0eb228)
- Bug 1169514 - Part 1: Move noscript rule from the preference style sheet to a cached UA style sheet. r=jwatt (a04979f0f)
- Bug 1169514 - Part 2: Move noframes rules from the preferences style sheet to a cached UA style sheet. r=jwatt (26aae1a45)
- Bug 1174450 part 1 - Split IntrinsicForContainer in two parts; move the latter part to a new function, AddIntrinsicSizeOffset, which applies the padding/border/margin from the given IntrinsicISizeOffsetData. r=jfkthame (37202f0f3)
- Bug 1174450 part 2 - Rename most AddIntrinsicSizeOffset params to follow the aName standard. r=jfkthame (4525fa9c5)
- Bug 1174450 part 3 - Rename AddIntrinsicSizeOffset local vars from xISize to xSize since the code is generic and handles both ISizes and BSizes. r=jfkthame (6a4816b18)
- Bug 1174450 part 4 - Rename the remaining AddIntrinsicSizeOffset params to follow the aName standard. Also rename local var 'w' to 'size' since it may be either a width or height. r=jfkthame (e1132b475)
- Bug 1174450 part 5 - Remove the duplicated min/max calculation in AddIntrinsicSizeOffset, pass a pointer to the calculated absolute values, if any, from IntrinsicForContainer instead. r=jfkthame (85f937449)
- Bug 1174450 part 6 - Add a doc comment for AddIntrinsicSizeOffset and some minor code style fixes. r=jfkthame (1e501c748)
- Bug 1174450 part 7 - Move most of IntrinsicForContainer into a new method, IntrinsicForWM, that takes the writing-mode to use as a parameter. r=jfkthame (db3ba1bc4)
- Bug 1174450 part 8 - Add a new method nsIFrame::IntrinsicBSizeOffsets. r=jfkthame (ef1715d4e)
- Bug 1174450 part 9 - Remove the nsRenderingContext* param from Intrinsic*SizeOffsets methods since it's unused. r=jfkthame (e0fd79cc6)
- Bug 1174450 part 10 - Use the right IntrinsicISizeOffsetData for the given writing-mode (this is what fixes the error reported in this bug). r=jfkthame (efc490611)
- Bug 1174450 part 9b - Make AddIntrinsicSizeOffset take a PhysicalAxis instead of a WritingMode. r=jfkthame (cab48ffef)
- Bug 1174450 part 10b - Rename IntrinsicForWM to IntrinsicForAxis and make it take a PhysicalAxis instead of a WritingMode. r=jfkthame (cd33baeff)
- Bug 1147834: tests for overconstrained relative positioning, r=jfkthame (c2c67b2fc)
- Bug 1157758 - Reftest for Arabic text in vertical-upright mode. r=jdaggett (689b0a84d)
- Bug 1163238 - Reftest for auto margins on orthogonal flow. (c9f5a50ec)
- Bug 1079151 - Tests for position:absolute in vertical writing modes; currently failing 72 out of 96 testcases. r=jfkthame (228756de5)
- Tests for bug 1172774, r=jfkthame (91ff7737d)
- Bug 1174450 part 11 - Tests. (89963b6a7)
- convert file to UTF-8 (f8e2e497a)
2021-02-03 10:56:59 +08:00

190 lines
6.9 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsMathMLSelectedFrame.h"
#include "nsDisplayList.h"
using namespace mozilla;
nsMathMLSelectedFrame::~nsMathMLSelectedFrame()
{
}
void
nsMathMLSelectedFrame::Init(nsIContent* aContent,
nsContainerFrame* aParent,
nsIFrame* aPrevInFlow)
{
// Init our local attributes
mInvalidMarkup = false;
mSelectedFrame = nullptr;
// Let the base class do the rest
nsMathMLContainerFrame::Init(aContent, aParent, aPrevInFlow);
}
NS_IMETHODIMP
nsMathMLSelectedFrame::TransmitAutomaticData()
{
// Note that to determine space-like and embellished op properties:
// - <semantics> behaves the same as <maction>
// - <annotation-xml> behaves the same as <mrow>
// The REC defines the following element to be space-like:
// * an maction element whose selected sub-expression exists and is
// space-like;
nsIMathMLFrame* mathMLFrame = do_QueryFrame(mSelectedFrame);
if (mathMLFrame && mathMLFrame->IsSpaceLike()) {
mPresentationData.flags |= NS_MATHML_SPACE_LIKE;
} else {
mPresentationData.flags &= ~NS_MATHML_SPACE_LIKE;
}
// The REC defines the following element to be an embellished operator:
// * an maction element whose selected sub-expression exists and is an
// embellished operator;
mPresentationData.baseFrame = mSelectedFrame;
GetEmbellishDataFrom(mSelectedFrame, mEmbellishData);
return NS_OK;
}
nsresult
nsMathMLSelectedFrame::ChildListChanged(int32_t aModType)
{
GetSelectedFrame();
return nsMathMLContainerFrame::ChildListChanged(aModType);
}
void
nsMathMLSelectedFrame::SetInitialChildList(ChildListID aListID,
nsFrameList& aChildList)
{
nsMathMLContainerFrame::SetInitialChildList(aListID, aChildList);
// This very first call to GetSelectedFrame() will cause us to be marked as an
// embellished operator if the selected child is an embellished operator
GetSelectedFrame();
}
// Only paint the selected child...
void
nsMathMLSelectedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// Report an error if something wrong was found in this frame.
// We can't call nsDisplayMathMLError from here,
// so ask nsMathMLContainerFrame to do the work for us.
if (NS_MATHML_HAS_ERROR(mPresentationData.flags)) {
nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
return;
}
DisplayBorderBackgroundOutline(aBuilder, aLists);
nsIFrame* childFrame = GetSelectedFrame();
if (childFrame) {
// Put the child's background directly onto the content list
nsDisplayListSet set(aLists, aLists.Content());
// The children should be in content order
BuildDisplayListForChild(aBuilder, childFrame, aDirtyRect, set);
}
#if defined(DEBUG) && defined(SHOW_BOUNDING_BOX)
// visual debug
DisplayBoundingMetrics(aBuilder, this, mReference, mBoundingMetrics, aLists);
#endif
}
/* virtual */
LogicalSize
nsMathMLSelectedFrame::ComputeSize(nsRenderingContext *aRenderingContext,
WritingMode aWM,
const LogicalSize& aCBSize,
nscoord aAvailableISize,
const LogicalSize& aMargin,
const LogicalSize& aBorder,
const LogicalSize& aPadding,
ComputeSizeFlags aFlags)
{
nsIFrame* childFrame = GetSelectedFrame();
if (childFrame) {
// Delegate size computation to the child frame.
// Try to account for border/padding/margin on this frame and the child,
// though we don't really support them during reflow anyway...
nscoord availableISize = aAvailableISize - aBorder.ISize(aWM) -
aPadding.ISize(aWM) - aMargin.ISize(aWM);
LogicalSize cbSize = aCBSize - aBorder - aPadding - aMargin;
nsCSSOffsetState offsetState(childFrame, aRenderingContext, aWM,
availableISize);
LogicalSize size =
childFrame->ComputeSize(aRenderingContext, aWM, cbSize,
availableISize, offsetState.ComputedLogicalMargin().Size(aWM),
offsetState.ComputedLogicalBorderPadding().Size(aWM) -
offsetState.ComputedLogicalPadding().Size(aWM),
offsetState.ComputedLogicalPadding().Size(aWM),
aFlags);
return size + offsetState.ComputedLogicalBorderPadding().Size(aWM);
}
return LogicalSize(aWM);
}
// Only reflow the selected child ...
void
nsMathMLSelectedFrame::Reflow(nsPresContext* aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus)
{
MarkInReflow();
mPresentationData.flags &= ~NS_MATHML_ERROR;
aStatus = NS_FRAME_COMPLETE;
aDesiredSize.ClearSize();
aDesiredSize.SetBlockStartAscent(0);
mBoundingMetrics = nsBoundingMetrics();
nsIFrame* childFrame = GetSelectedFrame();
if (childFrame) {
WritingMode wm = childFrame->GetWritingMode();
LogicalSize availSize = aReflowState.ComputedSize(wm);
availSize.BSize(wm) = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState childReflowState(aPresContext, aReflowState,
childFrame, availSize);
ReflowChild(childFrame, aPresContext, aDesiredSize,
childReflowState, aStatus);
SaveReflowAndBoundingMetricsFor(childFrame, aDesiredSize,
aDesiredSize.mBoundingMetrics);
mBoundingMetrics = aDesiredSize.mBoundingMetrics;
}
FinalizeReflow(*aReflowState.rendContext, aDesiredSize);
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
}
// Only place the selected child ...
/* virtual */ nsresult
nsMathMLSelectedFrame::Place(nsRenderingContext& aRenderingContext,
bool aPlaceOrigin,
nsHTMLReflowMetrics& aDesiredSize)
{
nsIFrame* childFrame = GetSelectedFrame();
if (mInvalidMarkup) {
return ReflowError(aRenderingContext, aDesiredSize);
}
aDesiredSize.ClearSize();
aDesiredSize.SetBlockStartAscent(0);
mBoundingMetrics = nsBoundingMetrics();
if (childFrame) {
GetReflowAndBoundingMetricsFor(childFrame, aDesiredSize, mBoundingMetrics);
if (aPlaceOrigin) {
FinishReflowChild(childFrame, PresContext(), aDesiredSize, nullptr, 0, 0, 0);
}
mReference.x = 0;
mReference.y = aDesiredSize.BlockStartAscent();
}
aDesiredSize.mBoundingMetrics = mBoundingMetrics;
return NS_OK;
}