Changeset 107650 in webkit


Ignore:
Timestamp:
Feb 13, 2012 5:34:31 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Implement Element.webkitRegionOverflow

[CSSRegions][CSSOM] Implement Element.regionOverflow
https://bugs.webkit.org/show_bug.cgi?id=77863

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

Source/WebCore:

On each layout, compute the overflowState for each region belonging to the flow thread

Tests: fast/regions/element-region-overflow-state-vertical-rl.html

fast/regions/element-region-overflow-state.html

  • dom/Element.cpp:

(WebCore::Element::webkitRegionOverflow):
(WebCore):

  • dom/Element.h:
  • dom/Element.idl:
  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::computeOverflow):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::computeOverflowStateForRegions):
(WebCore):

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

(WebCore::RenderRegion::RenderRegion):

  • rendering/RenderRegion.h:

(RenderRegion):
(WebCore::RenderRegion::regionState):
(WebCore::RenderRegion::setRegionState):

LayoutTests:

  • fast/regions/element-region-overflow-state-expected.txt: Added.
  • fast/regions/element-region-overflow-state-vertical-rl-expected.txt: Added.
  • fast/regions/element-region-overflow-state-vertical-rl.html: Added.
  • fast/regions/element-region-overflow-state.html: Added.
Location:
trunk
Files:
4 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r107643 r107650  
     12012-02-13  Raul Hudea  <rhudea@adobe.com>
     2
     3        Implement Element.webkitRegionOverflow
     4
     5        [CSSRegions][CSSOM] Implement Element.regionOverflow
     6        https://bugs.webkit.org/show_bug.cgi?id=77863
     7
     8        Reviewed by David Hyatt.
     9
     10        * fast/regions/element-region-overflow-state-expected.txt: Added.
     11        * fast/regions/element-region-overflow-state-vertical-rl-expected.txt: Added.
     12        * fast/regions/element-region-overflow-state-vertical-rl.html: Added.
     13        * fast/regions/element-region-overflow-state.html: Added.
     14
    1152012-02-13  Tony Chang  <tony@chromium.org>
    216
  • trunk/Source/WebCore/ChangeLog

    r107649 r107650  
     12012-02-13  Raul Hudea  <rhudea@adobe.com>
     2
     3        Implement Element.webkitRegionOverflow
     4
     5        [CSSRegions][CSSOM] Implement Element.regionOverflow
     6        https://bugs.webkit.org/show_bug.cgi?id=77863
     7
     8        Reviewed by David Hyatt.
     9
     10        On each layout, compute the overflowState for each region belonging to the flow thread
     11
     12        Tests: fast/regions/element-region-overflow-state-vertical-rl.html
     13               fast/regions/element-region-overflow-state.html
     14
     15        * dom/Element.cpp:
     16        (WebCore::Element::webkitRegionOverflow):
     17        (WebCore):
     18        * dom/Element.h:
     19        * dom/Element.idl:
     20        * rendering/RenderBlock.cpp:
     21        (WebCore::RenderBlock::computeOverflow):
     22        * rendering/RenderFlowThread.cpp:
     23        (WebCore::RenderFlowThread::computeOverflowStateForRegions):
     24        (WebCore):
     25        * rendering/RenderFlowThread.h:
     26        * rendering/RenderRegion.cpp:
     27        (WebCore::RenderRegion::RenderRegion):
     28        * rendering/RenderRegion.h:
     29        (RenderRegion):
     30        (WebCore::RenderRegion::regionState):
     31        (WebCore::RenderRegion::setRegionState):
     32
    1332012-02-13  Alexey Proskuryakov  <ap@apple.com>
    234
  • trunk/Source/WebCore/dom/Element.cpp

    r107570 r107650  
    5858#include "Page.h"
    5959#include "RenderLayer.h"
     60#include "RenderRegion.h"
    6061#include "RenderView.h"
    6162#include "RenderWidget.h"
     
    19901991}
    19911992
     1993const AtomicString& Element::webkitRegionOverflow() const
     1994{
     1995    if (renderer() && renderer()->isRenderRegion()) {
     1996        RenderRegion* region = toRenderRegion(renderer());
     1997        switch (region->regionState()) {
     1998        case RenderRegion::RegionFit:
     1999            DEFINE_STATIC_LOCAL(AtomicString, fitState, ("fit"));
     2000            return fitState;
     2001        case RenderRegion::RegionEmpty:
     2002            DEFINE_STATIC_LOCAL(AtomicString, emptyState, ("empty"));
     2003            return emptyState;
     2004        case RenderRegion::RegionOverflow:
     2005            DEFINE_STATIC_LOCAL(AtomicString, overflowState, ("overflow"));
     2006            return overflowState;
     2007        default:
     2008            break;
     2009        }
     2010    }
     2011    DEFINE_STATIC_LOCAL(AtomicString, undefinedState, ("undefined"));
     2012    return undefinedState;
     2013}
     2014
    19922015#ifndef NDEBUG
    19932016bool Element::fastAttributeLookupAllowed(const QualifiedName& name) const
  • trunk/Source/WebCore/dom/Element.h

    r107570 r107650  
    403403    PassRefPtr<Attribute> createAttribute(const QualifiedName&, const AtomicString& value);
    404404
     405    const AtomicString& webkitRegionOverflow() const;
     406
    405407protected:
    406408    Element(const QualifiedName& tagName, Document* document, ConstructionType type)
  • trunk/Source/WebCore/dom/Element.idl

    r107530 r107650  
    134134        [V8EnabledAtRuntime] void webkitRequestFullScreen(in [Optional=DefaultIsUndefined] unsigned short flags);
    135135#endif
     136
     137        // CSS Regions API
     138        readonly attribute DOMString webkitRegionOverflow;
    136139
    137140#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r107627 r107650  
    15061506    // Add visual overflow from theme.
    15071507    addVisualOverflowFromTheme();
     1508
     1509    if (isRenderFlowThread())
     1510        enclosingRenderFlowThread()->computeOverflowStateForRegions(oldClientAfterEdge);
    15081511}
    15091512
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r107622 r107650  
    873873}
    874874
     875void RenderFlowThread::computeOverflowStateForRegions(LayoutUnit oldClientAfterEdge)
     876{
     877    LayoutUnit height = oldClientAfterEdge;
     878    // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
     879    // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
     880    // because of how computeLogicalHeight is implemented for RenderFlowThread (as a sum of all regions height).
     881    // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
     882    if (hasRenderOverflow())
     883        height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
     884
     885    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     886        RenderRegion* region = *iter;
     887        if (!region->isValid()) {
     888            region->setRegionState(RenderRegion::RegionUndefined);
     889            continue;
     890        }
     891        LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->regionRect().y() : region->regionRect().x());
     892        LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->regionRect().maxY() : region->regionRect().maxX());
     893        RenderRegion::RegionState state = RenderRegion::RegionFit;
     894        if (flowMin <= 0)
     895            state = RenderRegion::RegionEmpty;
     896        if (flowMax > 0)
     897            state = RenderRegion::RegionOverflow;
     898        region->setRegionState(state);
     899    }
     900}
     901
    875902} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r107622 r107650  
    134134                                      const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0);
    135135    WebKitNamedFlow* ensureNamedFlow();
     136    void computeOverflowStateForRegions(LayoutUnit oldClientAfterEdge);
    136137
    137138private:
  • trunk/Source/WebCore/rendering/RenderRegion.cpp

    r107605 r107650  
    4848    , m_isValid(false)
    4949    , m_hasCustomRegionStyle(false)
     50    , m_regionState(RegionUndefined)
    5051{
    5152}
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r106694 r107650  
    8282
    8383    void clearBoxStyleInRegion(const RenderBox*);
     84
     85    enum RegionState {
     86        RegionUndefined,
     87        RegionEmpty,
     88        RegionFit,
     89        RegionOverflow
     90    };
     91
     92    RegionState regionState() const { return isValid() ? m_regionState : RegionUndefined; }
     93    void setRegionState(RegionState regionState) { m_regionState = regionState; }
    8494private:
    8595    virtual const char* renderName() const { return "RenderRegion"; }
     
    110120    bool m_isValid;
    111121    bool m_hasCustomRegionStyle;
     122    RegionState m_regionState;
    112123};
    113124
Note: See TracChangeset for help on using the changeset viewer.