Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Unified Diff: third_party/WebKit/Source/core/layout/TextAutosizer.h

Issue 2299213003: Fix the inconsistent problem while the content of textNodes is changed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git rebase... Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/TextAutosizer.h
diff --git a/third_party/WebKit/Source/core/layout/TextAutosizer.h b/third_party/WebKit/Source/core/layout/TextAutosizer.h
index c7847de739e7f544666b85f23758315b025a934c..ef632bc702020ee1b24a551433ba750d38f7f306 100644
--- a/third_party/WebKit/Source/core/layout/TextAutosizer.h
+++ b/third_party/WebKit/Source/core/layout/TextAutosizer.h
@@ -47,6 +47,7 @@ class IntSize;
class LayoutBlock;
class LayoutObject;
class LayoutTable;
+class LayoutText;
class LocalFrame;
class Page;
class SubtreeLayoutScope;
@@ -67,8 +68,9 @@ class CORE_EXPORT TextAutosizer final
void updatePageInfoInAllFrames();
void updatePageInfo();
- void record(const LayoutBlock*);
- void destroy(const LayoutBlock*);
+ void record(LayoutBlock*);
+ void record(LayoutText*);
+ void destroy(LayoutBlock*);
bool pageNeedsAutosizing() const;
@@ -105,7 +107,8 @@ class CORE_EXPORT TextAutosizer final
};
private:
- typedef HashSet<const LayoutBlock*> BlockSet;
+ typedef HashSet<LayoutBlock*> BlockSet;
+ typedef HashSet<const LayoutBlock*> ConstBlockSet;
enum HasEnoughTextToAutosize {
UnknownAmountOfText,
@@ -137,6 +140,12 @@ class CORE_EXPORT TextAutosizer final
SUPPRESSING = 1 << 4
};
+ enum InheritParentMultiplier {
+ Unknown,
+ InheritMultiplier,
+ DontInheritMultiplier
+ };
+
typedef unsigned BlockFlags;
// A supercluster represents autosizing information about a set of two or
@@ -150,11 +159,13 @@ class CORE_EXPORT TextAutosizer final
explicit Supercluster(const BlockSet* roots)
: m_roots(roots),
m_hasEnoughTextToAutosize(UnknownAmountOfText),
- m_multiplier(0) {}
+ m_multiplier(0),
+ m_inheritParentMultiplier(Unknown) {}
- const BlockSet* const m_roots;
+ const BlockSet* m_roots;
HasEnoughTextToAutosize m_hasEnoughTextToAutosize;
float m_multiplier;
+ InheritParentMultiplier m_inheritParentMultiplier;
};
struct Cluster {
@@ -208,30 +219,40 @@ class CORE_EXPORT TextAutosizer final
"sizeof(FingerprintSourceData) must be a multiple of UChar");
typedef unsigned Fingerprint;
- typedef HashMap<Fingerprint, std::unique_ptr<Supercluster>> SuperclusterMap;
typedef Vector<std::unique_ptr<Cluster>> ClusterStack;
// Fingerprints are computed during style recalc, for (some subset of)
// blocks that will become cluster roots.
+ // Clusters whose roots share the same fingerprint use the same multiplier
class FingerprintMapper {
DISALLOW_NEW();
public:
- void add(const LayoutObject*, Fingerprint);
- void addTentativeClusterRoot(const LayoutBlock*, Fingerprint);
+ void add(LayoutObject*, Fingerprint);
+ void addTentativeClusterRoot(LayoutBlock*, Fingerprint);
// Returns true if any BlockSet was modified or freed by the removal.
- bool remove(const LayoutObject*);
+ bool remove(LayoutObject*);
Fingerprint get(const LayoutObject*);
BlockSet* getTentativeClusterRoots(Fingerprint);
+ Supercluster* createSuperclusterIfNeeded(LayoutBlock*);
bool hasFingerprints() const { return !m_fingerprints.isEmpty(); }
+ HashSet<Supercluster*>& getPotentiallyInconsistentSuperclusters() {
+ return m_potentiallyInconsistentSuperclusters;
+ }
private:
typedef HashMap<const LayoutObject*, Fingerprint> FingerprintMap;
typedef HashMap<Fingerprint, std::unique_ptr<BlockSet>>
ReverseFingerprintMap;
+ typedef HashMap<Fingerprint, std::unique_ptr<Supercluster>> SuperclusterMap;
FingerprintMap m_fingerprints;
ReverseFingerprintMap m_blocksForFingerprint;
+ // Maps fingerprints to superclusters. Superclusters persist across layouts.
+ SuperclusterMap m_superclusters;
+ // Superclusters that need to be checked for consistency at the start of the
+ // next layout.
+ HashSet<Supercluster*> m_potentiallyInconsistentSuperclusters;
#if ENABLE(ASSERT)
void assertMapsAreConsistent();
#endif
@@ -268,23 +289,23 @@ class CORE_EXPORT TextAutosizer final
float multiplier = 0);
bool shouldHandleLayout() const;
IntSize windowSize() const;
- void setAllTextNeedsLayout();
+ void setAllTextNeedsLayout(LayoutBlock* container = nullptr);
void resetMultipliers();
- BeginLayoutBehavior prepareForLayout(const LayoutBlock*);
- void prepareClusterStack(const LayoutObject*);
+ BeginLayoutBehavior prepareForLayout(LayoutBlock*);
+ void prepareClusterStack(LayoutObject*);
bool clusterHasEnoughTextToAutosize(
Cluster*,
const LayoutBlock* widthProvider = nullptr);
bool superclusterHasEnoughTextToAutosize(
Supercluster*,
- const LayoutBlock* widthProvider = nullptr);
+ const LayoutBlock* widthProvider = nullptr,
+ bool skipLayoutedNodes = false);
bool clusterWouldHaveEnoughTextToAutosize(
const LayoutBlock* root,
const LayoutBlock* widthProvider = nullptr);
- Fingerprint getFingerprint(const LayoutObject*);
+ Fingerprint getFingerprint(LayoutObject*);
Fingerprint computeFingerprint(const LayoutObject*);
- Cluster* maybeCreateCluster(const LayoutBlock*);
- Supercluster* getSupercluster(const LayoutBlock*);
+ Cluster* maybeCreateCluster(LayoutBlock*);
float clusterMultiplier(Cluster*);
float superclusterMultiplier(Cluster*);
// A cluster's width provider is typically the deepest block containing all
@@ -292,7 +313,7 @@ class CORE_EXPORT TextAutosizer final
// table itself for width.
const LayoutBlock* clusterWidthProvider(const LayoutBlock*) const;
const LayoutBlock* maxClusterWidthProvider(
- const Supercluster*,
+ Supercluster*,
const LayoutBlock* currentRoot) const;
// Typically this returns a block's computed width. In the case of tables
// layout, this width is not yet known so the fixed width is used if it's
@@ -319,19 +340,20 @@ class CORE_EXPORT TextAutosizer final
#ifdef AUTOSIZING_DOM_DEBUG_INFO
void writeClusterDebugInfo(Cluster*);
#endif
+ // Must be called at the start of layout.
+ void checkSuperclusterConsistency();
+ // Mark the nearest non-inheritance supercluser
+ void markSuperclusterForConsistencyCheck(LayoutObject*);
Member<const Document> m_document;
const LayoutBlock* m_firstBlockToBeginLayout;
#if ENABLE(ASSERT)
// Used to ensure we don't compute properties of a block before beginLayout()
// is called on it.
- BlockSet m_blocksThatHaveBegunLayout;
+ ConstBlockSet m_blocksThatHaveBegunLayout;
#endif
- // Clusters are created and destroyed during layout. The map key is the
- // cluster root. Clusters whose roots share the same fingerprint use the
- // same multiplier.
- SuperclusterMap m_superclusters;
+ // Clusters are created and destroyed during layout
ClusterStack m_clusterStack;
FingerprintMapper m_fingerprintMapper;
Vector<RefPtr<ComputedStyle>> m_stylesRetainedDuringLayout;
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutText.cpp ('k') | third_party/WebKit/Source/core/layout/TextAutosizer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698