Use is<>() / downcast<>() for all remaining RenderObject subclasses
[WebKit-https.git] / Source / WebCore / dom / WebKitNamedFlow.cpp
index 2709af7..51dfc0b 100644 (file)
 #include "config.h"
 #include "WebKitNamedFlow.h"
 
-#include "EventNames.h"
 #include "NamedFlowCollection.h"
+#include "RenderNamedFlowFragment.h"
 #include "RenderNamedFlowThread.h"
 #include "RenderRegion.h"
-#include "ScriptExecutionContext.h"
 #include "StaticNodeList.h"
 #include "UIEvent.h"
 
@@ -43,7 +42,7 @@ namespace WebCore {
 WebKitNamedFlow::WebKitNamedFlow(PassRefPtr<NamedFlowCollection> manager, const AtomicString& flowThreadName)
     : m_flowThreadName(flowThreadName)
     , m_flowManager(manager)
-    , m_parentFlowThread(0)
+    , m_parentFlowThread(nullptr)
 {
 }
 
@@ -70,7 +69,11 @@ bool WebKitNamedFlow::overset() const
 
     // The renderer may be destroyed or created after the style update.
     // Because this is called from JS, where the wrapper keeps a reference to the NamedFlow, no guard is necessary.
-    return m_parentFlowThread ? m_parentFlowThread->overset() : true;
+    if (!m_parentFlowThread || !m_parentFlowThread->hasRegions())
+        return true;
+
+    const auto& namedFlowFragment = downcast<RenderNamedFlowFragment>(*m_parentFlowThread->lastRegion());
+    return namedFlowFragment.regionOversetState() == RegionOverset;
 }
 
 static inline bool inFlowThread(RenderObject* renderer, RenderNamedFlowThread* flowThread)
@@ -98,21 +101,26 @@ int WebKitNamedFlow::firstEmptyRegionIndex() const
     const RenderRegionList& regionList = m_parentFlowThread->renderRegionList();
     if (regionList.isEmpty())
         return -1;
