| OLD | NEW |
| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "core/page/Page.h" | 48 #include "core/page/Page.h" |
| 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/rendering/CompositedLayerMapping.h" | 51 #include "core/rendering/CompositedLayerMapping.h" |
| 52 #include "core/rendering/FlowThreadController.h" | 52 #include "core/rendering/FlowThreadController.h" |
| 53 #include "core/rendering/HitTestResult.h" | 53 #include "core/rendering/HitTestResult.h" |
| 54 #include "core/rendering/LayoutRectRecorder.h" | 54 #include "core/rendering/LayoutRectRecorder.h" |
| 55 #include "core/rendering/RenderCounter.h" | 55 #include "core/rendering/RenderCounter.h" |
| 56 #include "core/rendering/RenderDeprecatedFlexibleBox.h" | 56 #include "core/rendering/RenderDeprecatedFlexibleBox.h" |
| 57 #include "core/rendering/RenderFlexibleBox.h" | 57 #include "core/rendering/RenderFlexibleBox.h" |
| 58 #include "core/rendering/RenderFlowThread.h" |
| 58 #include "core/rendering/RenderGeometryMap.h" | 59 #include "core/rendering/RenderGeometryMap.h" |
| 59 #include "core/rendering/RenderGrid.h" | 60 #include "core/rendering/RenderGrid.h" |
| 60 #include "core/rendering/RenderImage.h" | 61 #include "core/rendering/RenderImage.h" |
| 61 #include "core/rendering/RenderImageResourceStyleImage.h" | 62 #include "core/rendering/RenderImageResourceStyleImage.h" |
| 62 #include "core/rendering/RenderInline.h" | 63 #include "core/rendering/RenderInline.h" |
| 63 #include "core/rendering/RenderLayer.h" | 64 #include "core/rendering/RenderLayer.h" |
| 64 #include "core/rendering/RenderLayerCompositor.h" | 65 #include "core/rendering/RenderLayerCompositor.h" |
| 65 #include "core/rendering/RenderListItem.h" | 66 #include "core/rendering/RenderListItem.h" |
| 66 #include "core/rendering/RenderMarquee.h" | 67 #include "core/rendering/RenderMarquee.h" |
| 67 #include "core/rendering/RenderMultiColumnBlock.h" | 68 #include "core/rendering/RenderMultiColumnBlock.h" |
| 68 #include "core/rendering/RenderNamedFlowThread.h" | |
| 69 #include "core/rendering/RenderRegion.h" | |
| 70 #include "core/rendering/RenderScrollbarPart.h" | 69 #include "core/rendering/RenderScrollbarPart.h" |
| 71 #include "core/rendering/RenderTableCaption.h" | 70 #include "core/rendering/RenderTableCaption.h" |
| 72 #include "core/rendering/RenderTableCell.h" | 71 #include "core/rendering/RenderTableCell.h" |
| 73 #include "core/rendering/RenderTableCol.h" | 72 #include "core/rendering/RenderTableCol.h" |
| 74 #include "core/rendering/RenderTableRow.h" | 73 #include "core/rendering/RenderTableRow.h" |
| 75 #include "core/rendering/RenderTheme.h" | 74 #include "core/rendering/RenderTheme.h" |
| 76 #include "core/rendering/RenderView.h" | 75 #include "core/rendering/RenderView.h" |
| 77 #include "core/rendering/style/ContentData.h" | 76 #include "core/rendering/style/ContentData.h" |
| 78 #include "core/rendering/style/CursorList.h" | 77 #include "core/rendering/style/CursorList.h" |
| 79 #include "core/rendering/style/ShadowList.h" | 78 #include "core/rendering/style/ShadowList.h" |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 // Not in the middle of layout so have to find the thread the slow way. | 599 // Not in the middle of layout so have to find the thread the slow way. |
| 601 RenderObject* curr = const_cast<RenderObject*>(this); | 600 RenderObject* curr = const_cast<RenderObject*>(this); |
| 602 while (curr) { | 601 while (curr) { |
| 603 if (curr->isRenderFlowThread()) | 602 if (curr->isRenderFlowThread()) |
| 604 return toRenderFlowThread(curr); | 603 return toRenderFlowThread(curr); |
| 605 curr = curr->containingBlock(); | 604 curr = curr->containingBlock(); |
| 606 } | 605 } |
| 607 return 0; | 606 return 0; |
| 608 } | 607 } |
| 609 | 608 |
| 610 RenderNamedFlowThread* RenderObject::renderNamedFlowThreadWrapper() const | |
| 611 { | |
| 612 RenderObject* object = const_cast<RenderObject*>(this); | |
| 613 while (object && object->isAnonymousBlock() && !object->isRenderNamedFlowThr
ead()) | |
| 614 object = object->parent(); | |
| 615 | |
| 616 return object && object->isRenderNamedFlowThread() ? toRenderNamedFlowThread
(object) : 0; | |
| 617 } | |
| 618 | |
| 619 RenderBlock* RenderObject::firstLineBlock() const | 609 RenderBlock* RenderObject::firstLineBlock() const |
| 620 { | 610 { |
| 621 return 0; | 611 return 0; |
| 622 } | 612 } |
| 623 | 613 |
| 624 static inline bool objectIsRelayoutBoundary(const RenderObject* object) | 614 static inline bool objectIsRelayoutBoundary(const RenderObject* object) |
| 625 { | 615 { |
| 626 // FIXME: In future it may be possible to broaden these conditions in order
to improve performance. | 616 // FIXME: In future it may be possible to broaden these conditions in order
to improve performance. |
| 627 if (object->isTextControl()) | 617 if (object->isTextControl()) |
| 628 return true; | 618 return true; |
| (...skipping 1928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2557 if (AXObjectCache* cache = document().existingAXObjectCache()) | 2547 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 2558 cache->childrenChanged(this->parent()); | 2548 cache->childrenChanged(this->parent()); |
| 2559 | 2549 |
| 2560 remove(); | 2550 remove(); |
| 2561 | 2551 |
| 2562 // The remove() call above may invoke axObjectCache()->childrenChanged() on
the parent, which may require the AX render | 2552 // The remove() call above may invoke axObjectCache()->childrenChanged() on
the parent, which may require the AX render |
| 2563 // object for this renderer. So we remove the AX render object now, after th
e renderer is removed. | 2553 // object for this renderer. So we remove the AX render object now, after th
e renderer is removed. |
| 2564 if (AXObjectCache* cache = document().existingAXObjectCache()) | 2554 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 2565 cache->remove(this); | 2555 cache->remove(this); |
| 2566 | 2556 |
| 2567 #ifndef NDEBUG | |
| 2568 if (!documentBeingDestroyed() && view() && view()->hasRenderNamedFlowThreads
()) { | |
| 2569 // After remove, the object and the associated information should not be
in any flow thread. | |
| 2570 const RenderNamedFlowThreadList* flowThreadList = view()->flowThreadCont
roller()->renderNamedFlowThreadList(); | |
| 2571 for (RenderNamedFlowThreadList::const_iterator iter = flowThreadList->be
gin(); iter != flowThreadList->end(); ++iter) { | |
| 2572 const RenderNamedFlowThread* renderFlowThread = *iter; | |
| 2573 ASSERT(!renderFlowThread->hasChild(this)); | |
| 2574 ASSERT(!renderFlowThread->hasChildInfo(this)); | |
| 2575 } | |
| 2576 } | |
| 2577 #endif | |
| 2578 | |
| 2579 // If this renderer had a parent, remove should have destroyed any counters | 2557 // If this renderer had a parent, remove should have destroyed any counters |
| 2580 // attached to this renderer and marked the affected other counters for | 2558 // attached to this renderer and marked the affected other counters for |
| 2581 // reevaluation. This apparently redundant check is here for the case when | 2559 // reevaluation. This apparently redundant check is here for the case when |
| 2582 // this renderer had no parent at the time remove() was called. | 2560 // this renderer had no parent at the time remove() was called. |
| 2583 | 2561 |
| 2584 if (hasCounterNodeMap()) | 2562 if (hasCounterNodeMap()) |
| 2585 RenderCounter::destroyCounterNodes(*this); | 2563 RenderCounter::destroyCounterNodes(*this); |
| 2586 | 2564 |
| 2587 setAncestorLineBoxDirty(false); | 2565 setAncestorLineBoxDirty(false); |
| 2588 | 2566 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2605 // that needs to be drawn and layer visibility optimization can't be used | 2583 // that needs to be drawn and layer visibility optimization can't be used |
| 2606 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { | 2584 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { |
| 2607 if (!layer) | 2585 if (!layer) |
| 2608 layer = parent()->enclosingLayer(); | 2586 layer = parent()->enclosingLayer(); |
| 2609 if (layer) | 2587 if (layer) |
| 2610 layer->setHasVisibleContent(); | 2588 layer->setHasVisibleContent(); |
| 2611 } | 2589 } |
| 2612 | 2590 |
| 2613 if (!isFloating() && parent()->childrenInline()) | 2591 if (!isFloating() && parent()->childrenInline()) |
| 2614 parent()->dirtyLinesFromChangedChild(this); | 2592 parent()->dirtyLinesFromChangedChild(this); |
| 2615 | |
| 2616 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh
readWrapper()) | |
| 2617 containerFlowThread->addFlowChild(this); | |
| 2618 } | 2593 } |
| 2619 | 2594 |
| 2620 void RenderObject::willBeRemovedFromTree() | 2595 void RenderObject::willBeRemovedFromTree() |
| 2621 { | 2596 { |
| 2622 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal
s which would need to be fixed first. | 2597 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal
s which would need to be fixed first. |
| 2623 | 2598 |
| 2624 // If we remove a visible child from an invisible parent, we don't know the
layer visibility any more. | 2599 // If we remove a visible child from an invisible parent, we don't know the
layer visibility any more. |
| 2625 RenderLayer* layer = 0; | 2600 RenderLayer* layer = 0; |
| 2626 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { | 2601 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { |
| 2627 if ((layer = parent()->enclosingLayer())) | 2602 if ((layer = parent()->enclosingLayer())) |
| 2628 layer->dirtyVisibleContentStatus(); | 2603 layer->dirtyVisibleContentStatus(); |
| 2629 } | 2604 } |
| 2630 | 2605 |
| 2631 // Keep our layer hierarchy updated. | 2606 // Keep our layer hierarchy updated. |
| 2632 if (firstChild() || hasLayer()) { | 2607 if (firstChild() || hasLayer()) { |
| 2633 if (!layer) | 2608 if (!layer) |
| 2634 layer = parent()->enclosingLayer(); | 2609 layer = parent()->enclosingLayer(); |
| 2635 removeLayers(layer); | 2610 removeLayers(layer); |
| 2636 } | 2611 } |
| 2637 | 2612 |
| 2638 if (isOutOfFlowPositioned() && parent()->childrenInline()) | 2613 if (isOutOfFlowPositioned() && parent()->childrenInline()) |
| 2639 parent()->dirtyLinesFromChangedChild(this); | 2614 parent()->dirtyLinesFromChangedChild(this); |
| 2640 | 2615 |
| 2641 removeFromRenderFlowThread(); | 2616 removeFromRenderFlowThread(); |
| 2642 | 2617 |
| 2643 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh
readWrapper()) | |
| 2644 containerFlowThread->removeFlowChild(this); | |
| 2645 | |
| 2646 // Update cached boundaries in SVG renderers if a child is removed. | 2618 // Update cached boundaries in SVG renderers if a child is removed. |
| 2647 if (parent()->isSVG()) | 2619 if (parent()->isSVG()) |
| 2648 parent()->setNeedsBoundariesUpdate(); | 2620 parent()->setNeedsBoundariesUpdate(); |
| 2649 } | 2621 } |
| 2650 | 2622 |
| 2651 void RenderObject::removeFromRenderFlowThread() | 2623 void RenderObject::removeFromRenderFlowThread() |
| 2652 { | 2624 { |
| 2653 if (flowThreadState() == NotInsideFlowThread) | 2625 if (flowThreadState() == NotInsideFlowThread) |
| 2654 return; | 2626 return; |
| 2655 | 2627 |
| 2656 // Sometimes we remove the element from the flow, but it's not destroyed at
that time. | 2628 // Sometimes we remove the element from the flow, but it's not destroyed at
that time. |
| 2657 // It's only until later when we actually destroy it and remove all the chil
dren from it. | 2629 // It's only until later when we actually destroy it and remove all the chil
dren from it. |
| 2658 // Currently, that happens for firstLetter elements and list markers. | 2630 // Currently, that happens for firstLetter elements and list markers. |
| 2659 // Pass in the flow thread so that we don't have to look it up for all the c
hildren. | 2631 // Pass in the flow thread so that we don't have to look it up for all the c
hildren. |
| 2660 removeFromRenderFlowThreadRecursive(flowThreadContainingBlock()); | 2632 removeFromRenderFlowThreadRecursive(flowThreadContainingBlock()); |
| 2661 } | 2633 } |
| 2662 | 2634 |
| 2663 void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF
lowThread) | 2635 void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF
lowThread) |
| 2664 { | 2636 { |
| 2665 if (const RenderObjectChildList* children = virtualChildren()) { | 2637 if (const RenderObjectChildList* children = virtualChildren()) { |
| 2666 for (RenderObject* child = children->firstChild(); child; child = child-
>nextSibling()) | 2638 for (RenderObject* child = children->firstChild(); child; child = child-
>nextSibling()) |
| 2667 child->removeFromRenderFlowThreadRecursive(renderFlowThread); | 2639 child->removeFromRenderFlowThreadRecursive(renderFlowThread); |
| 2668 } | 2640 } |
| 2669 | 2641 |
| 2670 RenderFlowThread* localFlowThread = renderFlowThread; | |
| 2671 if (flowThreadState() == InsideInFlowThread) | |
| 2672 localFlowThread = flowThreadContainingBlock(); // We have to ask. We can
't just assume we are in the same flow thread. | |
| 2673 if (localFlowThread) | |
| 2674 localFlowThread->removeFlowChildInfo(this); | |
| 2675 setFlowThreadState(NotInsideFlowThread); | 2642 setFlowThreadState(NotInsideFlowThread); |
| 2676 } | 2643 } |
| 2677 | 2644 |
| 2678 void RenderObject::destroyAndCleanupAnonymousWrappers() | 2645 void RenderObject::destroyAndCleanupAnonymousWrappers() |
| 2679 { | 2646 { |
| 2680 // If the tree is destroyed, there is no need for a clean-up phase. | 2647 // If the tree is destroyed, there is no need for a clean-up phase. |
| 2681 if (documentBeingDestroyed()) { | 2648 if (documentBeingDestroyed()) { |
| 2682 destroy(); | 2649 destroy(); |
| 2683 return; | 2650 return; |
| 2684 } | 2651 } |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3126 while (!renderer->node()) | 3093 while (!renderer->node()) |
| 3127 renderer = renderer->parent(); | 3094 renderer = renderer->parent(); |
| 3128 return renderer->node()->isInert(); | 3095 return renderer->node()->isInert(); |
| 3129 } | 3096 } |
| 3130 | 3097 |
| 3131 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect) | 3098 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect) |
| 3132 { | 3099 { |
| 3133 imageChanged(static_cast<WrappedImagePtr>(image), rect); | 3100 imageChanged(static_cast<WrappedImagePtr>(image), rect); |
| 3134 } | 3101 } |
| 3135 | 3102 |
| 3136 RenderObject* RenderObject::hoverAncestor() const | |
| 3137 { | |
| 3138 // When searching for the hover ancestor and encountering a named flow threa
d, | |
| 3139 // the search will continue with the DOM ancestor of the top-most element | |
| 3140 // in the named flow thread. | |
| 3141 // See https://code.google.com/p/chromium/issues/detail?id=243278 | |
| 3142 RenderObject* hoverAncestor = parent(); | |
| 3143 | |
| 3144 // Skip anonymous blocks directly flowed into flow threads as it would | |
| 3145 // prevent us from continuing the search on the DOM tree when reaching the n
amed flow thread. | |
| 3146 if (hoverAncestor && hoverAncestor->isAnonymousBlock() && hoverAncestor->par
ent() && hoverAncestor->parent()->isRenderNamedFlowThread()) | |
| 3147 hoverAncestor = hoverAncestor->parent(); | |
| 3148 | |
| 3149 if (hoverAncestor && hoverAncestor->isRenderNamedFlowThread()) { | |
| 3150 hoverAncestor = 0; | |
| 3151 | |
| 3152 Node* node = this->node(); | |
| 3153 if (node) { | |
| 3154 Node* domAncestorNode = node->parentNode(); | |
| 3155 if (domAncestorNode) | |
| 3156 hoverAncestor = domAncestorNode->renderer(); | |
| 3157 } | |
| 3158 } | |
| 3159 | |
| 3160 return hoverAncestor; | |
| 3161 } | |
| 3162 | |
| 3163 Element* RenderObject::offsetParent() const | 3103 Element* RenderObject::offsetParent() const |
| 3164 { | 3104 { |
| 3165 if (isRoot() || isBody()) | 3105 if (isRoot() || isBody()) |
| 3166 return 0; | 3106 return 0; |
| 3167 | 3107 |
| 3168 if (isOutOfFlowPositioned() && style()->position() == FixedPosition) | 3108 if (isOutOfFlowPositioned() && style()->position() == FixedPosition) |
| 3169 return 0; | 3109 return 0; |
| 3170 | 3110 |
| 3171 // If A is an area HTML element which has a map HTML element somewhere in th
e ancestor | 3111 // If A is an area HTML element which has a map HTML element somewhere in th
e ancestor |
| 3172 // chain return the nearest ancestor map HTML element and stop this algorith
m. | 3112 // chain return the nearest ancestor map HTML element and stop this algorith
m. |
| 3173 // FIXME: Implement! | 3113 // FIXME: Implement! |
| 3174 | 3114 |
| 3175 float effectiveZoom = style()->effectiveZoom(); | 3115 float effectiveZoom = style()->effectiveZoom(); |
| 3176 Node* node = 0; | 3116 Node* node = 0; |
| 3177 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren
t()) { | 3117 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren
t()) { |
| 3178 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes | 3118 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes |
| 3179 | 3119 |
| 3180 // CSS regions specification says that region flows should return the bo
dy element as their offsetParent. | |
| 3181 if (ancestor->isRenderNamedFlowThread()) | |
| 3182 return document().body(); | |
| 3183 | |
| 3184 node = ancestor->node(); | 3120 node = ancestor->node(); |
| 3185 | 3121 |
| 3186 if (!node) | 3122 if (!node) |
| 3187 continue; | 3123 continue; |
| 3188 | 3124 |
| 3189 if (ancestor->isPositioned()) | 3125 if (ancestor->isPositioned()) |
| 3190 break; | 3126 break; |
| 3191 | 3127 |
| 3192 if (node->hasTagName(bodyTag)) | 3128 if (node->hasTagName(bodyTag)) |
| 3193 break; | 3129 break; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3331 { | 3267 { |
| 3332 ASSERT_NOT_REACHED(); | 3268 ASSERT_NOT_REACHED(); |
| 3333 return false; | 3269 return false; |
| 3334 } | 3270 } |
| 3335 | 3271 |
| 3336 bool RenderObject::isRelayoutBoundaryForInspector() const | 3272 bool RenderObject::isRelayoutBoundaryForInspector() const |
| 3337 { | 3273 { |
| 3338 return objectIsRelayoutBoundary(this); | 3274 return objectIsRelayoutBoundary(this); |
| 3339 } | 3275 } |
| 3340 | 3276 |
| 3341 bool RenderObject::isRenderNamedFlowFragmentContainer() const | |
| 3342 { | |
| 3343 return isRenderBlockFlow() && toRenderBlockFlow(this)->renderNamedFlowFragme
nt(); | |
| 3344 } | |
| 3345 | |
| 3346 } // namespace WebCore | 3277 } // namespace WebCore |
| 3347 | 3278 |
| 3348 #ifndef NDEBUG | 3279 #ifndef NDEBUG |
| 3349 | 3280 |
| 3350 void showTree(const WebCore::RenderObject* object) | 3281 void showTree(const WebCore::RenderObject* object) |
| 3351 { | 3282 { |
| 3352 if (object) | 3283 if (object) |
| 3353 object->showTreeForThis(); | 3284 object->showTreeForThis(); |
| 3354 } | 3285 } |
| 3355 | 3286 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3368 { | 3299 { |
| 3369 if (object1) { | 3300 if (object1) { |
| 3370 const WebCore::RenderObject* root = object1; | 3301 const WebCore::RenderObject* root = object1; |
| 3371 while (root->parent()) | 3302 while (root->parent()) |
| 3372 root = root->parent(); | 3303 root = root->parent(); |
| 3373 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); | 3304 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); |
| 3374 } | 3305 } |
| 3375 } | 3306 } |
| 3376 | 3307 |
| 3377 #endif | 3308 #endif |
| OLD | NEW |