Changeset 110731 in webkit


Ignore:
Timestamp:
Mar 14, 2012 12:48:06 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[CSSRegions][CSSOM] Implement regionLayoutEvent
https://bugs.webkit.org/show_bug.cgi?id=78882

Patch by Raul Hudea <rhudea@adobe.com> on 2012-03-14
Reviewed by David Hyatt.

Source/WebCore:

Adding the regionLayoutEvent that is dispatch for all regions after each flow-thread layout.

Tests: fast/regions/region-event-add-to-flow.html

fast/regions/region-event-remove-from-dom.html
fast/regions/region-event-remove-from-flow.html
fast/regions/region-event.html

  • dom/Document.cpp:

(WebCore::Document::addListenerTypeIfNeeded): Added check for regionLayoutUpdate listeners

  • dom/Document.h:
  • dom/EventNames.h:

(WebCore):

  • dom/Node.cpp:

(WebCore::Node::dispatchRegionLayoutUpdateEvent):
(WebCore):

  • dom/Node.h:

(Node):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::RenderFlowThread):
(WebCore::RenderFlowThread::layout): Start the event dispatch timer but only if there are regionLayoutUpdate listeners and there is at least one region that had its layout updated.
(WebCore::RenderFlowThread::computeOverflowStateForRegions): Mark regions that might had a layout update
(WebCore::RenderFlowThread::regionLayoutUpdateEventTimerFired):
(WebCore):

  • rendering/RenderFlowThread.h:
  • rendering/RenderRegion.cpp:

(WebCore::RenderRegion::RenderRegion):

  • rendering/RenderRegion.h:

(WebCore::RenderRegion::setDispatchRegionLayoutUpdateEvent):
(WebCore::RenderRegion::shouldDispatchRegionLayoutUpdateEvent):
(RenderRegion):

LayoutTests:

  • fast/regions/region-event-add-to-flow-expected.txt: Added.
  • fast/regions/region-event-add-to-flow.html: Added.
  • fast/regions/region-event-expected.txt: Added.
  • fast/regions/region-event-remove-from-dom-expected.txt: Added.
  • fast/regions/region-event-remove-from-dom.html: Added.
  • fast/regions/region-event-remove-from-flow-expected.txt: Added.
  • fast/regions/region-event-remove-from-flow.html: Added.
  • fast/regions/region-event.html: Added.
