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) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights
reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights
reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 void ContainerNode::cloneChildNodes(ContainerNode *clone) | 860 void ContainerNode::cloneChildNodes(ContainerNode *clone) |
861 { | 861 { |
862 TrackExceptionState exceptionState; | 862 TrackExceptionState exceptionState; |
863 for (Node* n = firstChild(); n && !exceptionState.hadException(); n = n->nex
tSibling()) | 863 for (Node* n = firstChild(); n && !exceptionState.hadException(); n = n->nex
tSibling()) |
864 clone->appendChild(n->cloneNode(true), exceptionState); | 864 clone->appendChild(n->cloneNode(true), exceptionState); |
865 } | 865 } |
866 | 866 |
867 | 867 |
868 bool ContainerNode::getUpperLeftCorner(FloatPoint& point) const | 868 bool ContainerNode::getUpperLeftCorner(FloatPoint& point) const |
869 { | 869 { |
870 if (!renderer()) | 870 if (!layoutObject()) |
871 return false; | 871 return false; |
872 | 872 |
873 // FIXME: What is this code really trying to do? | 873 // FIXME: What is this code really trying to do? |
874 LayoutObject* o = renderer(); | 874 LayoutObject* o = layoutObject(); |
875 if (!o->isInline() || o->isReplaced()) { | 875 if (!o->isInline() || o->isReplaced()) { |
876 point = o->localToAbsolute(FloatPoint(), UseTransforms); | 876 point = o->localToAbsolute(FloatPoint(), UseTransforms); |
877 return true; | 877 return true; |
878 } | 878 } |
879 | 879 |
880 // Find the next text/image child, to get a position. | 880 // Find the next text/image child, to get a position. |
881 while (o) { | 881 while (o) { |
882 LayoutObject* p = o; | 882 LayoutObject* p = o; |
883 if (LayoutObject* oFirstChild = o->slowFirstChild()) { | 883 if (LayoutObject* oFirstChild = o->slowFirstChild()) { |
884 o = oFirstChild; | 884 o = oFirstChild; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 cur = toLayoutInline(cur)->continuation(); | 940 cur = toLayoutInline(cur)->continuation(); |
941 else | 941 else |
942 cur = toLayoutBlock(cur)->continuation(); | 942 cur = toLayoutBlock(cur)->continuation(); |
943 } | 943 } |
944 | 944 |
945 return prev; | 945 return prev; |
946 } | 946 } |
947 | 947 |
948 bool ContainerNode::getLowerRightCorner(FloatPoint& point) const | 948 bool ContainerNode::getLowerRightCorner(FloatPoint& point) const |
949 { | 949 { |
950 if (!renderer()) | 950 if (!layoutObject()) |
951 return false; | 951 return false; |
952 | 952 |
953 LayoutObject* o = renderer(); | 953 LayoutObject* o = layoutObject(); |
954 if (!o->isInline() || o->isReplaced()) { | 954 if (!o->isInline() || o->isReplaced()) { |
955 LayoutBox* box = toLayoutBox(o); | 955 LayoutBox* box = toLayoutBox(o); |
956 point = o->localToAbsolute(FloatPoint(box->size()), UseTransforms); | 956 point = o->localToAbsolute(FloatPoint(box->size()), UseTransforms); |
957 return true; | 957 return true; |
958 } | 958 } |
959 | 959 |
960 LayoutObject* startContinuation = nullptr; | 960 LayoutObject* startContinuation = nullptr; |
961 // Find the last text/image child, to get a position. | 961 // Find the last text/image child, to get a position. |
962 while (o) { | 962 while (o) { |
963 if (LayoutObject* oLastChild = o->slowLastChild()) { | 963 if (LayoutObject* oLastChild = o->slowLastChild()) { |
964 o = oLastChild; | 964 o = oLastChild; |
965 } else if (o != renderer() && o->previousSibling()) { | 965 } else if (o != layoutObject() && o->previousSibling()) { |
966 o = o->previousSibling(); | 966 o = o->previousSibling(); |
967 } else { | 967 } else { |
968 LayoutObject* prev = nullptr; | 968 LayoutObject* prev = nullptr; |
969 while (!prev) { | 969 while (!prev) { |
970 // Check if the current renderer has contiunation and move the l
ocation for finding the renderer | 970 // Check if the current renderer has contiunation and move the l
ocation for finding the renderer |
971 // to the end of continuations if there is the continuation. | 971 // to the end of continuations if there is the continuation. |
972 // Skip to check the contiunation on contiunations section | 972 // Skip to check the contiunation on contiunations section |
973 if (startContinuation == o) { | 973 if (startContinuation == o) { |
974 startContinuation = nullptr; | 974 startContinuation = nullptr; |
975 } else if (!startContinuation) { | 975 } else if (!startContinuation) { |
976 if (LayoutObject* continuation = endOfContinuations(o)) { | 976 if (LayoutObject* continuation = endOfContinuations(o)) { |
977 startContinuation = o; | 977 startContinuation = o; |
978 prev = continuation; | 978 prev = continuation; |
979 break; | 979 break; |
980 } | 980 } |
981 } | 981 } |
982 // Prevent to overrun out of own render tree | 982 // Prevent to overrun out of own render tree |
983 if (o == renderer()) { | 983 if (o == layoutObject()) { |
984 return false; | 984 return false; |
985 } | 985 } |
986 o = o->parent(); | 986 o = o->parent(); |
987 if (!o) | 987 if (!o) |
988 return false; | 988 return false; |
989 prev = o->previousSibling(); | 989 prev = o->previousSibling(); |
990 } | 990 } |
991 o = prev; | 991 o = prev; |
992 } | 992 } |
993 ASSERT(o); | 993 ASSERT(o); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 | 1031 |
1032 return enclosingLayoutRect(FloatRect(upperLeft, lowerRight.expandedTo(upperL
eft) - upperLeft)); | 1032 return enclosingLayoutRect(FloatRect(upperLeft, lowerRight.expandedTo(upperL
eft) - upperLeft)); |
1033 } | 1033 } |
1034 | 1034 |
1035 // This is used by FrameSelection to denote when the active-state of the page ha
s changed | 1035 // This is used by FrameSelection to denote when the active-state of the page ha
s changed |
1036 // independent of the focused element changing. | 1036 // independent of the focused element changing. |
1037 void ContainerNode::focusStateChanged() | 1037 void ContainerNode::focusStateChanged() |
1038 { | 1038 { |
1039 // If we're just changing the window's active state and the focused node has
no | 1039 // If we're just changing the window's active state and the focused node has
no |
1040 // renderer we can just ignore the state change. | 1040 // renderer we can just ignore the state change. |
1041 if (!renderer()) | 1041 if (!layoutObject()) |
1042 return; | 1042 return; |
1043 | 1043 |
1044 if (styleChangeType() < SubtreeStyleChange) { | 1044 if (styleChangeType() < SubtreeStyleChange) { |
1045 if (layoutStyle()->affectedByFocus() && layoutStyle()->hasPseudoStyle(FI
RST_LETTER)) | 1045 if (layoutStyle()->affectedByFocus() && layoutStyle()->hasPseudoStyle(FI
RST_LETTER)) |
1046 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing:
:createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus
)); | 1046 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing:
:createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus
)); |
1047 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedB
yFocus()) | 1047 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedB
yFocus()) |
1048 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); | 1048 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); |
1049 else if (layoutStyle()->affectedByFocus()) | 1049 else if (layoutStyle()->affectedByFocus()) |
1050 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus))
; | 1050 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus))
; |
1051 } | 1051 } |
1052 | 1052 |
1053 if (renderer() && renderer()->style()->hasAppearance()) | 1053 if (layoutObject() && layoutObject()->style()->hasAppearance()) |
1054 LayoutTheme::theme().stateChanged(renderer(), FocusControlState); | 1054 LayoutTheme::theme().stateChanged(layoutObject(), FocusControlState); |
1055 } | 1055 } |
1056 | 1056 |
1057 void ContainerNode::setFocus(bool received) | 1057 void ContainerNode::setFocus(bool received) |
1058 { | 1058 { |
1059 if (focused() == received) | 1059 if (focused() == received) |
1060 return; | 1060 return; |
1061 | 1061 |
1062 Node::setFocus(received); | 1062 Node::setFocus(received); |
1063 | 1063 |
1064 focusStateChanged(); | 1064 focusStateChanged(); |
1065 | 1065 |
1066 if (renderer() || received) | 1066 if (layoutObject() || received) |
1067 return; | 1067 return; |
1068 | 1068 |
1069 // If :focus sets display: none, we lose focus but still need to recalc our
style. | 1069 // If :focus sets display: none, we lose focus but still need to recalc our
style. |
1070 if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByFocus()
&& styleChangeType() < SubtreeStyleChange) | 1070 if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByFocus()
&& styleChangeType() < SubtreeStyleChange) |
1071 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleS
tyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); | 1071 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleS
tyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); |
1072 else | 1072 else |
1073 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::creat
eWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus)); | 1073 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::creat
eWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Focus)); |
1074 } | 1074 } |
1075 | 1075 |
1076 void ContainerNode::setActive(bool down) | 1076 void ContainerNode::setActive(bool down) |
1077 { | 1077 { |
1078 if (down == active()) | 1078 if (down == active()) |
1079 return; | 1079 return; |
1080 | 1080 |
1081 Node::setActive(down); | 1081 Node::setActive(down); |
1082 | 1082 |
1083 // FIXME: Why does this not need to handle the display: none transition like
:hover does? | 1083 // FIXME: Why does this not need to handle the display: none transition like
:hover does? |
1084 if (renderer()) { | 1084 if (layoutObject()) { |
1085 if (styleChangeType() < SubtreeStyleChange) { | 1085 if (styleChangeType() < SubtreeStyleChange) { |
1086 if (layoutStyle()->affectedByActive() && layoutStyle()->hasPseudoSty
le(FIRST_LETTER)) | 1086 if (layoutStyle()->affectedByActive() && layoutStyle()->hasPseudoSty
le(FIRST_LETTER)) |
1087 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTrac
ing::createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::A
ctive)); | 1087 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTrac
ing::createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::A
ctive)); |
1088 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffec
tedByActive()) | 1088 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffec
tedByActive()) |
1089 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().s
cheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(th
is)); | 1089 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().s
cheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(th
is)); |
1090 else if (layoutStyle()->affectedByActive()) | 1090 else if (layoutStyle()->affectedByActive()) |
1091 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracin
g::createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Act
ive)); | 1091 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracin
g::createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Act
ive)); |
1092 } | 1092 } |
1093 | 1093 |
1094 if (layoutStyle()->hasAppearance()) | 1094 if (layoutStyle()->hasAppearance()) |
1095 LayoutTheme::theme().stateChanged(renderer(), PressedControlState); | 1095 LayoutTheme::theme().stateChanged(layoutObject(), PressedControlStat
e); |
1096 } | 1096 } |
1097 } | 1097 } |
1098 | 1098 |
1099 void ContainerNode::setHovered(bool over) | 1099 void ContainerNode::setHovered(bool over) |
1100 { | 1100 { |
1101 if (over == hovered()) | 1101 if (over == hovered()) |
1102 return; | 1102 return; |
1103 | 1103 |
1104 Node::setHovered(over); | 1104 Node::setHovered(over); |
1105 | 1105 |
1106 // If :hover sets display: none we lose our hover but still need to recalc o
ur style. | 1106 // If :hover sets display: none we lose our hover but still need to recalc o
ur style. |
1107 if (!renderer()) { | 1107 if (!layoutObject()) { |
1108 if (over) | 1108 if (over) |
1109 return; | 1109 return; |
1110 if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByHove
r() && styleChangeType() < SubtreeStyleChange) | 1110 if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByHove
r() && styleChangeType() < SubtreeStyleChange) |
1111 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); | 1111 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); |
1112 else | 1112 else |
1113 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover))
; | 1113 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover))
; |
1114 return; | 1114 return; |
1115 } | 1115 } |
1116 | 1116 |
1117 if (styleChangeType() < SubtreeStyleChange) { | 1117 if (styleChangeType() < SubtreeStyleChange) { |
1118 if (layoutStyle()->affectedByHover() && layoutStyle()->hasPseudoStyle(FI
RST_LETTER)) | 1118 if (layoutStyle()->affectedByHover() && layoutStyle()->hasPseudoStyle(FI
RST_LETTER)) |
1119 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing:
:createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover
)); | 1119 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing:
:createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover
)); |
1120 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedB
yHover()) | 1120 else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedB
yHover()) |
1121 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); | 1121 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched
uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); |
1122 else if (layoutStyle()->affectedByHover()) | 1122 else if (layoutStyle()->affectedByHover()) |
1123 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover))
; | 1123 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::c
reateWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Hover))
; |
1124 } | 1124 } |
1125 | 1125 |
1126 if (renderer()->style()->hasAppearance()) | 1126 if (layoutObject()->style()->hasAppearance()) |
1127 LayoutTheme::theme().stateChanged(renderer(), HoverControlState); | 1127 LayoutTheme::theme().stateChanged(layoutObject(), HoverControlState); |
1128 } | 1128 } |
1129 | 1129 |
1130 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::children() | 1130 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::children() |
1131 { | 1131 { |
1132 return ensureCachedCollection<HTMLCollection>(NodeChildren); | 1132 return ensureCachedCollection<HTMLCollection>(NodeChildren); |
1133 } | 1133 } |
1134 | 1134 |
1135 unsigned ContainerNode::countChildren() const | 1135 unsigned ContainerNode::countChildren() const |
1136 { | 1136 { |
1137 unsigned count = 0; | 1137 unsigned count = 0; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1264 for (Node* child = lastChild(); child; child = child->previousSibling()) { | 1264 for (Node* child = lastChild(); child; child = child->previousSibling()) { |
1265 if (child->isTextNode()) { | 1265 if (child->isTextNode()) { |
1266 toText(child)->recalcTextStyle(change, lastTextNode); | 1266 toText(child)->recalcTextStyle(change, lastTextNode); |
1267 lastTextNode = toText(child); | 1267 lastTextNode = toText(child); |
1268 } else if (child->isElementNode()) { | 1268 } else if (child->isElementNode()) { |
1269 Element* element = toElement(child); | 1269 Element* element = toElement(child); |
1270 if (element->shouldCallRecalcStyle(change)) | 1270 if (element->shouldCallRecalcStyle(change)) |
1271 element->recalcStyle(change, lastTextNode); | 1271 element->recalcStyle(change, lastTextNode); |
1272 else if (element->supportsStyleSharing()) | 1272 else if (element->supportsStyleSharing()) |
1273 styleResolver.addToStyleSharingList(*element); | 1273 styleResolver.addToStyleSharingList(*element); |
1274 if (element->renderer()) | 1274 if (element->layoutObject()) |
1275 lastTextNode = nullptr; | 1275 lastTextNode = nullptr; |
1276 } | 1276 } |
1277 } | 1277 } |
1278 } | 1278 } |
1279 | 1279 |
1280 void ContainerNode::checkForChildrenAdjacentRuleChanges() | 1280 void ContainerNode::checkForChildrenAdjacentRuleChanges() |
1281 { | 1281 { |
1282 bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules(); | 1282 bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules(); |
1283 bool hasIndirectAdjacentRules = childrenAffectedByIndirectAdjacentRules(); | 1283 bool hasIndirectAdjacentRules = childrenAffectedByIndirectAdjacentRules(); |
1284 | 1284 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 return true; | 1478 return true; |
1479 | 1479 |
1480 if (node->isElementNode() && toElement(node)->shadow()) | 1480 if (node->isElementNode() && toElement(node)->shadow()) |
1481 return true; | 1481 return true; |
1482 | 1482 |
1483 return false; | 1483 return false; |
1484 } | 1484 } |
1485 #endif | 1485 #endif |
1486 | 1486 |
1487 } // namespace blink | 1487 } // namespace blink |
OLD | NEW |