Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2008, 2011 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 : m_hitTestLocation(other.m_hitTestLocation) | 75 : m_hitTestLocation(other.m_hitTestLocation) |
| 76 , m_innerNode(other.innerNode()) | 76 , m_innerNode(other.innerNode()) |
| 77 , m_innerPossiblyPseudoNode(other.m_innerPossiblyPseudoNode) | 77 , m_innerPossiblyPseudoNode(other.m_innerPossiblyPseudoNode) |
| 78 , m_innerNonSharedNode(other.innerNonSharedNode()) | 78 , m_innerNonSharedNode(other.innerNonSharedNode()) |
| 79 , m_pointInInnerNodeFrame(other.m_pointInInnerNodeFrame) | 79 , m_pointInInnerNodeFrame(other.m_pointInInnerNodeFrame) |
| 80 , m_localPoint(other.localPoint()) | 80 , m_localPoint(other.localPoint()) |
| 81 , m_innerURLElement(other.URLElement()) | 81 , m_innerURLElement(other.URLElement()) |
| 82 , m_scrollbar(other.scrollbar()) | 82 , m_scrollbar(other.scrollbar()) |
| 83 , m_isOverWidget(other.isOverWidget()) | 83 , m_isOverWidget(other.isOverWidget()) |
| 84 { | 84 { |
| 85 // Only copy the NodeSet in case of rect hit test. | 85 // Only copy the NodeSet in case of list hit test. |
| 86 m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0); | 86 m_listBasedTestResult = adoptPtrWillBeNoop(other.m_listBasedTestResult ? new NodeSet(*other.m_listBasedTestResult) : 0); |
| 87 } | 87 } |
| 88 | 88 |
| 89 HitTestResult::~HitTestResult() | 89 HitTestResult::~HitTestResult() |
| 90 { | 90 { |
| 91 } | 91 } |
| 92 | 92 |
| 93 HitTestResult& HitTestResult::operator=(const HitTestResult& other) | 93 HitTestResult& HitTestResult::operator=(const HitTestResult& other) |
| 94 { | 94 { |
| 95 m_hitTestLocation = other.m_hitTestLocation; | 95 m_hitTestLocation = other.m_hitTestLocation; |
| 96 m_innerNode = other.innerNode(); | 96 m_innerNode = other.innerNode(); |
| 97 m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode(); | 97 m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode(); |
| 98 m_innerNonSharedNode = other.innerNonSharedNode(); | 98 m_innerNonSharedNode = other.innerNonSharedNode(); |
| 99 m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame; | 99 m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame; |
| 100 m_localPoint = other.localPoint(); | 100 m_localPoint = other.localPoint(); |
| 101 m_innerURLElement = other.URLElement(); | 101 m_innerURLElement = other.URLElement(); |
| 102 m_scrollbar = other.scrollbar(); | 102 m_scrollbar = other.scrollbar(); |
| 103 m_isOverWidget = other.isOverWidget(); | 103 m_isOverWidget = other.isOverWidget(); |
| 104 | 104 |
| 105 // Only copy the NodeSet in case of rect hit test. | 105 // Only copy the NodeSet in case of list hit test. |
| 106 m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0); | 106 m_listBasedTestResult = adoptPtrWillBeNoop(other.m_listBasedTestResult ? new NodeSet(*other.m_listBasedTestResult) : 0); |
| 107 | 107 |
| 108 return *this; | 108 return *this; |
| 109 } | 109 } |
| 110 | 110 |
| 111 void HitTestResult::trace(Visitor* visitor) | 111 void HitTestResult::trace(Visitor* visitor) |
| 112 { | 112 { |
| 113 visitor->trace(m_innerNode); | 113 visitor->trace(m_innerNode); |
| 114 visitor->trace(m_innerPossiblyPseudoNode); | 114 visitor->trace(m_innerPossiblyPseudoNode); |
| 115 visitor->trace(m_innerNonSharedNode); | 115 visitor->trace(m_innerNonSharedNode); |
| 116 visitor->trace(m_innerURLElement); | 116 visitor->trace(m_innerURLElement); |
| 117 visitor->trace(m_scrollbar); | 117 visitor->trace(m_scrollbar); |
| 118 #if ENABLE(OILPAN) | 118 #if ENABLE(OILPAN) |
| 119 visitor->trace(m_rectBasedTestResult); | 119 visitor->trace(m_listBasedTestResult); |
| 120 #endif | 120 #endif |
| 121 } | 121 } |
| 122 | 122 |
| 123 PositionWithAffinity HitTestResult::position() const | 123 PositionWithAffinity HitTestResult::position() const |
| 124 { | 124 { |
| 125 if (!m_innerPossiblyPseudoNode) | 125 if (!m_innerPossiblyPseudoNode) |
| 126 return PositionWithAffinity(); | 126 return PositionWithAffinity(); |
| 127 RenderObject* renderer = this->renderer(); | 127 RenderObject* renderer = this->renderer(); |
| 128 if (!renderer) | 128 if (!renderer) |
| 129 return PositionWithAffinity(); | 129 return PositionWithAffinity(); |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 return !toHTMLTextAreaElement(*m_innerNonSharedNode).isDisabledOrReadOnl y(); | 364 return !toHTMLTextAreaElement(*m_innerNonSharedNode).isDisabledOrReadOnl y(); |
| 365 | 365 |
| 366 if (isHTMLInputElement(*m_innerNonSharedNode)) { | 366 if (isHTMLInputElement(*m_innerNonSharedNode)) { |
| 367 HTMLInputElement& inputElement = toHTMLInputElement(*m_innerNonSharedNod e); | 367 HTMLInputElement& inputElement = toHTMLInputElement(*m_innerNonSharedNod e); |
| 368 return !inputElement.isDisabledOrReadOnly() && inputElement.isTextField( ); | 368 return !inputElement.isDisabledOrReadOnly() && inputElement.isTextField( ); |
| 369 } | 369 } |
| 370 | 370 |
| 371 return m_innerNonSharedNode->hasEditableStyle(); | 371 return m_innerNonSharedNode->hasEditableStyle(); |
| 372 } | 372 } |
| 373 | 373 |
| 374 bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestReques t& request, const HitTestLocation& locationInContainer, const LayoutRect& rect) | 374 bool HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestReques t& request, const HitTestLocation& locationInContainer, const LayoutRect& rect) |
| 375 { | 375 { |
| 376 // If it is not a rect-based hit test, this method has to be no-op. | 376 // If not a list-based test, this function should be a no-op. |
| 377 // Return false, so the hit test stops. | 377 if (!request.listBased()) { |
| 378 if (!isRectBasedTest()) | 378 ASSERT(!isRectBasedTest()); |
| 379 return false; | 379 return false; |
| 380 } | |
| 380 | 381 |
| 381 // If node is null, return true so the hit test can continue. | 382 // If node is null, return true so the hit test can continue. |
| 382 if (!node) | 383 if (!node) |
| 383 return true; | 384 return true; |
| 384 | 385 |
| 385 mutableRectBasedTestResult().add(node); | 386 mutableListBasedTestResult().add(node); |
| 387 | |
| 388 if (request.penetrating()) | |
| 389 return true; | |
| 386 | 390 |
| 387 bool regionFilled = rect.contains(locationInContainer.boundingBox()); | 391 bool regionFilled = rect.contains(locationInContainer.boundingBox()); |
| 388 return !regionFilled; | 392 return !regionFilled; |
| 389 } | 393 } |
| 390 | 394 |
| 391 bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestReques t& request, const HitTestLocation& locationInContainer, const FloatRect& rect) | 395 bool HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestReques t& request, const HitTestLocation& locationInContainer, const FloatRect& rect) |
| 392 { | 396 { |
| 393 // If it is not a rect-based hit test, this method has to be no-op. | 397 // If not a list-based test, this function should be a no-op. |
| 394 // Return false, so the hit test stops. | 398 if (!request.listBased()) { |
| 395 if (!isRectBasedTest()) | 399 ASSERT(!isRectBasedTest()); |
| 396 return false; | 400 return false; |
| 401 } | |
| 397 | 402 |
| 398 // If node is null, return true so the hit test can continue. | 403 // If node is null, return true so the hit test can continue. |
| 399 if (!node) | 404 if (!node) |
| 400 return true; | 405 return true; |
| 401 | 406 |
| 402 mutableRectBasedTestResult().add(node); | 407 mutableListBasedTestResult().add(node); |
| 408 | |
| 409 if (request.penetrating()) | |
| 410 return true; | |
| 403 | 411 |
| 404 bool regionFilled = rect.contains(locationInContainer.boundingBox()); | 412 bool regionFilled = rect.contains(locationInContainer.boundingBox()); |
| 405 return !regionFilled; | 413 return !regionFilled; |
| 406 } | 414 } |
| 407 | 415 |
| 408 void HitTestResult::append(const HitTestResult& other) | 416 void HitTestResult::append(const HitTestResult& other) |
| 409 { | 417 { |
| 410 ASSERT(isRectBasedTest() && other.isRectBasedTest()); | |
|
Rick Byers
2015/02/04 10:34:03
why don't you want to assert both are list-based h
pdr.
2015/02/17 04:10:14
I've added a const HitTestRequest& parameter to ap
Rick Byers
2015/02/20 20:02:23
Seems reasonable, thanks.
I was naively thinking
| |
| 411 | |
| 412 if (!m_scrollbar && other.scrollbar()) { | 418 if (!m_scrollbar && other.scrollbar()) { |
| 413 setScrollbar(other.scrollbar()); | 419 setScrollbar(other.scrollbar()); |
| 414 } | 420 } |
| 415 | 421 |
| 416 if (!m_innerNode && other.innerNode()) { | 422 if (!m_innerNode && other.innerNode()) { |
| 417 m_innerNode = other.innerNode(); | 423 m_innerNode = other.innerNode(); |
| 418 m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode(); | 424 m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode(); |
| 419 m_innerNonSharedNode = other.innerNonSharedNode(); | 425 m_innerNonSharedNode = other.innerNonSharedNode(); |
| 420 m_localPoint = other.localPoint(); | 426 m_localPoint = other.localPoint(); |
| 421 m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame; | 427 m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame; |
| 422 m_innerURLElement = other.URLElement(); | 428 m_innerURLElement = other.URLElement(); |
| 423 m_isOverWidget = other.isOverWidget(); | 429 m_isOverWidget = other.isOverWidget(); |
| 424 } | 430 } |
| 425 | 431 |
| 426 if (other.m_rectBasedTestResult) { | 432 if (other.m_listBasedTestResult) { |
| 427 NodeSet& set = mutableRectBasedTestResult(); | 433 NodeSet& set = mutableListBasedTestResult(); |
| 428 for (NodeSet::const_iterator it = other.m_rectBasedTestResult->begin(), last = other.m_rectBasedTestResult->end(); it != last; ++it) | 434 for (NodeSet::const_iterator it = other.m_listBasedTestResult->begin(), last = other.m_listBasedTestResult->end(); it != last; ++it) |
| 429 set.add(it->get()); | 435 set.add(it->get()); |
| 430 } | 436 } |
| 431 } | 437 } |
| 432 | 438 |
| 433 const HitTestResult::NodeSet& HitTestResult::rectBasedTestResult() const | 439 const HitTestResult::NodeSet& HitTestResult::listBasedTestResult() const |
| 434 { | 440 { |
| 435 if (!m_rectBasedTestResult) | 441 if (!m_listBasedTestResult) |
| 436 m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet); | 442 m_listBasedTestResult = adoptPtrWillBeNoop(new NodeSet); |
| 437 return *m_rectBasedTestResult; | 443 return *m_listBasedTestResult; |
| 438 } | 444 } |
| 439 | 445 |
| 440 HitTestResult::NodeSet& HitTestResult::mutableRectBasedTestResult() | 446 HitTestResult::NodeSet& HitTestResult::mutableListBasedTestResult() |
| 441 { | 447 { |
| 442 if (!m_rectBasedTestResult) | 448 if (!m_listBasedTestResult) |
| 443 m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet); | 449 m_listBasedTestResult = adoptPtrWillBeNoop(new NodeSet); |
| 444 return *m_rectBasedTestResult; | 450 return *m_listBasedTestResult; |
| 445 } | 451 } |
| 446 | 452 |
| 447 void HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPo int& resolvedPointInMainFrame) | 453 void HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPo int& resolvedPointInMainFrame) |
| 448 { | 454 { |
| 449 ASSERT(isRectBasedTest()); | 455 ASSERT(isRectBasedTest()); |
| 450 ASSERT(m_hitTestLocation.containsPoint(FloatPoint(resolvedPointInMainFrame)) ); | 456 ASSERT(m_hitTestLocation.containsPoint(FloatPoint(resolvedPointInMainFrame)) ); |
| 451 m_hitTestLocation = HitTestLocation(resolvedPointInMainFrame); | 457 m_hitTestLocation = HitTestLocation(resolvedPointInMainFrame); |
| 452 m_pointInInnerNodeFrame = resolvedPointInMainFrame; | 458 m_pointInInnerNodeFrame = resolvedPointInMainFrame; |
| 453 m_innerNode = nullptr; | 459 m_innerNode = nullptr; |
| 454 m_innerNonSharedNode = nullptr; | 460 m_innerNonSharedNode = nullptr; |
| 455 m_innerPossiblyPseudoNode = nullptr; | 461 m_innerPossiblyPseudoNode = nullptr; |
| 456 m_rectBasedTestResult = nullptr; | 462 m_listBasedTestResult = nullptr; |
| 457 | 463 |
| 458 // Update the HitTestResult as if the supplied node had been hit in normal p oint-based hit-test. | 464 // Update the HitTestResult as if the supplied node had been hit in normal p oint-based hit-test. |
| 459 // Note that we don't know the local point after a rect-based hit-test, but we never use | 465 // Note that we don't know the local point after a rect-based hit-test, but we never use |
| 460 // it so shouldn't bother with the cost of computing it. | 466 // it so shouldn't bother with the cost of computing it. |
| 461 resolvedInnerNode->renderer()->updateHitTestResult(*this, LayoutPoint()); | 467 resolvedInnerNode->renderer()->updateHitTestResult(*this, LayoutPoint()); |
| 462 ASSERT(!isRectBasedTest()); | 468 ASSERT(!isRectBasedTest()); |
| 463 } | 469 } |
| 464 | 470 |
| 465 Element* HitTestResult::innerElement() const | 471 Element* HitTestResult::innerElement() const |
| 466 { | 472 { |
| 467 for (Node* node = m_innerNode.get(); node; node = NodeRenderingTraversal::pa rent(*node)) { | 473 for (Node* node = m_innerNode.get(); node; node = NodeRenderingTraversal::pa rent(*node)) { |
| 468 if (node->isElementNode()) | 474 if (node->isElementNode()) |
| 469 return toElement(node); | 475 return toElement(node); |
| 470 } | 476 } |
| 471 | 477 |
| 472 return 0; | 478 return 0; |
| 473 } | 479 } |
| 474 | 480 |
| 475 } // namespace blink | 481 } // namespace blink |
| OLD | NEW |