OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Neither the name of Google Inc. nor the names of its | 10 * * Neither the name of Google Inc. nor the names of its |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 ? insertion_point.FirstDistributedNode() | 99 ? insertion_point.FirstDistributedNode() |
100 : insertion_point.LastDistributedNode())) | 100 : insertion_point.LastDistributedNode())) |
101 return found; | 101 return found; |
102 DCHECK(isHTMLShadowElement(insertion_point) || | 102 DCHECK(isHTMLShadowElement(insertion_point) || |
103 (isHTMLContentElement(insertion_point) && | 103 (isHTMLContentElement(insertion_point) && |
104 !insertion_point.HasChildren())); | 104 !insertion_point.HasChildren())); |
105 } | 105 } |
106 return nullptr; | 106 return nullptr; |
107 } | 107 } |
108 | 108 |
109 static HTMLSlotElement* FinalDestinationSlotFor(const Node& node) { | |
110 HTMLSlotElement* slot = node.AssignedSlot(); | |
111 if (!slot) | |
112 return nullptr; | |
113 for (HTMLSlotElement* next = slot->AssignedSlot(); next; | |
114 next = next->AssignedSlot()) { | |
115 slot = next; | |
116 } | |
117 return slot; | |
118 } | |
119 | |
120 // TODO(hayato): This may return a wrong result for a node which is not in a | 109 // TODO(hayato): This may return a wrong result for a node which is not in a |
121 // document flat tree. See FlatTreeTraversalTest's redistribution test for | 110 // document flat tree. See FlatTreeTraversalTest's redistribution test for |
122 // details. | 111 // details. |
123 Node* FlatTreeTraversal::TraverseSiblings(const Node& node, | 112 Node* FlatTreeTraversal::TraverseSiblings(const Node& node, |
124 TraversalDirection direction) { | 113 TraversalDirection direction) { |
125 if (node.IsChildOfV1ShadowHost()) | 114 if (node.IsChildOfV1ShadowHost()) |
126 return TraverseSiblingsForV1HostChild(node, direction); | 115 return TraverseSiblingsForV1HostChild(node, direction); |
127 | 116 |
128 if (ShadowWhereNodeCanBeDistributedForV0(node)) | 117 if (ShadowWhereNodeCanBeDistributedForV0(node)) |
129 return TraverseSiblingsForV0Distribution(node, direction); | 118 return TraverseSiblingsForV0Distribution(node, direction); |
(...skipping 25 matching lines...) Expand all Loading... |
155 DCHECK(assigned_insertion_point); | 144 DCHECK(assigned_insertion_point); |
156 return TraverseSiblings(*assigned_insertion_point, direction); | 145 return TraverseSiblings(*assigned_insertion_point, direction); |
157 } | 146 } |
158 } | 147 } |
159 return nullptr; | 148 return nullptr; |
160 } | 149 } |
161 | 150 |
162 Node* FlatTreeTraversal::TraverseSiblingsForV1HostChild( | 151 Node* FlatTreeTraversal::TraverseSiblingsForV1HostChild( |
163 const Node& node, | 152 const Node& node, |
164 TraversalDirection direction) { | 153 TraversalDirection direction) { |
165 HTMLSlotElement* slot = FinalDestinationSlotFor(node); | 154 HTMLSlotElement* slot = node.FinalDestinationSlot(); |
166 if (!slot) | 155 if (!slot) |
167 return nullptr; | 156 return nullptr; |
168 if (Node* sibling_in_distributed_nodes = | 157 if (Node* sibling_in_distributed_nodes = |
169 (direction == kTraversalDirectionForward | 158 (direction == kTraversalDirectionForward |
170 ? slot->DistributedNodeNextTo(node) | 159 ? slot->DistributedNodeNextTo(node) |
171 : slot->DistributedNodePreviousTo(node))) | 160 : slot->DistributedNodePreviousTo(node))) |
172 return sibling_in_distributed_nodes; | 161 return sibling_in_distributed_nodes; |
173 return TraverseSiblings(*slot, direction); | 162 return TraverseSiblings(*slot, direction); |
174 } | 163 } |
175 | 164 |
(...skipping 12 matching lines...) Expand all Loading... |
188 | 177 |
189 ContainerNode* FlatTreeTraversal::TraverseParent( | 178 ContainerNode* FlatTreeTraversal::TraverseParent( |
190 const Node& node, | 179 const Node& node, |
191 ParentTraversalDetails* details) { | 180 ParentTraversalDetails* details) { |
192 // TODO(hayato): Stop this hack for a pseudo element because a pseudo element | 181 // TODO(hayato): Stop this hack for a pseudo element because a pseudo element |
193 // is not a child of its parentOrShadowHostNode() in a flat tree. | 182 // is not a child of its parentOrShadowHostNode() in a flat tree. |
194 if (node.IsPseudoElement()) | 183 if (node.IsPseudoElement()) |
195 return node.ParentOrShadowHostNode(); | 184 return node.ParentOrShadowHostNode(); |
196 | 185 |
197 if (node.IsChildOfV1ShadowHost()) { | 186 if (node.IsChildOfV1ShadowHost()) { |
198 HTMLSlotElement* slot = FinalDestinationSlotFor(node); | 187 HTMLSlotElement* slot = node.FinalDestinationSlot(); |
199 if (!slot) | 188 if (!slot) |
200 return nullptr; | 189 return nullptr; |
201 return TraverseParent(*slot); | 190 return TraverseParent(*slot); |
202 } | 191 } |
203 | 192 |
204 Element* parent = node.parentElement(); | 193 Element* parent = node.parentElement(); |
205 if (parent && isHTMLSlotElement(parent)) { | 194 if (parent && isHTMLSlotElement(parent)) { |
206 HTMLSlotElement& slot = toHTMLSlotElement(*parent); | 195 HTMLSlotElement& slot = toHTMLSlotElement(*parent); |
207 if (slot.SupportsDistribution()) { | 196 if (slot.SupportsDistribution()) { |
208 if (!slot.AssignedNodes().IsEmpty()) | 197 if (!slot.AssignedNodes().IsEmpty()) |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 | 383 |
395 Node& FlatTreeTraversal::LastWithinOrSelf(const Node& node) { | 384 Node& FlatTreeTraversal::LastWithinOrSelf(const Node& node) { |
396 AssertPrecondition(node); | 385 AssertPrecondition(node); |
397 Node* last_descendant = LastWithin(node); | 386 Node* last_descendant = LastWithin(node); |
398 Node& result = last_descendant ? *last_descendant : const_cast<Node&>(node); | 387 Node& result = last_descendant ? *last_descendant : const_cast<Node&>(node); |
399 AssertPostcondition(&result); | 388 AssertPostcondition(&result); |
400 return result; | 389 return result; |
401 } | 390 } |
402 | 391 |
403 } // namespace blink | 392 } // namespace blink |
OLD | NEW |