Location:
trunk
Files:
8 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r110729 r110731  
     12012-03-14  Raul Hudea  <rhudea@adobe.com>
     2
     3        [CSSRegions][CSSOM] Implement regionLayoutEvent
     4        https://bugs.webkit.org/show_bug.cgi?id=78882
     5
     6        Reviewed by David Hyatt.
     7
     8        * fast/regions/region-event-add-to-flow-expected.txt: Added.
     9        * fast/regions/region-event-add-to-flow.html: Added.
     10        * fast/regions/region-event-expected.txt: Added.
     11        * fast/regions/region-event-remove-from-dom-expected.txt: Added.
     12        * fast/regions/region-event-remove-from-dom.html: Added.
     13        * fast/regions/region-event-remove-from-flow-expected.txt: Added.
     14        * fast/regions/region-event-remove-from-flow.html: Added.
     15        * fast/regions/region-event.html: Added.
     16
    1172012-03-14  Ojan Vafai  <ojan@chromium.org>
    218
  • trunk/Source/WebCore/ChangeLog

    r110730 r110731  
     12012-03-14  Raul Hudea  <rhudea@adobe.com>
     2
     3        [CSSRegions][CSSOM] Implement regionLayoutEvent
     4        https://bugs.webkit.org/show_bug.cgi?id=78882
     5
     6        Reviewed by David Hyatt.
     7
     8        Adding the regionLayoutEvent that is dispatch for all regions after each flow-thread layout.
     9
     10        Tests: fast/regions/region-event-add-to-flow.html
     11               fast/regions/region-event-remove-from-dom.html
     12               fast/regions/region-event-remove-from-flow.html
     13               fast/regions/region-event.html
     14
     15        * dom/Document.cpp:
     16        (WebCore::Document::addListenerTypeIfNeeded): Added check for regionLayoutUpdate listeners
     17        * dom/Document.h:
     18        * dom/EventNames.h:
     19        (WebCore):
     20        * dom/Node.cpp:
     21        (WebCore::Node::dispatchRegionLayoutUpdateEvent):
     22        (WebCore):
     23        * dom/Node.h:
     24        (Node):
     25        * rendering/RenderFlowThread.cpp:
     26        (WebCore::RenderFlowThread::RenderFlowThread):
     27        (WebCore::RenderFlowThread::layout): Start the event dispatch timer but only if there are regionLayoutUpdate listeners and there is at least one region that had its layout updated.
     28        (WebCore::RenderFlowThread::computeOverflowStateForRegions): Mark regions that might had a layout update
     29        (WebCore::RenderFlowThread::regionLayoutUpdateEventTimerFired):
     30        (WebCore):
     31        * rendering/RenderFlowThread.h:
     32        * rendering/RenderRegion.cpp:
     33        (WebCore::RenderRegion::RenderRegion):
     34        * rendering/RenderRegion.h:
     35        (WebCore::RenderRegion::setDispatchRegionLayoutUpdateEvent):
     36        (WebCore::RenderRegion::shouldDispatchRegionLayoutUpdateEvent):
     37        (RenderRegion):
     38
    1392012-03-14  Pierre Rossi  <pierre.rossi@gmail.com>
    240
  • trunk/Source/WebCore/dom/Document.cpp

    r110626 r110731  
    38003800    else if (eventType == eventNames().scrollEvent)
    38013801        addListenerType(SCROLL_LISTENER);
     3802    else if (eventType == eventNames().webkitRegionLayoutUpdateEvent)
     3803        addListenerType(REGIONLAYOUTUPDATE_LISTENER);
    38023804}
    38033805
  • trunk/Source/WebCore/dom/Document.h

    r109785 r110731  
    774774        BEFORELOAD_LISTENER                  = 0x1000,
    775775        TOUCH_LISTENER                       = 0x2000,
    776         SCROLL_LISTENER                      = 0x4000
     776        SCROLL_LISTENER                      = 0x4000,
     777        REGIONLAYOUTUPDATE_LISTENER          = 0x8000
    777778    };
    778779
  • trunk/Source/WebCore/dom/EventNames.h

    r110448 r110731  
    213213    macro(webkitpointerlocklost) \
    214214    \
     215    macro(webkitRegionLayoutUpdate) \
     216    \
    215217
    216218// end of DOM_EVENT_NAMES_FOR_EACH
  • trunk/Source/WebCore/dom/Node.cpp

    r110639 r110731  
    27432743}
    27442744
     2745void Node::dispatchRegionLayoutUpdateEvent()
     2746{
     2747    ASSERT(!eventDispatchForbidden());
     2748
     2749    if (!document()->hasListenerType(Document::REGIONLAYOUTUPDATE_LISTENER))
     2750        return;
     2751
     2752    dispatchScopedEvent(UIEvent::create(eventNames().webkitRegionLayoutUpdateEvent, true, true, document()->defaultView(), 0));
     2753}
     2754
    27452755void Node::dispatchSubtreeModifiedEvent()
    27462756{
  • trunk/Source/WebCore/dom/Node.h

    r110639 r110731  
    570570    virtual void handleLocalEvents(Event*);
    571571
     572    void dispatchRegionLayoutUpdateEvent();
     573
    572574    void dispatchSubtreeModifiedEvent();
    573575    void dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent);
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r110639 r110731  
    5353    , m_regionsHaveUniformLogicalHeight(true)
    5454    , m_overflow(false)
     55    , m_regionLayoutUpdateEventTimer(this, &RenderFlowThread::regionLayoutUpdateEventTimerFired)
    5556{
    5657    ASSERT(node->document()->cssRegionsEnabled());
     
    400401    RenderBlock::layout();
    401402    statePusher.pop();
     403    if (document()->hasListenerType(Document::REGIONLAYOUTUPDATE_LISTENER) && !m_regionLayoutUpdateEventTimer.isActive())
     404        for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     405            RenderRegion* region = *iter;
     406            if (region->shouldDispatchRegionLayoutUpdateEvent()) {
     407                // at least one region needs to dispatch the event
     408                m_regionLayoutUpdateEventTimer.startOneShot(0);
     409                break;
     410            }
     411        }
    402412}
    403413
     
    893903        LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->regionRect().y() : region->regionRect().x());
    894904        LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->regionRect().maxY() : region->regionRect().maxX());
     905        RenderRegion::RegionState previousState = region->regionState();
    895906        RenderRegion::RegionState state = RenderRegion::RegionFit;
    896907        if (flowMin <= 0)
     
    899910            state = RenderRegion::RegionOverflow;
    900911        region->setRegionState(state);
     912        // determine whether this region should dispatch a regionLayoutUpdate event
     913        // FIXME: currently it cannot determine whether a region whose regionOverflow state remained either "fit" or "overflow" has actually
     914        // changed, so it just assumes that those region should dispatch the event
     915        if (previousState != state
     916            || state == RenderRegion::RegionFit
     917            || state == RenderRegion::RegionOverflow)
     918            region->setDispatchRegionLayoutUpdateEvent(true);
    901919    }
    902920
     
    906924}
    907925
     926void RenderFlowThread::regionLayoutUpdateEventTimerFired(Timer<RenderFlowThread>*)
     927{
     928    // Create a copy of region nodes, to protect them for being destroyed in the event listener
     929    Vector<RefPtr<Node> > regionNodes;
     930    regionNodes.reserveCapacity(m_regionList.size());
     931    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     932        RenderRegion* region = *iter;
     933        ASSERT(region->node() && region->node()->isElementNode());
     934        // dispatch the event only for marked regions and only for those who have a listener
     935        if (region->shouldDispatchRegionLayoutUpdateEvent()) {
     936            regionNodes.append(region->node());
     937            // clear the dispatch flag here, as it is possible to be set again due to event listeners
     938            region->setDispatchRegionLayoutUpdateEvent(false);
     939        }
     940    }
     941    for (Vector<RefPtr<Node> >::const_iterator it = regionNodes.begin(); it != regionNodes.end(); ++it) {
     942        RefPtr<Node> node = *it;
     943        RefPtr<Document> document = node->document();
     944        if (!document)
     945            continue;
     946        RenderObject* renderer = node->renderer();
     947        if (renderer && renderer->isRenderRegion()) {
     948            node->dispatchRegionLayoutUpdateEvent();
     949            // Layout needs to be uptodate after each event listener
     950            document->updateLayoutIgnorePendingStylesheets();
     951        }
     952    }
     953}
     954
    908955} // namespace WebCore
    909956
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r110639 r110731  
    147147
    148148    bool shouldRepaint(const LayoutRect&) const;
     149    void regionLayoutUpdateEventTimerFired(Timer<RenderFlowThread>*);
    149150
    150151    typedef ListHashSet<RenderObject*> FlowThreadChildList;
     
    200201    bool m_overflow;
    201202    RefPtr<WebKitNamedFlow> m_namedFlow;
     203    Timer<RenderFlowThread> m_regionLayoutUpdateEventTimer;
    202204};
    203205
  • trunk/Source/WebCore/rendering/RenderRegion.cpp

    r109273 r110731  
    4949    , m_hasCustomRegionStyle(false)
    5050    , m_regionState(RegionUndefined)
     51    , m_dispatchRegionLayoutUpdateEvent(false)
    5152{
    5253    ASSERT(node->document()->cssRegionsEnabled());
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r110639 r110731  
    9292    RegionState regionState() const { return isValid() ? m_regionState : RegionUndefined; }
    9393    void setRegionState(RegionState regionState) { m_regionState = regionState; }
     94    void setDispatchRegionLayoutUpdateEvent(bool value) { m_dispatchRegionLayoutUpdateEvent = value; }
     95    bool shouldDispatchRegionLayoutUpdateEvent() { return m_dispatchRegionLayoutUpdateEvent; }
    9496private:
    9597    virtual const char* renderName() const { return "RenderRegion"; }
     
    121123    bool m_hasCustomRegionStyle;
    122124    RegionState m_regionState;
     125    bool m_dispatchRegionLayoutUpdateEvent;
    123126};
    124127
Note: See TracChangeset for help on using the changeset viewer.