void RenderFlowThread::regionLayoutUpdateEventTimerFired(Timer<RenderFlowThread>*)
{
    // Create a copy of region nodes, to protect them for being destroyed in the event listener
    Vector<RefPtr<Node> > regionNodes;
    regionNodes.reserveCapacity(m_regionList.size());
    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
        RenderRegion* region = *iter;
        ASSERT(region->node() && region->node()->isElementNode());
        // dispatch the event only for marked regions and only for those who have a listener
        if (region->shouldDispatchRegionLayoutUpdateEvent()) {
            regionNodes.append(region->node());
            // clear the dispatch flag here, as it is possible to be set again due to event listeners
            region->setDispatchRegionLayoutUpdateEvent(false);
        }
    }
    for (Vector<RefPtr<Node> >::const_iterator it = regionNodes.begin(); it != regionNodes.end(); ++it) {
        RefPtr<Node> node = *it;
        RefPtr<Document> document = node->document();
        if (!document)
            continue;
        RenderObject* renderer = node->renderer();
        if (renderer && renderer->isRenderRegion()) {
            node->dispatchRegionLayoutUpdateEvent();
            // Layout needs to be uptodate after each event listener
            document->updateLayoutIgnorePendingStylesheets();
        }
    }
}
Example #2
0
static void writeRenderNamedFlowThreads(TextStream& ts, RenderView* renderView, const RenderLayer* rootLayer,
                        const LayoutRect& paintRect, int indent, RenderAsTextBehavior behavior)
{
    if (!renderView->hasRenderNamedFlowThreads())
        return;

    const RenderNamedFlowThreadList* list = renderView->flowThreadController()->renderNamedFlowThreadList();

    writeIndent(ts, indent);
    ts << "Flow Threads\n";

    for (RenderNamedFlowThreadList::const_iterator iter = list->begin(); iter != list->end(); ++iter) {
        const RenderNamedFlowThread* renderFlowThread = *iter;

        writeIndent(ts, indent + 1);
        ts << "Thread with flow-name '" << renderFlowThread->flowThreadName() << "'\n";

        RenderLayer* layer = renderFlowThread->layer();
        writeLayers(ts, rootLayer, layer, paintRect, indent + 2, behavior);

        // Display the render regions attached to this flow thread
        const RenderRegionList& flowThreadRegionList = renderFlowThread->renderRegionList();
        if (!flowThreadRegionList.isEmpty()) {
            writeIndent(ts, indent + 1);
            ts << "Regions for flow '"<< renderFlowThread->flowThreadName() << "'\n";
            for (RenderRegionList::const_iterator itRR = flowThreadRegionList.begin(); itRR != flowThreadRegionList.end(); ++itRR) {
                RenderRegion* renderRegion = *itRR;
                writeIndent(ts, indent + 2);
                ts << "RenderRegion";
                if (renderRegion->node()) {
                    String tagName = getTagName(renderRegion->node());
                    if (!tagName.isEmpty())
                        ts << " {" << tagName << "}";
                    if (renderRegion->node()->isElementNode() && renderRegion->node()->hasID()) {
                        Element* element = static_cast<Element*>(renderRegion->node());
                        ts << " #" << element->idForStyleResolution();
                    }
                    if (renderRegion->hasCustomRegionStyle())
                        ts << " region style: 1";
                }
                if (!renderRegion->isValid())
                    ts << " invalid";
                ts << "\n";
            }
        }
    }
}