-    RenderRegionList::const_iterator iter = regionList.begin();
-    for (int index = 0; iter != regionList.end(); ++index, ++iter) {
-        const RenderRegion* renderRegion = *iter;
-        if (renderRegion->regionOversetState() == RegionEmpty)
-            return index;
+
+    int countNonPseudoRegions = -1;
+    for (const auto& renderRegion : regionList) {
+        const auto& namedFlowFragment = downcast<RenderNamedFlowFragment>(*renderRegion);
+        // FIXME: Pseudo-elements are not included in the list.
+        // They will be included when we will properly support the Region interface
+        // http://dev.w3.org/csswg/css-regions/#the-region-interface
+        if (namedFlowFragment.isPseudoElementRegion())
+            continue;
+        ++countNonPseudoRegions;
+        if (namedFlowFragment.regionOversetState() == RegionEmpty)
+            return countNonPseudoRegions;
     }
     return -1;
 }
 
 PassRefPtr<NodeList> WebKitNamedFlow::getRegionsByContent(Node* contentNode)
 {
-    Vector<RefPtr<Node> > regionNodes;
-
     if (!contentNode)
-        return StaticNodeList::adopt(regionNodes);
+        return StaticElementList::createEmpty();
 
     if (m_flowManager->document())
         m_flowManager->document()->updateLayoutIgnorePendingStylesheets();
@@ -120,67 +128,75 @@ PassRefPtr<NodeList> WebKitNamedFlow::getRegionsByContent(Node* contentNode)
     // The renderer may be destroyed or created after the style update.
     // Because this is called from JS, where the wrapper keeps a reference to the NamedFlow, no guard is necessary.
     if (!m_parentFlowThread)
-        return StaticNodeList::adopt(regionNodes);
+        return StaticElementList::createEmpty();
+
+    Vector<Ref<Element>> regionElements;
 
     if (inFlowThread(contentNode->renderer(), m_parentFlowThread)) {
         const RenderRegionList& regionList = m_parentFlowThread->renderRegionList();
-        for (RenderRegionList::const_iterator iter = regionList.begin(); iter != regionList.end(); ++iter) {
-            const RenderRegion* renderRegion = *iter;
+        for (const auto& renderRegion : regionList) {
+            const auto& namedFlowFragment = downcast<RenderNamedFlowFragment>(*renderRegion);
             // FIXME: Pseudo-elements are not included in the list.
-            if (!renderRegion->node())
+            // They will be included when we will properly support the Region interface
+            // http://dev.w3.org/csswg/css-regions/#the-region-interface
+            if (namedFlowFragment.isPseudoElementRegion())
                 continue;
-            if (m_parentFlowThread->objectInFlowRegion(contentNode->renderer(), renderRegion))
-                regionNodes.append(renderRegion->node());
+            if (m_parentFlowThread->objectInFlowRegion(contentNode->renderer(), &namedFlowFragment)) {
+                ASSERT(namedFlowFragment.generatingElement());
+                regionElements.append(*namedFlowFragment.generatingElement());
+            }
         }
     }
 
-    return StaticNodeList::adopt(regionNodes);
+    return StaticElementList::adopt(regionElements);
 }
 
 PassRefPtr<NodeList> WebKitNamedFlow::getRegions()
 {
-    Vector<RefPtr<Node> > regionNodes;
-
     if (m_flowManager->document())
         m_flowManager->document()->updateLayoutIgnorePendingStylesheets();
 
     // The renderer may be destroyed or created after the style update.
     // Because this is called from JS, where the wrapper keeps a reference to the NamedFlow, no guard is necessary.
     if (!m_parentFlowThread)
-        return StaticNodeList::adopt(regionNodes);
+        return StaticElementList::createEmpty();
+
+    Vector<Ref<Element>> regionElements;
 
     const RenderRegionList& regionList = m_parentFlowThread->renderRegionList();
-    for (RenderRegionList::const_iterator iter = regionList.begin(); iter != regionList.end(); ++iter) {
-        const RenderRegion* renderRegion = *iter;
+    for (const auto& renderRegion : regionList) {
+        const auto& namedFlowFragment = downcast<RenderNamedFlowFragment>(*renderRegion);
         // FIXME: Pseudo-elements are not included in the list.
-        if (!renderRegion->node())
+        // They will be included when we will properly support the Region interface
+        // http://dev.w3.org/csswg/css-regions/#the-region-interface
+        if (namedFlowFragment.isPseudoElementRegion())
             continue;
-        regionNodes.append(renderRegion->node());
+        ASSERT(namedFlowFragment.generatingElement());
+        regionElements.append(*namedFlowFragment.generatingElement());
     }
 
-    return StaticNodeList::adopt(regionNodes);
+    return StaticElementList::adopt(regionElements);
 }
 
 PassRefPtr<NodeList> WebKitNamedFlow::getContent()
 {
-    Vector<RefPtr<Node> > contentNodes;
-
     if (m_flowManager->document())
         m_flowManager->document()->updateLayoutIgnorePendingStylesheets();
 
     // The renderer may be destroyed or created after the style update.
     // Because this is called from JS, where the wrapper keeps a reference to the NamedFlow, no guard is necessary.
     if (!m_parentFlowThread)
-        return StaticNodeList::adopt(contentNodes);
+        return StaticElementList::createEmpty();
 
-    const NamedFlowContentNodes& contentNodesList = m_parentFlowThread->contentNodes();
-    for (NamedFlowContentNodes::const_iterator it = contentNodesList.begin(); it != contentNodesList.end(); ++it) {
-        Node* node = *it;
-        ASSERT(node->computedStyle()->flowThread() == m_parentFlowThread->flowThreadName());
-        contentNodes.append(node);
+    Vector<Ref<Element>> contentElements;
+
+    const NamedFlowContentElements& contentElementsList = m_parentFlowThread->contentElements();
+    for (auto& element : contentElementsList) {
+        ASSERT(element->computedStyle()->flowThread() == m_parentFlowThread->flowThreadName());
+        contentElements.append(*element);
     }
 
-    return StaticNodeList::adopt(contentNodes);
+    return StaticElementList::adopt(contentElements);
 }
 
 void WebKitNamedFlow::setRenderer(RenderNamedFlowThread* parentFlowThread)
@@ -192,29 +208,6 @@ void WebKitNamedFlow::setRenderer(RenderNamedFlowThread* parentFlowThread)
     m_parentFlowThread = parentFlowThread;
 }
 
-EventTargetData* WebKitNamedFlow::eventTargetData()
-{
-    return &m_eventTargetData;
-}
-
-EventTargetData* WebKitNamedFlow::ensureEventTargetData()
-{
-    return &m_eventTargetData;
-}
-
-void WebKitNamedFlow::dispatchRegionLayoutUpdateEvent()
-{
-    ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
-
-    // If the flow is in the "NULL" state the event should not be dispatched any more.
-    if (flowState() == FlowStateNull)
-        return;
-
-    RefPtr<Event> event = UIEvent::create(eventNames().webkitregionlayoutupdateEvent, false, false, m_flowManager->document()->defaultView(), 0);
-
-    dispatchEvent(event);
-}
-    
 void WebKitNamedFlow::dispatchRegionOversetChangeEvent()
 {
     ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
@@ -222,15 +215,8 @@ void WebKitNamedFlow::dispatchRegionOversetChangeEvent()
     // If the flow is in the "NULL" state the event should not be dispatched any more.
     if (flowState() == FlowStateNull)
         return;
-    
-    RefPtr<Event> event = UIEvent::create(eventNames().webkitregionoversetchangeEvent, false, false, m_flowManager->document()->defaultView(), 0);
-    
-    dispatchEvent(event);
-}
 
-const AtomicString& WebKitNamedFlow::interfaceName() const
-{
-    return eventNames().interfaceForWebKitNamedFlow;
+    dispatchEvent(UIEvent::create(eventNames().webkitregionoversetchangeEvent, false, false, m_flowManager->document()->defaultView(), 0));
 }
 
 ScriptExecutionContext* WebKitNamedFlow::scriptExecutionContext() const