void RenderNamedFlowThread::checkInvalidRegions() { for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.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->isValid() || region->parentNamedFlowThread()->dependsOn(this)) continue; region->parentNamedFlowThread()->m_observerThreadsSet.remove(this); addDependencyOnFlowThread(region->parentNamedFlowThread()); region->setIsValid(true); 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); if (m_regionList.isEmpty()) m_regionList.add(renderRegion); else { // Find the first region "greater" than renderRegion. RenderRegionList::iterator it = m_regionList.begin(); while (it != m_regionList.end() && !compareRenderRegions(renderRegion, *it)) ++it; m_regionList.insertBefore(it, renderRegion); } resetMarkForDestruction(); ASSERT(!renderRegion->isValid()); if (renderRegion->parentNamedFlowThread()) { if (renderRegion->parentNamedFlowThread()->dependsOn(this)) { // Register ourself to get a notification when the state changes. renderRegion->parentNamedFlowThread()->m_observerThreadsSet.add(this); return; } addDependencyOnFlowThread(renderRegion->parentNamedFlowThread()); } renderRegion->setIsValid(true); invalidateRegions(); }
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::addFragmentToNamedFlowThread(RenderNamedFlowFragment* renderNamedFlowFragment) { ASSERT(renderNamedFlowFragment); ASSERT(!renderNamedFlowFragment->isValid()); if (renderNamedFlowFragment->parentNamedFlowThread()) addDependencyOnFlowThread(renderNamedFlowFragment->parentNamedFlowThread()); renderNamedFlowFragment->setIsValid(true); renderNamedFlowFragment->updateRegionFlags(); addFragmentToList(m_regionList, renderNamedFlowFragment); if (m_regionList.first() == renderNamedFlowFragment) updateWritingMode(); }
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(); }