Index: third_party/WebKit/Source/platform/graphics/paint/PaintChunker.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintChunker.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintChunker.cpp |
index 485ec009c0a5657995fb08d4ac3ed465a753e754..fab3f180315d1a7073f82d8ea35758eaa63f4f4f 100644 |
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintChunker.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintChunker.cpp |
@@ -16,19 +16,41 @@ PaintChunker::~PaintChunker() |
{ |
} |
-void PaintChunker::updateCurrentPaintChunkProperties(const PaintChunkProperties& properties) |
+void PaintChunker::updateCurrentPaintChunkProperties(const PaintChunk::Id* chunkId, const PaintChunkProperties& properties) |
{ |
ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ m_currentChunkId = WTF::nullopt; |
+ if (chunkId) |
+ m_currentChunkId.emplace(*chunkId); |
m_currentProperties = properties; |
} |
-void PaintChunker::incrementDisplayItemIndex(ItemBehavior behavior) |
+void PaintChunker::incrementDisplayItemIndex(const DisplayItem& item) |
{ |
ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ ItemBehavior behavior; |
+ Optional<PaintChunk::Id> newChunkId; |
+ if (DisplayItem::isForeignLayerType(item.getType())) { |
+ behavior = RequiresSeparateChunk; |
+ // Use null chunkId if we are skipping cache, so that the chunk will not |
+ // match any old chunk and will be treated as brand new. |
+ if (!item.skippedCache()) |
+ newChunkId.emplace(item.getId()); |
+ |
+ // Clear m_currentChunkId so that any display items after the foreign layer |
+ // without a new chunk id will be treated as having no id to avoid the chunk |
+ // from using the same id as the chunk before the foreign layer chunk. |
+ m_currentChunkId = WTF::nullopt; |
+ } else { |
+ behavior = DefaultBehavior; |
+ if (!item.skippedCache() && m_currentChunkId) |
+ newChunkId.emplace(*m_currentChunkId); |
+ } |
+ |
if (m_chunks.isEmpty()) { |
- PaintChunk newChunk(0, 1, m_currentProperties); |
+ PaintChunk newChunk(0, 1, newChunkId ? &*newChunkId : nullptr, m_currentProperties); |
m_chunks.append(newChunk); |
m_chunkBehavior.append(behavior); |
return; |
@@ -43,7 +65,7 @@ void PaintChunker::incrementDisplayItemIndex(ItemBehavior behavior) |
return; |
} |
- PaintChunk newChunk(lastChunk.endIndex, lastChunk.endIndex + 1, m_currentProperties); |
+ PaintChunk newChunk(lastChunk.endIndex, lastChunk.endIndex + 1, newChunkId ? &*newChunkId : nullptr, m_currentProperties); |
m_chunks.append(newChunk); |
m_chunkBehavior.append(behavior); |
} |
@@ -66,6 +88,7 @@ void PaintChunker::clear() |
{ |
m_chunks.clear(); |
m_chunkBehavior.clear(); |
+ m_currentChunkId = WTF::nullopt; |
m_currentProperties = PaintChunkProperties(); |
} |
@@ -74,6 +97,7 @@ Vector<PaintChunk> PaintChunker::releasePaintChunks() |
Vector<PaintChunk> chunks; |
chunks.swap(m_chunks); |
m_chunkBehavior.clear(); |
+ m_currentChunkId = WTF::nullopt; |
m_currentProperties = PaintChunkProperties(); |
return chunks; |
} |