Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 153233002: *** DO NOT LAND *** Remove regions support, keeping a bare minimum to support "region-based"... (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | Source/core/rendering/RenderRegion.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "core/frame/Settings.h" 49 #include "core/frame/Settings.h"
50 #include "core/frame/UseCounter.h" 50 #include "core/frame/UseCounter.h"
51 #include "core/frame/animation/AnimationController.h" 51 #include "core/frame/animation/AnimationController.h"
52 #include "core/rendering/CompositedLayerMapping.h" 52 #include "core/rendering/CompositedLayerMapping.h"
53 #include "core/rendering/FlowThreadController.h" 53 #include "core/rendering/FlowThreadController.h"
54 #include "core/rendering/HitTestResult.h" 54 #include "core/rendering/HitTestResult.h"
55 #include "core/rendering/LayoutRectRecorder.h" 55 #include "core/rendering/LayoutRectRecorder.h"
56 #include "core/rendering/RenderCounter.h" 56 #include "core/rendering/RenderCounter.h"
57 #include "core/rendering/RenderDeprecatedFlexibleBox.h" 57 #include "core/rendering/RenderDeprecatedFlexibleBox.h"
58 #include "core/rendering/RenderFlexibleBox.h" 58 #include "core/rendering/RenderFlexibleBox.h"
59 #include "core/rendering/RenderFlowThread.h"
59 #include "core/rendering/RenderGeometryMap.h" 60 #include "core/rendering/RenderGeometryMap.h"
60 #include "core/rendering/RenderGrid.h" 61 #include "core/rendering/RenderGrid.h"
61 #include "core/rendering/RenderImage.h" 62 #include "core/rendering/RenderImage.h"
62 #include "core/rendering/RenderImageResourceStyleImage.h" 63 #include "core/rendering/RenderImageResourceStyleImage.h"
63 #include "core/rendering/RenderInline.h" 64 #include "core/rendering/RenderInline.h"
64 #include "core/rendering/RenderLayer.h" 65 #include "core/rendering/RenderLayer.h"
65 #include "core/rendering/RenderLayerCompositor.h" 66 #include "core/rendering/RenderLayerCompositor.h"
66 #include "core/rendering/RenderListItem.h" 67 #include "core/rendering/RenderListItem.h"
67 #include "core/rendering/RenderMarquee.h" 68 #include "core/rendering/RenderMarquee.h"
68 #include "core/rendering/RenderMultiColumnBlock.h" 69 #include "core/rendering/RenderMultiColumnBlock.h"
69 #include "core/rendering/RenderNamedFlowThread.h"
70 #include "core/rendering/RenderRegion.h"
71 #include "core/rendering/RenderRuby.h" 70 #include "core/rendering/RenderRuby.h"
72 #include "core/rendering/RenderRubyText.h" 71 #include "core/rendering/RenderRubyText.h"
73 #include "core/rendering/RenderScrollbarPart.h" 72 #include "core/rendering/RenderScrollbarPart.h"
74 #include "core/rendering/RenderTableCaption.h" 73 #include "core/rendering/RenderTableCaption.h"
75 #include "core/rendering/RenderTableCell.h" 74 #include "core/rendering/RenderTableCell.h"
76 #include "core/rendering/RenderTableCol.h" 75 #include "core/rendering/RenderTableCol.h"
77 #include "core/rendering/RenderTableRow.h" 76 #include "core/rendering/RenderTableRow.h"
78 #include "core/rendering/RenderTheme.h" 77 #include "core/rendering/RenderTheme.h"
79 #include "core/rendering/RenderView.h" 78 #include "core/rendering/RenderView.h"
80 #include "core/rendering/style/ContentData.h" 79 #include "core/rendering/style/ContentData.h"
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 // Not in the middle of layout so have to find the thread the slow way. 614 // Not in the middle of layout so have to find the thread the slow way.
616 RenderObject* curr = const_cast<RenderObject*>(this); 615 RenderObject* curr = const_cast<RenderObject*>(this);
617 while (curr) { 616 while (curr) {
618 if (curr->isRenderFlowThread()) 617 if (curr->isRenderFlowThread())
619 return toRenderFlowThread(curr); 618 return toRenderFlowThread(curr);
620 curr = curr->containingBlock(); 619 curr = curr->containingBlock();
621 } 620 }
622 return 0; 621 return 0;
623 } 622 }
624 623
625 RenderNamedFlowThread* RenderObject::renderNamedFlowThreadWrapper() const
626 {
627 RenderObject* object = const_cast<RenderObject*>(this);
628 while (object && object->isAnonymousBlock() && !object->isRenderNamedFlowThr ead())
629 object = object->parent();
630
631 return object && object->isRenderNamedFlowThread() ? toRenderNamedFlowThread (object) : 0;
632 }
633
634 RenderBlock* RenderObject::firstLineBlock() const 624 RenderBlock* RenderObject::firstLineBlock() const
635 { 625 {
636 return 0; 626 return 0;
637 } 627 }
638 628
639 static inline bool objectIsRelayoutBoundary(const RenderObject* object) 629 static inline bool objectIsRelayoutBoundary(const RenderObject* object)
640 { 630 {
641 // FIXME: In future it may be possible to broaden these conditions in order to improve performance. 631 // FIXME: In future it may be possible to broaden these conditions in order to improve performance.
642 if (object->isTextControl()) 632 if (object->isTextControl())
643 return true; 633 return true;
(...skipping 1922 matching lines...) Expand 10 before | Expand all | Expand 10 after
2566 if (AXObjectCache* cache = document().existingAXObjectCache()) 2556 if (AXObjectCache* cache = document().existingAXObjectCache())
2567 cache->childrenChanged(this->parent()); 2557 cache->childrenChanged(this->parent());
2568 2558
2569 remove(); 2559 remove();
2570 2560
2571 // The remove() call above may invoke axObjectCache()->childrenChanged() on the parent, which may require the AX render 2561 // The remove() call above may invoke axObjectCache()->childrenChanged() on the parent, which may require the AX render
2572 // object for this renderer. So we remove the AX render object now, after th e renderer is removed. 2562 // object for this renderer. So we remove the AX render object now, after th e renderer is removed.
2573 if (AXObjectCache* cache = document().existingAXObjectCache()) 2563 if (AXObjectCache* cache = document().existingAXObjectCache())
2574 cache->remove(this); 2564 cache->remove(this);
2575 2565
2576 #ifndef NDEBUG
2577 if (!documentBeingDestroyed() && view() && view()->hasRenderNamedFlowThreads ()) {
2578 // After remove, the object and the associated information should not be in any flow thread.
2579 const RenderNamedFlowThreadList* flowThreadList = view()->flowThreadCont roller()->renderNamedFlowThreadList();
2580 for (RenderNamedFlowThreadList::const_iterator iter = flowThreadList->be gin(); iter != flowThreadList->end(); ++iter) {
2581 const RenderNamedFlowThread* renderFlowThread = *iter;
2582 ASSERT(!renderFlowThread->hasChild(this));
2583 ASSERT(!renderFlowThread->hasChildInfo(this));
2584 }
2585 }
2586 #endif
2587
2588 // If this renderer had a parent, remove should have destroyed any counters 2566 // If this renderer had a parent, remove should have destroyed any counters
2589 // attached to this renderer and marked the affected other counters for 2567 // attached to this renderer and marked the affected other counters for
2590 // reevaluation. This apparently redundant check is here for the case when 2568 // reevaluation. This apparently redundant check is here for the case when
2591 // this renderer had no parent at the time remove() was called. 2569 // this renderer had no parent at the time remove() was called.
2592 2570
2593 if (hasCounterNodeMap()) 2571 if (hasCounterNodeMap())
2594 RenderCounter::destroyCounterNodes(*this); 2572 RenderCounter::destroyCounterNodes(*this);
2595 2573
2596 setAncestorLineBoxDirty(false); 2574 setAncestorLineBoxDirty(false);
2597 2575
(...skipping 16 matching lines...) Expand all
2614 // that needs to be drawn and layer visibility optimization can't be used 2592 // that needs to be drawn and layer visibility optimization can't be used
2615 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V ISIBLE && !hasLayer()) { 2593 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V ISIBLE && !hasLayer()) {
2616 if (!layer) 2594 if (!layer)
2617 layer = parent()->enclosingLayer(); 2595 layer = parent()->enclosingLayer();
2618 if (layer) 2596 if (layer)
2619 layer->setHasVisibleContent(); 2597 layer->setHasVisibleContent();
2620 } 2598 }
2621 2599
2622 if (!isFloating() && parent()->childrenInline()) 2600 if (!isFloating() && parent()->childrenInline())
2623 parent()->dirtyLinesFromChangedChild(this); 2601 parent()->dirtyLinesFromChangedChild(this);
2624
2625 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh readWrapper())
2626 containerFlowThread->addFlowChild(this);
2627 } 2602 }
2628 2603
2629 void RenderObject::willBeRemovedFromTree() 2604 void RenderObject::willBeRemovedFromTree()
2630 { 2605 {
2631 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal s which would need to be fixed first. 2606 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal s which would need to be fixed first.
2632 2607
2633 // If we remove a visible child from an invisible parent, we don't know the layer visibility any more. 2608 // If we remove a visible child from an invisible parent, we don't know the layer visibility any more.
2634 RenderLayer* layer = 0; 2609 RenderLayer* layer = 0;
2635 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V ISIBLE && !hasLayer()) { 2610 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V ISIBLE && !hasLayer()) {
2636 if ((layer = parent()->enclosingLayer())) 2611 if ((layer = parent()->enclosingLayer()))
2637 layer->dirtyVisibleContentStatus(); 2612 layer->dirtyVisibleContentStatus();
2638 } 2613 }
2639 2614
2640 // Keep our layer hierarchy updated. 2615 // Keep our layer hierarchy updated.
2641 if (firstChild() || hasLayer()) { 2616 if (firstChild() || hasLayer()) {
2642 if (!layer) 2617 if (!layer)
2643 layer = parent()->enclosingLayer(); 2618 layer = parent()->enclosingLayer();
2644 removeLayers(layer); 2619 removeLayers(layer);
2645 } 2620 }
2646 2621
2647 if (isOutOfFlowPositioned() && parent()->childrenInline()) 2622 if (isOutOfFlowPositioned() && parent()->childrenInline())
2648 parent()->dirtyLinesFromChangedChild(this); 2623 parent()->dirtyLinesFromChangedChild(this);
2649 2624
2650 removeFromRenderFlowThread(); 2625 removeFromRenderFlowThread();
2651 2626
2652 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh readWrapper())
2653 containerFlowThread->removeFlowChild(this);
2654
2655 // Update cached boundaries in SVG renderers if a child is removed. 2627 // Update cached boundaries in SVG renderers if a child is removed.
2656 if (parent()->isSVG()) 2628 if (parent()->isSVG())
2657 parent()->setNeedsBoundariesUpdate(); 2629 parent()->setNeedsBoundariesUpdate();
2658 } 2630 }
2659 2631
2660 void RenderObject::removeFromRenderFlowThread() 2632 void RenderObject::removeFromRenderFlowThread()
2661 { 2633 {
2662 if (flowThreadState() == NotInsideFlowThread) 2634 if (flowThreadState() == NotInsideFlowThread)
2663 return; 2635 return;
2664 2636
2665 // Sometimes we remove the element from the flow, but it's not destroyed at that time. 2637 // Sometimes we remove the element from the flow, but it's not destroyed at that time.
2666 // It's only until later when we actually destroy it and remove all the chil dren from it. 2638 // It's only until later when we actually destroy it and remove all the chil dren from it.
2667 // Currently, that happens for firstLetter elements and list markers. 2639 // Currently, that happens for firstLetter elements and list markers.
2668 // Pass in the flow thread so that we don't have to look it up for all the c hildren. 2640 // Pass in the flow thread so that we don't have to look it up for all the c hildren.
2669 removeFromRenderFlowThreadRecursive(flowThreadContainingBlock()); 2641 removeFromRenderFlowThreadRecursive(flowThreadContainingBlock());
2670 } 2642 }
2671 2643
2672 void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF lowThread) 2644 void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF lowThread)
2673 { 2645 {
2674 if (const RenderObjectChildList* children = virtualChildren()) { 2646 if (const RenderObjectChildList* children = virtualChildren()) {
2675 for (RenderObject* child = children->firstChild(); child; child = child- >nextSibling()) 2647 for (RenderObject* child = children->firstChild(); child; child = child- >nextSibling())
2676 child->removeFromRenderFlowThreadRecursive(renderFlowThread); 2648 child->removeFromRenderFlowThreadRecursive(renderFlowThread);
2677 } 2649 }
2678 2650
2679 RenderFlowThread* localFlowThread = renderFlowThread;
2680 if (flowThreadState() == InsideInFlowThread)
2681 localFlowThread = flowThreadContainingBlock(); // We have to ask. We can 't just assume we are in the same flow thread.
2682 if (localFlowThread)
2683 localFlowThread->removeFlowChildInfo(this);
2684 setFlowThreadState(NotInsideFlowThread); 2651 setFlowThreadState(NotInsideFlowThread);
2685 } 2652 }
2686 2653
2687 void RenderObject::destroyAndCleanupAnonymousWrappers() 2654 void RenderObject::destroyAndCleanupAnonymousWrappers()
2688 { 2655 {
2689 // If the tree is destroyed, there is no need for a clean-up phase. 2656 // If the tree is destroyed, there is no need for a clean-up phase.
2690 if (documentBeingDestroyed()) { 2657 if (documentBeingDestroyed()) {
2691 destroy(); 2658 destroy();
2692 return; 2659 return;
2693 } 2660 }
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
3136 while (!renderer->node()) 3103 while (!renderer->node())
3137 renderer = renderer->parent(); 3104 renderer = renderer->parent();
3138 return renderer->node()->isInert(); 3105 return renderer->node()->isInert();
3139 } 3106 }
3140 3107
3141 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect) 3108 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect)
3142 { 3109 {
3143 imageChanged(static_cast<WrappedImagePtr>(image), rect); 3110 imageChanged(static_cast<WrappedImagePtr>(image), rect);
3144 } 3111 }
3145 3112
3146 RenderObject* RenderObject::hoverAncestor() const
3147 {
3148 // When searching for the hover ancestor and encountering a named flow threa d,
3149 // the search will continue with the DOM ancestor of the top-most element
3150 // in the named flow thread.
3151 // See https://code.google.com/p/chromium/issues/detail?id=243278
3152 RenderObject* hoverAncestor = parent();
3153
3154 // Skip anonymous blocks directly flowed into flow threads as it would
3155 // prevent us from continuing the search on the DOM tree when reaching the n amed flow thread.
3156 if (hoverAncestor && hoverAncestor->isAnonymousBlock() && hoverAncestor->par ent() && hoverAncestor->parent()->isRenderNamedFlowThread())
3157 hoverAncestor = hoverAncestor->parent();
3158
3159 if (hoverAncestor && hoverAncestor->isRenderNamedFlowThread()) {
3160 hoverAncestor = 0;
3161
3162 Node* node = this->node();
3163 if (node) {
3164 Node* domAncestorNode = node->parentNode();
3165 if (domAncestorNode)
3166 hoverAncestor = domAncestorNode->renderer();
3167 }
3168 }
3169
3170 return hoverAncestor;
3171 }
3172
3173 Element* RenderObject::offsetParent() const 3113 Element* RenderObject::offsetParent() const
3174 { 3114 {
3175 if (isRoot() || isBody()) 3115 if (isRoot() || isBody())
3176 return 0; 3116 return 0;
3177 3117
3178 if (isOutOfFlowPositioned() && style()->position() == FixedPosition) 3118 if (isOutOfFlowPositioned() && style()->position() == FixedPosition)
3179 return 0; 3119 return 0;
3180 3120
3181 // If A is an area HTML element which has a map HTML element somewhere in th e ancestor 3121 // If A is an area HTML element which has a map HTML element somewhere in th e ancestor
3182 // chain return the nearest ancestor map HTML element and stop this algorith m. 3122 // chain return the nearest ancestor map HTML element and stop this algorith m.
3183 // FIXME: Implement! 3123 // FIXME: Implement!
3184 3124
3185 float effectiveZoom = style()->effectiveZoom(); 3125 float effectiveZoom = style()->effectiveZoom();
3186 Node* node = 0; 3126 Node* node = 0;
3187 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren t()) { 3127 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren t()) {
3188 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes 3128 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes
3189 3129
3190 // CSS regions specification says that region flows should return the bo dy element as their offsetParent.
3191 if (ancestor->isRenderNamedFlowThread())
3192 return document().body();
3193
3194 node = ancestor->node(); 3130 node = ancestor->node();
3195 3131
3196 if (!node) 3132 if (!node)
3197 continue; 3133 continue;
3198 3134
3199 if (ancestor->isPositioned()) 3135 if (ancestor->isPositioned())
3200 break; 3136 break;
3201 3137
3202 if (node->hasTagName(bodyTag)) 3138 if (node->hasTagName(bodyTag))
3203 break; 3139 break;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 { 3277 {
3342 ASSERT_NOT_REACHED(); 3278 ASSERT_NOT_REACHED();
3343 return false; 3279 return false;
3344 } 3280 }
3345 3281
3346 bool RenderObject::isRelayoutBoundaryForInspector() const 3282 bool RenderObject::isRelayoutBoundaryForInspector() const
3347 { 3283 {
3348 return objectIsRelayoutBoundary(this); 3284 return objectIsRelayoutBoundary(this);
3349 } 3285 }
3350 3286
3351 bool RenderObject::isRenderNamedFlowFragmentContainer() const
3352 {
3353 return isRenderBlockFlow() && toRenderBlockFlow(this)->renderNamedFlowFragme nt();
3354 }
3355
3356 } // namespace WebCore 3287 } // namespace WebCore
3357 3288
3358 #ifndef NDEBUG 3289 #ifndef NDEBUG
3359 3290
3360 void showTree(const WebCore::RenderObject* object) 3291 void showTree(const WebCore::RenderObject* object)
3361 { 3292 {
3362 if (object) 3293 if (object)
3363 object->showTreeForThis(); 3294 object->showTreeForThis();
3364 } 3295 }
3365 3296
(...skipping 12 matching lines...) Expand all
3378 { 3309 {
3379 if (object1) { 3310 if (object1) {
3380 const WebCore::RenderObject* root = object1; 3311 const WebCore::RenderObject* root = object1;
3381 while (root->parent()) 3312 while (root->parent())
3382 root = root->parent(); 3313 root = root->parent();
3383 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3314 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3384 } 3315 }
3385 } 3316 }
3386 3317
3387 #endif 3318 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | Source/core/rendering/RenderRegion.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698