OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 // Exclude nodes in SVG <use>'s shadow tree from event path. | 112 // Exclude nodes in SVG <use>'s shadow tree from event path. |
113 // See crbug.com/630870 | 113 // See crbug.com/630870 |
114 while (current->isSVGElement()) { | 114 while (current->isSVGElement()) { |
115 SVGUseElement* correspondingUseElement = | 115 SVGUseElement* correspondingUseElement = |
116 toSVGElement(current)->correspondingUseElement(); | 116 toSVGElement(current)->correspondingUseElement(); |
117 if (!correspondingUseElement) | 117 if (!correspondingUseElement) |
118 break; | 118 break; |
119 current = correspondingUseElement; | 119 current = correspondingUseElement; |
120 } | 120 } |
121 | 121 |
122 nodesInPath.append(current); | 122 nodesInPath.push_back(current); |
123 while (current) { | 123 while (current) { |
124 if (m_event && current->keepEventInNode(m_event)) | 124 if (m_event && current->keepEventInNode(m_event)) |
125 break; | 125 break; |
126 HeapVector<Member<InsertionPoint>, 8> insertionPoints; | 126 HeapVector<Member<InsertionPoint>, 8> insertionPoints; |
127 collectDestinationInsertionPoints(*current, insertionPoints); | 127 collectDestinationInsertionPoints(*current, insertionPoints); |
128 if (!insertionPoints.isEmpty()) { | 128 if (!insertionPoints.isEmpty()) { |
129 for (const auto& insertionPoint : insertionPoints) { | 129 for (const auto& insertionPoint : insertionPoints) { |
130 if (insertionPoint->isShadowInsertionPoint()) { | 130 if (insertionPoint->isShadowInsertionPoint()) { |
131 ShadowRoot* containingShadowRoot = | 131 ShadowRoot* containingShadowRoot = |
132 insertionPoint->containingShadowRoot(); | 132 insertionPoint->containingShadowRoot(); |
133 DCHECK(containingShadowRoot); | 133 DCHECK(containingShadowRoot); |
134 if (!containingShadowRoot->isOldest()) | 134 if (!containingShadowRoot->isOldest()) |
135 nodesInPath.append(containingShadowRoot->olderShadowRoot()); | 135 nodesInPath.push_back(containingShadowRoot->olderShadowRoot()); |
136 } | 136 } |
137 nodesInPath.append(insertionPoint); | 137 nodesInPath.push_back(insertionPoint); |
138 } | 138 } |
139 current = insertionPoints.back(); | 139 current = insertionPoints.back(); |
140 continue; | 140 continue; |
141 } | 141 } |
142 if (current->isChildOfV1ShadowHost()) { | 142 if (current->isChildOfV1ShadowHost()) { |
143 if (HTMLSlotElement* slot = current->assignedSlot()) { | 143 if (HTMLSlotElement* slot = current->assignedSlot()) { |
144 current = slot; | 144 current = slot; |
145 nodesInPath.append(current); | 145 nodesInPath.push_back(current); |
146 continue; | 146 continue; |
147 } | 147 } |
148 } | 148 } |
149 if (current->isShadowRoot()) { | 149 if (current->isShadowRoot()) { |
150 if (m_event && | 150 if (m_event && |
151 shouldStopAtShadowRoot(*m_event, *toShadowRoot(current), *m_node)) | 151 shouldStopAtShadowRoot(*m_event, *toShadowRoot(current), *m_node)) |
152 break; | 152 break; |
153 current = current->ownerShadowHost(); | 153 current = current->ownerShadowHost(); |
154 nodesInPath.append(current); | 154 nodesInPath.push_back(current); |
155 } else { | 155 } else { |
156 current = current->parentNode(); | 156 current = current->parentNode(); |
157 if (current) | 157 if (current) |
158 nodesInPath.append(current); | 158 nodesInPath.push_back(current); |
159 } | 159 } |
160 } | 160 } |
161 | 161 |
162 m_nodeEventContexts.reserveCapacity(nodesInPath.size()); | 162 m_nodeEventContexts.reserveCapacity(nodesInPath.size()); |
163 for (Node* nodeInPath : nodesInPath) { | 163 for (Node* nodeInPath : nodesInPath) { |
164 m_nodeEventContexts.append(NodeEventContext( | 164 m_nodeEventContexts.push_back(NodeEventContext( |
165 nodeInPath, eventTargetRespectingTargetRules(*nodeInPath))); | 165 nodeInPath, eventTargetRespectingTargetRules(*nodeInPath))); |
166 } | 166 } |
167 } | 167 } |
168 | 168 |
169 void EventPath::calculateTreeOrderAndSetNearestAncestorClosedTree() { | 169 void EventPath::calculateTreeOrderAndSetNearestAncestorClosedTree() { |
170 // Precondition: | 170 // Precondition: |
171 // - TreeScopes in m_treeScopeEventContexts must be *connected* in the same | 171 // - TreeScopes in m_treeScopeEventContexts must be *connected* in the same |
172 // composed tree. | 172 // composed tree. |
173 // - The root tree must be included. | 173 // - The root tree must be included. |
174 HeapHashMap<Member<const TreeScope>, Member<TreeScopeEventContext>> | 174 HeapHashMap<Member<const TreeScope>, Member<TreeScopeEventContext>> |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 // the memory in subsequent event dispatchings. | 267 // the memory in subsequent event dispatchings. |
268 relatedTargetEventPath->clear(); | 268 relatedTargetEventPath->clear(); |
269 } | 269 } |
270 | 270 |
271 EventTarget* EventPath::findRelatedNode(TreeScope& scope, | 271 EventTarget* EventPath::findRelatedNode(TreeScope& scope, |
272 RelatedTargetMap& relatedTargetMap) { | 272 RelatedTargetMap& relatedTargetMap) { |
273 HeapVector<Member<TreeScope>, 32> parentTreeScopes; | 273 HeapVector<Member<TreeScope>, 32> parentTreeScopes; |
274 EventTarget* relatedNode = nullptr; | 274 EventTarget* relatedNode = nullptr; |
275 for (TreeScope* current = &scope; current; | 275 for (TreeScope* current = &scope; current; |
276 current = current->olderShadowRootOrParentTreeScope()) { | 276 current = current->olderShadowRootOrParentTreeScope()) { |
277 parentTreeScopes.append(current); | 277 parentTreeScopes.push_back(current); |
278 RelatedTargetMap::const_iterator iter = relatedTargetMap.find(current); | 278 RelatedTargetMap::const_iterator iter = relatedTargetMap.find(current); |
279 if (iter != relatedTargetMap.end() && iter->value) { | 279 if (iter != relatedTargetMap.end() && iter->value) { |
280 relatedNode = iter->value; | 280 relatedNode = iter->value; |
281 break; | 281 break; |
282 } | 282 } |
283 } | 283 } |
284 DCHECK(relatedNode); | 284 DCHECK(relatedNode); |
285 for (const auto& entry : parentTreeScopes) | 285 for (const auto& entry : parentTreeScopes) |
286 relatedTargetMap.add(entry, relatedNode); | 286 relatedTargetMap.add(entry, relatedNode); |
287 | 287 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 337 |
338 void EventPath::adjustForTouchEvent(TouchEvent& touchEvent) { | 338 void EventPath::adjustForTouchEvent(TouchEvent& touchEvent) { |
339 HeapVector<Member<TouchList>> adjustedTouches; | 339 HeapVector<Member<TouchList>> adjustedTouches; |
340 HeapVector<Member<TouchList>> adjustedTargetTouches; | 340 HeapVector<Member<TouchList>> adjustedTargetTouches; |
341 HeapVector<Member<TouchList>> adjustedChangedTouches; | 341 HeapVector<Member<TouchList>> adjustedChangedTouches; |
342 HeapVector<Member<TreeScope>> treeScopes; | 342 HeapVector<Member<TreeScope>> treeScopes; |
343 | 343 |
344 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { | 344 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
345 TouchEventContext* touchEventContext = | 345 TouchEventContext* touchEventContext = |
346 treeScopeEventContext->ensureTouchEventContext(); | 346 treeScopeEventContext->ensureTouchEventContext(); |
347 adjustedTouches.append(&touchEventContext->touches()); | 347 adjustedTouches.push_back(&touchEventContext->touches()); |
348 adjustedTargetTouches.append(&touchEventContext->targetTouches()); | 348 adjustedTargetTouches.push_back(&touchEventContext->targetTouches()); |
349 adjustedChangedTouches.append(&touchEventContext->changedTouches()); | 349 adjustedChangedTouches.push_back(&touchEventContext->changedTouches()); |
350 treeScopes.append(&treeScopeEventContext->treeScope()); | 350 treeScopes.push_back(&treeScopeEventContext->treeScope()); |
351 } | 351 } |
352 | 352 |
353 adjustTouchList(touchEvent.touches(), adjustedTouches, treeScopes); | 353 adjustTouchList(touchEvent.touches(), adjustedTouches, treeScopes); |
354 adjustTouchList(touchEvent.targetTouches(), adjustedTargetTouches, | 354 adjustTouchList(touchEvent.targetTouches(), adjustedTargetTouches, |
355 treeScopes); | 355 treeScopes); |
356 adjustTouchList(touchEvent.changedTouches(), adjustedChangedTouches, | 356 adjustTouchList(touchEvent.changedTouches(), adjustedChangedTouches, |
357 treeScopes); | 357 treeScopes); |
358 | 358 |
359 #if DCHECK_IS_ON() | 359 #if DCHECK_IS_ON() |
360 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { | 360 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 | 418 |
419 DEFINE_TRACE(EventPath) { | 419 DEFINE_TRACE(EventPath) { |
420 visitor->trace(m_nodeEventContexts); | 420 visitor->trace(m_nodeEventContexts); |
421 visitor->trace(m_node); | 421 visitor->trace(m_node); |
422 visitor->trace(m_event); | 422 visitor->trace(m_event); |
423 visitor->trace(m_treeScopeEventContexts); | 423 visitor->trace(m_treeScopeEventContexts); |
424 visitor->trace(m_windowEventContext); | 424 visitor->trace(m_windowEventContext); |
425 } | 425 } |
426 | 426 |
427 } // namespace blink | 427 } // namespace blink |
OLD | NEW |