2001-09-29 00:14:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2006-03-29 22:29:03 +04:00
|
|
|
|
|
|
|
/* rendering object for CSS display:inline objects */
|
|
|
|
|
1999-04-20 04:23:05 +04:00
|
|
|
#ifndef nsInlineFrame_h___
|
|
|
|
#define nsInlineFrame_h___
|
|
|
|
|
2012-09-14 20:10:08 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2011-12-28 00:18:48 +04:00
|
|
|
#include "nsContainerFrame.h"
|
2013-02-01 20:01:47 +04:00
|
|
|
|
|
|
|
class nsLineLayout;
|
1999-04-20 04:23:05 +04:00
|
|
|
|
1999-11-01 18:24:57 +03:00
|
|
|
/**
|
|
|
|
* Inline frame class.
|
|
|
|
*
|
|
|
|
* This class manages a list of child frames that are inline frames. Working with
|
|
|
|
* nsLineLayout, the class will reflow and place inline frames on a line.
|
|
|
|
*/
|
2016-04-18 09:22:22 +03:00
|
|
|
class nsInlineFrame : public nsContainerFrame
|
1999-04-20 04:23:05 +04:00
|
|
|
{
|
|
|
|
public:
|
2009-01-12 22:20:59 +03:00
|
|
|
NS_DECL_QUERYFRAME
|
2017-05-26 13:11:11 +03:00
|
|
|
NS_DECL_FRAMEARENA_HELPERS(nsInlineFrame)
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-05-25 02:20:40 +04:00
|
|
|
friend nsInlineFrame* NS_NewInlineFrame(nsIPresShell* aPresShell,
|
|
|
|
nsStyleContext* aContext);
|
2009-01-09 19:35:24 +03:00
|
|
|
|
1999-04-20 04:23:05 +04:00
|
|
|
// nsIFrame overrides
|
2013-02-14 15:12:27 +04:00
|
|
|
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
2015-03-21 19:28:04 +03:00
|
|
|
const nsDisplayListSet& aLists) override;
|
2000-01-13 00:52:58 +03:00
|
|
|
|
2002-08-10 11:59:44 +04:00
|
|
|
#ifdef ACCESSIBILITY
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual mozilla::a11y::AccType AccessibleType() override;
|
2002-08-10 11:59:44 +04:00
|
|
|
#endif
|
|
|
|
|
2014-01-06 03:31:14 +04:00
|
|
|
#ifdef DEBUG_FRAME_DUMP
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual nsresult GetFrameName(nsAString& aResult) const override;
|
1999-11-02 01:12:45 +03:00
|
|
|
#endif
|
2007-02-24 21:33:33 +03:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual bool IsFrameOfType(uint32_t aFlags) const override
|
2007-02-24 21:33:33 +03:00
|
|
|
{
|
2012-12-04 08:50:05 +04:00
|
|
|
if (aFlags & eSupportsCSSTransforms) {
|
|
|
|
return false;
|
|
|
|
}
|
2011-12-28 00:18:48 +04:00
|
|
|
return nsContainerFrame::IsFrameOfType(aFlags &
|
2007-05-18 10:04:04 +04:00
|
|
|
~(nsIFrame::eBidiInlineContainer | nsIFrame::eLineParticipant));
|
2007-02-24 21:33:33 +03:00
|
|
|
}
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual void InvalidateFrame(uint32_t aDisplayItemKey = 0) override;
|
|
|
|
virtual void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0) override;
|
2013-02-11 10:22:20 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual bool IsEmpty() override;
|
|
|
|
virtual bool IsSelfEmpty() override;
|
2001-10-25 05:08:40 +04:00
|
|
|
|
Bug 1375825 - part2: ContentEventHandler::ExpandToClusterBoundary() should check the return value of nsTextFrame::PeekOffsetCharacter() r=jfkthame
ContentEventHandler::ExpandToClusterBoundary() doesn't check the return value of nsTextFrame::PeekOffsetCharacter(). Therefore, it may set its result to reversed offset. (e.g., when aForward is true and offset is 6, the result may be 5. When aForward is false and offset is 5, the result may be 6.)
For avoiding that, ContentEventHandler::ExpandToClusterBoundary() should check the result and only when it returns nsIFrame::FOUND, it should compute the proper offset.
On the other hand, it's too bad for ContentEventHandler that nsTextFrame::PeekOffsetCharacter() to return nsIFrame::CONTINUE_UNSELECTABLE when the user-select style is "all" because IME doesn't expect such cases.
Therefore, this patch adds additional argument to nsIFrame::PeekOffsetCharacter(), aOptions which is a struct containing bool members. The reason why it's not a bit mask enum is, such struct doesn't cause simple mistake at checking the value and the code is shorter. When mIgnoreUserStyleAll of it is true, this patch makes nsTextFrame not return nsIFrame::CONTINUE_UNSELECTABLE.
MozReview-Commit-ID: ACNNBTP92YZ
--HG--
extra : rebase_source : bd85da902e7fb59135d15514cb20a5599a4a640b
2017-06-29 04:58:16 +03:00
|
|
|
virtual FrameSearchResult
|
|
|
|
PeekOffsetCharacter(bool aForward, int32_t* aOffset,
|
|
|
|
PeekOffsetCharacterOptions aOptions =
|
|
|
|
PeekOffsetCharacterOptions()) override;
|
2006-09-12 00:43:01 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
|
2016-06-10 03:56:23 +03:00
|
|
|
virtual nsresult StealFrame(nsIFrame* aChild) override;
|
2014-07-07 20:08:42 +04:00
|
|
|
|
1999-04-20 04:23:05 +04:00
|
|
|
// nsIHTMLReflow overrides
|
2017-06-09 22:14:53 +03:00
|
|
|
virtual void AddInlineMinISize(gfxContext *aRenderingContext,
|
2015-03-21 19:28:04 +03:00
|
|
|
InlineMinISizeData *aData) override;
|
2017-06-09 22:14:53 +03:00
|
|
|
virtual void AddInlinePrefISize(gfxContext *aRenderingContext,
|
2015-03-21 19:28:04 +03:00
|
|
|
InlinePrefISizeData *aData) override;
|
2014-08-24 18:34:44 +04:00
|
|
|
virtual mozilla::LogicalSize
|
2017-06-09 22:14:53 +03:00
|
|
|
ComputeSize(gfxContext *aRenderingContext,
|
2014-08-24 18:34:44 +04:00
|
|
|
mozilla::WritingMode aWritingMode,
|
|
|
|
const mozilla::LogicalSize& aCBSize,
|
|
|
|
nscoord aAvailableISize,
|
|
|
|
const mozilla::LogicalSize& aMargin,
|
|
|
|
const mozilla::LogicalSize& aBorder,
|
|
|
|
const mozilla::LogicalSize& aPadding,
|
2015-03-21 19:28:04 +03:00
|
|
|
ComputeSizeFlags aFlags) override;
|
2015-12-16 00:56:41 +03:00
|
|
|
virtual nsRect ComputeTightBounds(DrawTarget* aDrawTarget) const override;
|
2014-05-13 04:47:52 +04:00
|
|
|
virtual void Reflow(nsPresContext* aPresContext,
|
2016-07-21 13:36:38 +03:00
|
|
|
ReflowOutput& aDesiredSize,
|
2016-07-21 13:36:39 +03:00
|
|
|
const ReflowInput& aReflowInput,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsReflowStatus& aStatus) override;
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-09-08 06:34:20 +04:00
|
|
|
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
|
|
|
|
nsIAtom* aAttribute,
|
2015-03-21 19:28:04 +03:00
|
|
|
int32_t aModType) override;
|
2014-09-08 06:34:20 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual bool CanContinueTextRun() const override;
|
2000-07-29 02:29:28 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual void PullOverflowsFromPrevInFlow() override;
|
|
|
|
virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override;
|
|
|
|
virtual bool DrainSelfOverflowList() override;
|
2009-07-24 17:32:32 +04:00
|
|
|
|
2006-06-15 12:16:23 +04:00
|
|
|
/**
|
2014-03-13 11:39:33 +04:00
|
|
|
* Return true if the frame is first visual frame or first continuation
|
2006-06-15 12:16:23 +04:00
|
|
|
*/
|
2014-03-13 11:39:33 +04:00
|
|
|
bool IsFirst() const {
|
|
|
|
// If the frame's bidi visual state is set, return is-first state
|
2006-06-15 12:16:23 +04:00
|
|
|
// else return true if it's the first continuation.
|
|
|
|
return (GetStateBits() & NS_INLINE_FRAME_BIDI_VISUAL_STATE_IS_SET)
|
2014-03-13 11:39:33 +04:00
|
|
|
? !!(GetStateBits() & NS_INLINE_FRAME_BIDI_VISUAL_IS_FIRST)
|
2006-06-15 12:16:23 +04:00
|
|
|
: (!GetPrevInFlow());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2014-03-13 11:39:33 +04:00
|
|
|
* Return true if the frame is last visual frame or last continuation.
|
2006-06-15 12:16:23 +04:00
|
|
|
*/
|
2014-03-13 11:39:33 +04:00
|
|
|
bool IsLast() const {
|
|
|
|
// If the frame's bidi visual state is set, return is-last state
|
2006-06-15 12:16:23 +04:00
|
|
|
// else return true if it's the last continuation.
|
|
|
|
return (GetStateBits() & NS_INLINE_FRAME_BIDI_VISUAL_STATE_IS_SET)
|
2014-03-13 11:39:33 +04:00
|
|
|
? !!(GetStateBits() & NS_INLINE_FRAME_BIDI_VISUAL_IS_LAST)
|
2006-06-15 12:16:23 +04:00
|
|
|
: (!GetNextInFlow());
|
|
|
|
}
|
|
|
|
|
2017-06-16 12:22:33 +03:00
|
|
|
// Restyles the block wrappers around our non-inline-outside kids.
|
2017-03-03 23:45:40 +03:00
|
|
|
// This will only be called when such wrappers in fact exist.
|
2017-06-16 12:22:33 +03:00
|
|
|
void UpdateStyleOfOwnedAnonBoxesForIBSplit(
|
2017-06-21 00:21:27 +03:00
|
|
|
mozilla::ServoRestyleState& aRestyleState);
|
2017-03-03 23:45:40 +03:00
|
|
|
|
1999-04-20 04:23:05 +04:00
|
|
|
protected:
|
|
|
|
// Additional reflow state used during our reflow methods
|
2016-07-21 13:36:39 +03:00
|
|
|
struct InlineReflowInput {
|
1999-04-20 04:23:05 +04:00
|
|
|
nsIFrame* mPrevFrame;
|
|
|
|
nsInlineFrame* mNextInFlow;
|
2007-04-21 04:42:58 +04:00
|
|
|
nsIFrame* mLineContainer;
|
2009-10-27 04:43:56 +03:00
|
|
|
nsLineLayout* mLineLayout;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mSetParentPointer; // when reflowing child frame first set its
|
2000-09-12 00:46:44 +04:00
|
|
|
// parent frame pointer
|
2000-03-21 02:47:01 +03:00
|
|
|
|
2016-07-21 13:36:39 +03:00
|
|
|
InlineReflowInput() {
|
2012-07-30 18:20:58 +04:00
|
|
|
mPrevFrame = nullptr;
|
|
|
|
mNextInFlow = nullptr;
|
|
|
|
mLineContainer = nullptr;
|
|
|
|
mLineLayout = nullptr;
|
2011-10-17 18:59:28 +04:00
|
|
|
mSetParentPointer = false;
|
2007-04-23 18:21:53 +04:00
|
|
|
}
|
1999-04-20 04:23:05 +04:00
|
|
|
};
|
|
|
|
|
2017-05-26 13:11:11 +03:00
|
|
|
nsInlineFrame(nsStyleContext* aContext, ClassID aID)
|
|
|
|
: nsContainerFrame(aContext, aID)
|
2017-05-03 18:49:37 +03:00
|
|
|
, mBaseline(NS_INTRINSIC_WIDTH_UNKNOWN)
|
2017-04-30 18:30:08 +03:00
|
|
|
{}
|
|
|
|
|
2016-07-21 13:36:39 +03:00
|
|
|
virtual LogicalSides GetLogicalSkipSides(const ReflowInput* aReflowInput = nullptr) const override;
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-05-13 04:47:52 +04:00
|
|
|
void ReflowFrames(nsPresContext* aPresContext,
|
2016-07-21 13:36:39 +03:00
|
|
|
const ReflowInput& aReflowInput,
|
|
|
|
InlineReflowInput& rs,
|
2016-07-21 13:36:38 +03:00
|
|
|
ReflowOutput& aMetrics,
|
2014-05-13 04:47:52 +04:00
|
|
|
nsReflowStatus& aStatus);
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-05-13 04:47:52 +04:00
|
|
|
void ReflowInlineFrame(nsPresContext* aPresContext,
|
2016-07-21 13:36:39 +03:00
|
|
|
const ReflowInput& aReflowInput,
|
|
|
|
InlineReflowInput& rs,
|
2014-05-13 04:47:52 +04:00
|
|
|
nsIFrame* aFrame,
|
|
|
|
nsReflowStatus& aStatus);
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2007-04-21 04:42:58 +04:00
|
|
|
/**
|
|
|
|
* Reparent floats whose placeholders are inline descendants of aFrame from
|
|
|
|
* whatever block they're currently parented by to aOurBlock.
|
|
|
|
* @param aReparentSiblings if this is true, we follow aFrame's
|
|
|
|
* GetNextSibling chain reparenting them all
|
|
|
|
*/
|
|
|
|
void ReparentFloatsForInlineChild(nsIFrame* aOurBlock, nsIFrame* aFrame,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aReparentSiblings);
|
2007-04-21 04:42:58 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
virtual nsIFrame* PullOneFrame(nsPresContext* aPresContext,
|
2016-07-21 13:36:39 +03:00
|
|
|
InlineReflowInput& rs,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool* aIsComplete);
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
virtual void PushFrames(nsPresContext* aPresContext,
|
1999-04-20 04:23:05 +04:00
|
|
|
nsIFrame* aFromChild,
|
2009-10-27 04:43:56 +03:00
|
|
|
nsIFrame* aPrevSibling,
|
2016-07-21 13:36:39 +03:00
|
|
|
InlineReflowInput& aState);
|
2011-08-03 22:30:58 +04:00
|
|
|
|
2013-12-17 17:30:24 +04:00
|
|
|
private:
|
2017-05-26 13:11:11 +03:00
|
|
|
explicit nsInlineFrame(nsStyleContext* aContext)
|
|
|
|
: nsInlineFrame(aContext, kClassID)
|
|
|
|
{}
|
|
|
|
|
2013-12-17 17:30:24 +04:00
|
|
|
// Helper method for DrainSelfOverflowList() to deal with lazy parenting
|
|
|
|
// (which we only do for nsInlineFrame, not nsFirstLineFrame).
|
|
|
|
enum DrainFlags {
|
|
|
|
eDontReparentFrames = 1, // skip reparenting the overflow list frames
|
|
|
|
eInFirstLine = 2, // the request is for an inline descendant of a nsFirstLineFrame
|
2014-07-07 20:08:42 +04:00
|
|
|
eForDestroy = 4, // the request is from DestroyFrom; in this case we do the
|
|
|
|
// minimal work required since the frame is about to be
|
|
|
|
// destroyed (just fixup parent pointers)
|
2013-12-17 17:30:24 +04:00
|
|
|
};
|
|
|
|
/**
|
|
|
|
* Move any frames on our overflow list to the end of our principal list.
|
|
|
|
* @param aFlags one or more of the above DrainFlags
|
|
|
|
* @param aLineContainer the nearest line container ancestor
|
|
|
|
* @return true if there were any overflow frames
|
|
|
|
*/
|
|
|
|
bool DrainSelfOverflowListInternal(DrainFlags aFlags,
|
|
|
|
nsIFrame* aLineContainer);
|
|
|
|
protected:
|
2011-08-03 22:30:58 +04:00
|
|
|
nscoord mBaseline;
|
1999-04-20 04:23:05 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
1999-11-01 18:24:57 +03:00
|
|
|
/**
|
|
|
|
* Variation on inline-frame used to manage lines for line layout in
|
|
|
|
* special situations (:first-line style in particular).
|
|
|
|
*/
|
2015-03-21 19:28:04 +03:00
|
|
|
class nsFirstLineFrame final : public nsInlineFrame {
|
1999-04-20 04:23:05 +04:00
|
|
|
public:
|
2017-05-26 13:11:11 +03:00
|
|
|
NS_DECL_FRAMEARENA_HELPERS(nsFirstLineFrame)
|
2009-09-12 20:49:24 +04:00
|
|
|
|
2014-05-25 02:20:39 +04:00
|
|
|
friend nsFirstLineFrame* NS_NewFirstLineFrame(nsIPresShell* aPresShell,
|
|
|
|
nsStyleContext* aContext);
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-01-06 03:31:14 +04:00
|
|
|
#ifdef DEBUG_FRAME_DUMP
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual nsresult GetFrameName(nsAString& aResult) const override;
|
1999-11-02 02:12:32 +03:00
|
|
|
#endif
|
2014-05-13 04:47:52 +04:00
|
|
|
virtual void Reflow(nsPresContext* aPresContext,
|
2016-07-21 13:36:38 +03:00
|
|
|
ReflowOutput& aDesiredSize,
|
2016-07-21 13:36:39 +03:00
|
|
|
const ReflowInput& aReflowInput,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsReflowStatus& aStatus) override;
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2014-05-25 02:20:40 +04:00
|
|
|
virtual void Init(nsIContent* aContent,
|
|
|
|
nsContainerFrame* aParent,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsIFrame* aPrevInFlow) override;
|
|
|
|
virtual void PullOverflowsFromPrevInFlow() override;
|
|
|
|
virtual bool DrainSelfOverflowList() override;
|
2009-07-24 17:32:32 +04:00
|
|
|
|
1999-04-20 04:23:05 +04:00
|
|
|
protected:
|
2017-04-30 18:30:08 +03:00
|
|
|
explicit nsFirstLineFrame(nsStyleContext* aContext)
|
2017-05-26 13:11:11 +03:00
|
|
|
: nsInlineFrame(aContext, kClassID)
|
2017-04-30 18:30:08 +03:00
|
|
|
{}
|
1999-04-20 04:23:05 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
virtual nsIFrame* PullOneFrame(nsPresContext* aPresContext,
|
2016-07-21 13:36:39 +03:00
|
|
|
InlineReflowInput& rs,
|
2015-03-21 19:28:04 +03:00
|
|
|
bool* aIsComplete) override;
|
1999-04-20 04:23:05 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* nsInlineFrame_h___ */
|