Changeset 206049 in webkit
- Timestamp:
- Sep 16, 2016 2:39:28 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r206048 r206049 1 2016-09-16 Antti Koivisto <antti@apple.com> 2 3 Tighten region style map to use RenderElement instead of RenderObject 4 https://bugs.webkit.org/show_bug.cgi?id=162064 5 6 Reviewed by Zalan Bujtas. 7 8 RenderTexts don't have styles of their own so the map can operate on RenderElements. 9 10 * rendering/RenderElement.cpp: 11 (WebCore::RenderElement::willBeRemovedFromTree): 12 (WebCore::RenderElement::removeFromRenderFlowThread): 13 (WebCore::RenderElement::removeFromRenderFlowThreadIncludingDescendants): 14 (WebCore::RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants): 15 * rendering/RenderElement.h: 16 * rendering/RenderFlowThread.cpp: 17 (WebCore::RenderFlowThread::removeFlowChildInfo): 18 * rendering/RenderFlowThread.h: 19 * rendering/RenderNamedFlowFragment.cpp: 20 (WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion): 21 (WebCore::RenderNamedFlowFragment::setRendererStyleInRegion): 22 (WebCore::RenderNamedFlowFragment::clearObjectStyleInRegion): 23 (WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle): 24 (WebCore::RenderNamedFlowFragment::restoreRegionObjectsOriginalStyle): 25 (WebCore::RenderNamedFlowFragment::setObjectStyleInRegion): Deleted. 26 * rendering/RenderNamedFlowFragment.h: 27 * rendering/RenderNamedFlowThread.cpp: 28 (WebCore::RenderNamedFlowThread::clearRenderObjectCustomStyle): 29 (WebCore::RenderNamedFlowThread::removeFlowChildInfo): 30 * rendering/RenderNamedFlowThread.h: 31 * rendering/RenderObject.cpp: 32 (WebCore::RenderObject::willBeRemovedFromTree): 33 (WebCore::RenderObject::removeFromRenderFlowThread): Deleted. 34 (WebCore::RenderObject::removeFromRenderFlowThreadIncludingDescendants): Deleted. 35 (WebCore::RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants): Deleted. 36 37 These can now move to RenderElement. 38 39 * rendering/RenderObject.h: 40 1 41 2016-09-16 Brent Fulgham <bfulgham@apple.com> 2 42 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r205997 r206049 1088 1088 containerFlowThread->removeFlowChild(*this); 1089 1089 1090 removeFromRenderFlowThread(); 1091 1090 1092 RenderObject::willBeRemovedFromTree(); 1091 1093 } … … 2205 2207 } 2206 2208 2209 void RenderElement::removeFromRenderFlowThread() 2210 { 2211 if (flowThreadState() == NotInsideFlowThread) 2212 return; 2213 2214 // Sometimes we remove the element from the flow, but it's not destroyed at that time. 2215 // It's only until later when we actually destroy it and remove all the children from it. 2216 // Currently, that happens for firstLetter elements and list markers. 2217 // Pass in the flow thread so that we don't have to look it up for all the children. 2218 removeFromRenderFlowThreadIncludingDescendants(true); 2219 } 2220 2221 void RenderElement::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState) 2222 { 2223 // Once we reach another flow thread we don't need to update the flow thread state 2224 // but we have to continue cleanup the flow thread info. 2225 if (isRenderFlowThread()) 2226 shouldUpdateState = false; 2227 2228 for (auto& child : childrenOfType<RenderObject>(*this)) { 2229 if (is<RenderElement>(child)) { 2230 downcast<RenderElement>(child).removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState); 2231 continue; 2232 } 2233 if (shouldUpdateState) 2234 child.setFlowThreadState(NotInsideFlowThread); 2235 } 2236 2237 // We have to ask for our containing flow thread as it may be above the removed sub-tree. 2238 RenderFlowThread* flowThreadContainingBlock = this->flowThreadContainingBlock(); 2239 while (flowThreadContainingBlock) { 2240 flowThreadContainingBlock->removeFlowChildInfo(this); 2241 2242 if (flowThreadContainingBlock->flowThreadState() == NotInsideFlowThread) 2243 break; 2244 auto* parent = flowThreadContainingBlock->parent(); 2245 if (!parent) 2246 break; 2247 flowThreadContainingBlock = parent->flowThreadContainingBlock(); 2248 } 2249 if (is<RenderBlock>(*this)) 2250 downcast<RenderBlock>(*this).setCachedFlowThreadContainingBlockNeedsUpdate(); 2251 2252 if (shouldUpdateState) 2253 setFlowThreadState(NotInsideFlowThread); 2254 } 2255 2256 void RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread) 2257 { 2258 if (flowThreadState() == NotInsideFlowThread) 2259 return; 2260 2261 if (is<RenderBlock>(*this)) { 2262 RenderBlock& block = downcast<RenderBlock>(*this); 2263 2264 if (block.cachedFlowThreadContainingBlockNeedsUpdate()) 2265 return; 2266 2267 flowThread = block.cachedFlowThreadContainingBlock(); 2268 block.setCachedFlowThreadContainingBlockNeedsUpdate(); 2269 } 2270 2271 if (flowThread) 2272 flowThread->removeFlowChildInfo(this); 2273 2274 if (!is<RenderElement>(*this)) 2275 return; 2276 2277 for (auto& child : childrenOfType<RenderElement>(*this)) 2278 child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread); 2279 } 2280 2207 2281 #if ENABLE(IOS_TEXT_AUTOSIZING) 2208 2282 static RenderObject::BlockContentHeightType includeNonFixedHeight(const RenderObject& renderer) -
trunk/Source/WebCore/rendering/RenderElement.h
r205997 r206049 230 230 RespectImageOrientationEnum shouldRespectImageOrientation() const; 231 231 232 void removeFromRenderFlowThread(); 233 void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr); 234 232 235 protected: 233 236 enum BaseTypeFlag { … … 285 288 void updateOutlineAutoAncestor(bool hasOutlineAuto); 286 289 290 void removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState); 291 287 292 private: 288 293 RenderElement(ContainerNode&, RenderStyle&&, BaseTypeFlags); -
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r200098 r206049 93 93 } 94 94 95 void RenderFlowThread::removeFlowChildInfo(Render Object* child)95 void RenderFlowThread::removeFlowChildInfo(RenderElement* child) 96 96 { 97 97 if (is<RenderBlockFlow>(*child)) -
trunk/Source/WebCore/rendering/RenderFlowThread.h
r204466 r206049 61 61 virtual ~RenderFlowThread() { } 62 62 63 virtual void removeFlowChildInfo(Render Object*);63 virtual void removeFlowChildInfo(RenderElement*); 64 64 #ifndef NDEBUG 65 65 bool hasChildInfo(RenderObject* child) const { return is<RenderBox>(child) && m_regionRangeMap.contains(downcast<RenderBox>(child)); } -
trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp
r201040 r206049 360 360 void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement& renderer) 361 361 { 362 for (auto& child : childrenOfType<RenderObject>(renderer)) { 363 364 auto it = m_renderObjectRegionStyle.find(&child); 362 for (auto& child : childrenOfType<RenderElement>(renderer)) { 363 auto it = m_rendererRegionStyle.find(&child); 365 364 366 365 std::unique_ptr<RenderStyle> childStyleInRegion; 367 366 bool objectRegionStyleCached = false; 368 if (it != m_render ObjectRegionStyle.end()) {367 if (it != m_rendererRegionStyle.end()) { 369 368 childStyleInRegion = RenderStyle::clonePtr(*it->value.style); 370 369 objectRegionStyleCached = true; … … 372 371 if (child.isAnonymous() || child.isInFlowRenderFlowThread()) 373 372 childStyleInRegion = std::make_unique<RenderStyle>(RenderStyle::createAnonymousStyleWithDisplay(renderer.style(), child.style().display())); 374 else if (is<RenderText>(child))375 childStyleInRegion = RenderStyle::clonePtr(renderer.style());376 373 else 377 childStyleInRegion = computeStyleInRegion(downcast<RenderElement>(child), renderer.style()); 378 } 379 380 setObjectStyleInRegion(&child, WTFMove(childStyleInRegion), objectRegionStyleCached); 381 382 if (is<RenderElement>(child)) 383 computeChildrenStyleInRegion(downcast<RenderElement>(child)); 384 } 385 } 386 387 void RenderNamedFlowFragment::setObjectStyleInRegion(RenderObject* object, std::unique_ptr<RenderStyle> styleInRegion, bool objectRegionStyleCached) 388 { 389 ASSERT(object->flowThreadContainingBlock()); 390 391 std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(object->style()); 392 if (is<RenderElement>(*object)) 393 downcast<RenderElement>(*object).setStyleInternal(WTFMove(*styleInRegion)); 394 395 if (is<RenderBoxModelObject>(*object) && !object->hasVisibleBoxDecorations()) { 396 bool hasVisibleBoxDecorations = is<RenderTableCell>(*object) 397 || object->style().hasBackground() 398 || object->style().hasVisibleBorder() 399 || object->style().hasAppearance() 400 || object->style().boxShadow(); 401 object->setHasVisibleBoxDecorations(hasVisibleBoxDecorations); 374 childStyleInRegion = computeStyleInRegion(child, renderer.style()); 375 } 376 377 setRendererStyleInRegion(child, WTFMove(childStyleInRegion), objectRegionStyleCached); 378 computeChildrenStyleInRegion(child); 379 } 380 } 381 382 void RenderNamedFlowFragment::setRendererStyleInRegion(RenderElement& renderer, std::unique_ptr<RenderStyle> styleInRegion, bool objectRegionStyleCached) 383 { 384 ASSERT(renderer.flowThreadContainingBlock()); 385 386 std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(renderer.style()); 387 renderer.setStyleInternal(WTFMove(*styleInRegion)); 388 389 if (is<RenderBoxModelObject>(renderer) && !renderer.hasVisibleBoxDecorations()) { 390 bool hasVisibleBoxDecorations = is<RenderTableCell>(renderer) 391 || renderer.style().hasBackground() 392 || renderer.style().hasVisibleBorder() 393 || renderer.style().hasAppearance() 394 || renderer.style().boxShadow(); 395 renderer.setHasVisibleBoxDecorations(hasVisibleBoxDecorations); 402 396 } 403 397 … … 405 399 styleInfo.style = WTFMove(objectOriginalStyle); 406 400 styleInfo.cached = objectRegionStyleCached; 407 m_render ObjectRegionStyle.set(object, WTFMove(styleInfo));408 } 409 410 void RenderNamedFlowFragment::clearObjectStyleInRegion(const Render Object* object)401 m_rendererRegionStyle.set(&renderer, WTFMove(styleInfo)); 402 } 403 404 void RenderNamedFlowFragment::clearObjectStyleInRegion(const RenderElement* object) 411 405 { 412 406 ASSERT(object); 413 m_render ObjectRegionStyle.remove(object);407 m_rendererRegionStyle.remove(object); 414 408 415 409 // Clear the style for the children of this object. 416 for ( RenderObject* child = object->firstChildSlow(); child; child = child->nextSibling())417 clearObjectStyleInRegion( child);410 for (auto& child : childrenOfType<RenderElement>(*object)) 411 clearObjectStyleInRegion(&child); 418 412 } 419 413 … … 432 426 if (!element->renderer()) 433 427 continue; 434 435 RenderElement* object = element->renderer(); 428 auto& renderer = *element->renderer(); 429 436 430 // If the content node does not flow any of its children in this region, 437 431 // we do not compute any style for them in this region. 438 if (!flowThread()->objectInFlowRegion( object, this))432 if (!flowThread()->objectInFlowRegion(&renderer, this)) 439 433 continue; 440 434 441 435 // If the object has style in region, use that instead of computing a new one. 442 auto it = m_render ObjectRegionStyle.find(object);436 auto it = m_rendererRegionStyle.find(&renderer); 443 437 std::unique_ptr<RenderStyle> objectStyleInRegion; 444 438 bool objectRegionStyleCached = false; 445 if (it != m_render ObjectRegionStyle.end()) {439 if (it != m_rendererRegionStyle.end()) { 446 440 objectStyleInRegion = RenderStyle::clonePtr(*it->value.style); 447 441 ASSERT(it->value.cached); 448 442 objectRegionStyleCached = true; 449 443 } else 450 objectStyleInRegion = computeStyleInRegion( *object, style());451 452 set ObjectStyleInRegion(object, WTFMove(objectStyleInRegion), objectRegionStyleCached);453 454 computeChildrenStyleInRegion( *object);444 objectStyleInRegion = computeStyleInRegion(renderer, style()); 445 446 setRendererStyleInRegion(renderer, WTFMove(objectStyleInRegion), objectRegionStyleCached); 447 448 computeChildrenStyleInRegion(renderer); 455 449 } 456 450 } … … 461 455 return; 462 456 463 Render ObjectRegionStyleMap temp;464 for (auto& objectPair : m_render ObjectRegionStyle) {465 RenderObject* object = const_cast<RenderObject*>(objectPair.key);457 RendererRegionStyleMap temp; 458 for (auto& objectPair : m_rendererRegionStyle) { 459 auto* object = const_cast<RenderElement*>(objectPair.key); 466 460 std::unique_ptr<RenderStyle> objectRegionStyle = RenderStyle::clonePtr(object->style()); 467 461 std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(*objectPair.value.style); … … 481 475 temp.set(object, WTFMove(styleInfo)); 482 476 } 483 if (is<RenderElement>(*object)) 484 downcast<RenderElement>(*object).setStyleInternal(WTFMove(*objectOriginalStyle)); 485 } 486 487 m_renderObjectRegionStyle.swap(temp); 477 object->setStyleInternal(WTFMove(*objectOriginalStyle)); 478 } 479 480 m_rendererRegionStyle.swap(temp); 488 481 } 489 482 -
trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h
r200098 r206049 80 80 81 81 bool hasCustomRegionStyle() const { return m_hasCustomRegionStyle; } 82 void clearObjectStyleInRegion(const Render Object*);82 void clearObjectStyleInRegion(const RenderElement*); 83 83 84 84 void setRegionObjectsRegionStyle(); … … 126 126 std::unique_ptr<RenderStyle> computeStyleInRegion(RenderElement&, const RenderStyle& parentStyle) const; 127 127 void computeChildrenStyleInRegion(RenderElement&); 128 void set ObjectStyleInRegion(RenderObject*, std::unique_ptr<RenderStyle>, bool objectRegionStyleCached);128 void setRendererStyleInRegion(RenderElement&, std::unique_ptr<RenderStyle>, bool objectRegionStyleCached); 129 129 130 130 void checkRegionStyle(); … … 154 154 }; 155 155 156 typedef HashMap<const RenderObject*, ObjectRegionStyleInfo > RenderObjectRegionStyleMap;157 Render ObjectRegionStyleMap m_renderObjectRegionStyle;156 using RendererRegionStyleMap = HashMap<const RenderElement*, ObjectRegionStyleInfo>; 157 RendererRegionStyleMap m_rendererRegionStyle; 158 158 159 159 bool m_hasCustomRegionStyle : 1; -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp
r203601 r206049 813 813 } 814 814 815 void RenderNamedFlowThread::clearRenderObjectCustomStyle(const Render Object* object)815 void RenderNamedFlowThread::clearRenderObjectCustomStyle(const RenderElement* object) 816 816 { 817 817 // Clear the styles for the object in the regions. … … 821 821 } 822 822 823 void RenderNamedFlowThread::removeFlowChildInfo(Render Object* child)823 void RenderNamedFlowThread::removeFlowChildInfo(RenderElement* child) 824 824 { 825 825 RenderFlowThread::removeFlowChildInfo(child); -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.h
r200041 r206049 92 92 void checkRegionsWithStyling(); 93 93 94 void clearRenderObjectCustomStyle(const Render Object*);94 void clearRenderObjectCustomStyle(const RenderElement*); 95 95 96 void removeFlowChildInfo(Render Object*) override;96 void removeFlowChildInfo(RenderElement*) override; 97 97 98 98 LayoutUnit flowContentBottom() const { return m_flowContentBottom; } -
trunk/Source/WebCore/rendering/RenderObject.cpp
r205997 r206049 1427 1427 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removals which would need to be fixed first. 1428 1428 1429 removeFromRenderFlowThread();1429 setFlowThreadState(NotInsideFlowThread); 1430 1430 1431 1431 // Update cached boundaries in SVG renderers, if a child is removed. 1432 1432 parent()->setNeedsBoundariesUpdate(); 1433 }1434 1435 void RenderObject::removeFromRenderFlowThread()1436 {1437 if (flowThreadState() == NotInsideFlowThread)1438 return;1439 1440 // Sometimes we remove the element from the flow, but it's not destroyed at that time.1441 // It's only until later when we actually destroy it and remove all the children from it.1442 // Currently, that happens for firstLetter elements and list markers.1443 // Pass in the flow thread so that we don't have to look it up for all the children.1444 removeFromRenderFlowThreadIncludingDescendants(true);1445 }1446 1447 void RenderObject::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState)1448 {1449 // Once we reach another flow thread we don't need to update the flow thread state1450 // but we have to continue cleanup the flow thread info.1451 if (isRenderFlowThread())1452 shouldUpdateState = false;1453 1454 if (is<RenderElement>(*this)) {1455 for (auto& child : childrenOfType<RenderObject>(downcast<RenderElement>(*this)))1456 child.removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState);1457 }1458 1459 // We have to ask for our containing flow thread as it may be above the removed sub-tree.1460 RenderFlowThread* flowThreadContainingBlock = this->flowThreadContainingBlock();1461 while (flowThreadContainingBlock) {1462 flowThreadContainingBlock->removeFlowChildInfo(this);1463 if (flowThreadContainingBlock->flowThreadState() == NotInsideFlowThread)1464 break;1465 RenderObject* parent = flowThreadContainingBlock->parent();1466 if (!parent)1467 break;1468 flowThreadContainingBlock = parent->flowThreadContainingBlock();1469 }1470 if (is<RenderBlock>(*this))1471 downcast<RenderBlock>(*this).setCachedFlowThreadContainingBlockNeedsUpdate();1472 1473 if (shouldUpdateState)1474 setFlowThreadState(NotInsideFlowThread);1475 }1476 1477 void RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread)1478 {1479 if (flowThreadState() == NotInsideFlowThread)1480 return;1481 1482 if (is<RenderBlock>(*this)) {1483 RenderBlock& block = downcast<RenderBlock>(*this);1484 1485 if (block.cachedFlowThreadContainingBlockNeedsUpdate())1486 return;1487 1488 flowThread = block.cachedFlowThreadContainingBlock();1489 block.setCachedFlowThreadContainingBlockNeedsUpdate();1490 }1491 1492 if (flowThread)1493 flowThread->removeFlowChildInfo(this);1494 1495 if (!is<RenderElement>(*this))1496 return;1497 1498 for (auto& child : childrenOfType<RenderObject>(downcast<RenderElement>(*this)))1499 child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread);1500 1433 } 1501 1434 -
trunk/Source/WebCore/rendering/RenderObject.h
r205997 r206049 817 817 818 818 virtual RenderFlowThread* locateFlowThreadContainingBlock() const; 819 void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr);820 819 static void calculateBorderStyleColor(const EBorderStyle&, const BoxSide&, Color&); 821 820 … … 830 829 void setLayerNeedsFullRepaintForPositionedMovementLayout(); 831 830 832 void removeFromRenderFlowThread();833 void removeFromRenderFlowThreadIncludingDescendants(bool);834 831 Node* generatingPseudoHostElement() const; 835 832
Note: See TracChangeset
for help on using the changeset viewer.