OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2005 Apple Computer, 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 20 matching lines...) Expand all Loading... |
31 #include "core/dom/Element.h" | 31 #include "core/dom/Element.h" |
32 #include "core/dom/NodeTraversal.h" | 32 #include "core/dom/NodeTraversal.h" |
33 #include "core/dom/Text.h" | 33 #include "core/dom/Text.h" |
34 #include "core/editing/EditingBoundary.h" | 34 #include "core/editing/EditingBoundary.h" |
35 #include "core/editing/Editor.h" | 35 #include "core/editing/Editor.h" |
36 #include "core/editing/VisibleUnits.h" | 36 #include "core/editing/VisibleUnits.h" |
37 #include "core/editing/htmlediting.h" | 37 #include "core/editing/htmlediting.h" |
38 #include "core/frame/LocalFrame.h" | 38 #include "core/frame/LocalFrame.h" |
39 #include "core/html/HTMLBRElement.h" | 39 #include "core/html/HTMLBRElement.h" |
40 #include "core/html/HTMLInputElement.h" | 40 #include "core/html/HTMLInputElement.h" |
| 41 #include "core/html/HTMLStyleElement.h" |
| 42 #include "core/html/HTMLTableRowElement.h" |
41 #include "core/rendering/RenderTableCell.h" | 43 #include "core/rendering/RenderTableCell.h" |
42 #include "core/rendering/RenderText.h" | 44 #include "core/rendering/RenderText.h" |
43 | 45 |
44 namespace blink { | 46 namespace blink { |
45 | 47 |
46 using namespace HTMLNames; | 48 using namespace HTMLNames; |
47 | 49 |
48 static bool isTableCellEmpty(Node* cell) | 50 static bool isTableCellEmpty(Node* cell) |
49 { | 51 { |
50 ASSERT(isTableCell(cell)); | 52 ASSERT(isTableCell(cell)); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 end = lastEditablePositionBeforePositionInRoot(end, highestEditableRoot(
start)); | 173 end = lastEditablePositionBeforePositionInRoot(end, highestEditableRoot(
start)); |
172 | 174 |
173 m_upstreamStart = start.upstream(); | 175 m_upstreamStart = start.upstream(); |
174 m_downstreamStart = start.downstream(); | 176 m_downstreamStart = start.downstream(); |
175 m_upstreamEnd = end.upstream(); | 177 m_upstreamEnd = end.upstream(); |
176 m_downstreamEnd = end.downstream(); | 178 m_downstreamEnd = end.downstream(); |
177 | 179 |
178 m_startRoot = editableRootForPosition(start); | 180 m_startRoot = editableRootForPosition(start); |
179 m_endRoot = editableRootForPosition(end); | 181 m_endRoot = editableRootForPosition(end); |
180 | 182 |
181 m_startTableRow = enclosingNodeOfType(start, &isHTMLTableRowElement); | 183 m_startTableRow = toHTMLTableRowElement(enclosingNodeOfType(start, &isHTMLTa
bleRowElement)); |
182 m_endTableRow = enclosingNodeOfType(end, &isHTMLTableRowElement); | 184 m_endTableRow = toHTMLTableRowElement(enclosingNodeOfType(end, &isHTMLTableR
owElement)); |
183 | 185 |
184 // Don't move content out of a table cell. | 186 // Don't move content out of a table cell. |
185 // If the cell is non-editable, enclosingNodeOfType won't return it by defau
lt, so | 187 // If the cell is non-editable, enclosingNodeOfType won't return it by defau
lt, so |
186 // tell that function that we don't care if it returns non-editable nodes. | 188 // tell that function that we don't care if it returns non-editable nodes. |
187 Node* startCell = enclosingNodeOfType(m_upstreamStart, &isTableCell, CanCros
sEditingBoundary); | 189 Node* startCell = enclosingNodeOfType(m_upstreamStart, &isTableCell, CanCros
sEditingBoundary); |
188 Node* endCell = enclosingNodeOfType(m_downstreamEnd, &isTableCell, CanCrossE
ditingBoundary); | 190 Node* endCell = enclosingNodeOfType(m_downstreamEnd, &isTableCell, CanCrossE
ditingBoundary); |
189 // FIXME: This isn't right. A borderless table with two rows and a single c
olumn would appear as two paragraphs. | 191 // FIXME: This isn't right. A borderless table with two rows and a single c
olumn would appear as two paragraphs. |
190 if (endCell && endCell != startCell) | 192 if (endCell && endCell != startCell) |
191 m_mergeBlocksAfterDelete = false; | 193 m_mergeBlocksAfterDelete = false; |
192 | 194 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 } | 395 } |
394 | 396 |
395 // FIXME: Update the endpoints of the range being deleted. | 397 // FIXME: Update the endpoints of the range being deleted. |
396 updatePositionForNodeRemoval(m_endingPosition, *node); | 398 updatePositionForNodeRemoval(m_endingPosition, *node); |
397 updatePositionForNodeRemoval(m_leadingWhitespace, *node); | 399 updatePositionForNodeRemoval(m_leadingWhitespace, *node); |
398 updatePositionForNodeRemoval(m_trailingWhitespace, *node); | 400 updatePositionForNodeRemoval(m_trailingWhitespace, *node); |
399 | 401 |
400 CompositeEditCommand::removeNode(node, shouldAssumeContentIsAlwaysEditable); | 402 CompositeEditCommand::removeNode(node, shouldAssumeContentIsAlwaysEditable); |
401 } | 403 } |
402 | 404 |
403 static void updatePositionForTextRemoval(Node* node, int offset, int count, Posi
tion& position) | 405 static void updatePositionForTextRemoval(Text* node, int offset, int count, Posi
tion& position) |
404 { | 406 { |
405 if (position.anchorType() != Position::PositionIsOffsetInAnchor || position.
containerNode() != node) | 407 if (position.anchorType() != Position::PositionIsOffsetInAnchor || position.
containerNode() != node) |
406 return; | 408 return; |
407 | 409 |
408 if (position.offsetInContainerNode() > offset + count) | 410 if (position.offsetInContainerNode() > offset + count) |
409 position.moveToOffset(position.offsetInContainerNode() - count); | 411 position.moveToOffset(position.offsetInContainerNode() - count); |
410 else if (position.offsetInContainerNode() > offset) | 412 else if (position.offsetInContainerNode() > offset) |
411 position.moveToOffset(offset); | 413 position.moveToOffset(offset); |
412 } | 414 } |
413 | 415 |
414 void DeleteSelectionCommand::deleteTextFromNode(PassRefPtrWillBeRawPtr<Text> nod
e, unsigned offset, unsigned count) | 416 void DeleteSelectionCommand::deleteTextFromNode(PassRefPtrWillBeRawPtr<Text> nod
e, unsigned offset, unsigned count) |
415 { | 417 { |
416 // FIXME: Update the endpoints of the range being deleted. | 418 // FIXME: Update the endpoints of the range being deleted. |
417 updatePositionForTextRemoval(node.get(), offset, count, m_endingPosition); | 419 updatePositionForTextRemoval(node.get(), offset, count, m_endingPosition); |
418 updatePositionForTextRemoval(node.get(), offset, count, m_leadingWhitespace)
; | 420 updatePositionForTextRemoval(node.get(), offset, count, m_leadingWhitespace)
; |
419 updatePositionForTextRemoval(node.get(), offset, count, m_trailingWhitespace
); | 421 updatePositionForTextRemoval(node.get(), offset, count, m_trailingWhitespace
); |
420 updatePositionForTextRemoval(node.get(), offset, count, m_downstreamEnd); | 422 updatePositionForTextRemoval(node.get(), offset, count, m_downstreamEnd); |
421 | 423 |
422 CompositeEditCommand::deleteTextFromNode(node, offset, count); | 424 CompositeEditCommand::deleteTextFromNode(node, offset, count); |
423 } | 425 } |
424 | 426 |
425 void DeleteSelectionCommand::makeStylingElementsDirectChildrenOfEditableRootToPr
eventStyleLoss() | 427 void DeleteSelectionCommand::makeStylingElementsDirectChildrenOfEditableRootToPr
eventStyleLoss() |
426 { | 428 { |
427 RefPtrWillBeRawPtr<Range> range = m_selectionToDelete.toNormalizedRange(); | 429 RefPtrWillBeRawPtr<Range> range = m_selectionToDelete.toNormalizedRange(); |
428 RefPtrWillBeRawPtr<Node> node = range->firstNode(); | 430 RefPtrWillBeRawPtr<Node> node = range->firstNode(); |
429 while (node && node != range->pastLastNode()) { | 431 while (node && node != range->pastLastNode()) { |
430 RefPtrWillBeRawPtr<Node> nextNode = NodeTraversal::next(*node); | 432 RefPtrWillBeRawPtr<Node> nextNode = NodeTraversal::next(*node); |
431 if ((isHTMLStyleElement(*node) && !(toElement(node)->hasAttribute(scoped
Attr))) || isHTMLLinkElement(*node)) { | 433 if ((isHTMLStyleElement(*node) && !toHTMLStyleElement(node)->hasAttribut
e(scopedAttr)) |
| 434 || isHTMLLinkElement(*node)) { |
432 nextNode = NodeTraversal::nextSkippingChildren(*node); | 435 nextNode = NodeTraversal::nextSkippingChildren(*node); |
433 RefPtrWillBeRawPtr<ContainerNode> rootEditableElement = node->rootEd
itableElement(); | 436 RefPtrWillBeRawPtr<Element> rootEditableElement = node->rootEditable
Element(); |
434 if (rootEditableElement.get()) { | 437 if (rootEditableElement.get()) { |
435 removeNode(node); | 438 removeNode(node); |
436 appendNode(node, rootEditableElement); | 439 appendNode(node, rootEditableElement); |
437 } | 440 } |
438 } | 441 } |
439 node = nextNode; | 442 node = nextNode; |
440 } | 443 } |
441 } | 444 } |
442 | 445 |
443 void DeleteSelectionCommand::handleGeneralDelete() | 446 void DeleteSelectionCommand::handleGeneralDelete() |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 m_downstreamEnd.clear(); | 754 m_downstreamEnd.clear(); |
752 m_endingPosition.clear(); | 755 m_endingPosition.clear(); |
753 m_leadingWhitespace.clear(); | 756 m_leadingWhitespace.clear(); |
754 m_trailingWhitespace.clear(); | 757 m_trailingWhitespace.clear(); |
755 } | 758 } |
756 | 759 |
757 // This method removes div elements with no attributes that have only one child
or no children at all. | 760 // This method removes div elements with no attributes that have only one child
or no children at all. |
758 void DeleteSelectionCommand::removeRedundantBlocks() | 761 void DeleteSelectionCommand::removeRedundantBlocks() |
759 { | 762 { |
760 Node* node = m_endingPosition.containerNode(); | 763 Node* node = m_endingPosition.containerNode(); |
761 Node* rootNode = node->rootEditableElement(); | 764 Element* rootElement = node->rootEditableElement(); |
762 | 765 |
763 while (node != rootNode) { | 766 while (node != rootElement) { |
764 if (isRemovableBlock(node)) { | 767 if (isRemovableBlock(node)) { |
765 if (node == m_endingPosition.anchorNode()) | 768 if (node == m_endingPosition.anchorNode()) |
766 updatePositionForNodeRemovalPreservingChildren(m_endingPosition,
*node); | 769 updatePositionForNodeRemovalPreservingChildren(m_endingPosition,
*node); |
767 | 770 |
768 CompositeEditCommand::removeNodePreservingChildren(node); | 771 CompositeEditCommand::removeNodePreservingChildren(node); |
769 node = m_endingPosition.anchorNode(); | 772 node = m_endingPosition.anchorNode(); |
770 } else | 773 } else |
771 node = node->parentNode(); | 774 node = node->parentNode(); |
772 } | 775 } |
773 } | 776 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 visitor->trace(m_deleteIntoBlockquoteStyle); | 889 visitor->trace(m_deleteIntoBlockquoteStyle); |
887 visitor->trace(m_startRoot); | 890 visitor->trace(m_startRoot); |
888 visitor->trace(m_endRoot); | 891 visitor->trace(m_endRoot); |
889 visitor->trace(m_startTableRow); | 892 visitor->trace(m_startTableRow); |
890 visitor->trace(m_endTableRow); | 893 visitor->trace(m_endTableRow); |
891 visitor->trace(m_temporaryPlaceholder); | 894 visitor->trace(m_temporaryPlaceholder); |
892 CompositeEditCommand::trace(visitor); | 895 CompositeEditCommand::trace(visitor); |
893 } | 896 } |
894 | 897 |
895 } // namespace blink | 898 } // namespace blink |
OLD | NEW |