void PaintController::checkCachedDisplayItemIsUnchanged(const char* messagePrefix, const DisplayItem& newItem, const DisplayItem& oldItem) { ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()); ASSERT(!newItem.isCached()); ASSERT(!oldItem.isCached()); if (newItem.skippedCache()) { showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: skipped-cache in cached subsequence", &newItem, &oldItem); ASSERT_NOT_REACHED(); } if (newItem.isCacheable() && !m_validlyCachedClients.contains(&newItem.client())) { showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: invalidated in cached subsequence", &newItem, &oldItem); ASSERT_NOT_REACHED(); } if (newItem.equals(oldItem)) return; showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: display item changed", &newItem, &oldItem); #ifndef NDEBUG if (newItem.isDrawing()) { RefPtr<const SkPicture> newPicture = static_cast<const DrawingDisplayItem&>(newItem).picture(); RefPtr<const SkPicture> oldPicture = static_cast<const DrawingDisplayItem&>(oldItem).picture(); String oldPictureDebugString = oldPicture ? pictureAsDebugString(oldPicture.get()) : "None"; String newPictureDebugString = newPicture ? pictureAsDebugString(newPicture.get()) : "None"; WTFLogAlways("old picture:\n%s\n", oldPictureDebugString.utf8().data()); WTFLogAlways("new picture:\n%s\n", newPictureDebugString.utf8().data()); } #endif // NDEBUG ASSERT_NOT_REACHED(); }
void PaintController::processNewItem(DisplayItem& displayItem) { ASSERT(!m_constructionDisabled); ASSERT(!skippingCache() || !displayItem.isCached()); if (displayItem.isCached()) ++m_numCachedNewItems; #if ENABLE(ASSERT) // Verify noop begin/end pairs have been removed. if (m_newDisplayItemList.size() >= 2 && displayItem.isEnd()) { const auto& beginDisplayItem = m_newDisplayItemList[m_newDisplayItemList.size() - 2]; if (beginDisplayItem.isBegin() && beginDisplayItem.type() != DisplayItem::Subsequence && !beginDisplayItem.drawsContent()) ASSERT(!displayItem.isEndAndPairedWith(beginDisplayItem.type())); } #endif if (!m_scopeStack.isEmpty()) displayItem.setScope(m_scopeStack.last()); #if ENABLE(ASSERT) size_t index = findMatchingItemFromIndex(displayItem.nonCachedId(), m_newDisplayItemIndicesByClient, m_newDisplayItemList); if (index != kNotFound) { #ifndef NDEBUG showDebugData(); WTFLogAlways("DisplayItem %s has duplicated id with previous %s (index=%d)\n", displayItem.asDebugString().utf8().data(), m_newDisplayItemList[index].asDebugString().utf8().data(), static_cast<int>(index)); #endif ASSERT_NOT_REACHED(); } addItemToIndexIfNeeded(displayItem, m_newDisplayItemList.size() - 1, m_newDisplayItemIndicesByClient); #endif // ENABLE(ASSERT) if (skippingCache()) displayItem.setSkippedCache(); if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) m_newPaintChunks.incrementDisplayItemIndex(); }