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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutObject.cpp

Issue 1934833002: Ensure filter and reflection outsets are applied on paint invalidation rect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
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 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 o->m_bitfields.setPreferredLogicalWidthsDirty(true); 846 o->m_bitfields.setPreferredLogicalWidthsDirty(true);
847 if (o->style()->hasOutOfFlowPosition()) { 847 if (o->style()->hasOutOfFlowPosition()) {
848 // A positioned object has no effect on the min/max width of its con taining block ever. 848 // A positioned object has no effect on the min/max width of its con taining block ever.
849 // We can optimize this case and not go up any further. 849 // We can optimize this case and not go up any further.
850 break; 850 break;
851 } 851 }
852 o = container; 852 o = container;
853 } 853 }
854 } 854 }
855 855
856 LayoutObject* LayoutObject::containerForAbsolutePosition(const LayoutBoxModelObj ect* ancestor, bool* ancestorSkipped) const 856 bool LayoutObject::hasFilterOrReflection() const
857 { 857 {
858 return (!RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && hasReflecti on())
859 || (hasLayer() && toLayoutBoxModelObject(this)->layer()->hasFilterInduci ngProperty());
860 }
861
862 LayoutObject* LayoutObject::containerForAbsolutePosition(const LayoutBoxModelObj ect* ancestor, bool* ancestorSkipped, bool* filterOrReflectionSkipped) const
863 {
864 ASSERT(!ancestorSkipped || !*ancestorSkipped);
865 ASSERT(!filterOrReflectionSkipped || !*filterOrReflectionSkipped);
866
858 // We technically just want our containing block, but 867 // We technically just want our containing block, but
859 // we may not have one if we're part of an uninstalled 868 // we may not have one if we're part of an uninstalled
860 // subtree. We'll climb as high as we can though. 869 // subtree. We'll climb as high as we can though.
861 for (LayoutObject* object = parent(); object; object = object->parent()) { 870 for (LayoutObject* object = parent(); object; object = object->parent()) {
862 if (object->canContainAbsolutePositionObjects()) 871 if (object->canContainAbsolutePositionObjects())
863 return object; 872 return object;
864 873
865 if (ancestorSkipped && object == ancestor) 874 if (ancestorSkipped && object == ancestor)
866 *ancestorSkipped = true; 875 *ancestorSkipped = true;
876
877 if (filterOrReflectionSkipped && object->hasFilterOrReflection())
878 *filterOrReflectionSkipped = true;
867 } 879 }
868 return nullptr; 880 return nullptr;
869 } 881 }
870 882
871 LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* ancestor, bool* ancestorSkipped) const 883 LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* ancestor, bool* ancestorSkipped, bool* filterOrReflectionSkipped) const
872 { 884 {
873 ASSERT(!ancestorSkipped || !*ancestorSkipped); 885 ASSERT(!ancestorSkipped || !*ancestorSkipped);
886 ASSERT(!filterOrReflectionSkipped || !*filterOrReflectionSkipped);
874 ASSERT(!isText()); 887 ASSERT(!isText());
875 888
876 LayoutObject* object = parent(); 889 LayoutObject* object = parent();
877 for (; object && !object->canContainFixedPositionObjects(); object = object- >parent()) { 890 for (; object && !object->canContainFixedPositionObjects(); object = object- >parent()) {
878 if (ancestorSkipped && object == ancestor) 891 if (ancestorSkipped && object == ancestor)
879 *ancestorSkipped = true; 892 *ancestorSkipped = true;
893
894 if (filterOrReflectionSkipped && object->hasFilterOrReflection())
895 *filterOrReflectionSkipped = true;
880 } 896 }
881 897
882 ASSERT(!object || !object->isAnonymousBlock()); 898 ASSERT(!object || !object->isAnonymousBlock());
883 return toLayoutBlock(object); 899 return toLayoutBlock(object);
884 } 900 }
885 901
886 LayoutBlock* LayoutObject::containingBlockForAbsolutePosition() const 902 LayoutBlock* LayoutObject::containingBlockForAbsolutePosition() const
887 { 903 {
888 LayoutObject* o = containerForAbsolutePosition(); 904 LayoutObject* o = containerForAbsolutePosition();
889 905
(...skipping 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after
2556 2572
2557 if (layoutObject->document().settings() && layoutObject->document().settings ()->shouldRespectImageOrientation()) 2573 if (layoutObject->document().settings() && layoutObject->document().settings ()->shouldRespectImageOrientation())
2558 return RespectImageOrientation; 2574 return RespectImageOrientation;
2559 2575
2560 if (layoutObject->style() && layoutObject->style()->respectImageOrientation( ) == RespectImageOrientation) 2576 if (layoutObject->style() && layoutObject->style()->respectImageOrientation( ) == RespectImageOrientation)
2561 return RespectImageOrientation; 2577 return RespectImageOrientation;
2562 2578
2563 return DoNotRespectImageOrientation; 2579 return DoNotRespectImageOrientation;
2564 } 2580 }
2565 2581
2566 LayoutObject* LayoutObject::container(const LayoutBoxModelObject* ancestor, bool * ancestorSkipped) const 2582 LayoutObject* LayoutObject::container(const LayoutBoxModelObject* ancestor, bool * ancestorSkipped, bool* filterOrReflectionSkipped) const
2567 { 2583 {
2568 if (ancestorSkipped) 2584 if (ancestorSkipped)
2569 *ancestorSkipped = false; 2585 *ancestorSkipped = false;
2586 if (filterOrReflectionSkipped)
2587 *filterOrReflectionSkipped = false;
2570 2588
2571 LayoutObject* o = parent(); 2589 LayoutObject* o = parent();
2572 2590
2573 if (isTextOrSVGChild()) 2591 if (isTextOrSVGChild())
2574 return o; 2592 return o;
2575 2593
2576 EPosition pos = m_style->position(); 2594 EPosition pos = m_style->position();
2577 if (pos == FixedPosition) 2595 if (pos == FixedPosition)
2578 return containerForFixedPosition(ancestor, ancestorSkipped); 2596 return containerForFixedPosition(ancestor, ancestorSkipped, filterOrRefl ectionSkipped);
2579 2597
2580 if (pos == AbsolutePosition) 2598 if (pos == AbsolutePosition)
2581 return containerForAbsolutePosition(ancestor, ancestorSkipped); 2599 return containerForAbsolutePosition(ancestor, ancestorSkipped, filterOrR eflectionSkipped);
2582 2600
2583 if (isColumnSpanAll()) { 2601 if (isColumnSpanAll()) {
2584 LayoutObject* multicolContainer = spannerPlaceholder()->container(); 2602 LayoutObject* multicolContainer = spannerPlaceholder()->container();
2585 if (ancestorSkipped && ancestor) { 2603 if ((ancestorSkipped && ancestor) || filterOrReflectionSkipped) {
2586 // We jumped directly from the spanner to the multicol container. Ne ed to check if 2604 // We jumped directly from the spanner to the multicol container. Ne ed to check if
2587 // we skipped |paintInvalidationContainer| on the way. 2605 // we skipped |ancestor| or filter/reflection on the way.
2588 for (LayoutObject* walker = parent(); walker && walker != multicolCo ntainer; walker = walker->parent()) { 2606 for (LayoutObject* walker = parent(); walker && walker != multicolCo ntainer; walker = walker->parent()) {
2589 if (walker == ancestor) { 2607 if (ancestorSkipped && walker == ancestor)
2590 *ancestorSkipped = true; 2608 *ancestorSkipped = true;
2591 break; 2609 if (filterOrReflectionSkipped && walker->hasFilterOrReflection() )
2592 } 2610 *filterOrReflectionSkipped = true;
2593 } 2611 }
2594 } 2612 }
2595 return multicolContainer; 2613 return multicolContainer;
2596 } 2614 }
2597 2615
2598 return o; 2616 return o;
2599 } 2617 }
2600 2618
2601 LayoutObject* LayoutObject::parentCrossingFrameBoundaries() const 2619 LayoutObject* LayoutObject::parentCrossingFrameBoundaries() const
2602 { 2620 {
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after
3687 const blink::LayoutObject* root = object1; 3705 const blink::LayoutObject* root = object1;
3688 while (root->parent()) 3706 while (root->parent())
3689 root = root->parent(); 3707 root = root->parent();
3690 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3708 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3691 } else { 3709 } else {
3692 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); 3710 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n");
3693 } 3711 }
3694 } 3712 }
3695 3713
3696 #endif 3714 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698