void RenderNamedFlowThread::addRegionToNamedFlowThread(RenderRegion* renderRegion) { ASSERT(renderRegion); ASSERT(!renderRegion->isValid()); if (renderRegion->parentNamedFlowThread()) addDependencyOnFlowThread(renderRegion->parentNamedFlowThread()); renderRegion->setIsValid(true); addRegionToList(m_regionList, renderRegion); }
void RenderNamedFlowThread::checkInvalidRegions() { Vector<RenderRegion*> newValidRegions; for (RenderRegionList::iterator iter = m_invalidRegionList.begin(); iter != m_invalidRegionList.end(); ++iter) { RenderRegion* region = *iter; // The only reason a region would be invalid is because it has a parent flow thread. ASSERT(!region->isValid() && region->parentNamedFlowThread()); if (region->parentNamedFlowThread()->dependsOn(this)) continue; newValidRegions.append(region); } for (Vector<RenderRegion*>::iterator iter = newValidRegions.begin(); iter != newValidRegions.end(); ++iter) { RenderRegion* region = *iter; m_invalidRegionList.remove(region); region->parentNamedFlowThread()->m_observerThreadsSet.remove(this); region->setIsValid(true); addDependencyOnFlowThread(region->parentNamedFlowThread()); addRegionToList(m_regionList, region); } if (!newValidRegions.isEmpty()) invalidateRegions(); if (m_observerThreadsSet.isEmpty()) return; // Notify all the flow threads that were dependent on this flow. // Create a copy of the list first. That's because observers might change the list when calling checkInvalidRegions. Vector<RenderNamedFlowThread*> observers; copyToVector(m_observerThreadsSet, observers); for (size_t i = 0; i < observers.size(); ++i) { RenderNamedFlowThread* flowThread = observers.at(i); flowThread->checkInvalidRegions(); } }
void RenderNamedFlowThread::addRegionToThread(RenderRegion* renderRegion) { ASSERT(renderRegion); resetMarkForDestruction(); ASSERT(!renderRegion->isValid()); if (renderRegion->parentNamedFlowThread()) { if (renderRegion->parentNamedFlowThread()->dependsOn(this)) { // The order of invalid regions is irrelevant. m_invalidRegionList.add(renderRegion); // Register ourself to get a notification when the state changes. renderRegion->parentNamedFlowThread()->m_observerThreadsSet.add(this); return; } addDependencyOnFlowThread(renderRegion->parentNamedFlowThread()); } renderRegion->setIsValid(true); addRegionToList(m_regionList, renderRegion); invalidateRegions(); }