| 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 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
| 15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
| 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
| 18 */ | 18 */ |
| 19 | 19 |
| 20 #include "config.h" | 20 #include "config.h" |
| 21 #include "core/dom/EventRetargeter.h" | 21 #include "core/dom/EventRetargeter.h" |
| 22 | 22 |
| 23 #include "RuntimeEnabledFeatures.h" |
| 23 #include "core/dom/ContainerNode.h" | 24 #include "core/dom/ContainerNode.h" |
| 24 #include "core/dom/EventContext.h" | 25 #include "core/dom/EventContext.h" |
| 25 #include "core/dom/EventPathWalker.h" | 26 #include "core/dom/EventPathWalker.h" |
| 26 #include "core/dom/FocusEvent.h" | 27 #include "core/dom/FocusEvent.h" |
| 27 #include "core/dom/MouseEvent.h" | 28 #include "core/dom/MouseEvent.h" |
| 28 #include "core/dom/Touch.h" | 29 #include "core/dom/Touch.h" |
| 29 #include "core/dom/TouchEvent.h" | 30 #include "core/dom/TouchEvent.h" |
| 30 #include "core/dom/TouchList.h" | 31 #include "core/dom/TouchList.h" |
| 31 #include "core/dom/TreeScope.h" | 32 #include "core/dom/TreeScope.h" |
| 32 #include "core/dom/shadow/ShadowRoot.h" | 33 #include "core/dom/shadow/ShadowRoot.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 return; | 97 return; |
| 97 if (!node->isShadowRoot()) | 98 if (!node->isShadowRoot()) |
| 98 continue; | 99 continue; |
| 99 if (determineDispatchBehavior(event, toShadowRoot(node), targetStack.las
t()) == StayInsideShadowDOM) | 100 if (determineDispatchBehavior(event, toShadowRoot(node), targetStack.las
t()) == StayInsideShadowDOM) |
| 100 return; | 101 return; |
| 101 if (!isSVGElement) { | 102 if (!isSVGElement) { |
| 102 ASSERT(!targetStack.isEmpty()); | 103 ASSERT(!targetStack.isEmpty()); |
| 103 targetStack.removeLast(); | 104 targetStack.removeLast(); |
| 104 } | 105 } |
| 105 } | 106 } |
| 107 |
| 108 // Calculates eventPath for each node for Event.path() API. |
| 109 if (!RuntimeEnabledFeatures::experimentalShadowDOMEnabled()) |
| 110 return; |
| 111 TreeScope* lastScope = 0; |
| 112 size_t eventPathSize = eventPath.size(); |
| 113 for (size_t i = 0; i < eventPathSize; ++i) { |
| 114 TreeScope* currentScope = eventPath[i]->node()->treeScope(); |
| 115 if (currentScope == lastScope) { |
| 116 // Fast path. |
| 117 eventPath[i]->setEventPath(eventPath[i - 1]->eventPath()); |
| 118 continue; |
| 119 } |
| 120 lastScope = currentScope; |
| 121 Vector<RefPtr<Node> > nodes; |
| 122 for (size_t j = 0; j < eventPathSize; ++j) { |
| 123 Node* node = eventPath[j]->node(); |
| 124 if (node->treeScope()->isInclusiveAncestorOf(currentScope)) |
| 125 nodes.append(node); |
| 126 } |
| 127 eventPath[i]->adoptEventPath(nodes); |
| 128 } |
| 106 } | 129 } |
| 107 | 130 |
| 108 void EventRetargeter::adjustForMouseEvent(Node* node, MouseEvent& mouseEvent) | 131 void EventRetargeter::adjustForMouseEvent(Node* node, MouseEvent& mouseEvent) |
| 109 { | 132 { |
| 110 adjustForRelatedTarget(node, mouseEvent.relatedTarget(), mouseEvent.eventPat
h()); | 133 adjustForRelatedTarget(node, mouseEvent.relatedTarget(), mouseEvent.eventPat
h()); |
| 111 } | 134 } |
| 112 | 135 |
| 113 void EventRetargeter::adjustForFocusEvent(Node* node, FocusEvent& focusEvent) | 136 void EventRetargeter::adjustForFocusEvent(Node* node, FocusEvent& focusEvent) |
| 114 { | 137 { |
| 115 adjustForRelatedTarget(node, focusEvent.relatedTarget(), focusEvent.eventPat
h()); | 138 adjustForRelatedTarget(node, focusEvent.relatedTarget(), focusEvent.eventPat
h()); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 break; | 265 break; |
| 243 } | 266 } |
| 244 scope = scope->parentTreeScope(); | 267 scope = scope->parentTreeScope(); |
| 245 } | 268 } |
| 246 for (Vector<TreeScope*, 32>::iterator iter = parentTreeScopes.begin(); iter
< parentTreeScopes.end(); ++iter) | 269 for (Vector<TreeScope*, 32>::iterator iter = parentTreeScopes.begin(); iter
< parentTreeScopes.end(); ++iter) |
| 247 relatedNodeMap.add(*iter, relatedNode); | 270 relatedNodeMap.add(*iter, relatedNode); |
| 248 return relatedNode; | 271 return relatedNode; |
| 249 } | 272 } |
| 250 | 273 |
| 251 } | 274 } |
| OLD | NEW |