| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2008, 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 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 if (hasTextDirection) { | 605 if (hasTextDirection) { |
| 606 // Leave alone an ancestor that provides the desired single level embedd
ing, if there is one. | 606 // Leave alone an ancestor that provides the desired single level embedd
ing, if there is one. |
| 607 HTMLElement* startUnsplitAncestor = splitAncestorsWithUnicodeBidi(start.
deprecatedNode(), true, textDirection); | 607 HTMLElement* startUnsplitAncestor = splitAncestorsWithUnicodeBidi(start.
deprecatedNode(), true, textDirection); |
| 608 HTMLElement* endUnsplitAncestor = splitAncestorsWithUnicodeBidi(end.depr
ecatedNode(), false, textDirection); | 608 HTMLElement* endUnsplitAncestor = splitAncestorsWithUnicodeBidi(end.depr
ecatedNode(), false, textDirection); |
| 609 removeEmbeddingUpToEnclosingBlock(start.deprecatedNode(), startUnsplitAn
cestor); | 609 removeEmbeddingUpToEnclosingBlock(start.deprecatedNode(), startUnsplitAn
cestor); |
| 610 removeEmbeddingUpToEnclosingBlock(end.deprecatedNode(), endUnsplitAncest
or); | 610 removeEmbeddingUpToEnclosingBlock(end.deprecatedNode(), endUnsplitAncest
or); |
| 611 | 611 |
| 612 // Avoid removing the dir attribute and the unicode-bidi and direction p
roperties from the unsplit ancestors. | 612 // Avoid removing the dir attribute and the unicode-bidi and direction p
roperties from the unsplit ancestors. |
| 613 Position embeddingRemoveStart = removeStart; | 613 Position embeddingRemoveStart = removeStart; |
| 614 if (startUnsplitAncestor && nodeFullySelected(startUnsplitAncestor, remo
veStart, end)) | 614 if (startUnsplitAncestor && nodeFullySelected(startUnsplitAncestor, remo
veStart, end)) |
| 615 embeddingRemoveStart = positionInParentAfterNode(startUnsplitAncesto
r); | 615 embeddingRemoveStart = positionInParentAfterNode(*startUnsplitAncest
or); |
| 616 | 616 |
| 617 Position embeddingRemoveEnd = end; | 617 Position embeddingRemoveEnd = end; |
| 618 if (endUnsplitAncestor && nodeFullySelected(endUnsplitAncestor, removeSt
art, end)) | 618 if (endUnsplitAncestor && nodeFullySelected(endUnsplitAncestor, removeSt
art, end)) |
| 619 embeddingRemoveEnd = positionInParentBeforeNode(endUnsplitAncestor).
downstream(); | 619 embeddingRemoveEnd = positionInParentBeforeNode(*endUnsplitAncestor)
.downstream(); |
| 620 | 620 |
| 621 if (embeddingRemoveEnd != removeStart || embeddingRemoveEnd != end) { | 621 if (embeddingRemoveEnd != removeStart || embeddingRemoveEnd != end) { |
| 622 styleWithoutEmbedding = style->copy(); | 622 styleWithoutEmbedding = style->copy(); |
| 623 embeddingStyle = styleWithoutEmbedding->extractAndRemoveTextDirectio
n(); | 623 embeddingStyle = styleWithoutEmbedding->extractAndRemoveTextDirectio
n(); |
| 624 | 624 |
| 625 if (comparePositions(embeddingRemoveStart, embeddingRemoveEnd) <= 0) | 625 if (comparePositions(embeddingRemoveStart, embeddingRemoveEnd) <= 0) |
| 626 removeInlineStyle(embeddingStyle.get(), embeddingRemoveStart, em
beddingRemoveEnd); | 626 removeInlineStyle(embeddingStyle.get(), embeddingRemoveStart, em
beddingRemoveEnd); |
| 627 } | 627 } |
| 628 } | 628 } |
| 629 | 629 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 649 // to check a computed style | 649 // to check a computed style |
| 650 document().updateLayoutIgnorePendingStylesheets(); | 650 document().updateLayoutIgnorePendingStylesheets(); |
| 651 | 651 |
| 652 RefPtr<EditingStyle> styleToApply = style; | 652 RefPtr<EditingStyle> styleToApply = style; |
| 653 if (hasTextDirection) { | 653 if (hasTextDirection) { |
| 654 // Avoid applying the unicode-bidi and direction properties beneath ance
stors that already have them. | 654 // Avoid applying the unicode-bidi and direction properties beneath ance
stors that already have them. |
| 655 Node* embeddingStartNode = highestEmbeddingAncestor(start.deprecatedNode
(), enclosingBlock(start.deprecatedNode())); | 655 Node* embeddingStartNode = highestEmbeddingAncestor(start.deprecatedNode
(), enclosingBlock(start.deprecatedNode())); |
| 656 Node* embeddingEndNode = highestEmbeddingAncestor(end.deprecatedNode(),
enclosingBlock(end.deprecatedNode())); | 656 Node* embeddingEndNode = highestEmbeddingAncestor(end.deprecatedNode(),
enclosingBlock(end.deprecatedNode())); |
| 657 | 657 |
| 658 if (embeddingStartNode || embeddingEndNode) { | 658 if (embeddingStartNode || embeddingEndNode) { |
| 659 Position embeddingApplyStart = embeddingStartNode ? positionInParent
AfterNode(embeddingStartNode) : start; | 659 Position embeddingApplyStart = embeddingStartNode ? positionInParent
AfterNode(*embeddingStartNode) : start; |
| 660 Position embeddingApplyEnd = embeddingEndNode ? positionInParentBefo
reNode(embeddingEndNode) : end; | 660 Position embeddingApplyEnd = embeddingEndNode ? positionInParentBefo
reNode(*embeddingEndNode) : end; |
| 661 ASSERT(embeddingApplyStart.isNotNull() && embeddingApplyEnd.isNotNul
l()); | 661 ASSERT(embeddingApplyStart.isNotNull() && embeddingApplyEnd.isNotNul
l()); |
| 662 | 662 |
| 663 if (!embeddingStyle) { | 663 if (!embeddingStyle) { |
| 664 styleWithoutEmbedding = style->copy(); | 664 styleWithoutEmbedding = style->copy(); |
| 665 embeddingStyle = styleWithoutEmbedding->extractAndRemoveTextDire
ction(); | 665 embeddingStyle = styleWithoutEmbedding->extractAndRemoveTextDire
ction(); |
| 666 } | 666 } |
| 667 fixRangeAndApplyInlineStyle(embeddingStyle.get(), embeddingApplyStar
t, embeddingApplyEnd); | 667 fixRangeAndApplyInlineStyle(embeddingStyle.get(), embeddingApplyStar
t, embeddingApplyEnd); |
| 668 | 668 |
| 669 styleToApply = styleWithoutEmbedding; | 669 styleToApply = styleWithoutEmbedding; |
| 670 } | 670 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 697 // if they want style applied to the empty line. | 697 // if they want style applied to the empty line. |
| 698 if (start == end && start.deprecatedNode()->hasTagName(brTag)) | 698 if (start == end && start.deprecatedNode()->hasTagName(brTag)) |
| 699 pastEndNode = NodeTraversal::next(*start.deprecatedNode()); | 699 pastEndNode = NodeTraversal::next(*start.deprecatedNode()); |
| 700 | 700 |
| 701 // Start from the highest fully selected ancestor so that we can modify the
fully selected node. | 701 // Start from the highest fully selected ancestor so that we can modify the
fully selected node. |
| 702 // e.g. When applying font-size: large on <font color="blue">hello</font>, w
e need to include the font element in our run | 702 // e.g. When applying font-size: large on <font color="blue">hello</font>, w
e need to include the font element in our run |
| 703 // to generate <font color="blue" size="4">hello</font> instead of <font col
or="blue"><font size="4">hello</font></font> | 703 // to generate <font color="blue" size="4">hello</font> instead of <font col
or="blue"><font size="4">hello</font></font> |
| 704 RefPtr<Range> range = Range::create(startNode->document(), start, end); | 704 RefPtr<Range> range = Range::create(startNode->document(), start, end); |
| 705 Element* editableRoot = startNode->rootEditableElement(); | 705 Element* editableRoot = startNode->rootEditableElement(); |
| 706 if (startNode != editableRoot) { | 706 if (startNode != editableRoot) { |
| 707 while (editableRoot && startNode->parentNode() != editableRoot && isNode
VisiblyContainedWithin(startNode->parentNode(), range.get())) | 707 while (editableRoot && startNode->parentNode() != editableRoot && isNode
VisiblyContainedWithin(*startNode->parentNode(), *range)) |
| 708 startNode = startNode->parentNode(); | 708 startNode = startNode->parentNode(); |
| 709 } | 709 } |
| 710 | 710 |
| 711 applyInlineStyleToNodeRange(style, startNode, pastEndNode); | 711 applyInlineStyleToNodeRange(style, startNode, pastEndNode); |
| 712 } | 712 } |
| 713 | 713 |
| 714 static bool containsNonEditableRegion(Node& node) | 714 static bool containsNonEditableRegion(Node& node) |
| 715 { | 715 { |
| 716 if (!node.rendererIsEditable()) | 716 if (!node.rendererIsEditable()) |
| 717 return true; | 717 return true; |
| (...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1542 String textToMove = nextText->data(); | 1542 String textToMove = nextText->data(); |
| 1543 insertTextIntoNode(childText, childText->length(), textToMove); | 1543 insertTextIntoNode(childText, childText->length(), textToMove); |
| 1544 removeNode(next); | 1544 removeNode(next); |
| 1545 // don't move child node pointer. it may want to merge with more text no
des. | 1545 // don't move child node pointer. it may want to merge with more text no
des. |
| 1546 } | 1546 } |
| 1547 | 1547 |
| 1548 updateStartEnd(newStart, newEnd); | 1548 updateStartEnd(newStart, newEnd); |
| 1549 } | 1549 } |
| 1550 | 1550 |
| 1551 } | 1551 } |
| OLD | NEW |