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

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

Issue 2414683002: Make offsetTop/Left handle a relative positioned inline offsetParent correctly. (Closed)
Patch Set: Fixed broken rebase. Created 4 years, 1 month 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) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2010 Google Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 // compositing inputs. 972 // compositing inputs.
973 if (!scrollableArea->stickyConstraintsMap().contains(layer())) 973 if (!scrollableArea->stickyConstraintsMap().contains(layer()))
974 return LayoutSize(); 974 return LayoutSize();
975 return LayoutSize( 975 return LayoutSize(
976 scrollableArea->stickyConstraintsMap().get(layer()).computeStickyOffset( 976 scrollableArea->stickyConstraintsMap().get(layer()).computeStickyOffset(
977 constrainingRect)); 977 constrainingRect));
978 } 978 }
979 979
980 LayoutPoint LayoutBoxModelObject::adjustedPositionRelativeTo( 980 LayoutPoint LayoutBoxModelObject::adjustedPositionRelativeTo(
981 const LayoutPoint& startPoint, 981 const LayoutPoint& startPoint,
982 const Element* element) const { 982 const Element* offsetParent) const {
983 // If the element is the HTML body element or doesn't have a parent 983 // If the element is the HTML body element or doesn't have a parent
984 // return 0 and stop this algorithm. 984 // return 0 and stop this algorithm.
985 if (isBody() || !parent()) 985 if (isBody() || !parent())
986 return LayoutPoint(); 986 return LayoutPoint();
987 987
988 LayoutPoint referencePoint = startPoint; 988 LayoutPoint referencePoint = startPoint;
989 989
990 // If the base element is null, return the distance between the canvas origin 990 // If the offsetParent is null, return the distance between the canvas origin
991 // and the left border edge of the element and stop this algorithm. 991 // and the left/top border edge of the element and stop this algorithm.
992 if (!element) 992 if (!offsetParent)
993 return referencePoint; 993 return referencePoint;
994 994
995 if (const LayoutBoxModelObject* offsetParent = 995 if (const LayoutBoxModelObject* offsetParentObject =
996 element->layoutBoxModelObject()) { 996 offsetParent->layoutBoxModelObject()) {
997 if (!isOutOfFlowPositioned()) { 997 if (!isOutOfFlowPositioned()) {
998 if (isInFlowPositioned()) 998 if (isInFlowPositioned())
999 referencePoint.move(offsetForInFlowPosition()); 999 referencePoint.move(offsetForInFlowPosition());
1000 1000
1001 // Note that we may fail to find |offsetParent| while walking the 1001 // Note that we may fail to find |offsetParent| while walking the
1002 // container chain, if |offsetParent| is an inline split into 1002 // container chain, if |offsetParent| is an inline split into
1003 // continuations: <body style="display:inline;" id="offsetParent"> 1003 // continuations: <body style="display:inline;" id="offsetParent">
1004 // <div id="this"> 1004 // <div id="this">
1005 // This is why we have to do a nullptr check here. 1005 // This is why we have to do a nullptr check here.
1006 // offset(Left|Top) is generally broken when offsetParent is inline.
1007 for (const LayoutObject* current = container(); 1006 for (const LayoutObject* current = container();
1008 current && current->node() != element; 1007 current && current->node() != offsetParent;
1009 current = current->container()) { 1008 current = current->container()) {
1010 // FIXME: What are we supposed to do inside SVG content? 1009 // FIXME: What are we supposed to do inside SVG content?
1011 referencePoint.move(current->columnOffset(referencePoint)); 1010 referencePoint.move(current->columnOffset(referencePoint));
1012 if (current->isBox() && !current->isTableRow()) 1011 if (current->isBox() && !current->isTableRow())
1013 referencePoint.moveBy(toLayoutBox(current)->topLeftLocation()); 1012 referencePoint.moveBy(toLayoutBox(current)->topLeftLocation());
1014 } 1013 }
1015 1014
1016 if (offsetParent->isBox() && offsetParent->isBody() && 1015 if (offsetParentObject->isBox() && offsetParentObject->isBody() &&
1017 !offsetParent->isPositioned()) 1016 !offsetParentObject->isPositioned()) {
1018 referencePoint.moveBy(toLayoutBox(offsetParent)->topLeftLocation()); 1017 referencePoint.moveBy(
1018 toLayoutBox(offsetParentObject)->topLeftLocation());
1019 }
1019 } 1020 }
1020 if (offsetParent->isBox() && !offsetParent->isBody()) 1021
1021 referencePoint.move(-toLayoutBox(offsetParent)->borderLeft(), 1022 if (offsetParentObject->isLayoutInline()) {
1022 -toLayoutBox(offsetParent)->borderTop()); 1023 const LayoutInline* inlineParent = toLayoutInline(offsetParentObject);
1024
1025 if (isBox() && style()->position() == AbsolutePosition &&
1026 inlineParent->isInFlowPositioned()) {
1027 // Offset for absolute elements with inline parent is a special
1028 // case in the CSS spec
1029 referencePoint +=
1030 inlineParent->offsetForInFlowPositionedInline(*toLayoutBox(this));
1031 }
1032
1033 referencePoint -= inlineParent->firstLineBoxTopLeft();
1034 }
1035
1036 if (offsetParentObject->isBox() && !offsetParentObject->isBody()) {
1037 referencePoint.move(-toLayoutBox(offsetParentObject)->borderLeft(),
1038 -toLayoutBox(offsetParentObject)->borderTop());
1039 }
1023 } 1040 }
1024 1041
1025 return referencePoint; 1042 return referencePoint;
1026 } 1043 }
1027 1044
1028 LayoutSize LayoutBoxModelObject::offsetForInFlowPosition() const { 1045 LayoutSize LayoutBoxModelObject::offsetForInFlowPosition() const {
1029 if (isRelPositioned()) 1046 if (isRelPositioned())
1030 return relativePositionOffset(); 1047 return relativePositionOffset();
1031 1048
1032 if (isStickyPositioned()) 1049 if (isStickyPositioned())
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 if (rootElementStyle->hasBackground()) 1393 if (rootElementStyle->hasBackground())
1377 return false; 1394 return false;
1378 1395
1379 if (node() != document().firstBodyElement()) 1396 if (node() != document().firstBodyElement())
1380 return false; 1397 return false;
1381 1398
1382 return true; 1399 return true;
1383 } 1400 }
1384 1401
1385 } // namespace blink 1402 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698