| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2009 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 return child; | 276 return child; |
| 277 return Strategy::nextSkippingChildren(*m_anchorNode); | 277 return Strategy::nextSkippingChildren(*m_anchorNode); |
| 278 } | 278 } |
| 279 | 279 |
| 280 template <typename Strategy> | 280 template <typename Strategy> |
| 281 Node* PositionTemplate<Strategy>::commonAncestorContainer(const PositionTemplate
<Strategy>& other) const | 281 Node* PositionTemplate<Strategy>::commonAncestorContainer(const PositionTemplate
<Strategy>& other) const |
| 282 { | 282 { |
| 283 return Strategy::commonAncestor(*computeContainerNode(), *other.computeConta
inerNode()); | 283 return Strategy::commonAncestor(*computeContainerNode(), *other.computeConta
inerNode()); |
| 284 } | 284 } |
| 285 | 285 |
| 286 int comparePositions(const PositionInComposedTree& positionA, const PositionInCo
mposedTree& positionB) | 286 int comparePositions(const PositionInFlatTree& positionA, const PositionInFlatTr
ee& positionB) |
| 287 { | 287 { |
| 288 ASSERT(positionA.isNotNull()); | 288 ASSERT(positionA.isNotNull()); |
| 289 ASSERT(positionB.isNotNull()); | 289 ASSERT(positionB.isNotNull()); |
| 290 | 290 |
| 291 positionA.anchorNode()->updateDistribution(); | 291 positionA.anchorNode()->updateDistribution(); |
| 292 Node* containerA = positionA.computeContainerNode(); | 292 Node* containerA = positionA.computeContainerNode(); |
| 293 positionB.anchorNode()->updateDistribution(); | 293 positionB.anchorNode()->updateDistribution(); |
| 294 Node* containerB = positionB.computeContainerNode(); | 294 Node* containerB = positionB.computeContainerNode(); |
| 295 int offsetA = positionA.computeOffsetInContainerNode(); | 295 int offsetA = positionA.computeOffsetInContainerNode(); |
| 296 int offsetB = positionB.computeOffsetInContainerNode(); | 296 int offsetB = positionB.computeOffsetInContainerNode(); |
| 297 return comparePositionsInComposedTree(containerA, offsetA, containerB, offse
tB); | 297 return comparePositionsInFlatTree(containerA, offsetA, containerB, offsetB); |
| 298 } | 298 } |
| 299 | 299 |
| 300 template <typename Strategy> | 300 template <typename Strategy> |
| 301 int PositionTemplate<Strategy>::compareTo(const PositionTemplate<Strategy>& othe
r) const | 301 int PositionTemplate<Strategy>::compareTo(const PositionTemplate<Strategy>& othe
r) const |
| 302 { | 302 { |
| 303 return comparePositions(*this, other); | 303 return comparePositions(*this, other); |
| 304 } | 304 } |
| 305 | 305 |
| 306 template <typename Strategy> | 306 template <typename Strategy> |
| 307 bool PositionTemplate<Strategy>::atFirstEditingPositionForNode() const | 307 bool PositionTemplate<Strategy>::atFirstEditingPositionForNode() const |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 | 376 |
| 377 const char* anchorType = anchorTypes[std::min(static_cast<size_t>(m_anchorTy
pe), WTF_ARRAY_LENGTH(anchorTypes) - 1)]; | 377 const char* anchorType = anchorTypes[std::min(static_cast<size_t>(m_anchorTy
pe), WTF_ARRAY_LENGTH(anchorTypes) - 1)]; |
| 378 if (m_anchorNode->isTextNode()) { | 378 if (m_anchorNode->isTextNode()) { |
| 379 fprintf(stderr, "Position [%s]: %s [%p] %s, (%s) at %d\n", msg, anchorNo
de()->nodeName().utf8().data(), anchorNode(), anchorType, m_anchorNode->nodeValu
e().utf8().data(), m_offset); | 379 fprintf(stderr, "Position [%s]: %s [%p] %s, (%s) at %d\n", msg, anchorNo
de()->nodeName().utf8().data(), anchorNode(), anchorType, m_anchorNode->nodeValu
e().utf8().data(), m_offset); |
| 380 return; | 380 return; |
| 381 } | 381 } |
| 382 | 382 |
| 383 fprintf(stderr, "Position [%s]: %s [%p] %s at %d\n", msg, anchorNode()->node
Name().utf8().data(), anchorNode(), anchorType, m_offset); | 383 fprintf(stderr, "Position [%s]: %s [%p] %s at %d\n", msg, anchorNode()->node
Name().utf8().data(), anchorNode(), anchorType, m_offset); |
| 384 } | 384 } |
| 385 | 385 |
| 386 PositionInComposedTree toPositionInComposedTree(const Position& pos) | 386 PositionInFlatTree toPositionInFlatTree(const Position& pos) |
| 387 { | 387 { |
| 388 if (pos.isNull()) | 388 if (pos.isNull()) |
| 389 return PositionInComposedTree(); | 389 return PositionInFlatTree(); |
| 390 | 390 |
| 391 if (pos.isOffsetInAnchor()) { | 391 if (pos.isOffsetInAnchor()) { |
| 392 Node* anchor = pos.anchorNode(); | 392 Node* anchor = pos.anchorNode(); |
| 393 if (anchor->offsetInCharacters()) | 393 if (anchor->offsetInCharacters()) |
| 394 return PositionInComposedTree(anchor, pos.computeOffsetInContainerNo
de()); | 394 return PositionInFlatTree(anchor, pos.computeOffsetInContainerNode()
); |
| 395 ASSERT(!anchor->isSlotOrActiveInsertionPoint()); | 395 ASSERT(!anchor->isSlotOrActiveInsertionPoint()); |
| 396 int offset = pos.computeOffsetInContainerNode(); | 396 int offset = pos.computeOffsetInContainerNode(); |
| 397 Node* child = NodeTraversal::childAt(*anchor, offset); | 397 Node* child = NodeTraversal::childAt(*anchor, offset); |
| 398 if (!child) { | 398 if (!child) { |
| 399 if (anchor->isShadowRoot()) | 399 if (anchor->isShadowRoot()) |
| 400 return PositionInComposedTree(anchor->shadowHost(), PositionAnch
orType::AfterChildren); | 400 return PositionInFlatTree(anchor->shadowHost(), PositionAnchorTy
pe::AfterChildren); |
| 401 return PositionInComposedTree(anchor, PositionAnchorType::AfterChild
ren); | 401 return PositionInFlatTree(anchor, PositionAnchorType::AfterChildren)
; |
| 402 } | 402 } |
| 403 child->updateDistribution(); | 403 child->updateDistribution(); |
| 404 if (child->isSlotOrActiveInsertionPoint()) { | 404 if (child->isSlotOrActiveInsertionPoint()) { |
| 405 if (anchor->isShadowRoot()) | 405 if (anchor->isShadowRoot()) |
| 406 return PositionInComposedTree(anchor->shadowHost(), offset); | 406 return PositionInFlatTree(anchor->shadowHost(), offset); |
| 407 return PositionInComposedTree(anchor, offset); | 407 return PositionInFlatTree(anchor, offset); |
| 408 } | 408 } |
| 409 if (Node* parent = ComposedTreeTraversal::parent(*child)) | 409 if (Node* parent = FlatTreeTraversal::parent(*child)) |
| 410 return PositionInComposedTree(parent, ComposedTreeTraversal::index(*
child)); | 410 return PositionInFlatTree(parent, FlatTreeTraversal::index(*child)); |
| 411 // When |pos| isn't appeared in composed tree, we map |pos| to after | 411 // When |pos| isn't appeared in flat tree, we map |pos| to after |
| 412 // children of shadow host. | 412 // children of shadow host. |
| 413 // e.g. "foo",0 in <progress>foo</progress> | 413 // e.g. "foo",0 in <progress>foo</progress> |
| 414 if (anchor->isShadowRoot()) | 414 if (anchor->isShadowRoot()) |
| 415 return PositionInComposedTree(anchor->shadowHost(), PositionAnchorTy
pe::AfterChildren); | 415 return PositionInFlatTree(anchor->shadowHost(), PositionAnchorType::
AfterChildren); |
| 416 return PositionInComposedTree(anchor, PositionAnchorType::AfterChildren)
; | 416 return PositionInFlatTree(anchor, PositionAnchorType::AfterChildren); |
| 417 } | 417 } |
| 418 | 418 |
| 419 return PositionInComposedTree(pos.anchorNode(), pos.anchorType()); | 419 return PositionInFlatTree(pos.anchorNode(), pos.anchorType()); |
| 420 } | 420 } |
| 421 | 421 |
| 422 Position toPositionInDOMTree(const Position& position) | 422 Position toPositionInDOMTree(const Position& position) |
| 423 { | 423 { |
| 424 return position; | 424 return position; |
| 425 } | 425 } |
| 426 | 426 |
| 427 Position toPositionInDOMTree(const PositionInComposedTree& position) | 427 Position toPositionInDOMTree(const PositionInFlatTree& position) |
| 428 { | 428 { |
| 429 if (position.isNull()) | 429 if (position.isNull()) |
| 430 return Position(); | 430 return Position(); |
| 431 | 431 |
| 432 Node* anchorNode = position.anchorNode(); | 432 Node* anchorNode = position.anchorNode(); |
| 433 | 433 |
| 434 switch (position.anchorType()) { | 434 switch (position.anchorType()) { |
| 435 case PositionAnchorType::AfterChildren: | 435 case PositionAnchorType::AfterChildren: |
| 436 // FIXME: When anchorNode is <img>, assertion fails in the constructor. | 436 // FIXME: When anchorNode is <img>, assertion fails in the constructor. |
| 437 return Position(anchorNode, PositionAnchorType::AfterChildren); | 437 return Position(anchorNode, PositionAnchorType::AfterChildren); |
| 438 case PositionAnchorType::AfterAnchor: | 438 case PositionAnchorType::AfterAnchor: |
| 439 return positionAfterNode(anchorNode); | 439 return positionAfterNode(anchorNode); |
| 440 case PositionAnchorType::BeforeChildren: | 440 case PositionAnchorType::BeforeChildren: |
| 441 return Position(anchorNode, PositionAnchorType::BeforeChildren); | 441 return Position(anchorNode, PositionAnchorType::BeforeChildren); |
| 442 case PositionAnchorType::BeforeAnchor: | 442 case PositionAnchorType::BeforeAnchor: |
| 443 return positionBeforeNode(anchorNode); | 443 return positionBeforeNode(anchorNode); |
| 444 case PositionAnchorType::OffsetInAnchor: { | 444 case PositionAnchorType::OffsetInAnchor: { |
| 445 int offset = position.offsetInContainerNode(); | 445 int offset = position.offsetInContainerNode(); |
| 446 if (anchorNode->offsetInCharacters()) | 446 if (anchorNode->offsetInCharacters()) |
| 447 return Position(anchorNode, offset); | 447 return Position(anchorNode, offset); |
| 448 Node* child = ComposedTreeTraversal::childAt(*anchorNode, offset); | 448 Node* child = FlatTreeTraversal::childAt(*anchorNode, offset); |
| 449 if (child) | 449 if (child) |
| 450 return Position(child->parentNode(), child->nodeIndex()); | 450 return Position(child->parentNode(), child->nodeIndex()); |
| 451 if (!position.offsetInContainerNode()) | 451 if (!position.offsetInContainerNode()) |
| 452 return Position(anchorNode, PositionAnchorType::BeforeChildren); | 452 return Position(anchorNode, PositionAnchorType::BeforeChildren); |
| 453 | 453 |
| 454 // |child| is null when the position is at the end of the children. | 454 // |child| is null when the position is at the end of the children. |
| 455 // <div>foo|</div> | 455 // <div>foo|</div> |
| 456 return Position(anchorNode, PositionAnchorType::AfterChildren); | 456 return Position(anchorNode, PositionAnchorType::AfterChildren); |
| 457 } | 457 } |
| 458 default: | 458 default: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 template <typename Strategy> | 508 template <typename Strategy> |
| 509 void PositionTemplate<Strategy>::showTreeForThis() const | 509 void PositionTemplate<Strategy>::showTreeForThis() const |
| 510 { | 510 { |
| 511 if (!anchorNode()) | 511 if (!anchorNode()) |
| 512 return; | 512 return; |
| 513 anchorNode()->showTreeForThis(); | 513 anchorNode()->showTreeForThis(); |
| 514 showAnchorTypeAndOffset(); | 514 showAnchorTypeAndOffset(); |
| 515 } | 515 } |
| 516 | 516 |
| 517 template <typename Strategy> | 517 template <typename Strategy> |
| 518 void PositionTemplate<Strategy>::showTreeForThisInComposedTree() const | 518 void PositionTemplate<Strategy>::showTreeForThisInFlatTree() const |
| 519 { | 519 { |
| 520 if (!anchorNode()) | 520 if (!anchorNode()) |
| 521 return; | 521 return; |
| 522 anchorNode()->showTreeForThisInComposedTree(); | 522 anchorNode()->showTreeForThisInFlatTree(); |
| 523 showAnchorTypeAndOffset(); | 523 showAnchorTypeAndOffset(); |
| 524 } | 524 } |
| 525 | 525 |
| 526 #endif | 526 #endif |
| 527 | 527 |
| 528 template class CORE_TEMPLATE_EXPORT PositionTemplate<EditingStrategy>; | 528 template class CORE_TEMPLATE_EXPORT PositionTemplate<EditingStrategy>; |
| 529 template class CORE_TEMPLATE_EXPORT PositionTemplate<EditingInComposedTreeStrate
gy>; | 529 template class CORE_TEMPLATE_EXPORT PositionTemplate<EditingInFlatTreeStrategy>; |
| 530 | 530 |
| 531 } // namespace blink | 531 } // namespace blink |
| 532 | 532 |
| 533 #ifndef NDEBUG | 533 #ifndef NDEBUG |
| 534 | 534 |
| 535 void showTree(const blink::Position& pos) | 535 void showTree(const blink::Position& pos) |
| 536 { | 536 { |
| 537 pos.showTreeForThis(); | 537 pos.showTreeForThis(); |
| 538 } | 538 } |
| 539 | 539 |
| 540 void showTree(const blink::Position* pos) | 540 void showTree(const blink::Position* pos) |
| 541 { | 541 { |
| 542 if (pos) | 542 if (pos) |
| 543 pos->showTreeForThis(); | 543 pos->showTreeForThis(); |
| 544 else | 544 else |
| 545 fprintf(stderr, "Cannot showTree for (nil)\n"); | 545 fprintf(stderr, "Cannot showTree for (nil)\n"); |
| 546 } | 546 } |
| 547 | 547 |
| 548 #endif | 548 #endif |
| OLD | NEW |