OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) | 2 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) |
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 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 return false; | 146 return false; |
147 } | 147 } |
148 | 148 |
149 static inline void appendQuadsToSubtargetList( | 149 static inline void appendQuadsToSubtargetList( |
150 Vector<FloatQuad>& quads, | 150 Vector<FloatQuad>& quads, |
151 Node* node, | 151 Node* node, |
152 SubtargetGeometryList& subtargets) { | 152 SubtargetGeometryList& subtargets) { |
153 Vector<FloatQuad>::const_iterator it = quads.begin(); | 153 Vector<FloatQuad>::const_iterator it = quads.begin(); |
154 const Vector<FloatQuad>::const_iterator end = quads.end(); | 154 const Vector<FloatQuad>::const_iterator end = quads.end(); |
155 for (; it != end; ++it) | 155 for (; it != end; ++it) |
156 subtargets.append(SubtargetGeometry(node, *it)); | 156 subtargets.push_back(SubtargetGeometry(node, *it)); |
157 } | 157 } |
158 | 158 |
159 static inline void appendBasicSubtargetsForNode( | 159 static inline void appendBasicSubtargetsForNode( |
160 Node* node, | 160 Node* node, |
161 SubtargetGeometryList& subtargets) { | 161 SubtargetGeometryList& subtargets) { |
162 // Node guaranteed to have layoutObject due to check in node filter. | 162 // Node guaranteed to have layoutObject due to check in node filter. |
163 ASSERT(node->layoutObject()); | 163 ASSERT(node->layoutObject()); |
164 | 164 |
165 Vector<FloatQuad> quads; | 165 Vector<FloatQuad> quads; |
166 node->layoutObject()->absoluteQuads(quads); | 166 node->layoutObject()->absoluteQuads(quads); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 233 } |
234 | 234 |
235 static inline void appendZoomableSubtargets(Node* node, | 235 static inline void appendZoomableSubtargets(Node* node, |
236 SubtargetGeometryList& subtargets) { | 236 SubtargetGeometryList& subtargets) { |
237 LayoutBox* layoutObject = toLayoutBox(node->layoutObject()); | 237 LayoutBox* layoutObject = toLayoutBox(node->layoutObject()); |
238 ASSERT(layoutObject); | 238 ASSERT(layoutObject); |
239 | 239 |
240 Vector<FloatQuad> quads; | 240 Vector<FloatQuad> quads; |
241 FloatRect borderBoxRect(layoutObject->borderBoxRect()); | 241 FloatRect borderBoxRect(layoutObject->borderBoxRect()); |
242 FloatRect contentBoxRect(layoutObject->contentBoxRect()); | 242 FloatRect contentBoxRect(layoutObject->contentBoxRect()); |
243 quads.append(layoutObject->localToAbsoluteQuad(borderBoxRect)); | 243 quads.push_back(layoutObject->localToAbsoluteQuad(borderBoxRect)); |
244 if (borderBoxRect != contentBoxRect) | 244 if (borderBoxRect != contentBoxRect) |
245 quads.append(layoutObject->localToAbsoluteQuad(contentBoxRect)); | 245 quads.push_back(layoutObject->localToAbsoluteQuad(contentBoxRect)); |
246 // FIXME: For LayoutBlocks, add column boxes and content boxes cleared for | 246 // FIXME: For LayoutBlocks, add column boxes and content boxes cleared for |
247 // floats. | 247 // floats. |
248 | 248 |
249 Vector<FloatQuad>::const_iterator it = quads.begin(); | 249 Vector<FloatQuad>::const_iterator it = quads.begin(); |
250 const Vector<FloatQuad>::const_iterator end = quads.end(); | 250 const Vector<FloatQuad>::const_iterator end = quads.end(); |
251 for (; it != end; ++it) | 251 for (; it != end; ++it) |
252 subtargets.append(SubtargetGeometry(node, *it)); | 252 subtargets.push_back(SubtargetGeometry(node, *it)); |
253 } | 253 } |
254 | 254 |
255 static inline Node* parentShadowHostOrOwner(const Node* node) { | 255 static inline Node* parentShadowHostOrOwner(const Node* node) { |
256 if (Node* ancestor = node->parentOrShadowHostNode()) | 256 if (Node* ancestor = node->parentOrShadowHostNode()) |
257 return ancestor; | 257 return ancestor; |
258 if (node->isDocumentNode()) | 258 if (node->isDocumentNode()) |
259 return toDocument(node)->localOwner(); | 259 return toDocument(node)->localOwner(); |
260 return nullptr; | 260 return nullptr; |
261 } | 261 } |
262 | 262 |
(...skipping 15 matching lines...) Expand all Loading... |
278 Node* node = intersectedNodes[i].get(); | 278 Node* node = intersectedNodes[i].get(); |
279 HeapVector<Member<Node>> visitedNodes; | 279 HeapVector<Member<Node>> visitedNodes; |
280 Node* respondingNode = nullptr; | 280 Node* respondingNode = nullptr; |
281 for (Node* visitedNode = node; visitedNode; | 281 for (Node* visitedNode = node; visitedNode; |
282 visitedNode = visitedNode->parentOrShadowHostNode()) { | 282 visitedNode = visitedNode->parentOrShadowHostNode()) { |
283 // Check if we already have a result for a common ancestor from another | 283 // Check if we already have a result for a common ancestor from another |
284 // candidate. | 284 // candidate. |
285 respondingNode = responderMap.get(visitedNode); | 285 respondingNode = responderMap.get(visitedNode); |
286 if (respondingNode) | 286 if (respondingNode) |
287 break; | 287 break; |
288 visitedNodes.append(visitedNode); | 288 visitedNodes.push_back(visitedNode); |
289 // Check if the node filter applies, which would mean we have found a | 289 // Check if the node filter applies, which would mean we have found a |
290 // responding node. | 290 // responding node. |
291 if (nodeFilter(visitedNode)) { | 291 if (nodeFilter(visitedNode)) { |
292 respondingNode = visitedNode; | 292 respondingNode = visitedNode; |
293 // Continue the iteration to collect the ancestors of the responder, | 293 // Continue the iteration to collect the ancestors of the responder, |
294 // which we will need later. | 294 // which we will need later. |
295 for (visitedNode = parentShadowHostOrOwner(visitedNode); visitedNode; | 295 for (visitedNode = parentShadowHostOrOwner(visitedNode); visitedNode; |
296 visitedNode = parentShadowHostOrOwner(visitedNode)) { | 296 visitedNode = parentShadowHostOrOwner(visitedNode)) { |
297 HeapHashSet<Member<Node>>::AddResult addResult = | 297 HeapHashSet<Member<Node>>::AddResult addResult = |
298 ancestorsToRespondersSet.add(visitedNode); | 298 ancestorsToRespondersSet.add(visitedNode); |
299 if (!addResult.isNewEntry) | 299 if (!addResult.isNewEntry) |
300 break; | 300 break; |
301 } | 301 } |
302 break; | 302 break; |
303 } | 303 } |
304 } | 304 } |
305 // Insert the detected responder for all the visited nodes. | 305 // Insert the detected responder for all the visited nodes. |
306 for (unsigned j = 0; j < visitedNodes.size(); j++) | 306 for (unsigned j = 0; j < visitedNodes.size(); j++) |
307 responderMap.add(visitedNodes[j], respondingNode); | 307 responderMap.add(visitedNodes[j], respondingNode); |
308 | 308 |
309 if (respondingNode) | 309 if (respondingNode) |
310 candidates.append(node); | 310 candidates.push_back(node); |
311 } | 311 } |
312 | 312 |
313 // We compile the list of component absolute quads instead of using the | 313 // We compile the list of component absolute quads instead of using the |
314 // bounding rect to be able to perform better hit-testing on inline links on | 314 // bounding rect to be able to perform better hit-testing on inline links on |
315 // line-breaks. | 315 // line-breaks. |
316 for (unsigned i = 0; i < candidates.size(); i++) { | 316 for (unsigned i = 0; i < candidates.size(); i++) { |
317 Node* candidate = candidates[i]; | 317 Node* candidate = candidates[i]; |
318 // Skip nodes who's responders are ancestors of other responders. This gives | 318 // Skip nodes who's responders are ancestors of other responders. This gives |
319 // preference to the inner-most event-handlers. So that a link is always | 319 // preference to the inner-most event-handlers. So that a link is always |
320 // preferred even when contained in an element that monitors all | 320 // preferred even when contained in an element that monitors all |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 const HeapVector<Member<Node>>& nodes) { | 562 const HeapVector<Member<Node>>& nodes) { |
563 IntPoint targetPoint; | 563 IntPoint targetPoint; |
564 TouchAdjustment::SubtargetGeometryList subtargets; | 564 TouchAdjustment::SubtargetGeometryList subtargets; |
565 TouchAdjustment::compileZoomableSubtargets(nodes, subtargets); | 565 TouchAdjustment::compileZoomableSubtargets(nodes, subtargets); |
566 return TouchAdjustment::findNodeWithLowestDistanceMetric( | 566 return TouchAdjustment::findNodeWithLowestDistanceMetric( |
567 targetNode, targetPoint, targetArea, touchHotspot, touchArea, subtargets, | 567 targetNode, targetPoint, targetArea, touchHotspot, touchArea, subtargets, |
568 TouchAdjustment::zoomableIntersectionQuotient); | 568 TouchAdjustment::zoomableIntersectionQuotient); |
569 } | 569 } |
570 | 570 |
571 } // namespace blink | 571 } // namespace blink |
OLD | NEW |