 Chromium Code Reviews
 Chromium Code Reviews Issue 977113003:
  Rename renderer() to layoutObject().  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk
    
  
    Issue 977113003:
  Rename renderer() to layoutObject().  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk| 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 |