static bool pseudoStyleCacheIsInvalid(RenderObject* renderer, RenderStyle* newStyle) { const RenderStyle* currentStyle = renderer->style(); const PseudoStyleCache* pseudoStyleCache = currentStyle->cachedPseudoStyles(); if (!pseudoStyleCache) return false; size_t cacheSize = pseudoStyleCache->size(); for (size_t i = 0; i < cacheSize; ++i) { RefPtr<RenderStyle> newPseudoStyle; PseudoId pseudoId = pseudoStyleCache->at(i)->styleType(); if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED) newPseudoStyle = renderer->uncachedFirstLineStyle(newStyle); else newPseudoStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(pseudoId), newStyle, newStyle); if (!newPseudoStyle) return true; if (*newPseudoStyle != *pseudoStyleCache->at(i)) { if (pseudoId < FIRST_INTERNAL_PSEUDOID) newStyle->setHasPseudoStyle(pseudoId); newStyle->addCachedPseudoStyle(newPseudoStyle); if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED) { // FIXME: We should do an actual diff to determine whether a repaint vs. layout // is needed, but for now just assume a layout will be required. The diff code // in RenderObject::setStyle would need to be factored out so that it could be reused. renderer->setNeedsLayoutAndPrefWidthsRecalc(); } return true; } } return false; }
PassRefPtr<RenderStyle> RenderScrollbar::getScrollbarPseudoStyle(ScrollbarPart partType, PseudoId pseudoId) { if (!owningRenderer()) return 0; RefPtr<RenderStyle> result = owningRenderer()->getUncachedPseudoStyle(PseudoStyleRequest(pseudoId, this, partType), &owningRenderer()->style()); // Scrollbars for root frames should always have background color // unless explicitly specified as transparent. So we force it. // This is because WebKit assumes scrollbar to be always painted and missing background // causes visual artifact like non-repainted dirty region. if (result && m_owningFrame && m_owningFrame->view() && !m_owningFrame->view()->isTransparent() && !result->hasBackground()) result->setBackgroundColor(Color::white); return result; }
static bool pseudoStyleCacheIsInvalid(RenderElement* renderer, RenderStyle* newStyle) { const RenderStyle& currentStyle = renderer->style(); const PseudoStyleCache* pseudoStyleCache = currentStyle.cachedPseudoStyles(); if (!pseudoStyleCache) return false; for (auto& cache : *pseudoStyleCache) { PseudoId pseudoId = cache->styleType(); std::unique_ptr<RenderStyle> newPseudoStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(pseudoId), newStyle, newStyle); if (!newPseudoStyle) return true; if (*newPseudoStyle != *cache) { newStyle->addCachedPseudoStyle(WTFMove(newPseudoStyle)); return true; } } return false; }