Changeset 110731 in webkit
- Timestamp:
- Mar 14, 2012 12:48:06 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r110729 r110731 1 2012-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 1 17 2012-03-14 Ojan Vafai <ojan@chromium.org> 2 18 -
trunk/Source/WebCore/ChangeLog
r110730 r110731 1 2012-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 1 39 2012-03-14 Pierre Rossi <pierre.rossi@gmail.com> 2 40 -
trunk/Source/WebCore/dom/Document.cpp
r110626 r110731 3800 3800 else if (eventType == eventNames().scrollEvent) 3801 3801 addListenerType(SCROLL_LISTENER); 3802 else if (eventType == eventNames().webkitRegionLayoutUpdateEvent) 3803 addListenerType(REGIONLAYOUTUPDATE_LISTENER); 3802 3804 } 3803 3805 -
trunk/Source/WebCore/dom/Document.h
r109785 r110731 774 774 BEFORELOAD_LISTENER = 0x1000, 775 775 TOUCH_LISTENER = 0x2000, 776 SCROLL_LISTENER = 0x4000 776 SCROLL_LISTENER = 0x4000, 777 REGIONLAYOUTUPDATE_LISTENER = 0x8000 777 778 }; 778 779 -
trunk/Source/WebCore/dom/EventNames.h
r110448 r110731 213 213 macro(webkitpointerlocklost) \ 214 214 \ 215 macro(webkitRegionLayoutUpdate) \ 216 \ 215 217 216 218 // end of DOM_EVENT_NAMES_FOR_EACH -
trunk/Source/WebCore/dom/Node.cpp
r110639 r110731 2743 2743 } 2744 2744 2745 void 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 2745 2755 void Node::dispatchSubtreeModifiedEvent() 2746 2756 { -
trunk/Source/WebCore/dom/Node.h
r110639 r110731 570 570 virtual void handleLocalEvents(Event*); 571 571 572 void dispatchRegionLayoutUpdateEvent(); 573 572 574 void dispatchSubtreeModifiedEvent(); 573 575 void dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent); -
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r110639 r110731 53 53 , m_regionsHaveUniformLogicalHeight(true) 54 54 , m_overflow(false) 55 , m_regionLayoutUpdateEventTimer(this, &RenderFlowThread::regionLayoutUpdateEventTimerFired) 55 56 { 56 57 ASSERT(node->document()->cssRegionsEnabled()); … … 400 401 RenderBlock::layout(); 401 402 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 } 402 412 } 403 413 … … 893 903 LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->regionRect().y() : region->regionRect().x()); 894 904 LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->regionRect().maxY() : region->regionRect().maxX()); 905 RenderRegion::RegionState previousState = region->regionState(); 895 906 RenderRegion::RegionState state = RenderRegion::RegionFit; 896 907 if (flowMin <= 0) … … 899 910 state = RenderRegion::RegionOverflow; 900 911 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); 901 919 } 902 920 … … 906 924 } 907 925 926 void 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 908 955 } // namespace WebCore 909 956 -
trunk/Source/WebCore/rendering/RenderFlowThread.h
r110639 r110731 147 147 148 148 bool shouldRepaint(const LayoutRect&) const; 149 void regionLayoutUpdateEventTimerFired(Timer<RenderFlowThread>*); 149 150 150 151 typedef ListHashSet<RenderObject*> FlowThreadChildList; … … 200 201 bool m_overflow; 201 202 RefPtr<WebKitNamedFlow> m_namedFlow; 203 Timer<RenderFlowThread> m_regionLayoutUpdateEventTimer; 202 204 }; 203 205 -
trunk/Source/WebCore/rendering/RenderRegion.cpp
r109273 r110731 49 49 , m_hasCustomRegionStyle(false) 50 50 , m_regionState(RegionUndefined) 51 , m_dispatchRegionLayoutUpdateEvent(false) 51 52 { 52 53 ASSERT(node->document()->cssRegionsEnabled()); -
trunk/Source/WebCore/rendering/RenderRegion.h
r110639 r110731 92 92 RegionState regionState() const { return isValid() ? m_regionState : RegionUndefined; } 93 93 void setRegionState(RegionState regionState) { m_regionState = regionState; } 94 void setDispatchRegionLayoutUpdateEvent(bool value) { m_dispatchRegionLayoutUpdateEvent = value; } 95 bool shouldDispatchRegionLayoutUpdateEvent() { return m_dispatchRegionLayoutUpdateEvent; } 94 96 private: 95 97 virtual const char* renderName() const { return "RenderRegion"; } … … 121 123 bool m_hasCustomRegionStyle; 122 124 RegionState m_regionState; 125 bool m_dispatchRegionLayoutUpdateEvent; 123 126 }; 124 127
Note: See TracChangeset
for help on using the changeset viewer.