OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/input/MouseEventManager.h" | 5 #include "core/input/MouseEventManager.h" |
6 | 6 |
7 #include "core/clipboard/DataObject.h" | 7 #include "core/clipboard/DataObject.h" |
8 #include "core/clipboard/DataTransfer.h" | 8 #include "core/clipboard/DataTransfer.h" |
9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
10 #include "core/dom/ElementTraversal.h" | 10 #include "core/dom/ElementTraversal.h" |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 // FIXME: The Mac port achieves the same behavior by checking whether the | 244 // FIXME: The Mac port achieves the same behavior by checking whether the |
245 // context menu is currently open in WebPage::mouseEvent(). Consider merging | 245 // context menu is currently open in WebPage::mouseEvent(). Consider merging |
246 // the implementations. | 246 // the implementations. |
247 if (mouseEvent.button == WebPointerProperties::Button::Left && | 247 if (mouseEvent.button == WebPointerProperties::Button::Left && |
248 mouseEvent.modifiers() & WebInputEvent::Modifiers::ControlKey) | 248 mouseEvent.modifiers() & WebInputEvent::Modifiers::ControlKey) |
249 contextMenuEvent = true; | 249 contextMenuEvent = true; |
250 #endif | 250 #endif |
251 | 251 |
252 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled; | 252 WebInputEventResult clickEventResult = WebInputEventResult::NotHandled; |
253 const bool shouldDispatchClickEvent = m_clickCount > 0 && !contextMenuEvent && | 253 const bool shouldDispatchClickEvent = m_clickCount > 0 && !contextMenuEvent && |
254 target && m_clickNode && | 254 m_clickNode && |
255 target->canParticipateInFlatTree() && | |
256 m_clickNode->canParticipateInFlatTree(); | 255 m_clickNode->canParticipateInFlatTree(); |
257 if (shouldDispatchClickEvent) { | 256 if (shouldDispatchClickEvent) { |
258 Node* clickTargetNode = nullptr; | 257 Node* clickTargetNode = nullptr; |
259 // Updates distribution because a 'mouseup' event listener can make the | 258 // Updates distribution because a 'mouseup' event listener can make the |
260 // tree dirty at dispatchMouseEvent() invocation above. | 259 // tree dirty at dispatchMouseEvent() invocation above. |
261 // Unless distribution is updated, commonAncestor would hit ASSERT. | 260 // Unless distribution is updated, commonAncestor would hit ASSERT. |
262 if (m_clickNode == target) { | 261 if (target && target->canParticipateInFlatTree()) { |
263 clickTargetNode = m_clickNode; | 262 if (m_clickNode == target) { |
264 clickTargetNode->updateDistribution(); | 263 clickTargetNode = m_clickNode; |
265 } else if (m_clickNode->document() == target->document()) { | 264 clickTargetNode->updateDistribution(); |
266 m_clickNode->updateDistribution(); | 265 } else if (m_clickNode->document() == target->document()) { |
267 target->updateDistribution(); | 266 m_clickNode->updateDistribution(); |
268 clickTargetNode = target->commonAncestor( | 267 target->updateDistribution(); |
269 *m_clickNode, EventHandlingUtil::parentForClickEvent); | 268 clickTargetNode = target->commonAncestor( |
| 269 *m_clickNode, EventHandlingUtil::parentForClickEvent); |
| 270 } |
270 } | 271 } |
271 | 272 |
272 // This block is only for the purpose of gathering the metric and can be | 273 // This block is only for the purpose of gathering the metric and can be |
273 // removed as soon as we don't need the metric. | 274 // removed as soon as we don't need the metric. |
274 if (targetWithoutCapture != target) { | 275 if (targetWithoutCapture != target) { |
275 Node* alternativeClickTargetNode = nullptr; | 276 Node* alternativeClickTargetNode = nullptr; |
276 if (m_clickNode == targetWithoutCapture) { | 277 if (targetWithoutCapture && |
277 alternativeClickTargetNode = m_clickNode; | 278 targetWithoutCapture->canParticipateInFlatTree()) { |
278 } else if (m_clickNode->document() == targetWithoutCapture->document()) { | 279 if (m_clickNode == targetWithoutCapture) { |
279 alternativeClickTargetNode = targetWithoutCapture->commonAncestor( | 280 alternativeClickTargetNode = m_clickNode; |
280 *m_clickNode, EventHandlingUtil::parentForClickEvent); | 281 } else if (m_clickNode->document() == |
| 282 targetWithoutCapture->document()) { |
| 283 alternativeClickTargetNode = targetWithoutCapture->commonAncestor( |
| 284 *m_clickNode, EventHandlingUtil::parentForClickEvent); |
| 285 } |
281 } | 286 } |
282 if (alternativeClickTargetNode != clickTargetNode) { | 287 if (alternativeClickTargetNode != clickTargetNode) { |
283 UseCounter::count(m_frame, | 288 UseCounter::count(m_frame, |
284 UseCounter::PointerEventClickRetargetCausedByCapture); | 289 UseCounter::PointerEventClickRetargetCausedByCapture); |
285 } | 290 } |
| 291 // TODO(crbug.com/699933): The following line removes the effect of |
| 292 // pointer capture. |
| 293 clickTargetNode = alternativeClickTargetNode; |
286 } | 294 } |
287 | 295 |
288 if (clickTargetNode) { | 296 if (clickTargetNode) { |
289 clickEventResult = dispatchMouseEvent( | 297 clickEventResult = dispatchMouseEvent( |
290 clickTargetNode, | 298 clickTargetNode, |
291 !RuntimeEnabledFeatures::auxclickEnabled() || | 299 !RuntimeEnabledFeatures::auxclickEnabled() || |
292 (mouseEvent.button == WebPointerProperties::Button::Left) | 300 (mouseEvent.button == WebPointerProperties::Button::Left) |
293 ? EventTypeNames::click | 301 ? EventTypeNames::click |
294 : EventTypeNames::auxclick, | 302 : EventTypeNames::auxclick, |
295 mouseEvent, canvasRegionId, nullptr); | 303 mouseEvent, canvasRegionId, nullptr); |
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1037 | 1045 |
1038 void MouseEventManager::setClickCount(int clickCount) { | 1046 void MouseEventManager::setClickCount(int clickCount) { |
1039 m_clickCount = clickCount; | 1047 m_clickCount = clickCount; |
1040 } | 1048 } |
1041 | 1049 |
1042 bool MouseEventManager::mouseDownMayStartDrag() { | 1050 bool MouseEventManager::mouseDownMayStartDrag() { |
1043 return m_mouseDownMayStartDrag; | 1051 return m_mouseDownMayStartDrag; |
1044 } | 1052 } |
1045 | 1053 |
1046 } // namespace blink | 1054 } // namespace blink |
OLD | NEW |