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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
47 #include "wtf/unicode/CharacterNames.h" | 47 #include "wtf/unicode/CharacterNames.h" |
48 #include <stdio.h> | 48 #include <stdio.h> |
49 | 49 |
50 namespace blink { | 50 namespace blink { |
51 | 51 |
52 using namespace HTMLNames; | 52 using namespace HTMLNames; |
53 | 53 |
54 static Node* nextRenderedEditable(Node* node) | 54 static Node* nextRenderedEditable(Node* node) |
55 { | 55 { |
56 for (node = node->nextLeafNode(); node; node = node->nextLeafNode()) { | 56 for (node = node->nextLeafNode(); node; node = node->nextLeafNode()) { |
57 LayoutObject* renderer = node->renderer(); | 57 LayoutObject* renderer = node->layoutObject(); |
Julien - ping for review
2015/03/05 16:19:16
Ditto.
| |
58 if (!renderer) | 58 if (!renderer) |
59 continue; | 59 continue; |
60 if (!node->hasEditableStyle()) | 60 if (!node->hasEditableStyle()) |
61 continue; | 61 continue; |
62 if ((renderer->isBox() && toLayoutBox(renderer)->inlineBoxWrapper()) || (renderer->isText() && toLayoutText(renderer)->firstTextBox())) | 62 if ((renderer->isBox() && toLayoutBox(renderer)->inlineBoxWrapper()) || (renderer->isText() && toLayoutText(renderer)->firstTextBox())) |
63 return node; | 63 return node; |
64 } | 64 } |
65 return 0; | 65 return 0; |
66 } | 66 } |
67 | 67 |
68 static Node* previousRenderedEditable(Node* node) | 68 static Node* previousRenderedEditable(Node* node) |
69 { | 69 { |
70 for (node = node->previousLeafNode(); node; node = node->previousLeafNode()) { | 70 for (node = node->previousLeafNode(); node; node = node->previousLeafNode()) { |
71 LayoutObject* renderer = node->renderer(); | 71 LayoutObject* renderer = node->layoutObject(); |
Julien - ping for review
2015/03/05 16:19:16
Ditto (tired of repeating this so no more ditto).
| |
72 if (!renderer) | 72 if (!renderer) |
73 continue; | 73 continue; |
74 if (!node->hasEditableStyle()) | 74 if (!node->hasEditableStyle()) |
75 continue; | 75 continue; |
76 if ((renderer->isBox() && toLayoutBox(renderer)->inlineBoxWrapper()) || (renderer->isText() && toLayoutText(renderer)->firstTextBox())) | 76 if ((renderer->isBox() && toLayoutBox(renderer)->inlineBoxWrapper()) || (renderer->isText() && toLayoutText(renderer)->firstTextBox())) |
77 return node; | 77 return node; |
78 } | 78 } |
79 return 0; | 79 return 0; |
80 } | 80 } |
81 | 81 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 return createLegacyEditingPosition(node, (moveType == Character) ? unche ckedNextOffset(node, offset) : offset + 1); | 357 return createLegacyEditingPosition(node, (moveType == Character) ? unche ckedNextOffset(node, offset) : offset + 1); |
358 } | 358 } |
359 | 359 |
360 if (ContainerNode* parent = node->parentNode()) | 360 if (ContainerNode* parent = node->parentNode()) |
361 return createLegacyEditingPosition(parent, node->nodeIndex() + 1); | 361 return createLegacyEditingPosition(parent, node->nodeIndex() + 1); |
362 return *this; | 362 return *this; |
363 } | 363 } |
364 | 364 |
365 int Position::uncheckedPreviousOffset(const Node* n, int current) | 365 int Position::uncheckedPreviousOffset(const Node* n, int current) |
366 { | 366 { |
367 return n->renderer() ? n->renderer()->previousOffset(current) : current - 1; | 367 return n->layoutObject() ? n->layoutObject()->previousOffset(current) : curr ent - 1; |
368 } | 368 } |
369 | 369 |
370 int Position::uncheckedPreviousOffsetForBackwardDeletion(const Node* n, int curr ent) | 370 int Position::uncheckedPreviousOffsetForBackwardDeletion(const Node* n, int curr ent) |
371 { | 371 { |
372 return n->renderer() ? n->renderer()->previousOffsetForBackwardDeletion(curr ent) : current - 1; | 372 return n->layoutObject() ? n->layoutObject()->previousOffsetForBackwardDelet ion(current) : current - 1; |
373 } | 373 } |
374 | 374 |
375 int Position::uncheckedNextOffset(const Node* n, int current) | 375 int Position::uncheckedNextOffset(const Node* n, int current) |
376 { | 376 { |
377 return n->renderer() ? n->renderer()->nextOffset(current) : current + 1; | 377 return n->layoutObject() ? n->layoutObject()->nextOffset(current) : current + 1; |
378 } | 378 } |
379 | 379 |
380 bool Position::atFirstEditingPositionForNode() const | 380 bool Position::atFirstEditingPositionForNode() const |
381 { | 381 { |
382 if (isNull()) | 382 if (isNull()) |
383 return true; | 383 return true; |
384 // FIXME: Position before anchor shouldn't be considered as at the first edi ting position for node | 384 // FIXME: Position before anchor shouldn't be considered as at the first edi ting position for node |
385 // since that position resides outside of the node. | 385 // since that position resides outside of the node. |
386 switch (m_anchorType) { | 386 switch (m_anchorType) { |
387 case PositionIsOffsetInAnchor: | 387 case PositionIsOffsetInAnchor: |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
456 if (isNull()) | 456 if (isNull()) |
457 return true; | 457 return true; |
458 return !deprecatedNode()->parentNode() && m_offset >= lastOffsetForEditing(d eprecatedNode()); | 458 return !deprecatedNode()->parentNode() && m_offset >= lastOffsetForEditing(d eprecatedNode()); |
459 } | 459 } |
460 | 460 |
461 int Position::renderedOffset() const | 461 int Position::renderedOffset() const |
462 { | 462 { |
463 if (!deprecatedNode()->isTextNode()) | 463 if (!deprecatedNode()->isTextNode()) |
464 return m_offset; | 464 return m_offset; |
465 | 465 |
466 if (!deprecatedNode()->renderer()) | 466 if (!deprecatedNode()->layoutObject()) |
467 return m_offset; | 467 return m_offset; |
468 | 468 |
469 int result = 0; | 469 int result = 0; |
470 LayoutText* textRenderer = toLayoutText(deprecatedNode()->renderer()); | 470 LayoutText* textRenderer = toLayoutText(deprecatedNode()->layoutObject()); |
471 for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { | 471 for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { |
472 int start = box->start(); | 472 int start = box->start(); |
473 int end = box->start() + box->len(); | 473 int end = box->start() + box->len(); |
474 if (m_offset < start) | 474 if (m_offset < start) |
475 return result; | 475 return result; |
476 if (m_offset <= end) { | 476 if (m_offset <= end) { |
477 result += m_offset - start; | 477 result += m_offset - start; |
478 return result; | 478 return result; |
479 } | 479 } |
480 result += box->len(); | 480 result += box->len(); |
481 } | 481 } |
482 return result; | 482 return result; |
483 } | 483 } |
484 | 484 |
485 // Whether or not [node, 0] and [node, lastOffsetForEditing(node)] are their own VisiblePositions. | 485 // Whether or not [node, 0] and [node, lastOffsetForEditing(node)] are their own VisiblePositions. |
486 // If true, adjacent candidates are visually distinct. | 486 // If true, adjacent candidates are visually distinct. |
487 // FIXME: Disregard nodes with renderers that have no height, as we do in isCand idate. | 487 // FIXME: Disregard nodes with renderers that have no height, as we do in isCand idate. |
488 // FIXME: Share code with isCandidate, if possible. | 488 // FIXME: Share code with isCandidate, if possible. |
489 static bool endsOfNodeAreVisuallyDistinctPositions(Node* node) | 489 static bool endsOfNodeAreVisuallyDistinctPositions(Node* node) |
490 { | 490 { |
491 if (!node || !node->renderer()) | 491 if (!node || !node->layoutObject()) |
492 return false; | 492 return false; |
493 | 493 |
494 if (!node->renderer()->isInline()) | 494 if (!node->layoutObject()->isInline()) |
495 return true; | 495 return true; |
496 | 496 |
497 // Don't include inline tables. | 497 // Don't include inline tables. |
498 if (isHTMLTableElement(*node)) | 498 if (isHTMLTableElement(*node)) |
499 return false; | 499 return false; |
500 | 500 |
501 // A Marquee elements are moving so we should assume their ends are always | 501 // A Marquee elements are moving so we should assume their ends are always |
502 // visibily distinct. | 502 // visibily distinct. |
503 if (isHTMLMarqueeElement(*node)) | 503 if (isHTMLMarqueeElement(*node)) |
504 return true; | 504 return true; |
505 | 505 |
506 // There is a VisiblePosition inside an empty inline-block container. | 506 // There is a VisiblePosition inside an empty inline-block container. |
507 return node->renderer()->isReplaced() && canHaveChildrenForEditing(node) && toLayoutBox(node->renderer())->size().height() != 0 && !node->hasChildren(); | 507 return node->layoutObject()->isReplaced() && canHaveChildrenForEditing(node) && toLayoutBox(node->layoutObject())->size().height() != 0 && !node->hasChildre n(); |
508 } | 508 } |
509 | 509 |
510 static Node* enclosingVisualBoundary(Node* node) | 510 static Node* enclosingVisualBoundary(Node* node) |
511 { | 511 { |
512 while (node && !endsOfNodeAreVisuallyDistinctPositions(node)) | 512 while (node && !endsOfNodeAreVisuallyDistinctPositions(node)) |
513 node = node->parentNode(); | 513 node = node->parentNode(); |
514 | 514 |
515 return node; | 515 return node; |
516 } | 516 } |
517 | 517 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
563 } | 563 } |
564 lastNode = currentNode; | 564 lastNode = currentNode; |
565 } | 565 } |
566 | 566 |
567 // If we've moved to a position that is visually distinct, return the la st saved position. There | 567 // If we've moved to a position that is visually distinct, return the la st saved position. There |
568 // is code below that terminates early if we're *about* to move to a vis ually distinct position. | 568 // is code below that terminates early if we're *about* to move to a vis ually distinct position. |
569 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && currentNode ! = boundary) | 569 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && currentNode ! = boundary) |
570 return lastVisible; | 570 return lastVisible; |
571 | 571 |
572 // skip position in unrendered or invisible node | 572 // skip position in unrendered or invisible node |
573 LayoutObject* renderer = currentNode->renderer(); | 573 LayoutObject* renderer = currentNode->layoutObject(); |
574 if (!renderer || renderer->style()->visibility() != VISIBLE) | 574 if (!renderer || renderer->style()->visibility() != VISIBLE) |
575 continue; | 575 continue; |
576 | 576 |
577 if (rule == CanCrossEditingBoundary && boundaryCrossed) { | 577 if (rule == CanCrossEditingBoundary && boundaryCrossed) { |
578 lastVisible = currentPos; | 578 lastVisible = currentPos; |
579 break; | 579 break; |
580 } | 580 } |
581 | 581 |
582 // track last visible streamer position | 582 // track last visible streamer position |
583 if (isStreamer(currentPos)) | 583 if (isStreamer(currentPos)) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
621 | 621 |
622 // The text continues on the next line only if the last text box is not on this line and | 622 // The text continues on the next line only if the last text box is not on this line and |
623 // none of the boxes on this line have a larger start offset. | 623 // none of the boxes on this line have a larger start offset. |
624 | 624 |
625 bool continuesOnNextLine = true; | 625 bool continuesOnNextLine = true; |
626 InlineBox* otherBox = box; | 626 InlineBox* otherBox = box; |
627 while (continuesOnNextLine) { | 627 while (continuesOnNextLine) { |
628 otherBox = otherBox->nextLeafChild(); | 628 otherBox = otherBox->nextLeafChild(); |
629 if (!otherBox) | 629 if (!otherBox) |
630 break; | 630 break; |
631 if (otherBox == lastTextBox || (otherBox->renderer() == text Renderer && toInlineTextBox(otherBox)->start() > textOffset)) | 631 if (otherBox == lastTextBox || (otherBox->layoutObject() == textRenderer && toInlineTextBox(otherBox)->start() > textOffset)) |
632 continuesOnNextLine = false; | 632 continuesOnNextLine = false; |
633 } | 633 } |
634 | 634 |
635 otherBox = box; | 635 otherBox = box; |
636 while (continuesOnNextLine) { | 636 while (continuesOnNextLine) { |
637 otherBox = otherBox->prevLeafChild(); | 637 otherBox = otherBox->prevLeafChild(); |
638 if (!otherBox) | 638 if (!otherBox) |
639 break; | 639 break; |
640 if (otherBox == lastTextBox || (otherBox->renderer() == text Renderer && toInlineTextBox(otherBox)->start() > textOffset)) | 640 if (otherBox == lastTextBox || (otherBox->layoutObject() == textRenderer && toInlineTextBox(otherBox)->start() > textOffset)) |
641 continuesOnNextLine = false; | 641 continuesOnNextLine = false; |
642 } | 642 } |
643 | 643 |
644 if (continuesOnNextLine) | 644 if (continuesOnNextLine) |
645 return currentPos; | 645 return currentPos; |
646 } | 646 } |
647 } | 647 } |
648 } | 648 } |
649 | 649 |
650 return lastVisible; | 650 return lastVisible; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
696 // Do not move to a visually distinct position. | 696 // Do not move to a visually distinct position. |
697 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && currentNode ! = boundary) | 697 if (endsOfNodeAreVisuallyDistinctPositions(currentNode) && currentNode ! = boundary) |
698 return lastVisible; | 698 return lastVisible; |
699 // Do not move past a visually disinct position. | 699 // Do not move past a visually disinct position. |
700 // Note: The first position after the last in a node whose ends are visu ally distinct | 700 // Note: The first position after the last in a node whose ends are visu ally distinct |
701 // positions will be [boundary->parentNode(), originalBlock->nodeIndex() + 1]. | 701 // positions will be [boundary->parentNode(), originalBlock->nodeIndex() + 1]. |
702 if (boundary && boundary->parentNode() == currentNode) | 702 if (boundary && boundary->parentNode() == currentNode) |
703 return lastVisible; | 703 return lastVisible; |
704 | 704 |
705 // skip position in unrendered or invisible node | 705 // skip position in unrendered or invisible node |
706 LayoutObject* renderer = currentNode->renderer(); | 706 LayoutObject* renderer = currentNode->layoutObject(); |
707 if (!renderer || renderer->style()->visibility() != VISIBLE) | 707 if (!renderer || renderer->style()->visibility() != VISIBLE) |
708 continue; | 708 continue; |
709 | 709 |
710 if (rule == CanCrossEditingBoundary && boundaryCrossed) { | 710 if (rule == CanCrossEditingBoundary && boundaryCrossed) { |
711 lastVisible = currentPos; | 711 lastVisible = currentPos; |
712 break; | 712 break; |
713 } | 713 } |
714 | 714 |
715 // track last visible streamer position | 715 // track last visible streamer position |
716 if (isStreamer(currentPos)) | 716 if (isStreamer(currentPos)) |
(...skipping 28 matching lines...) Expand all Loading... | |
745 | 745 |
746 // The text continues on the next line only if the last text box is not on this line and | 746 // The text continues on the next line only if the last text box is not on this line and |
747 // none of the boxes on this line have a larger start offset. | 747 // none of the boxes on this line have a larger start offset. |
748 | 748 |
749 bool continuesOnNextLine = true; | 749 bool continuesOnNextLine = true; |
750 InlineBox* otherBox = box; | 750 InlineBox* otherBox = box; |
751 while (continuesOnNextLine) { | 751 while (continuesOnNextLine) { |
752 otherBox = otherBox->nextLeafChild(); | 752 otherBox = otherBox->nextLeafChild(); |
753 if (!otherBox) | 753 if (!otherBox) |
754 break; | 754 break; |
755 if (otherBox == lastTextBox || (otherBox->renderer() == text Renderer && toInlineTextBox(otherBox)->start() >= textOffset)) | 755 if (otherBox == lastTextBox || (otherBox->layoutObject() == textRenderer && toInlineTextBox(otherBox)->start() >= textOffset)) |
756 continuesOnNextLine = false; | 756 continuesOnNextLine = false; |
757 } | 757 } |
758 | 758 |
759 otherBox = box; | 759 otherBox = box; |
760 while (continuesOnNextLine) { | 760 while (continuesOnNextLine) { |
761 otherBox = otherBox->prevLeafChild(); | 761 otherBox = otherBox->prevLeafChild(); |
762 if (!otherBox) | 762 if (!otherBox) |
763 break; | 763 break; |
764 if (otherBox == lastTextBox || (otherBox->renderer() == text Renderer && toInlineTextBox(otherBox)->start() >= textOffset)) | 764 if (otherBox == lastTextBox || (otherBox->layoutObject() == textRenderer && toInlineTextBox(otherBox)->start() >= textOffset)) |
765 continuesOnNextLine = false; | 765 continuesOnNextLine = false; |
766 } | 766 } |
767 | 767 |
768 if (continuesOnNextLine) | 768 if (continuesOnNextLine) |
769 return currentPos; | 769 return currentPos; |
770 } | 770 } |
771 } | 771 } |
772 } | 772 } |
773 | 773 |
774 return lastVisible; | 774 return lastVisible; |
(...skipping 12 matching lines...) Expand all Loading... | |
787 if ((o->isText() && boundingBoxLogicalHeight(o, toLayoutText(o)->lin esBoundingBox())) | 787 if ((o->isText() && boundingBoxLogicalHeight(o, toLayoutText(o)->lin esBoundingBox())) |
788 || (o->isBox() && toLayoutBox(o)->pixelSnappedLogicalHeight()) | 788 || (o->isBox() && toLayoutBox(o)->pixelSnappedLogicalHeight()) |
789 || (o->isLayoutInline() && isEmptyInline(o) && boundingBoxLogica lHeight(o, toLayoutInline(o)->linesBoundingBox()))) | 789 || (o->isLayoutInline() && isEmptyInline(o) && boundingBoxLogica lHeight(o, toLayoutInline(o)->linesBoundingBox()))) |
790 return true; | 790 return true; |
791 } | 791 } |
792 return false; | 792 return false; |
793 } | 793 } |
794 | 794 |
795 bool Position::nodeIsUserSelectNone(Node* node) | 795 bool Position::nodeIsUserSelectNone(Node* node) |
796 { | 796 { |
797 return node && node->renderer() && !node->renderer()->isSelectable(); | 797 return node && node->layoutObject() && !node->layoutObject()->isSelectable() ; |
798 } | 798 } |
799 | 799 |
800 bool Position::nodeIsUserSelectAll(const Node* node) | 800 bool Position::nodeIsUserSelectAll(const Node* node) |
801 { | 801 { |
802 return RuntimeEnabledFeatures::userSelectAllEnabled() && node && node->rende rer() && node->renderer()->style()->userSelect() == SELECT_ALL; | 802 return RuntimeEnabledFeatures::userSelectAllEnabled() && node && node->layou tObject() && node->layoutObject()->style()->userSelect() == SELECT_ALL; |
803 } | 803 } |
804 | 804 |
805 Node* Position::rootUserSelectAllForNode(Node* node) | 805 Node* Position::rootUserSelectAllForNode(Node* node) |
806 { | 806 { |
807 if (!node || !nodeIsUserSelectAll(node)) | 807 if (!node || !nodeIsUserSelectAll(node)) |
808 return 0; | 808 return 0; |
809 Node* parent = node->parentNode(); | 809 Node* parent = node->parentNode(); |
810 if (!parent) | 810 if (!parent) |
811 return node; | 811 return node; |
812 | 812 |
813 Node* candidateRoot = node; | 813 Node* candidateRoot = node; |
814 while (parent) { | 814 while (parent) { |
815 if (!parent->renderer()) { | 815 if (!parent->layoutObject()) { |
816 parent = parent->parentNode(); | 816 parent = parent->parentNode(); |
817 continue; | 817 continue; |
818 } | 818 } |
819 if (!nodeIsUserSelectAll(parent)) | 819 if (!nodeIsUserSelectAll(parent)) |
820 break; | 820 break; |
821 candidateRoot = parent; | 821 candidateRoot = parent; |
822 parent = candidateRoot->parentNode(); | 822 parent = candidateRoot->parentNode(); |
823 } | 823 } |
824 return candidateRoot; | 824 return candidateRoot; |
825 } | 825 } |
826 | 826 |
827 bool Position::isCandidate() const | 827 bool Position::isCandidate() const |
828 { | 828 { |
829 if (isNull()) | 829 if (isNull()) |
830 return false; | 830 return false; |
831 | 831 |
832 LayoutObject* renderer = deprecatedNode()->renderer(); | 832 LayoutObject* renderer = deprecatedNode()->layoutObject(); |
833 if (!renderer) | 833 if (!renderer) |
834 return false; | 834 return false; |
835 | 835 |
836 if (renderer->style()->visibility() != VISIBLE) | 836 if (renderer->style()->visibility() != VISIBLE) |
837 return false; | 837 return false; |
838 | 838 |
839 if (renderer->isBR()) | 839 if (renderer->isBR()) |
840 // FIXME: The condition should be m_anchorType == PositionIsBeforeAnchor , but for now we still need to support legacy positions. | 840 // FIXME: The condition should be m_anchorType == PositionIsBeforeAnchor , but for now we still need to support legacy positions. |
841 return !m_offset && m_anchorType != PositionIsAfterAnchor && !nodeIsUser SelectNone(deprecatedNode()->parentNode()); | 841 return !m_offset && m_anchorType != PositionIsAfterAnchor && !nodeIsUser SelectNone(deprecatedNode()->parentNode()); |
842 | 842 |
(...skipping 25 matching lines...) Expand all Loading... | |
868 } | 868 } |
869 | 869 |
870 return false; | 870 return false; |
871 } | 871 } |
872 | 872 |
873 bool Position::inRenderedText() const | 873 bool Position::inRenderedText() const |
874 { | 874 { |
875 if (isNull() || !deprecatedNode()->isTextNode()) | 875 if (isNull() || !deprecatedNode()->isTextNode()) |
876 return false; | 876 return false; |
877 | 877 |
878 LayoutObject* renderer = deprecatedNode()->renderer(); | 878 LayoutObject* renderer = deprecatedNode()->layoutObject(); |
879 if (!renderer) | 879 if (!renderer) |
880 return false; | 880 return false; |
881 | 881 |
882 LayoutText* textRenderer = toLayoutText(renderer); | 882 LayoutText* textRenderer = toLayoutText(renderer); |
883 for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { | 883 for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { |
884 if (m_offset < static_cast<int>(box->start()) && !textRenderer->contains ReversedText()) { | 884 if (m_offset < static_cast<int>(box->start()) && !textRenderer->contains ReversedText()) { |
885 // The offset we're looking for is before this node | 885 // The offset we're looking for is before this node |
886 // this means the offset must be in content that is | 886 // this means the offset must be in content that is |
887 // not rendered. Return false. | 887 // not rendered. Return false. |
888 return false; | 888 return false; |
889 } | 889 } |
890 if (box->containsCaretOffset(m_offset)) | 890 if (box->containsCaretOffset(m_offset)) |
891 // Return false for offsets inside composed characters. | 891 // Return false for offsets inside composed characters. |
892 return m_offset == 0 || m_offset == textRenderer->nextOffset(textRen derer->previousOffset(m_offset)); | 892 return m_offset == 0 || m_offset == textRenderer->nextOffset(textRen derer->previousOffset(m_offset)); |
893 } | 893 } |
894 | 894 |
895 return false; | 895 return false; |
896 } | 896 } |
897 | 897 |
898 bool Position::isRenderedCharacter() const | 898 bool Position::isRenderedCharacter() const |
899 { | 899 { |
900 if (isNull() || !deprecatedNode()->isTextNode()) | 900 if (isNull() || !deprecatedNode()->isTextNode()) |
901 return false; | 901 return false; |
902 | 902 |
903 LayoutObject* renderer = deprecatedNode()->renderer(); | 903 LayoutObject* renderer = deprecatedNode()->layoutObject(); |
904 if (!renderer) | 904 if (!renderer) |
905 return false; | 905 return false; |
906 | 906 |
907 LayoutText* textRenderer = toLayoutText(renderer); | 907 LayoutText* textRenderer = toLayoutText(renderer); |
908 for (InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { | 908 for (InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->next TextBox()) { |
909 if (m_offset < static_cast<int>(box->start()) && !textRenderer->contains ReversedText()) { | 909 if (m_offset < static_cast<int>(box->start()) && !textRenderer->contains ReversedText()) { |
910 // The offset we're looking for is before this node | 910 // The offset we're looking for is before this node |
911 // this means the offset must be in content that is | 911 // this means the offset must be in content that is |
912 // not rendered. Return false. | 912 // not rendered. Return false. |
913 return false; | 913 return false; |
914 } | 914 } |
915 if (m_offset >= static_cast<int>(box->start()) && m_offset < static_cast <int>(box->start() + box->len())) | 915 if (m_offset >= static_cast<int>(box->start()) && m_offset < static_cast <int>(box->start() + box->len())) |
916 return true; | 916 return true; |
917 } | 917 } |
918 | 918 |
919 return false; | 919 return false; |
920 } | 920 } |
921 | 921 |
922 bool Position::rendersInDifferentPosition(const Position &pos) const | 922 bool Position::rendersInDifferentPosition(const Position &pos) const |
923 { | 923 { |
924 if (isNull() || pos.isNull()) | 924 if (isNull() || pos.isNull()) |
925 return false; | 925 return false; |
926 | 926 |
927 LayoutObject* renderer = deprecatedNode()->renderer(); | 927 LayoutObject* renderer = deprecatedNode()->layoutObject(); |
928 if (!renderer) | 928 if (!renderer) |
929 return false; | 929 return false; |
930 | 930 |
931 LayoutObject* posRenderer = pos.deprecatedNode()->renderer(); | 931 LayoutObject* posRenderer = pos.deprecatedNode()->layoutObject(); |
932 if (!posRenderer) | 932 if (!posRenderer) |
933 return false; | 933 return false; |
934 | 934 |
935 if (renderer->style()->visibility() != VISIBLE || | 935 if (renderer->style()->visibility() != VISIBLE || |
936 posRenderer->style()->visibility() != VISIBLE) | 936 posRenderer->style()->visibility() != VISIBLE) |
937 return false; | 937 return false; |
938 | 938 |
939 if (deprecatedNode() == pos.deprecatedNode()) { | 939 if (deprecatedNode() == pos.deprecatedNode()) { |
940 if (isHTMLBRElement(*deprecatedNode())) | 940 if (isHTMLBRElement(*deprecatedNode())) |
941 return false; | 941 return false; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1062 while (position != lastPosition) { | 1062 while (position != lastPosition) { |
1063 lastPosition = position; | 1063 lastPosition = position; |
1064 position = position.upstream(CanCrossEditingBoundary); | 1064 position = position.upstream(CanCrossEditingBoundary); |
1065 } | 1065 } |
1066 return position; | 1066 return position; |
1067 } | 1067 } |
1068 | 1068 |
1069 void Position::getInlineBoxAndOffset(EAffinity affinity, TextDirection primaryDi rection, InlineBox*& inlineBox, int& caretOffset) const | 1069 void Position::getInlineBoxAndOffset(EAffinity affinity, TextDirection primaryDi rection, InlineBox*& inlineBox, int& caretOffset) const |
1070 { | 1070 { |
1071 caretOffset = deprecatedEditingOffset(); | 1071 caretOffset = deprecatedEditingOffset(); |
1072 LayoutObject* renderer = deprecatedNode()->renderer(); | 1072 LayoutObject* renderer = deprecatedNode()->layoutObject(); |
1073 | 1073 |
1074 if (!renderer->isText()) { | 1074 if (!renderer->isText()) { |
1075 inlineBox = 0; | 1075 inlineBox = 0; |
1076 if (canHaveChildrenForEditing(deprecatedNode()) && renderer->isLayoutBlo ckFlow() && hasRenderedNonAnonymousDescendantsWithHeight(renderer)) { | 1076 if (canHaveChildrenForEditing(deprecatedNode()) && renderer->isLayoutBlo ckFlow() && hasRenderedNonAnonymousDescendantsWithHeight(renderer)) { |
1077 // Try a visually equivalent position with possibly opposite editabi lity. This helps in case |this| is in | 1077 // Try a visually equivalent position with possibly opposite editabi lity. This helps in case |this| is in |
1078 // an editable block but surrounded by non-editable positions. It ac ts to negate the logic at the beginning | 1078 // an editable block but surrounded by non-editable positions. It ac ts to negate the logic at the beginning |
1079 // of LayoutObject::createVisiblePosition(). | 1079 // of LayoutObject::createVisiblePosition(). |
1080 Position equivalent = downstreamIgnoringEditingBoundaries(*this); | 1080 Position equivalent = downstreamIgnoringEditingBoundaries(*this); |
1081 if (equivalent == *this) { | 1081 if (equivalent == *this) { |
1082 equivalent = upstreamIgnoringEditingBoundaries(*this); | 1082 equivalent = upstreamIgnoringEditingBoundaries(*this); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1218 inlineBox = tertiaryBox; | 1218 inlineBox = tertiaryBox; |
1219 } | 1219 } |
1220 caretOffset = inlineBox->caretRightmostOffset(); | 1220 caretOffset = inlineBox->caretRightmostOffset(); |
1221 } | 1221 } |
1222 } | 1222 } |
1223 } | 1223 } |
1224 | 1224 |
1225 TextDirection Position::primaryDirection() const | 1225 TextDirection Position::primaryDirection() const |
1226 { | 1226 { |
1227 TextDirection primaryDirection = LTR; | 1227 TextDirection primaryDirection = LTR; |
1228 for (const LayoutObject* r = m_anchorNode->renderer(); r; r = r->parent()) { | 1228 for (const LayoutObject* r = m_anchorNode->layoutObject(); r; r = r->parent( )) { |
1229 if (r->isLayoutBlockFlow()) { | 1229 if (r->isLayoutBlockFlow()) { |
1230 primaryDirection = r->style()->direction(); | 1230 primaryDirection = r->style()->direction(); |
1231 break; | 1231 break; |
1232 } | 1232 } |
1233 } | 1233 } |
1234 | 1234 |
1235 return primaryDirection; | 1235 return primaryDirection; |
1236 } | 1236 } |
1237 | 1237 |
1238 DEFINE_TRACE(Position) | 1238 DEFINE_TRACE(Position) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1313 pos.showTreeForThis(); | 1313 pos.showTreeForThis(); |
1314 } | 1314 } |
1315 | 1315 |
1316 void showTree(const blink::Position* pos) | 1316 void showTree(const blink::Position* pos) |
1317 { | 1317 { |
1318 if (pos) | 1318 if (pos) |
1319 pos->showTreeForThis(); | 1319 pos->showTreeForThis(); |
1320 } | 1320 } |
1321 | 1321 |
1322 #endif | 1322 #endif |
OLD | NEW |