mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 23:06:52 +00:00
dcbe25ed45
- Bug 1235979 - Remove spammy printf that got left by accident when bug 1226904 landed. r=thinker (fc6fe64f23) - Bug 1208344 part 1: Make EnsurePhysicalProperty() return the property directly, instead of using in/out-param. r=heycam (9515887dd7) - Bug 1208344 part 2: Make EnsurePhysicalProperty() (not its callers) check whether property is logical. r=heycam (defa671bab) - Bug 1208344 part 3: Rename MapSinglePropertyInto() args, to make src-vs-target distinctions clearer. r=heycam (bfd2e2c9bc) - Bug 1208344 part 4: Make MapSinglePropertyInto() take the source property as an arg (unused for the moment). r=heycam (d1278eb58a) - Bug 1208344 part 5: Add (preffed-off) support for "-webkit-box-orient" CSS property, as a writing-mode-dependent alias for "flex-direction". r=heycam (d8407990aa) - Bug 1208344 part 6: Move new CSS_PROPERTY_LOGICAL_CUSTOM flag up with other LOGICAL flags, and adjust bits accordingly. r=heycam (df27d64733) - Bug 1208344 part 7: Add mochitest to test how "-webkit-box-orient" maps to "flex-direction". r=heycam (c448070877) - Bug 686225 - Work around buggy AAT fonts for Bengali and Kannada scripts. r=jdaggett (17afddbc6c) - Bug 739117 - Avoid bidi-wrapping the text to be shaped if Core Text direction override API is available. r=jdaggett (c492390922) - Bug 1156581 - Add null check to nsSVGEffects::InvalidateRenderingObservers to prevent crashes r=dholbert (4c0460e7ac) - remove windows accents (8b0ad08f11) - Bug 1123654 - Replace use of [deprecated] GetStockObject(DEFAULT_GUI_FONT) with newer API; results in use of Tahoma in place of Microsoft Sans Serif in various contexts. r=jmathies (3a81fc1bed) - put back cleartype for winXP (1c24e5ae09) - Bug 1240180 - Optimize native theme scaling for the single-monitor case. r=emk (a5846457ab) - Bug 1242720 - Use (non-dynamic) resolution from GetDeviceCaps when dealing with native-theme code that does not handle dynamic changes to system DPI. r=emk (7c25841f0b) - More win accent removal (afd6af9fd2) - some more vista or later stuff (1d99554064) - missing bits of Bug 1243720 - Send accessibility theme state down to the content process on Windows. r=jimm (8f00b4f3ca) - Bug 1153460 - Support new Fitzpatrick emoji modifiers and regional symbol indicators in Apple Color Emoji font. r=jdaggett (6faf5f30e6) - Bug 1230497 - Ignore font fallback in Core Text shaping if it's just for a join-control character. r=jdaggett (b612806a42) - Bug 1153460 - Followup to fix warnings-as-errors build failure on a CLOSED TREE. r=bustage. (12d492772c) - bug 1243077 - make it possible to get MaiAtkObject::mAccWrap from an AtkObject* without casting to Accessible* or ProxyAccessible* r=davidb (d8f690b6cd) - Bug 1238403 - Fix inconsistent indenting in layout/style/. r=xidorn (4f24334234) - Bug 717722 - Implement WebKitCSSMatrix. r=baku (c10f90ff6e) - Bug 1241723. Update WebKitCSSMatrix.idl to match latest spec updates. r=baku (5f8c33ff14) - Bug 1241727 - Inverting non-invertible WebKitCSSMatrix should throw NotSupportedError. r=baku (c7791802b8) - Bug 1241575 - Use transform property syntax to parse WebKitCSSMatrix transform list. r=heycam (5f886e2bd9) - bug 1243077 - add AccessibleOrProxy::ChildCount() r=davidb (044537f53c) - bug 1243077 - add AccessibleOrProxy::Role() r=davidb (3f61d03c8e) - bug 1243077 - add AccessibleOrProxy::ChildAt() r=davidb (91288f269f) - bug 1243077 - add AccessibleOrProxy::FirstChild() r=davidb (ea3f984716) - bug 1243077 - add AccessibleOrProxy::LastChild() r=davidb (2181f1740b) - Bug 1237720: Put "-webkit-min-device-pixel-ratio"/"-webkit-max-device-pixel-ratio" behind its own disabled pref. r=heycam (9f75535617) - Bug 1239153: Accept unitless '0' for angle values in CSS -webkit-linear-gradient() expressions. r=heycam (c11657a6c9) - Bug 1239799 part 1: Make check for -webkit-device-pixel-ratio pref more targeted, so we can support other webkit-prefixed media queries. r=heycam (1e8a40127e) - Bug 1239799 part 2: Add support for @media(-webkit-transform-3d) media query, for web compatibility. r=heycam (f7ff08423e) - guard some code for 10.5/10.6 which didn't get run, but coulnd't natively compile (cf68e969fd) - Bug 1019856 - avoid double-buffering in BasicCompositor when window allows it. r=mattwoodrow (e94cfc3fb4)
373 lines
12 KiB
C++
373 lines
12 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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/. */
|
|
|
|
/*
|
|
* compact representation of the property-value pairs within a CSS
|
|
* declaration, and the code for expanding and compacting it
|
|
*/
|
|
|
|
#ifndef nsCSSDataBlock_h__
|
|
#define nsCSSDataBlock_h__
|
|
|
|
#include "mozilla/MemoryReporting.h"
|
|
#include "nsCSSProps.h"
|
|
#include "nsCSSPropertySet.h"
|
|
#include "nsCSSValue.h"
|
|
#include "nsStyleStruct.h"
|
|
#include "imgRequestProxy.h"
|
|
|
|
struct nsRuleData;
|
|
class nsCSSExpandedDataBlock;
|
|
class nsIDocument;
|
|
|
|
namespace mozilla {
|
|
namespace css {
|
|
class Declaration;
|
|
} // namespace css
|
|
} // namespace mozilla
|
|
|
|
/**
|
|
* An |nsCSSCompressedDataBlock| holds a usually-immutable chunk of
|
|
* property-value data for a CSS declaration block (which we misname a
|
|
* |css::Declaration|). Mutation is accomplished through
|
|
* |nsCSSExpandedDataBlock| or in some cases via direct slot access.
|
|
*/
|
|
class nsCSSCompressedDataBlock
|
|
{
|
|
private:
|
|
friend class nsCSSExpandedDataBlock;
|
|
|
|
// Only this class (via |CreateEmptyBlock|) or nsCSSExpandedDataBlock
|
|
// (in |Compress|) can create compressed data blocks.
|
|
explicit nsCSSCompressedDataBlock(uint32_t aNumProps)
|
|
: mStyleBits(0), mNumProps(aNumProps)
|
|
{}
|
|
|
|
public:
|
|
~nsCSSCompressedDataBlock();
|
|
|
|
/**
|
|
* Do what |nsIStyleRule::MapRuleInfoInto| needs to do for a style
|
|
* rule using this block for storage.
|
|
*/
|
|
void MapRuleInfoInto(nsRuleData *aRuleData) const;
|
|
|
|
/**
|
|
* Return the location at which the *value* for the property is
|
|
* stored, or null if the block does not contain a value for the
|
|
* property.
|
|
*
|
|
* Inefficient (by design).
|
|
*
|
|
* Must not be called for shorthands.
|
|
*/
|
|
const nsCSSValue* ValueFor(nsCSSProperty aProperty) const;
|
|
|
|
/**
|
|
* Attempt to replace the value for |aProperty| stored in this block
|
|
* with the matching value stored in |aFromBlock|.
|
|
* This method will fail (returning false) if |aProperty| is not
|
|
* already in this block. It will set |aChanged| to true if it
|
|
* actually made a change to the block, but regardless, if it
|
|
* returns true, the value in |aFromBlock| was erased.
|
|
*/
|
|
bool TryReplaceValue(nsCSSProperty aProperty,
|
|
nsCSSExpandedDataBlock& aFromBlock,
|
|
bool* aChanged);
|
|
|
|
/**
|
|
* Clone this block, or return null on out-of-memory.
|
|
*/
|
|
nsCSSCompressedDataBlock* Clone() const;
|
|
|
|
/**
|
|
* Create a new nsCSSCompressedDataBlock holding no declarations.
|
|
*/
|
|
static nsCSSCompressedDataBlock* CreateEmptyBlock();
|
|
|
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
|
|
|
bool HasDefaultBorderImageSlice() const;
|
|
bool HasDefaultBorderImageWidth() const;
|
|
bool HasDefaultBorderImageOutset() const;
|
|
bool HasDefaultBorderImageRepeat() const;
|
|
|
|
bool HasInheritedStyleData() const
|
|
{
|
|
return mStyleBits & NS_STYLE_INHERITED_STRUCT_MASK;
|
|
}
|
|
|
|
private:
|
|
void* operator new(size_t aBaseSize, uint32_t aNumProps) {
|
|
MOZ_ASSERT(aBaseSize == sizeof(nsCSSCompressedDataBlock),
|
|
"unexpected size for nsCSSCompressedDataBlock");
|
|
return ::operator new(aBaseSize + DataSize(aNumProps));
|
|
}
|
|
|
|
public:
|
|
// Ideally, |nsCSSProperty| would be |enum nsCSSProperty : int16_t|. But
|
|
// not all of the compilers we use are modern enough to support small
|
|
// enums. So we manually squeeze nsCSSProperty into 16 bits ourselves.
|
|
// The static assertion below ensures it fits.
|
|
typedef int16_t CompressedCSSProperty;
|
|
static const size_t MaxCompressedCSSProperty = INT16_MAX;
|
|
|
|
private:
|
|
static size_t DataSize(uint32_t aNumProps) {
|
|
return size_t(aNumProps) *
|
|
(sizeof(nsCSSValue) + sizeof(CompressedCSSProperty));
|
|
}
|
|
|
|
int32_t mStyleBits; // the structs for which we have data, according to
|
|
// |nsCachedStyleData::GetBitForSID|.
|
|
uint32_t mNumProps;
|
|
// nsCSSValue elements are stored after these fields, and
|
|
// nsCSSProperty elements are stored -- each one compressed as a
|
|
// CompressedCSSProperty -- after the nsCSSValue elements. Space for them
|
|
// is allocated in |operator new| above. The static assertions following
|
|
// this class make sure that the value and property elements are aligned
|
|
// appropriately.
|
|
|
|
nsCSSValue* Values() const {
|
|
return (nsCSSValue*)(this + 1);
|
|
}
|
|
|
|
CompressedCSSProperty* CompressedProperties() const {
|
|
return (CompressedCSSProperty*)(Values() + mNumProps);
|
|
}
|
|
|
|
nsCSSValue* ValueAtIndex(uint32_t i) const {
|
|
MOZ_ASSERT(i < mNumProps, "value index out of range");
|
|
return Values() + i;
|
|
}
|
|
|
|
nsCSSProperty PropertyAtIndex(uint32_t i) const {
|
|
MOZ_ASSERT(i < mNumProps, "property index out of range");
|
|
nsCSSProperty prop = (nsCSSProperty)CompressedProperties()[i];
|
|
MOZ_ASSERT(!nsCSSProps::IsShorthand(prop), "out of range");
|
|
return prop;
|
|
}
|
|
|
|
void CopyValueToIndex(uint32_t i, nsCSSValue* aValue) {
|
|
new (ValueAtIndex(i)) nsCSSValue(*aValue);
|
|
}
|
|
|
|
void RawCopyValueToIndex(uint32_t i, nsCSSValue* aValue) {
|
|
memcpy(ValueAtIndex(i), aValue, sizeof(nsCSSValue));
|
|
}
|
|
|
|
void SetPropertyAtIndex(uint32_t i, nsCSSProperty aProperty) {
|
|
MOZ_ASSERT(i < mNumProps, "set property index out of range");
|
|
CompressedProperties()[i] = (CompressedCSSProperty)aProperty;
|
|
}
|
|
|
|
void SetNumPropsToZero() {
|
|
mNumProps = 0;
|
|
}
|
|
};
|
|
|
|
// Make sure the values and properties are aligned appropriately. (These
|
|
// assertions are stronger than necessary to keep them simple.)
|
|
static_assert(sizeof(nsCSSCompressedDataBlock) == 8,
|
|
"nsCSSCompressedDataBlock's size has changed");
|
|
static_assert(NS_ALIGNMENT_OF(nsCSSValue) == 4 || NS_ALIGNMENT_OF(nsCSSValue) == 8,
|
|
"nsCSSValue doesn't align with nsCSSCompressedDataBlock");
|
|
static_assert(NS_ALIGNMENT_OF(nsCSSCompressedDataBlock::CompressedCSSProperty) == 2,
|
|
"CompressedCSSProperty doesn't align with nsCSSValue");
|
|
|
|
// Make sure that sizeof(CompressedCSSProperty) is big enough.
|
|
static_assert(eCSSProperty_COUNT_no_shorthands <=
|
|
nsCSSCompressedDataBlock::MaxCompressedCSSProperty,
|
|
"nsCSSProperty doesn't fit in StoredSizeOfCSSProperty");
|
|
|
|
class nsCSSExpandedDataBlock
|
|
{
|
|
friend class nsCSSCompressedDataBlock;
|
|
|
|
public:
|
|
nsCSSExpandedDataBlock();
|
|
~nsCSSExpandedDataBlock();
|
|
|
|
private:
|
|
/* Property storage may not be accessed directly; use AddLonghandProperty
|
|
* and friends.
|
|
*/
|
|
nsCSSValue mValues[eCSSProperty_COUNT_no_shorthands];
|
|
|
|
public:
|
|
/**
|
|
* Transfer all of the state from a pair of compressed data blocks
|
|
* to this expanded block. This expanded block must be clear
|
|
* beforehand.
|
|
*
|
|
* This method DELETES both of the compressed data blocks it is
|
|
* passed. (This is necessary because ownership of sub-objects
|
|
* is transferred to the expanded block.)
|
|
*/
|
|
void Expand(nsCSSCompressedDataBlock *aNormalBlock,
|
|
nsCSSCompressedDataBlock *aImportantBlock);
|
|
|
|
/**
|
|
* Allocate new compressed blocks and transfer all of the state
|
|
* from this expanded block to the new blocks, clearing this
|
|
* expanded block. A normal block will always be allocated, but
|
|
* an important block will only be allocated if there are
|
|
* !important properties in the expanded block; otherwise
|
|
* |*aImportantBlock| will be set to null.
|
|
*
|
|
* aOrder is an array of nsCSSProperty values specifying the order
|
|
* to store values in the two data blocks.
|
|
*/
|
|
void Compress(nsCSSCompressedDataBlock **aNormalBlock,
|
|
nsCSSCompressedDataBlock **aImportantBlock,
|
|
const nsTArray<uint32_t>& aOrder);
|
|
|
|
/**
|
|
* Copy a value into this expanded block. This does NOT destroy
|
|
* the source value object. |aProperty| cannot be a shorthand.
|
|
*/
|
|
void AddLonghandProperty(nsCSSProperty aProperty, const nsCSSValue& aValue);
|
|
|
|
/**
|
|
* Clear the state of this expanded block.
|
|
*/
|
|
void Clear();
|
|
|
|
/**
|
|
* Clear the data for the given property (including the set and
|
|
* important bits). Can be used with shorthand properties.
|
|
*/
|
|
void ClearProperty(nsCSSProperty aPropID);
|
|
|
|
/**
|
|
* Same as ClearProperty, but faster and cannot be used with shorthands.
|
|
*/
|
|
void ClearLonghandProperty(nsCSSProperty aPropID);
|
|
|
|
/**
|
|
* Transfer the state for |aPropID| (which may be a shorthand)
|
|
* from |aFromBlock| to this block. The property being transferred
|
|
* is !important if |aIsImportant| is true, and should replace an
|
|
* existing !important property regardless of its own importance
|
|
* if |aOverrideImportant| is true. |aEnabledState| is used to
|
|
* determine which longhand components of |aPropID| (if it is a
|
|
* shorthand) to transfer.
|
|
*
|
|
* Returns true if something changed, false otherwise. Calls
|
|
* |ValueAppended| on |aDeclaration| if the property was not
|
|
* previously set, or in any case if |aMustCallValueAppended| is true.
|
|
* Calls |SetDocumentAndPageUseCounter| on |aSheetDocument| if it is
|
|
* non-null and |aPropID| has a use counter.
|
|
*/
|
|
bool TransferFromBlock(nsCSSExpandedDataBlock& aFromBlock,
|
|
nsCSSProperty aPropID,
|
|
nsCSSProps::EnabledState aEnabledState,
|
|
bool aIsImportant,
|
|
bool aOverrideImportant,
|
|
bool aMustCallValueAppended,
|
|
mozilla::css::Declaration* aDeclaration,
|
|
nsIDocument* aSheetDocument);
|
|
|
|
/**
|
|
* Copies the values for aPropID into the specified aRuleData object.
|
|
*
|
|
* This is used for copying parsed-at-computed-value-time properties
|
|
* that had variable references. aPropID must be a longhand property.
|
|
*/
|
|
void MapRuleInfoInto(nsCSSProperty aPropID, nsRuleData* aRuleData) const;
|
|
|
|
void AssertInitialState() {
|
|
#ifdef DEBUG
|
|
DoAssertInitialState();
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
/**
|
|
* Compute the number of properties that will be present in the
|
|
* result of |Compress|.
|
|
*/
|
|
void ComputeNumProps(uint32_t* aNumPropsNormal,
|
|
uint32_t* aNumPropsImportant);
|
|
|
|
void DoExpand(nsCSSCompressedDataBlock *aBlock, bool aImportant);
|
|
|
|
/**
|
|
* Worker for TransferFromBlock; cannot be used with shorthands.
|
|
*/
|
|
bool DoTransferFromBlock(nsCSSExpandedDataBlock& aFromBlock,
|
|
nsCSSProperty aPropID,
|
|
bool aIsImportant,
|
|
bool aOverrideImportant,
|
|
bool aMustCallValueAppended,
|
|
mozilla::css::Declaration* aDeclaration,
|
|
nsIDocument* aSheetDocument);
|
|
|
|
#ifdef DEBUG
|
|
void DoAssertInitialState();
|
|
#endif
|
|
|
|
/*
|
|
* mPropertiesSet stores a bit for every property that is present,
|
|
* to optimize compression of blocks with small numbers of
|
|
* properties (the norm) and to allow quickly checking whether a
|
|
* property is set in this block.
|
|
*/
|
|
nsCSSPropertySet mPropertiesSet;
|
|
/*
|
|
* mPropertiesImportant indicates which properties are '!important'.
|
|
*/
|
|
nsCSSPropertySet mPropertiesImportant;
|
|
|
|
/*
|
|
* Return the storage location within |this| of the value of the
|
|
* property |aProperty|.
|
|
*/
|
|
nsCSSValue* PropertyAt(nsCSSProperty aProperty) {
|
|
MOZ_ASSERT(0 <= aProperty &&
|
|
aProperty < eCSSProperty_COUNT_no_shorthands,
|
|
"property out of range");
|
|
return &mValues[aProperty];
|
|
}
|
|
const nsCSSValue* PropertyAt(nsCSSProperty aProperty) const {
|
|
MOZ_ASSERT(0 <= aProperty &&
|
|
aProperty < eCSSProperty_COUNT_no_shorthands,
|
|
"property out of range");
|
|
return &mValues[aProperty];
|
|
}
|
|
|
|
void SetPropertyBit(nsCSSProperty aProperty) {
|
|
mPropertiesSet.AddProperty(aProperty);
|
|
}
|
|
|
|
void ClearPropertyBit(nsCSSProperty aProperty) {
|
|
mPropertiesSet.RemoveProperty(aProperty);
|
|
}
|
|
|
|
bool HasPropertyBit(nsCSSProperty aProperty) {
|
|
return mPropertiesSet.HasProperty(aProperty);
|
|
}
|
|
|
|
void SetImportantBit(nsCSSProperty aProperty) {
|
|
mPropertiesImportant.AddProperty(aProperty);
|
|
}
|
|
|
|
void ClearImportantBit(nsCSSProperty aProperty) {
|
|
mPropertiesImportant.RemoveProperty(aProperty);
|
|
}
|
|
|
|
bool HasImportantBit(nsCSSProperty aProperty) {
|
|
return mPropertiesImportant.HasProperty(aProperty);
|
|
}
|
|
|
|
void ClearSets() {
|
|
mPropertiesSet.Empty();
|
|
mPropertiesImportant.Empty();
|
|
}
|
|
};
|
|
|
|
#endif /* !defined(nsCSSDataBlock_h__) */
|