Changeset 102234 in webkit


Ignore:
Timestamp:
Dec 7, 2011 6:51:33 AM (12 years ago)
Author:
mihnea@adobe.com
Message:

[CSSRegions]Add support for background-color in region styling
https://bugs.webkit.org/show_bug.cgi?id=71488

Reviewed by David Hyatt.

Source/WebCore:

Tests: fast/regions/region-style-block-background-color.html

fast/regions/region-style-block-background-color2.html
fast/regions/region-style-image-background-color.html
fast/regions/region-style-inline-background-color.html

  • WebCore.exp.in:
  • css/CSSStyleSelector.cpp:

(WebCore::RuleData::regionStyleRule):
(WebCore::CSSStyleSelector::CSSStyleSelector):
(WebCore::CSSStyleSelector::addMatchedDeclaration):
(WebCore::CSSStyleSelector::matchRules):
(WebCore::CSSStyleSelector::matchAllRules):
(WebCore::CSSStyleSelector::initForRegionStyling):
(WebCore::CSSStyleSelector::styleForElement):
(WebCore::CSSStyleSelector::pseudoStyleForElement):
(WebCore::RuleData::RuleData):
(WebCore::RuleSet::RuleSet):
(WebCore::RuleSet::addToRuleSet):
(WebCore::CSSStyleSelector::applyDeclarations):
(WebCore::isValidRegionStyleProperty):
(WebCore::CSSStyleSelector::applyProperty):

  • css/CSSStyleSelector.h:

(WebCore::CSSStyleSelector::setRegionForStyling):
(WebCore::CSSStyleSelector::regionForStyling):
(WebCore::CSSStyleSelector::applyPropertyToRegionStyle):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::clearRenderRegionRangeMap):
(WebCore::RenderFlowThread::~RenderFlowThread):
(WebCore::RenderFlowThread::layout):
(WebCore::RenderFlowThread::clearRenderObjectCustomStyle):
(WebCore::RenderFlowThread::setRegionRangeForBox):

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

(WebCore::CurrentRenderRegionMaintainer::CurrentRenderRegionMaintainer):
(WebCore::CurrentRenderRegionMaintainer::~CurrentRenderRegionMaintainer):
(WebCore::RenderLayer::paint):
(WebCore::RenderLayer::hitTest):

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::style):

  • rendering/RenderObject.h:

(WebCore::RenderObject::canHaveRegionStyle):

  • rendering/RenderObjectChildList.cpp:

(WebCore::RenderObjectChildList::removeChildNode):

  • rendering/RenderRegion.cpp:

(WebCore::RenderRegion::layout):
(WebCore::RenderRegion::renderObjectRegionStyle):
(WebCore::RenderRegion::computeStyleInRegion):
(WebCore::RenderRegion::clearObjectStyleInRegion):

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

(WebCore::RenderView::RenderView):

  • rendering/RenderView.h:

(WebCore::RenderView::currentRenderRegion):
(WebCore::RenderView::setCurrentRenderRegion):

LayoutTests:

  • fast/regions/region-style-block-background-color.html: Added.
  • fast/regions/region-style-block-background-color2.html: Added.
  • fast/regions/region-style-image-background-color.html: Added.
  • fast/regions/region-style-inline-background-color.html: Added.
  • fast/regions/resources/transparent.png: Added.
  • platform/mac-snowleopard/fast/regions/region-style-block-background-color-expected.png: Added.
  • platform/mac-snowleopard/fast/regions/region-style-block-background-color-expected.txt: Added.
  • platform/mac-snowleopard/fast/regions/region-style-block-background-color2-expected.png: Added.
  • platform/mac-snowleopard/fast/regions/region-style-block-background-color2-expected.txt: Added.
  • platform/mac-snowleopard/fast/regions/region-style-image-background-color-expected.png: Added.
  • platform/mac-snowleopard/fast/regions/region-style-image-background-color-expected.txt: Added.
  • platform/mac-snowleopard/fast/regions/region-style-inline-background-color-expected.png: Added.
  • platform/mac-snowleopard/fast/regions/region-style-inline-background-color-expected.txt: Added.
