Changeset 106281 in webkit
- Timestamp:
- Jan 30, 2012 1:11:48 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r106279 r106281 1 2012-01-30 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 Enable the region styling tests again. 9 10 * platform/mac-snowleopard/Skipped: 11 1 12 2012-01-30 Joshua Bell <jsbell@chromium.org> 2 13 -
trunk/LayoutTests/platform/mac-snowleopard/Skipped
r105532 r106281 186 186 # Regression in performance 187 187 # https://bugs.webkit.org/show_bug.cgi?id=74141 188 fast/regions/region-style-block-background-color.html189 fast/regions/region-style-block-background-color2.html190 fast/regions/region-style-image-background-color.html191 fast/regions/region-style-inline-background-color.html188 #fast/regions/region-style-block-background-color.html 189 #fast/regions/region-style-block-background-color2.html 190 #fast/regions/region-style-image-background-color.html 191 #fast/regions/region-style-inline-background-color.html 192 192 193 193 # HiDPI tests have lower-level platform dependencies on Mac -
trunk/Source/WebCore/ChangeLog
r106280 r106281 1 2012-01-30 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 Based on work by Alexandru Chiculita (achicu@adobe.com). 9 Previous patches for region styling were touching RenderObject::style() method. After several attempts to avoid regressions 10 (including caching of RenderObject::style() pointer in most used methods), we decided to attempt a different approach: 11 Step1: before each region is repainted, we compute the style for each box that falls into the region 12 Step2: before paint, we store the box original style 13 Step3: paint the region contents using the style in region 14 Step4: after paint is finished, we restore the box original style (and store the box style in region for future region paint) 15 16 Tests for region styling are also enabled with this patch. 17 18 * WebCore.exp.in: 19 * rendering/RenderFlowThread.cpp: 20 (WebCore::RenderFlowThread::clearRenderBoxCustomStyle): 21 (WebCore::RenderFlowThread::setRegionRangeForBox): 22 * rendering/RenderFlowThread.h: 23 (): 24 * rendering/RenderLayer.cpp: 25 (WebCore::RenderLayer::paint): 26 (WebCore::RenderLayer::hitTest): 27 * rendering/RenderObject.cpp: 28 * rendering/RenderObject.h: 29 (WebCore::RenderObject::style): 30 (RenderObject): 31 * rendering/RenderObjectChildList.cpp: 32 (WebCore::RenderObjectChildList::removeChildNode): 33 * rendering/RenderRegion.cpp: 34 (WebCore::RenderRegion::RenderRegion): 35 (WebCore::RenderRegion::setRegionBoxesRegionStyle): 36 (WebCore): 37 (WebCore::RenderRegion::restoreRegionBoxesOriginalStyle): 38 (WebCore::RenderRegion::paintReplaced): 39 (WebCore::RenderRegion::setRenderBoxRegionInfo): 40 (WebCore::RenderRegion::takeRenderBoxRegionInfo): 41 (WebCore::RenderRegion::removeRenderBoxRegionInfo): 42 (WebCore::RenderRegion::renderBoxRegionStyle): 43 (WebCore::RenderRegion::computeStyleInRegion): 44 (WebCore::RenderRegion::clearBoxStyleInRegion): 45 * rendering/RenderRegion.h: 46 (RenderRegion): 47 * rendering/RenderView.cpp: 48 (WebCore::RenderView::RenderView): 49 * rendering/RenderView.h: 50 (WebCore): 51 (RenderView): 52 1 53 2012-01-30 Jessie Berlin <jberlin@apple.com> 2 54 -
trunk/Source/WebCore/WebCore.exp.in
r106271 r106281 1193 1193 __ZNK7WebCore12IconDatabase24shouldStopThreadActivityEv 1194 1194 __ZNK7WebCore12IconDatabase9isEnabledEv 1195 __ZNK7WebCore12RenderObject13styleInRegionEv1196 1195 __ZNK7WebCore12RenderObject14enclosingLayerEv 1197 1196 __ZNK7WebCore12RenderObject15localToAbsoluteERKNS_10FloatPointEbb -
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r105176 r106281 743 743 } 744 744 745 void RenderFlowThread::clearRender ObjectCustomStyle(const RenderObject* object,745 void RenderFlowThread::clearRenderBoxCustomStyle(const RenderBox* box, 746 746 const RenderRegion* oldStartRegion, const RenderRegion* oldEndRegion, 747 747 const RenderRegion* newStartRegion, const RenderRegion* newEndRegion) … … 760 760 761 761 if (!(insideOldRegionRange && insideNewRegionRange)) 762 region->clear ObjectStyleInRegion(object);762 region->clearBoxStyleInRegion(box); 763 763 764 764 if (oldEndRegion == region) … … 799 799 } 800 800 801 clearRender ObjectCustomStyle(box, range.startRegion(), range.endRegion(), startRegion, endRegion);801 clearRenderBoxCustomStyle(box, range.startRegion(), range.endRegion(), startRegion, endRegion); 802 802 range.setRange(startRegion, endRegion); 803 803 } -
trunk/Source/WebCore/rendering/RenderFlowThread.h
r105176 r106281 125 125 void getRegionRangeForBox(const RenderBox*, RenderRegion*& startRegion, RenderRegion*& endRegion) const; 126 126 127 void clearRender ObjectCustomStyle(const RenderObject*,127 void clearRenderBoxCustomStyle(const RenderBox*, 128 128 const RenderRegion* oldStartRegion = 0, const RenderRegion* oldEndRegion = 0, 129 129 const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0); -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r106247 r106281 2591 2591 } 2592 2592 2593 class CurrentRenderRegionMaintainer {2594 WTF_MAKE_NONCOPYABLE(CurrentRenderRegionMaintainer);2595 public:2596 CurrentRenderRegionMaintainer(RenderView* view, RenderRegion* renderRegion)2597 : m_view(view)2598 , m_renderRegion(view->currentRenderRegion())2599 {2600 m_view->setCurrentRenderRegion(renderRegion);2601 }2602 ~CurrentRenderRegionMaintainer()2603 {2604 m_view->setCurrentRenderRegion(m_renderRegion);2605 }2606 private:2607 RenderView* m_view;2608 RenderRegion* m_renderRegion;2609 };2610 2611 2593 void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot, RenderRegion* region, PaintLayerFlags paintFlags) 2612 2594 { 2613 CurrentRenderRegionMaintainer renderRegionMaintainer(renderer()->view(), region);2614 2595 OverlapTestRequestMap overlapTestRequests; 2615 2596 paintLayer(this, context, damageRect, paintBehavior, paintingRoot, region, &overlapTestRequests, paintFlags); … … 3113 3094 bool RenderLayer::hitTest(const HitTestRequest& request, HitTestResult& result) 3114 3095 { 3115 CurrentRenderRegionMaintainer renderRegionMaintainer(renderer()->view(), result.region());3116 3096 renderer()->document()->updateLayout(); 3117 3097 -
trunk/Source/WebCore/rendering/RenderObject.cpp
r104965 r106281 1714 1714 } 1715 1715 1716 RenderStyle* RenderObject::styleInRegion() const1717 {1718 ASSERT(inRenderFlowThread());1719 1720 if (!canHaveRegionStyle()1721 || !((view() && view()->currentRenderRegion() && view()->currentRenderRegion()->hasCustomRegionStyle())))1722 return m_style.get();1723 1724 RenderStyle* regionStyle = view()->currentRenderRegion()->renderObjectRegionStyle(this);1725 if (!regionStyle)1726 view()->currentRenderRegion()->computeStyleInRegion(this);1727 return view()->currentRenderRegion()->renderObjectRegionStyle(this);1728 }1729 1730 1716 void RenderObject::setStyle(PassRefPtr<RenderStyle> style) 1731 1717 { -
trunk/Source/WebCore/rendering/RenderObject.h
r105532 r106281 675 675 virtual LayoutUnit maxPreferredLogicalWidth() const { return 0; } 676 676 677 RenderStyle* style() const ;677 RenderStyle* style() const { return m_style.get(); } 678 678 RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); } 679 679 RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); } … … 880 880 881 881 private: 882 RenderStyle* styleInRegion() const;883 882 RenderStyle* firstLineStyleSlowCase() const; 884 883 StyleDifference adjustStyleDifference(StyleDifference, unsigned contextSensitiveProperties) const; … … 1109 1108 } 1110 1109 1111 inline RenderStyle* RenderObject::style() const1112 {1113 return m_style.get();1114 }1115 1116 1110 inline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRendering) 1117 1111 { -
trunk/Source/WebCore/rendering/RenderObjectChildList.cpp
r104965 r106281 118 118 oldChild->enclosingRenderFlowThread()->removeRenderBoxRegionInfo(toRenderBox(oldChild)); 119 119 if (oldChild->canHaveRegionStyle()) 120 oldChild->enclosingRenderFlowThread()->clearRender ObjectCustomStyle(oldChild);120 oldChild->enclosingRenderFlowThread()->clearRenderBoxCustomStyle(toRenderBox(oldChild)); 121 121 } 122 122 -
trunk/Source/WebCore/rendering/RenderRegion.cpp
r104965 r106281 48 48 , m_isValid(false) 49 49 , m_hasCustomRegionStyle(false) 50 #ifndef NDEBUG 51 , m_insideRegionPaint(false) 52 #endif 50 53 { 51 54 } … … 94 97 } 95 98 99 void RenderRegion::setRegionBoxesRegionStyle() 100 { 101 for (RenderBoxRegionInfoMap::iterator iter = m_renderBoxRegionInfo.begin(), end = m_renderBoxRegionInfo.end(); iter != end; ++iter) { 102 const RenderBox* box = iter->first; 103 if (!box->canHaveRegionStyle()) 104 continue; 105 106 // Save original box style to be restored later, after paint. 107 RefPtr<RenderStyle> boxOriginalStyle = box->style(); 108 109 // Set the style to be used for box as the style computed in region. 110 (const_cast<RenderBox*>(box))->setStyleInternal(renderBoxRegionStyle(box)); 111 112 m_renderBoxRegionStyle.set(box, boxOriginalStyle); 113 } 114 } 115 116 void RenderRegion::restoreRegionBoxesOriginalStyle() 117 { 118 for (RenderBoxRegionInfoMap::iterator iter = m_renderBoxRegionInfo.begin(), end = m_renderBoxRegionInfo.end(); iter != end; ++iter) { 119 const RenderBox* box = iter->first; 120 RenderBoxRegionStyleMap::iterator it = m_renderBoxRegionStyle.find(box); 121 if (it == m_renderBoxRegionStyle.end()) 122 continue; 123 124 // Restore the box style to the original style and store the box style in region for later use. 125 RefPtr<RenderStyle> boxRegionStyle = box->style(); 126 (const_cast<RenderBox*>(box))->setStyleInternal(it->second); 127 m_renderBoxRegionStyle.set(box, boxRegionStyle); 128 } 129 } 130 96 131 void RenderRegion::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset) 97 132 { … … 99 134 if (!m_flowThread || !isValid()) 100 135 return; 136 137 #ifndef NDEBUG 138 m_insideRegionPaint = true; 139 #endif 140 141 setRegionBoxesRegionStyle(); 101 142 m_flowThread->paintIntoRegion(paintInfo, this, LayoutPoint(paintOffset.x() + borderLeft() + paddingLeft(), paintOffset.y() + borderTop() + paddingTop())); 143 restoreRegionBoxesOriginalStyle(); 144 145 #ifndef NDEBUG 146 m_insideRegionPaint = false; 147 #endif 102 148 } 103 149 … … 202 248 return 0; 203 249 250 #ifndef NDEBUG 251 ASSERT(!m_insideRegionPaint && "RenderBoxRegionInfo should not be modified inside region paint."); 252 #endif 253 204 254 OwnPtr<RenderBoxRegionInfo>& boxInfo = m_renderBoxRegionInfo.add(box, nullptr).first->second; 205 255 if (boxInfo) … … 213 263 PassOwnPtr<RenderBoxRegionInfo> RenderRegion::takeRenderBoxRegionInfo(const RenderBox* box) 214 264 { 265 #ifndef NDEBUG 266 ASSERT(!m_insideRegionPaint && "RenderBoxRegionInfo should not be modified inside region paint."); 267 #endif 268 215 269 return m_renderBoxRegionInfo.take(box); 216 270 } … … 218 272 void RenderRegion::removeRenderBoxRegionInfo(const RenderBox* box) 219 273 { 274 #ifndef NDEBUG 275 ASSERT(!m_insideRegionPaint && "RenderBoxRegionInfo should not be modified inside region paint."); 276 #endif 277 220 278 m_renderBoxRegionInfo.remove(box); 221 279 } … … 235 293 } 236 294 237 RenderStyle* RenderRegion::renderObjectRegionStyle(const RenderObject* renderObject) const 238 { 239 RenderObjectRegionStyleMap::const_iterator it = m_renderObjectRegionStyle.find(renderObject); 240 return (it != m_renderObjectRegionStyle.end()) ? it->second.get() : 0; 241 } 242 243 void RenderRegion::computeStyleInRegion(const RenderObject* object) 244 { 245 ASSERT(object); 246 ASSERT(object->view()); 247 ASSERT(object->view()->document()); 248 ASSERT(!object->isAnonymous()); 249 ASSERT(object->node() && object->node()->isElementNode()); 250 251 Element* element = toElement(object->node()); 252 RefPtr<RenderStyle> renderObjectStyle = object->view()->document()->styleSelector()->styleForElement(element, 0, false, false, this); 253 m_renderObjectRegionStyle.set(object, renderObjectStyle); 254 255 if (!object->hasBoxDecorations()) { 256 RenderBox* box = const_cast<RenderBox*>(toRenderBox(object)); 257 RenderStyle* styleInRegion = renderObjectRegionStyle(object); 258 ASSERT(styleInRegion); 259 260 bool hasBoxDecorations = object->isTableCell() || styleInRegion->hasBackground() || styleInRegion->hasBorder() || styleInRegion->hasAppearance() || styleInRegion->boxShadow(); 261 box->setHasBoxDecorations(hasBoxDecorations); 262 } 263 } 264 265 void RenderRegion::clearObjectStyleInRegion(const RenderObject* object) 266 { 267 ASSERT(object); 268 m_renderObjectRegionStyle.remove(object); 295 PassRefPtr<RenderStyle> RenderRegion::renderBoxRegionStyle(const RenderBox* renderBox) 296 { 297 // The box for which we are asking for style in region should have its info present 298 // in the region box info map. 299 ASSERT(m_renderBoxRegionInfo.find(renderBox) != m_renderBoxRegionInfo.end()); 300 301 RenderBoxRegionStyleMap::iterator it = m_renderBoxRegionStyle.find(renderBox); 302 if (it != m_renderBoxRegionStyle.end()) 303 return it->second; 304 return computeStyleInRegion(renderBox); 305 } 306 307 PassRefPtr<RenderStyle> RenderRegion::computeStyleInRegion(const RenderBox* box) 308 { 309 ASSERT(box); 310 ASSERT(box->view()); 311 ASSERT(box->view()->document()); 312 ASSERT(!box->isAnonymous()); 313 ASSERT(box->node() && box->node()->isElementNode()); 314 315 Element* element = toElement(box->node()); 316 RefPtr<RenderStyle> renderBoxRegionStyle = box->view()->document()->styleSelector()->styleForElement(element, 0, false, false, this); 317 m_renderBoxRegionStyle.add(box, renderBoxRegionStyle); 318 319 if (!box->hasBoxDecorations()) { 320 bool hasBoxDecorations = box->isTableCell() || renderBoxRegionStyle->hasBackground() || renderBoxRegionStyle->hasBorder() || renderBoxRegionStyle->hasAppearance() || renderBoxRegionStyle->boxShadow(); 321 (const_cast<RenderBox*>(box))->setHasBoxDecorations(hasBoxDecorations); 322 } 323 324 return renderBoxRegionStyle.release(); 325 } 326 327 void RenderRegion::clearBoxStyleInRegion(const RenderBox* box) 328 { 329 ASSERT(box); 330 m_renderBoxRegionStyle.remove(box); 269 331 } 270 332 -
trunk/Source/WebCore/rendering/RenderRegion.h
r104965 r106281 81 81 bool isLastRegion() const; 82 82 83 RenderStyle* renderObjectRegionStyle(const RenderObject*) const; 84 void computeStyleInRegion(const RenderObject*); 85 void clearObjectStyleInRegion(const RenderObject*); 83 void clearBoxStyleInRegion(const RenderBox*); 86 84 private: 87 85 virtual const char* renderName() const { return "RenderRegion"; } 86 87 PassRefPtr<RenderStyle> renderBoxRegionStyle(const RenderBox*); 88 PassRefPtr<RenderStyle> computeStyleInRegion(const RenderBox*); 89 void setRegionBoxesRegionStyle(); 90 void restoreRegionBoxesOriginalStyle(); 88 91 89 92 RenderFlowThread* m_flowThread; … … 99 102 // is unique to the region. For now it just holds logical width information for RenderBlocks, but eventually 100 103 // it will also hold a custom style for any box (for region styling). 101 HashMap<const RenderBox*, OwnPtr<RenderBoxRegionInfo> > m_renderBoxRegionInfo; 104 typedef HashMap<const RenderBox*, OwnPtr<RenderBoxRegionInfo> > RenderBoxRegionInfoMap; 105 RenderBoxRegionInfoMap m_renderBoxRegionInfo; 102 106 103 // This map holds information about the region style associated with the render objects that 104 // are displayed into this region. 105 typedef HashMap<const RenderObject*, RefPtr<RenderStyle> > RenderObjectRegionStyleMap; 106 RenderObjectRegionStyleMap m_renderObjectRegionStyle; 107 typedef HashMap<const RenderBox*, RefPtr<RenderStyle> > RenderBoxRegionStyleMap; 108 RenderBoxRegionStyleMap m_renderBoxRegionStyle; 107 109 108 110 bool m_isValid; 109 111 bool m_hasCustomRegionStyle; 112 113 #ifndef NDEBUG 114 bool m_insideRegionPaint; 115 #endif 110 116 }; 111 117 -
trunk/Source/WebCore/rendering/RenderView.cpp
r104965 r106281 59 59 , m_layoutStateDisableCount(0) 60 60 , m_currentRenderFlowThread(0) 61 , m_currentRenderRegion(0)62 61 { 63 62 // Clear our anonymous bit, set because RenderObject assumes -
trunk/Source/WebCore/rendering/RenderView.h
r105176 r106281 33 33 34 34 class RenderFlowThread; 35 class RenderRegion;36 35 class RenderWidget; 37 36 … … 188 187 RenderFlowThread* currentRenderFlowThread() const { return m_currentRenderFlowThread; } 189 188 void setCurrentRenderFlowThread(RenderFlowThread* flowThread) { m_currentRenderFlowThread = flowThread; } 190 191 RenderRegion* currentRenderRegion() const { return m_currentRenderRegion; }192 void setCurrentRenderRegion(RenderRegion* region) { m_currentRenderRegion = region; }193 189 194 190 void styleDidChange(StyleDifference, const RenderStyle* oldStyle); … … 282 278 OwnPtr<RenderFlowThreadList> m_renderFlowThreadList; 283 279 RenderFlowThread* m_currentRenderFlowThread; 284 RenderRegion* m_currentRenderRegion;285 280 RefPtr<IntervalArena> m_intervalArena; 286 281 };
Note: See TracChangeset
for help on using the changeset viewer.