2017-10-27 20:33:53 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
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/. */
|
2008-07-17 10:30:25 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Inline methods that belong in nsStyleStruct.h, except that they
|
|
|
|
* require more headers.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef nsStyleStructInlines_h_
|
|
|
|
#define nsStyleStructInlines_h_
|
|
|
|
|
2012-08-02 15:38:49 +04:00
|
|
|
#include "nsIFrame.h"
|
2008-07-17 10:30:25 +04:00
|
|
|
#include "nsStyleStruct.h"
|
2023-04-03 00:17:07 +03:00
|
|
|
#include "nsIContent.h" // for GetParent()
|
|
|
|
#include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak
|
2017-02-02 23:51:34 +03:00
|
|
|
|
2015-05-04 00:52:53 +03:00
|
|
|
bool nsStyleText::NewlineIsSignificant(const nsTextFrame* aContextFrame) const {
|
2015-03-17 11:10:15 +03:00
|
|
|
NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame");
|
|
|
|
return NewlineIsSignificantStyle() &&
|
2016-05-03 07:39:24 +03:00
|
|
|
!aContextFrame->ShouldSuppressLineBreak() &&
|
2018-03-22 21:20:41 +03:00
|
|
|
!aContextFrame->Style()->IsTextCombined();
|
2015-03-17 11:10:15 +03:00
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleText::WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return WhiteSpaceCanWrapStyle() && !aContextFrame->IsInSVGTextSubtree() &&
|
2018-03-22 21:20:41 +03:00
|
|
|
!aContextFrame->Style()->IsTextCombined();
|
2013-03-25 07:50:59 +04:00
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleText::WordCanWrap(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return WordCanWrapStyle() && !aContextFrame->IsInSVGTextSubtree();
|
2013-03-25 07:50:59 +04:00
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleDisplay::IsBlockOutside(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
if (aContextFrame->IsInSVGTextSubtree()) {
|
2017-04-30 18:30:08 +03:00
|
|
|
return aContextFrame->IsBlockFrame();
|
2012-08-02 15:38:51 +04:00
|
|
|
}
|
|
|
|
return IsBlockOutsideStyle();
|
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleDisplay::IsInlineOutside(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
if (aContextFrame->IsInSVGTextSubtree()) {
|
2017-04-30 18:30:08 +03:00
|
|
|
return !aContextFrame->IsBlockFrame();
|
2012-08-02 15:38:51 +04:00
|
|
|
}
|
|
|
|
return IsInlineOutsideStyle();
|
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
mozilla::StyleDisplay nsStyleDisplay::GetDisplay(
|
|
|
|
const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
if (aContextFrame->IsInSVGTextSubtree() &&
|
2017-03-23 10:29:11 +03:00
|
|
|
mDisplay != mozilla::StyleDisplay::None) {
|
2017-04-30 18:30:08 +03:00
|
|
|
return aContextFrame->IsBlockFrame() ? mozilla::StyleDisplay::Block
|
|
|
|
: mozilla::StyleDisplay::Inline;
|
2012-08-02 15:38:51 +04:00
|
|
|
}
|
|
|
|
return mDisplay;
|
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleDisplay::IsFloating(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return IsFloatingStyle() && !aContextFrame->IsInSVGTextSubtree();
|
2012-08-02 15:38:49 +04:00
|
|
|
}
|
|
|
|
|
2015-03-12 06:21:01 +03:00
|
|
|
// If you change this function, also change the corresponding block in
|
|
|
|
// nsCSSFrameConstructor::ConstructFrameFromItemInternal that references
|
|
|
|
// this function in comments.
|
2015-03-20 07:12:17 +03:00
|
|
|
bool nsStyleDisplay::HasTransform(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-11-27 01:17:28 +03:00
|
|
|
return HasTransformStyle() && aContextFrame->SupportsCSSTransforms();
|
2015-03-20 07:12:17 +03:00
|
|
|
}
|
|
|
|
|
2018-05-23 01:41:19 +03:00
|
|
|
bool nsStyleDisplay::HasPerspective(const nsIFrame* aContextFrame) const {
|
|
|
|
MOZ_ASSERT(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame");
|
2023-11-27 01:17:28 +03:00
|
|
|
return HasPerspectiveStyle() && aContextFrame->SupportsCSSTransforms();
|
2018-05-23 01:41:19 +03:00
|
|
|
}
|
|
|
|
|
2018-08-08 01:02:08 +03:00
|
|
|
bool nsStyleDisplay::
|
|
|
|
IsFixedPosContainingBlockForContainLayoutAndPaintSupportingFrames() const {
|
2021-05-10 16:09:42 +03:00
|
|
|
return IsContainPaint() || IsContainLayout() ||
|
|
|
|
mWillChange.bits & mozilla::StyleWillChangeBits::CONTAIN;
|
2018-08-08 01:02:08 +03:00
|
|
|
}
|
|
|
|
|
Bug 1479859 patch 2 - Send nsChangeHint_UpdateContainingBlock when containing block-ness changes due to one property change, while another property that might trigger containing block-ness doesn't do so because of the frame type. r=emilio
This fixes a rather subtle bug. What the underlying code here is trying
to do is remove nsChangeHint_UpdateContainingBlock when some properties
that influence whether a frame is a containing block for absolutely
positioned or fixed positioned elements have changed, but the final
calculation of being a containing block has not changed. However, the
old code was using a function that tested whether the style could
*possibly* lead to a frame being a containing block. Some of the
properties (like the transform properties) that lead to being a
containing block, for example, don't apply to non-replaced inlines.
Some, however, do (such as 'filter'). So if there's a dynamic change
adding or removing a filter, on an inline that also has an *ignored*
transform property (like 'transform' or 'perspective') set, then the
code prior to this patch causes us to remove the UpdateContainingBlock
hint.
This patch fixes things by testing whether being a containing block
could have changed for *any* type of frame, by separately testing the
changes.
The added tests fail without the patch and pass with the patch, viewed
in isolation. However, without the previous patch, test 003 passes.
Test 003 also fails in Chrome (but 001 and 002 pass).
Differential Revision: https://phabricator.services.mozilla.com/D2814
--HG--
extra : rebase_source : 0a5dbb15a058cf4a43d989bf53f042c5b718e24d
2018-08-08 01:02:07 +03:00
|
|
|
bool nsStyleDisplay::IsFixedPosContainingBlockForTransformSupportingFrames()
|
|
|
|
const {
|
2016-08-29 21:43:29 +03:00
|
|
|
// NOTE: Any CSS properties that influence the output of this function
|
2021-05-10 16:09:42 +03:00
|
|
|
// should also look at mWillChange as necessary.
|
|
|
|
return HasTransformStyle() || HasPerspectiveStyle() ||
|
|
|
|
mWillChange.bits & mozilla::StyleWillChangeBits::PERSPECTIVE;
|
2016-08-29 21:43:29 +03:00
|
|
|
}
|
|
|
|
|
2022-03-04 06:02:00 +03:00
|
|
|
bool nsStyleDisplay::IsRelativelyOrStickyPositioned(
|
2013-04-07 03:40:07 +04:00
|
|
|
const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2022-03-04 06:02:00 +03:00
|
|
|
return IsRelativelyOrStickyPositionedStyle() &&
|
2023-04-03 00:17:07 +03:00
|
|
|
!aContextFrame->IsInSVGTextSubtree();
|
2022-03-04 06:02:01 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool nsStyleDisplay::IsRelativelyPositioned(
|
|
|
|
const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return IsRelativelyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree();
|
2012-08-02 15:38:50 +04:00
|
|
|
}
|
|
|
|
|
2018-11-22 07:35:23 +03:00
|
|
|
bool nsStyleDisplay::IsStickyPositioned(const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return IsStickyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree();
|
2018-11-22 07:35:23 +03:00
|
|
|
}
|
|
|
|
|
2013-04-07 03:40:07 +04:00
|
|
|
bool nsStyleDisplay::IsAbsolutelyPositioned(
|
|
|
|
const nsIFrame* aContextFrame) const {
|
|
|
|
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
|
|
|
|
"unexpected aContextFrame");
|
2023-04-03 00:17:07 +03:00
|
|
|
return IsAbsolutelyPositionedStyle() && !aContextFrame->IsInSVGTextSubtree();
|
2012-08-02 15:38:50 +04:00
|
|
|
}
|
|
|
|
|
2016-07-15 22:56:39 +03:00
|
|
|
bool nsStyleBackground::HasLocalBackground() const {
|
|
|
|
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, mImage) {
|
|
|
|
const nsStyleImageLayers::Layer& layer = mImage.mLayers[i];
|
2020-02-11 23:56:20 +03:00
|
|
|
if (!layer.mImage.IsNone() &&
|
2018-05-09 01:05:33 +03:00
|
|
|
layer.mAttachment == mozilla::StyleImageLayerAttachment::Local) {
|
2016-07-15 22:56:39 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2008-07-17 10:30:25 +04:00
|
|
|
#endif /* !defined(nsStyleStructInlines_h_) */
|