| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2010 Google Inc. All rights reserved. | 3 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 DCHECK(!endOfSelection.isNull()); | 87 DCHECK(!endOfSelection.isNull()); |
| 88 ContainerNode* startScope = nullptr; | 88 ContainerNode* startScope = nullptr; |
| 89 int startIndex = indexForVisiblePosition(startOfSelection, startScope); | 89 int startIndex = indexForVisiblePosition(startOfSelection, startScope); |
| 90 ContainerNode* endScope = nullptr; | 90 ContainerNode* endScope = nullptr; |
| 91 int endIndex = indexForVisiblePosition(endOfSelection, endScope); | 91 int endIndex = indexForVisiblePosition(endOfSelection, endScope); |
| 92 | 92 |
| 93 formatSelection(startOfSelection, endOfSelection, editingState); | 93 formatSelection(startOfSelection, endOfSelection, editingState); |
| 94 if (editingState->isAborted()) | 94 if (editingState->isAborted()) |
| 95 return; | 95 return; |
| 96 | 96 |
| 97 document().updateLayoutIgnorePendingStylesheets(); | 97 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
| 98 | 98 |
| 99 DCHECK_EQ(startScope, endScope); | 99 DCHECK_EQ(startScope, endScope); |
| 100 DCHECK_GE(startIndex, 0); | 100 DCHECK_GE(startIndex, 0); |
| 101 DCHECK_LE(startIndex, endIndex); | 101 DCHECK_LE(startIndex, endIndex); |
| 102 if (startScope == endScope && startIndex >= 0 && startIndex <= endIndex) { | 102 if (startScope == endScope && startIndex >= 0 && startIndex <= endIndex) { |
| 103 VisiblePosition start(visiblePositionForIndex(startIndex, startScope)); | 103 VisiblePosition start(visiblePositionForIndex(startIndex, startScope)); |
| 104 VisiblePosition end(visiblePositionForIndex(endIndex, endScope)); | 104 VisiblePosition end(visiblePositionForIndex(endIndex, endScope)); |
| 105 if (start.isNotNull() && end.isNotNull()) | 105 if (start.isNotNull() && end.isNotNull()) |
| 106 setEndingSelection(VisibleSelection(start, end, endingSelection().is
Directional())); | 106 setEndingSelection(VisibleSelection(start, end, endingSelection().is
Directional())); |
| 107 } | 107 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 if (!position.isOffsetInAnchor() || !position.computeContainerNode() || !pos
ition.computeContainerNode()->isTextNode()) | 185 if (!position.isOffsetInAnchor() || !position.computeContainerNode() || !pos
ition.computeContainerNode()->isTextNode()) |
| 186 return 0; | 186 return 0; |
| 187 return position.computeContainerNode()->computedStyle(); | 187 return position.computeContainerNode()->computedStyle(); |
| 188 } | 188 } |
| 189 | 189 |
| 190 void ApplyBlockElementCommand::rangeForParagraphSplittingTextNodesIfNeeded(const
VisiblePosition& endOfCurrentParagraph, Position& start, Position& end) | 190 void ApplyBlockElementCommand::rangeForParagraphSplittingTextNodesIfNeeded(const
VisiblePosition& endOfCurrentParagraph, Position& start, Position& end) |
| 191 { | 191 { |
| 192 start = startOfParagraph(endOfCurrentParagraph).deepEquivalent(); | 192 start = startOfParagraph(endOfCurrentParagraph).deepEquivalent(); |
| 193 end = endOfCurrentParagraph.deepEquivalent(); | 193 end = endOfCurrentParagraph.deepEquivalent(); |
| 194 | 194 |
| 195 document().updateLayoutTree(); | 195 document().updateStyleAndLayoutTree(); |
| 196 | 196 |
| 197 bool isStartAndEndOnSameNode = false; | 197 bool isStartAndEndOnSameNode = false; |
| 198 if (const ComputedStyle* startStyle = computedStyleOfEnclosingTextNode(start
)) { | 198 if (const ComputedStyle* startStyle = computedStyleOfEnclosingTextNode(start
)) { |
| 199 isStartAndEndOnSameNode = computedStyleOfEnclosingTextNode(end) && start
.computeContainerNode() == end.computeContainerNode(); | 199 isStartAndEndOnSameNode = computedStyleOfEnclosingTextNode(end) && start
.computeContainerNode() == end.computeContainerNode(); |
| 200 bool isStartAndEndOfLastParagraphOnSameNode = computedStyleOfEnclosingTe
xtNode(m_endOfLastParagraph) && start.computeContainerNode() == m_endOfLastParag
raph.computeContainerNode(); | 200 bool isStartAndEndOfLastParagraphOnSameNode = computedStyleOfEnclosingTe
xtNode(m_endOfLastParagraph) && start.computeContainerNode() == m_endOfLastParag
raph.computeContainerNode(); |
| 201 | 201 |
| 202 // Avoid obtanining the start of next paragraph for start | 202 // Avoid obtanining the start of next paragraph for start |
| 203 // TODO(yosin) We should use |PositionMoveType::CodePoint| for | 203 // TODO(yosin) We should use |PositionMoveType::CodePoint| for |
| 204 // |previousPositionOf()|. | 204 // |previousPositionOf()|. |
| 205 if (startStyle->preserveNewline() && isNewLineAtPosition(start) && !isNe
wLineAtPosition(previousPositionOf(start, PositionMoveType::CodeUnit)) && start.
offsetInContainerNode() > 0) | 205 if (startStyle->preserveNewline() && isNewLineAtPosition(start) && !isNe
wLineAtPosition(previousPositionOf(start, PositionMoveType::CodeUnit)) && start.
offsetInContainerNode() > 0) |
| 206 start = startOfParagraph(createVisiblePosition(previousPositionOf(en
d, PositionMoveType::CodeUnit))).deepEquivalent(); | 206 start = startOfParagraph(createVisiblePosition(previousPositionOf(en
d, PositionMoveType::CodeUnit))).deepEquivalent(); |
| 207 | 207 |
| 208 // If start is in the middle of a text node, split. | 208 // If start is in the middle of a text node, split. |
| 209 if (!startStyle->collapseWhiteSpace() && start.offsetInContainerNode() >
0) { | 209 if (!startStyle->collapseWhiteSpace() && start.offsetInContainerNode() >
0) { |
| 210 int startOffset = start.offsetInContainerNode(); | 210 int startOffset = start.offsetInContainerNode(); |
| 211 Text* startText = toText(start.computeContainerNode()); | 211 Text* startText = toText(start.computeContainerNode()); |
| 212 splitTextNode(startText, startOffset); | 212 splitTextNode(startText, startOffset); |
| 213 start = firstPositionInNode(startText); | 213 start = firstPositionInNode(startText); |
| 214 if (isStartAndEndOnSameNode) { | 214 if (isStartAndEndOnSameNode) { |
| 215 DCHECK_GE(end.offsetInContainerNode(), startOffset); | 215 DCHECK_GE(end.offsetInContainerNode(), startOffset); |
| 216 end = Position(startText, end.offsetInContainerNode() - startOff
set); | 216 end = Position(startText, end.offsetInContainerNode() - startOff
set); |
| 217 } | 217 } |
| 218 if (isStartAndEndOfLastParagraphOnSameNode) { | 218 if (isStartAndEndOfLastParagraphOnSameNode) { |
| 219 DCHECK_GE(m_endOfLastParagraph.offsetInContainerNode(), startOff
set); | 219 DCHECK_GE(m_endOfLastParagraph.offsetInContainerNode(), startOff
set); |
| 220 m_endOfLastParagraph = Position(startText, m_endOfLastParagraph.
offsetInContainerNode() - startOffset); | 220 m_endOfLastParagraph = Position(startText, m_endOfLastParagraph.
offsetInContainerNode() - startOffset); |
| 221 } | 221 } |
| 222 } | 222 } |
| 223 } | 223 } |
| 224 | 224 |
| 225 document().updateLayoutTree(); | 225 document().updateStyleAndLayoutTree(); |
| 226 | 226 |
| 227 if (const ComputedStyle* endStyle = computedStyleOfEnclosingTextNode(end)) { | 227 if (const ComputedStyle* endStyle = computedStyleOfEnclosingTextNode(end)) { |
| 228 bool isEndAndEndOfLastParagraphOnSameNode = computedStyleOfEnclosingText
Node(m_endOfLastParagraph) && end.anchorNode() == m_endOfLastParagraph.anchorNod
e(); | 228 bool isEndAndEndOfLastParagraphOnSameNode = computedStyleOfEnclosingText
Node(m_endOfLastParagraph) && end.anchorNode() == m_endOfLastParagraph.anchorNod
e(); |
| 229 // Include \n at the end of line if we're at an empty paragraph | 229 // Include \n at the end of line if we're at an empty paragraph |
| 230 if (endStyle->preserveNewline() && start == end && end.offsetInContainer
Node() < end.computeContainerNode()->maxCharacterOffset()) { | 230 if (endStyle->preserveNewline() && start == end && end.offsetInContainer
Node() < end.computeContainerNode()->maxCharacterOffset()) { |
| 231 int endOffset = end.offsetInContainerNode(); | 231 int endOffset = end.offsetInContainerNode(); |
| 232 // TODO(yosin) We should use |PositionMoveType::CodePoint| for | 232 // TODO(yosin) We should use |PositionMoveType::CodePoint| for |
| 233 // |previousPositionOf()|. | 233 // |previousPositionOf()|. |
| 234 if (!isNewLineAtPosition(previousPositionOf(end, PositionMoveType::C
odeUnit)) && isNewLineAtPosition(end)) | 234 if (!isNewLineAtPosition(previousPositionOf(end, PositionMoveType::C
odeUnit)) && isNewLineAtPosition(end)) |
| 235 end = Position(end.computeContainerNode(), endOffset + 1); | 235 end = Position(end.computeContainerNode(), endOffset + 1); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 return element; | 301 return element; |
| 302 } | 302 } |
| 303 | 303 |
| 304 DEFINE_TRACE(ApplyBlockElementCommand) | 304 DEFINE_TRACE(ApplyBlockElementCommand) |
| 305 { | 305 { |
| 306 visitor->trace(m_endOfLastParagraph); | 306 visitor->trace(m_endOfLastParagraph); |
| 307 CompositeEditCommand::trace(visitor); | 307 CompositeEditCommand::trace(visitor); |
| 308 } | 308 } |
| 309 | 309 |
| 310 } // namespace blink | 310 } // namespace blink |
| OLD | NEW |