Location:
trunk
Files:
13 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r102231 r102234  
     12011-12-07  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Add support for background-color in region styling
     4        https://bugs.webkit.org/show_bug.cgi?id=71488
     5
     6        Reviewed by David Hyatt.
     7
     8        * fast/regions/region-style-block-background-color.html: Added.
     9        * fast/regions/region-style-block-background-color2.html: Added.
     10        * fast/regions/region-style-image-background-color.html: Added.
     11        * fast/regions/region-style-inline-background-color.html: Added.
     12        * fast/regions/resources/transparent.png: Added.
     13        * platform/mac-snowleopard/fast/regions/region-style-block-background-color-expected.png: Added.
     14        * platform/mac-snowleopard/fast/regions/region-style-block-background-color-expected.txt: Added.
     15        * platform/mac-snowleopard/fast/regions/region-style-block-background-color2-expected.png: Added.
     16        * platform/mac-snowleopard/fast/regions/region-style-block-background-color2-expected.txt: Added.
     17        * platform/mac-snowleopard/fast/regions/region-style-image-background-color-expected.png: Added.
     18        * platform/mac-snowleopard/fast/regions/region-style-image-background-color-expected.txt: Added.
     19        * platform/mac-snowleopard/fast/regions/region-style-inline-background-color-expected.png: Added.
     20        * platform/mac-snowleopard/fast/regions/region-style-inline-background-color-expected.txt: Added.
     21
    1222011-12-07  Shinya Kawanaka  <shinyak@google.com>
    223
  • trunk/Source/WebCore/ChangeLog

    r102233 r102234  
     12011-12-07  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Add support for background-color in region styling
     4        https://bugs.webkit.org/show_bug.cgi?id=71488
     5
     6        Reviewed by David Hyatt.
     7
     8        Tests: fast/regions/region-style-block-background-color.html
     9               fast/regions/region-style-block-background-color2.html
     10               fast/regions/region-style-image-background-color.html
     11               fast/regions/region-style-inline-background-color.html
     12
     13        * WebCore.exp.in:
     14        * css/CSSStyleSelector.cpp:
     15        (WebCore::RuleData::regionStyleRule):
     16        (WebCore::CSSStyleSelector::CSSStyleSelector):
     17        (WebCore::CSSStyleSelector::addMatchedDeclaration):
     18        (WebCore::CSSStyleSelector::matchRules):
     19        (WebCore::CSSStyleSelector::matchAllRules):
     20        (WebCore::CSSStyleSelector::initForRegionStyling):
     21        (WebCore::CSSStyleSelector::styleForElement):
     22        (WebCore::CSSStyleSelector::pseudoStyleForElement):
     23        (WebCore::RuleData::RuleData):
     24        (WebCore::RuleSet::RuleSet):
     25        (WebCore::RuleSet::addToRuleSet):
     26        (WebCore::CSSStyleSelector::applyDeclarations):
     27        (WebCore::isValidRegionStyleProperty):
     28        (WebCore::CSSStyleSelector::applyProperty):
     29        * css/CSSStyleSelector.h:
     30        (WebCore::CSSStyleSelector::setRegionForStyling):
     31        (WebCore::CSSStyleSelector::regionForStyling):
     32        (WebCore::CSSStyleSelector::applyPropertyToRegionStyle):
     33        * rendering/RenderFlowThread.cpp:
     34        (WebCore::RenderFlowThread::clearRenderRegionRangeMap):
     35        (WebCore::RenderFlowThread::~RenderFlowThread):
     36        (WebCore::RenderFlowThread::layout):
     37        (WebCore::RenderFlowThread::clearRenderObjectCustomStyle):
     38        (WebCore::RenderFlowThread::setRegionRangeForBox):
     39        * rendering/RenderFlowThread.h:
     40        * rendering/RenderLayer.cpp:
     41        (WebCore::CurrentRenderRegionMaintainer::CurrentRenderRegionMaintainer):
     42        (WebCore::CurrentRenderRegionMaintainer::~CurrentRenderRegionMaintainer):
     43        (WebCore::RenderLayer::paint):
     44        (WebCore::RenderLayer::hitTest):
     45        * rendering/RenderObject.cpp:
     46        (WebCore::RenderObject::style):
     47        * rendering/RenderObject.h:
     48        (WebCore::RenderObject::canHaveRegionStyle):
     49        * rendering/RenderObjectChildList.cpp:
     50        (WebCore::RenderObjectChildList::removeChildNode):
     51        * rendering/RenderRegion.cpp:
     52        (WebCore::RenderRegion::layout):
     53        (WebCore::RenderRegion::renderObjectRegionStyle):
     54        (WebCore::RenderRegion::computeStyleInRegion):
     55        (WebCore::RenderRegion::clearObjectStyleInRegion):
     56        * rendering/RenderRegion.h:
     57        * rendering/RenderView.cpp:
     58        (WebCore::RenderView::RenderView):
     59        * rendering/RenderView.h:
     60        (WebCore::RenderView::currentRenderRegion):
     61        (WebCore::RenderView::setCurrentRenderRegion):
     62
    1632011-12-01  Vsevolod Vlasov  <vsevik@chromium.org>
    264
  • trunk/Source/WebCore/WebCore.exp.in

    r102205 r102234  
    11811181__ZNK7WebCore12RenderObject15localToAbsoluteERKNS_10FloatPointEbb
    11821182__ZNK7WebCore12RenderObject7childAtEj
     1183__ZNK7WebCore12RenderObject5styleEv
    11831184__ZNK7WebCore12RenderWidget14windowClipRectEv
    11841185__ZNK7WebCore12SharedBuffer11getSomeDataERPKcj
  • trunk/Source/WebCore/css/CSSStyleSelector.cpp

    r102188 r102234  
    8181#include "QuotesData.h"
    8282#include "Rect.h"
     83#include "RenderRegion.h"
    8384#include "RenderScrollbar.h"
    8485#include "RenderScrollbarTheme.h"
     
    168169class RuleData {
    169170public:
    170     RuleData(CSSStyleRule*, CSSSelector*, unsigned position);
     171    RuleData(CSSStyleRule*, CSSSelector*, unsigned position, bool regionStyleRule = false);
    171172
    172173    unsigned position() const { return m_position; }
     
    180181    unsigned specificity() const { return m_specificity; }
    181182    unsigned linkMatchType() const { return m_linkMatchType; }
     183    bool regionStyleRule() const { return m_regionStyleRule; }
    182184
    183185    // Try to balance between memory usage (there can be lots of RuleData objects) and good filtering performance.
     
    195197    bool m_containsUncommonAttributeSelector : 1;
    196198    unsigned m_linkMatchType : 2; //  SelectorChecker::LinkMatchMask
     199    bool m_regionStyleRule : 1;
    197200    // Use plain array instead of a Vector to minimize memory overhead.
    198201    unsigned m_descendantSelectorIdentifierHashes[maximumIdentifierCount];
     
    202205    WTF_MAKE_NONCOPYABLE(RuleSet);
    203206public:
    204     RuleSet();
     207    RuleSet(bool regionStyleRules = false);
    205208
    206209    typedef HashMap<AtomicStringImpl*, OwnPtr<Vector<RuleData> > > AtomRuleMap;
     
    237240    unsigned m_ruleCount;
    238241    bool m_autoShrinkToFitEnabled;
     242    bool m_regionStyleRules;
    239243};
    240244
     
    323327    , m_element(0)
    324328    , m_styledElement(0)
     329    , m_regionForStyling(0)
    325330    , m_elementLinkState(NotInsideLink)
    326331    , m_parentNode(0)
     
    332337    , m_applyPropertyToRegularStyle(true)
    333338    , m_applyPropertyToVisitedLinkStyle(false)
     339    , m_applyPropertyToRegionStyle(false)
    334340    , m_applyProperty(CSSStyleApplyProperty::sharedCSSStyleApplyProperty())
    335341#if ENABLE(CSS_SHADERS)
     
    586592}
    587593
    588 void CSSStyleSelector::addMatchedDeclaration(CSSMutableStyleDeclaration* styleDeclaration, unsigned linkMatchType)
     594void CSSStyleSelector::addMatchedDeclaration(CSSMutableStyleDeclaration* styleDeclaration, unsigned linkMatchType, bool regionStyleRule)
    589595{
    590596    m_matchedDecls.grow(m_matchedDecls.size() + 1);
     
    592598    newDeclaration.styleDeclaration = styleDeclaration;
    593599    newDeclaration.linkMatchType = linkMatchType;
     600    newDeclaration.regionStyleRule = regionStyleRule;
    594601}
    595602
     
    641648            if (swapVisitedUnvisited && linkMatchType && linkMatchType != SelectorChecker::MatchAll)
    642649                linkMatchType = (linkMatchType == SelectorChecker::MatchVisited) ? SelectorChecker::MatchLink : SelectorChecker::MatchVisited;
    643             addMatchedDeclaration(m_matchedRules[i]->rule()->declaration(), linkMatchType);
     650            addMatchedDeclaration(m_matchedRules[i]->rule()->declaration(), linkMatchType, m_matchedRules[i]->regionStyleRule());
    644651        }
    645652    } else {
     
    794801    if (m_matchAuthorAndUserStyles)
    795802        matchRules(m_authorStyle.get(), result.firstAuthorRule, result.lastAuthorRule, false);
    796        
     803
     804    if (m_regionForStyling)
     805        matchRules(m_regionRules.get(), result.firstAuthorRule, result.lastAuthorRule, false);
     806
    797807    // Now check our inline style attribute.
    798808    if (m_matchAuthorAndUserStyles && m_styledElement) {
     
    845855
    846856    m_fontDirty = false;
     857}
     858
     859void CSSStyleSelector::initForRegionStyling(RenderRegion* region)
     860{
     861    setRegionForStyling(region);
     862    // Mark that the set of rules comes from region styling since we need to filter
     863    // the properties that can be applied.
     864    m_regionRules = adoptPtr(new RuleSet(true));
     865
     866    if (!region)
     867        return;
     868
     869    // From all the region style rules, select those that apply to the specified region.
     870    for (Vector<RefPtr<WebKitCSSRegionRule> >::iterator it = m_regionStyleRules.begin(); it != m_regionStyleRules.end(); ++it) {
     871        const CSSSelectorList& regionSelectorList = (*it)->selectorList();
     872        for (CSSSelector* s = regionSelectorList.first(); s; s = regionSelectorList.next(s)) {
     873            if (!m_checker.checkSelector(s, static_cast<Element*>(region->node())))
     874                continue;
     875            CSSRuleList* regionStylingRules = (*it)->cssRules();
     876            for (unsigned index = 0; index < regionStylingRules->length(); ++index) {
     877                CSSRule* regionStylingRule = regionStylingRules->item(index);
     878                if (regionStylingRule->isStyleRule())
     879                    m_regionRules->addStyleRule(static_cast<CSSStyleRule*>(regionStylingRule));
     880            }
     881        }
     882    }
    847883}
    848884
     
    12011237// relative units are interpreted according to document root element style, styled only with UA stylesheet
    12021238
    1203 PassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* element, RenderStyle* defaultParent, bool allowSharing, bool resolveForRootDefault)
     1239PassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* element, RenderStyle* defaultParent, bool allowSharing, bool resolveForRootDefault, RenderRegion* regionForStyling)
    12041240{
    12051241    // Once an element has a renderer, we don't try to destroy it, since otherwise the renderer
     
    12171253    initElement(element);
    12181254    initForStyleResolve(element, defaultParent);
     1255    initForRegionStyling(regionForStyling);
    12191256    if (allowSharing) {
    12201257        RenderStyle* sharedStyle = locateSharedStyle();
     
    13721409}
    13731410
    1374 PassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo, Element* e, RenderStyle* parentStyle)
     1411PassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo, Element* e, RenderStyle* parentStyle, RenderRegion* regionForStyling)
    13751412{
    13761413    if (!e)
     
    13801417
    13811418    initForStyleResolve(e, parentStyle, pseudo);
     1419    initForRegionStyling(regionForStyling);
    13821420    m_style = RenderStyle::create();
    13831421
     
    18361874}
    18371875
    1838 RuleData::RuleData(CSSStyleRule* rule, CSSSelector* selector, unsigned position)
     1876RuleData::RuleData(CSSStyleRule* rule, CSSSelector* selector, unsigned position, bool regionStyleRule)
    18391877    : m_rule(rule)
    18401878    , m_selector(selector)
     
    18461884    , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector))
    18471885    , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector))
     1886    , m_regionStyleRule(regionStyleRule)
    18481887{
    18491888    SelectorChecker::collectIdentifierHashes(m_selector, m_descendantSelectorIdentifierHashes, maximumIdentifierCount);
    18501889}
    18511890
    1852 RuleSet::RuleSet()
     1891RuleSet::RuleSet(bool regionStyleRules)
    18531892    : m_ruleCount(0)
    18541893    , m_autoShrinkToFitEnabled(true)
     1894    , m_regionStyleRules(regionStyleRules)
    18551895{
    18561896}
     
    18631903    if (!rules)
    18641904        rules = adoptPtr(new Vector<RuleData>);
    1865     rules->append(RuleData(rule, selector, m_ruleCount++));
     1905    rules->append(RuleData(rule, selector, m_ruleCount++, m_regionStyleRules));
    18661906}
    18671907
     
    21662206        return;
    21672207    }
    2168     for (int i = startIndex; i <= endIndex; ++i)
     2208    for (int i = startIndex; i <= endIndex; ++i) {
     2209        m_applyPropertyToRegionStyle = m_matchedDecls[i].regionStyleRule;
    21692210        applyDeclaration<applyFirst>(m_matchedDecls[i].styleDeclaration, isImportant, inheritedOnly);
     2211        m_applyPropertyToRegionStyle = false;
     2212    }
    21702213}
    21712214
     
    24472490}
    24482491
     2492// http://dev.w3.org/csswg/css3-regions/#the-at-region-style-rule
     2493// FIXME: add incremental support for other region styling properties.
     2494inline bool isValidRegionStyleProperty(int id)
     2495{
     2496    switch (static_cast<CSSPropertyID>(id)) {
     2497    case CSSPropertyBackgroundColor:
     2498        return true;
     2499    default:
     2500        break;
     2501    }
     2502
     2503    return false;
     2504}
     2505
    24492506class SVGDisplayPropertyGuard {
    24502507    WTF_MAKE_NONCOPYABLE(SVGDisplayPropertyGuard);
     
    25732630        return;
    25742631    }
     2632
     2633    // Filter region style property
     2634    if (applyPropertyToRegionStyle() && !isValidRegionStyleProperty(id))
     2635        return;
    25752636
    25762637    CSSPropertyID property = static_cast<CSSPropertyID>(id);
  • trunk/Source/WebCore/css/CSSStyleSelector.h

    r102188 r102234  
    6464class MediaQueryEvaluator;
    6565class Node;
     66class RenderRegion;
    6667class RuleData;
    6768class RuleSet;
     
    105106    void popParent(Element* parent) { m_checker.popParent(parent); }
    106107
    107     PassRefPtr<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle = 0, bool allowSharing = true, bool resolveForRootDefault = false);
     108    PassRefPtr<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle = 0, bool allowSharing = true, bool resolveForRootDefault = false, RenderRegion* regionForStyling = 0);
    108109
    109110    void keyframeStylesForAnimation(Element*, const RenderStyle*, KeyframeList&);
    110111
    111     PassRefPtr<RenderStyle> pseudoStyleForElement(PseudoId, Element*, RenderStyle* parentStyle = 0);
     112    PassRefPtr<RenderStyle> pseudoStyleForElement(PseudoId, Element*, RenderStyle* parentStyle = 0, RenderRegion* regionForStyling = 0);
    112113
    113114    PassRefPtr<RenderStyle> styleForPage(int pageIndex);
     
    130131    void initForStyleResolve(Element*, RenderStyle* parentStyle = 0, PseudoId = NOPSEUDO);
    131132    void initElement(Element*);
     133    void initForRegionStyling(RenderRegion*);
    132134    RenderStyle* locateSharedStyle();
    133135    bool matchesRuleSet(RuleSet*);
     
    137139
    138140    PassRefPtr<RenderStyle> styleForKeyframe(const RenderStyle*, const WebKitCSSKeyframeRule*, KeyframeValue&);
     141
     142    void setRegionForStyling(RenderRegion* region) { m_regionForStyling = region; }
     143    RenderRegion* regionForStyling() const { return m_regionForStyling; }
    139144
    140145public:
     
    245250
    246251    void addMatchedRule(const RuleData* rule) { m_matchedRules.append(rule); }
    247     void addMatchedDeclaration(CSSMutableStyleDeclaration*, unsigned linkMatchType = SelectorChecker::MatchAll);
     252    void addMatchedDeclaration(CSSMutableStyleDeclaration*, unsigned linkMatchType = SelectorChecker::MatchAll, bool regionStyleRule = false);
    248253
    249254    struct MatchResult {
     
    281286    OwnPtr<RuleSet> m_authorStyle;
    282287    OwnPtr<RuleSet> m_userStyle;
     288    OwnPtr<RuleSet> m_regionRules;
    283289
    284290    Features m_features;
     
    304310    bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; }
    305311    bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; }
     312    bool applyPropertyToRegionStyle() const { return m_applyPropertyToRegionStyle; }
    306313
    307314private:
     
    351358        CSSMutableStyleDeclaration* styleDeclaration;
    352359        unsigned linkMatchType;
     360        bool regionStyleRule;
    353361    };
    354362    static unsigned computeDeclarationHash(MatchedStyleDeclaration*, unsigned size);
     
    391399    Element* m_element;
    392400    StyledElement* m_styledElement;
     401    RenderRegion* m_regionForStyling;
    393402    EInsideLink m_elementLinkState;
    394403    ContainerNode* m_parentNode;
     
    403412    bool m_applyPropertyToRegularStyle;
    404413    bool m_applyPropertyToVisitedLinkStyle;
     414    bool m_applyPropertyToRegionStyle;
    405415    const CSSStyleApplyProperty& m_applyProperty;
    406416   
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r99467 r102234  
    5656}
    5757
    58 RenderFlowThread::~RenderFlowThread()
     58void RenderFlowThread::clearRenderRegionRangeMap()
    5959{
    6060    deleteAllValues(m_regionRangeMap);
    6161    m_regionRangeMap.clear();
     62}
     63
     64RenderFlowThread::~RenderFlowThread()
     65{
     66    clearRenderRegionRangeMap();
    6267}
    6368
     
    311316        m_regionsHaveUniformLogicalWidth = true;
    312317        m_regionsHaveUniformLogicalHeight = true;
    313         deleteAllValues(m_regionRangeMap);
    314         m_regionRangeMap.clear();
     318        clearRenderRegionRangeMap();
    315319        LayoutUnit previousRegionLogicalWidth = 0;
    316320        LayoutUnit previousRegionLogicalHeight = 0;
     
    741745}
    742746
     747void RenderFlowThread::clearRenderObjectCustomStyle(const RenderObject* object,
     748        const RenderRegion* oldStartRegion, const RenderRegion* oldEndRegion,
     749        const RenderRegion* newStartRegion, const RenderRegion* newEndRegion)
     750{
     751    // Clear the styles for the object in the regions.
     752    // The styles are not cleared for the regions that are contained in both ranges.
     753    bool insideOldRegionRange = false;
     754    bool insideNewRegionRange = false;
     755    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     756        RenderRegion* region = *iter;
     757
     758        if (oldStartRegion == region)
     759            insideOldRegionRange = true;
     760        if (newStartRegion == region)
     761            insideNewRegionRange = true;
     762
     763        if (!(insideOldRegionRange && insideNewRegionRange))
     764            region->clearObjectStyleInRegion(object);
     765
     766        if (oldEndRegion == region)
     767            insideOldRegionRange = false;
     768        if (newEndRegion == region)
     769            insideNewRegionRange = false;
     770    }
     771}
     772
    743773void RenderFlowThread::setRegionRangeForBox(const RenderBox* box, LayoutUnit offsetFromLogicalTopOfFirstPage)
    744774{
     
    752782            return;
    753783
     784        RenderRegion* oldStartRegion = range->startRegion();
     785        RenderRegion* oldEndRegion = range->endRegion();
    754786        // Delete any info that we find before our new startRegion and after our new endRegion.
    755787        for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     
    759791                continue;
    760792            }
    761            
     793
    762794            region->removeRenderBoxRegionInfo(box);
    763795
     
    765797                break;
    766798        }
    767        
     799
    768800        range->setRange(startRegion, endRegion);
     801        clearRenderObjectCustomStyle(box, oldStartRegion, oldEndRegion, startRegion, endRegion);
    769802        return;
    770803    }
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r96975 r102234  
    122122    void getRegionRangeForBox(const RenderBox*, RenderRegion*& startRegion, RenderRegion*& endRegion) const;
    123123
     124    void clearRenderObjectCustomStyle(const RenderObject*,
     125                                      const RenderRegion* oldStartRegion = 0, const RenderRegion* oldEndRegion = 0,
     126                                      const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0);
     127
    124128private:
    125129    virtual const char* renderName() const { return "RenderFlowThread"; }
     
    131135
    132136    bool shouldRepaint(const LayoutRect&) const;
     137
     138    void clearRenderRegionRangeMap();
    133139
    134140    typedef ListHashSet<RenderObject*> FlowThreadChildList;
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r102217 r102234  
    25582558}
    25592559
     2560class CurrentRenderRegionMaintainer {
     2561    WTF_MAKE_NONCOPYABLE(CurrentRenderRegionMaintainer);
     2562public:
     2563    CurrentRenderRegionMaintainer(RenderView* view, RenderRegion* renderRegion)
     2564    : m_view(view)
     2565    , m_renderRegion(view->currentRenderRegion())
     2566    {
     2567        m_view->setCurrentRenderRegion(renderRegion);
     2568    }
     2569    ~CurrentRenderRegionMaintainer()
     2570    {
     2571        m_view->setCurrentRenderRegion(m_renderRegion);
     2572    }
     2573private:
     2574    RenderView* m_view;
     2575    RenderRegion* m_renderRegion;
     2576};
     2577
    25602578void RenderLayer::paint(GraphicsContext* p, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject *paintingRoot,
    25612579    RenderRegion* region, PaintLayerFlags paintFlags)
    25622580{
     2581    CurrentRenderRegionMaintainer renderRegionMaintainer(renderer()->view(), region);
    25632582    OverlapTestRequestMap overlapTestRequests;
    25642583    paintLayer(this, p, damageRect, paintBehavior, paintingRoot, region, &overlapTestRequests, paintFlags);
     
    30633082bool RenderLayer::hitTest(const HitTestRequest& request, HitTestResult& result)
    30643083{
     3084    CurrentRenderRegionMaintainer renderRegionMaintainer(renderer()->view(), result.region());
    30653085    renderer()->document()->updateLayout();
    30663086   
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r102185 r102234  
    17241724}
    17251725
     1726RenderStyle* RenderObject::style() const
     1727{
     1728    if (!inRenderFlowThread()
     1729        || !canHaveRegionStyle()
     1730        || !((view() && view()->currentRenderRegion() && view()->currentRenderRegion()->hasCustomRegionStyle())))
     1731        return m_style.get();
     1732
     1733    RenderStyle* regionStyle = view()->currentRenderRegion()->renderObjectRegionStyle(this);
     1734    if (!regionStyle)
     1735        view()->currentRenderRegion()->computeStyleInRegion(this);
     1736    return view()->currentRenderRegion()->renderObjectRegionStyle(this);
     1737}
     1738
    17261739void RenderObject::setStyle(PassRefPtr<RenderStyle> style)
    17271740{
  • trunk/Source/WebCore/rendering/RenderObject.h

    r102185 r102234  
    343343    virtual bool isRenderFlowThread() const { return false; }
    344344
     345    bool canHaveRegionStyle() const { return isRenderBlock() && !isAnonymous() && !isRenderFlowThread(); }
     346
    345347    bool isRoot() const { return document()->documentElement() == m_node; }
    346348    bool isBody() const;
     
    658660    virtual LayoutUnit maxPreferredLogicalWidth() const { return 0; }
    659661
    660     RenderStyle* style() const { return m_style.get(); }
     662    RenderStyle* style() const;
    661663    RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); }
    662664    RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); }
  • trunk/Source/WebCore/rendering/RenderObjectChildList.cpp

    r100630 r102234  
    115115            toRenderRegion(oldChild)->detachRegion();
    116116
    117         if (oldChild->inRenderFlowThread() && oldChild->isBox())
     117        if (oldChild->inRenderFlowThread() && oldChild->isBox()) {
    118118            oldChild->enclosingRenderFlowThread()->removeRenderBoxRegionInfo(toRenderBox(oldChild));
     119            if (oldChild->canHaveRegionStyle())
     120                oldChild->enclosingRenderFlowThread()->clearRenderObjectCustomStyle(oldChild);
     121        }
    119122
    120123        if (RenderFlowThread* containerFlowThread = renderFlowThreadContainer(owner))
  • trunk/Source/WebCore/rendering/RenderRegion.cpp

    r99467 r102234  
    148148            m_flowThread->invalidateRegions();
    149149    }
    150    
     150
    151151    // FIXME: We need to find a way to set up overflow properly. Our flow thread hasn't gotten a layout
    152152    // yet, so we can't look to it for correct information. It's possible we could wait until after the RenderFlowThread
     
    243243}
    244244
     245RenderStyle* RenderRegion::renderObjectRegionStyle(const RenderObject* renderObject) const
     246{
     247    RenderObjectRegionStyleMap::const_iterator it = m_renderObjectRegionStyle.find(renderObject);
     248    return (it != m_renderObjectRegionStyle.end()) ? it->second.get() : 0;
     249}
     250
     251void RenderRegion::computeStyleInRegion(const RenderObject* object)
     252{
     253    ASSERT(object);
     254    ASSERT(object->view());
     255    ASSERT(object->view()->document());
     256    ASSERT(!object->isAnonymous());
     257    ASSERT(object->node() && object->node()->isElementNode());
     258
     259    Element* element = toElement(object->node());
     260    RefPtr<RenderStyle> renderObjectStyle = object->view()->document()->styleSelector()->styleForElement(element, 0, false, false, this);
     261    m_renderObjectRegionStyle.set(object, renderObjectStyle);
     262
     263    if (!object->hasBoxDecorations()) {
     264        RenderBox* box = const_cast<RenderBox*>(toRenderBox(object));
     265        RenderStyle* styleInRegion = renderObjectRegionStyle(object);
     266        ASSERT(styleInRegion);
     267
     268        bool hasBoxDecorations = object->isTableCell() || styleInRegion->hasBackground() || styleInRegion->hasBorder() || styleInRegion->hasAppearance() || styleInRegion->boxShadow();
     269        box->setHasBoxDecorations(hasBoxDecorations);
     270    }
     271}
     272
     273void RenderRegion::clearObjectStyleInRegion(const RenderObject* object)
     274{
     275    ASSERT(object);
     276    m_renderObjectRegionStyle.remove(object);
     277}
     278
    245279} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r98600 r102234  
    7474    RenderBoxRegionInfo* takeRenderBoxRegionInfo(const RenderBox*);
    7575    void removeRenderBoxRegionInfo(const RenderBox*);
    76    
     76
    7777    void deleteAllRenderBoxRegionInfo();
    7878
     
    8282    bool isLastRegion() const;
    8383
     84    RenderStyle* renderObjectRegionStyle(const RenderObject*) const;
     85    void computeStyleInRegion(const RenderObject*);
     86    void clearObjectStyleInRegion(const RenderObject*);
    8487private:
    8588    virtual const char* renderName() const { return "RenderRegion"; }
     
    98101    // it will also hold a custom style for any box (for region styling).
    99102    HashMap<const RenderBox*, RenderBoxRegionInfo*> m_renderBoxRegionInfo;
     103
     104    // This map holds information about the region style associated with the render objects that
     105    // are displayed into this region.
     106    typedef HashMap<const RenderObject*, RefPtr<RenderStyle> > RenderObjectRegionStyleMap;
     107    RenderObjectRegionStyleMap m_renderObjectRegionStyle;
    100108
    101109    bool m_isValid;
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r101574 r102234  
    5959    , m_layoutStateDisableCount(0)
    6060    , m_currentRenderFlowThread(0)
     61    , m_currentRenderRegion(0)
    6162{
    6263    // Clear our anonymous bit, set because RenderObject assumes
  • trunk/Source/WebCore/rendering/RenderView.h

    r102185 r102234  
    3232
    3333class RenderFlowThread;
     34class RenderRegion;
    3435class RenderWidget;
    3536
     
    187188    void setCurrentRenderFlowThread(RenderFlowThread* flowThread) { m_currentRenderFlowThread = flowThread; }
    188189
     190    RenderRegion* currentRenderRegion() const { return m_currentRenderRegion; }
     191    void setCurrentRenderRegion(RenderRegion* region) { m_currentRenderRegion = region; }
     192
    189193    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
    190    
     194
    191195protected:
    192196    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, bool* wasFixed = 0) const;
     
    274278    OwnPtr<RenderFlowThreadList> m_renderFlowThreadList;
    275279    RenderFlowThread* m_currentRenderFlowThread;
     280    RenderRegion* m_currentRenderRegion;
    276281};
    277282
Note: See TracChangeset for help on using the changeset viewer.