OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 // Breaking the blockquote would also break apart the table, which is uneces
sary when inserting a newline | 379 // Breaking the blockquote would also break apart the table, which is uneces
sary when inserting a newline |
380 if (enclosingNodeOfType(endingSelection().start(), &isTableStructureNode)) { | 380 if (enclosingNodeOfType(endingSelection().start(), &isTableStructureNode)) { |
381 insertParagraphSeparator(); | 381 insertParagraphSeparator(); |
382 return; | 382 return; |
383 } | 383 } |
384 | 384 |
385 applyCommandToComposite(BreakBlockquoteCommand::create(document())); | 385 applyCommandToComposite(BreakBlockquoteCommand::create(document())); |
386 typingAddedToOpenCommand(InsertParagraphSeparatorInQuotedContent); | 386 typingAddedToOpenCommand(InsertParagraphSeparatorInQuotedContent); |
387 } | 387 } |
388 | 388 |
389 bool TypingCommand::makeEditableRootEmpty() | 389 bool TypingCommand::makeEditableRootEmpty(EditingState* editingState) |
390 { | 390 { |
391 Element* root = endingSelection().rootEditableElement(); | 391 Element* root = endingSelection().rootEditableElement(); |
392 if (!root || !root->hasChildren()) | 392 if (!root || !root->hasChildren()) |
393 return false; | 393 return false; |
394 | 394 |
395 if (root->firstChild() == root->lastChild()) { | 395 if (root->firstChild() == root->lastChild()) { |
396 if (isHTMLBRElement(root->firstChild())) { | 396 if (isHTMLBRElement(root->firstChild())) { |
397 // If there is a single child and it could be a placeholder, leave i
t alone. | 397 // If there is a single child and it could be a placeholder, leave i
t alone. |
398 if (root->layoutObject() && root->layoutObject()->isLayoutBlockFlow(
)) | 398 if (root->layoutObject() && root->layoutObject()->isLayoutBlockFlow(
)) |
399 return false; | 399 return false; |
400 } | 400 } |
401 } | 401 } |
402 | 402 |
403 while (Node* child = root->firstChild()) | 403 while (Node* child = root->firstChild()) { |
404 removeNode(child); | 404 removeNode(child, editingState); |
| 405 if (editingState->isAborted()) |
| 406 return false; |
| 407 } |
405 | 408 |
406 addBlockPlaceholderIfNeeded(root); | 409 addBlockPlaceholderIfNeeded(root); |
407 setEndingSelection(VisibleSelection(firstPositionInNode(root), TextAffinity:
:Downstream, endingSelection().isDirectional())); | 410 setEndingSelection(VisibleSelection(firstPositionInNode(root), TextAffinity:
:Downstream, endingSelection().isDirectional())); |
408 | 411 |
409 return true; | 412 return true; |
410 } | 413 } |
411 | 414 |
412 void TypingCommand::deleteKeyPressed(TextGranularity granularity, bool killRing,
EditingState* editingState) | 415 void TypingCommand::deleteKeyPressed(TextGranularity granularity, bool killRing,
EditingState* editingState) |
413 { | 416 { |
414 LocalFrame* frame = document().frame(); | 417 LocalFrame* frame = document().frame(); |
415 if (!frame) | 418 if (!frame) |
416 return; | 419 return; |
417 | 420 |
418 frame->spellChecker().updateMarkersForWordsAffectedByEditing(false); | 421 frame->spellChecker().updateMarkersForWordsAffectedByEditing(false); |
419 | 422 |
420 VisibleSelection selectionToDelete; | 423 VisibleSelection selectionToDelete; |
421 VisibleSelection selectionAfterUndo; | 424 VisibleSelection selectionAfterUndo; |
422 | 425 |
423 switch (endingSelection().selectionType()) { | 426 switch (endingSelection().selectionType()) { |
424 case RangeSelection: | 427 case RangeSelection: |
425 selectionToDelete = endingSelection(); | 428 selectionToDelete = endingSelection(); |
426 selectionAfterUndo = selectionToDelete; | 429 selectionAfterUndo = selectionToDelete; |
427 break; | 430 break; |
428 case CaretSelection: { | 431 case CaretSelection: { |
429 // After breaking out of an empty mail blockquote, we still want continu
e with the deletion | 432 // After breaking out of an empty mail blockquote, we still want continu
e with the deletion |
430 // so actual content will get deleted, and not just the quote style. | 433 // so actual content will get deleted, and not just the quote style. |
431 if (breakOutOfEmptyMailBlockquotedParagraph()) | 434 bool breakOutResult = breakOutOfEmptyMailBlockquotedParagraph(editingSta
te); |
| 435 if (editingState->isAborted()) |
| 436 return; |
| 437 if (breakOutResult) |
432 typingAddedToOpenCommand(DeleteKey); | 438 typingAddedToOpenCommand(DeleteKey); |
433 | 439 |
434 m_smartDelete = false; | 440 m_smartDelete = false; |
435 | 441 |
436 OwnPtrWillBeRawPtr<FrameSelection> selection = FrameSelection::create(); | 442 OwnPtrWillBeRawPtr<FrameSelection> selection = FrameSelection::create(); |
437 selection->setSelection(endingSelection()); | 443 selection->setSelection(endingSelection()); |
438 selection->modify(FrameSelection::AlterationExtend, DirectionBackward, g
ranularity); | 444 selection->modify(FrameSelection::AlterationExtend, DirectionBackward, g
ranularity); |
439 if (killRing && selection->isCaret() && granularity != CharacterGranular
ity) | 445 if (killRing && selection->isCaret() && granularity != CharacterGranular
ity) |
440 selection->modify(FrameSelection::AlterationExtend, DirectionBackwar
d, CharacterGranularity); | 446 selection->modify(FrameSelection::AlterationExtend, DirectionBackwar
d, CharacterGranularity); |
441 | 447 |
442 VisiblePosition visibleStart(endingSelection().visibleStart()); | 448 VisiblePosition visibleStart(endingSelection().visibleStart()); |
443 if (previousPositionOf(visibleStart, CannotCrossEditingBoundary).isNull(
)) { | 449 if (previousPositionOf(visibleStart, CannotCrossEditingBoundary).isNull(
)) { |
444 // When the caret is at the start of the editable area in an empty l
ist item, break out of the list item. | 450 // When the caret is at the start of the editable area in an empty l
ist item, break out of the list item. |
445 if (breakOutOfEmptyListItem()) { | 451 bool breakOutOfEmptyListItemResult = breakOutOfEmptyListItem(editing
State); |
| 452 if (editingState->isAborted()) |
| 453 return; |
| 454 if (breakOutOfEmptyListItemResult) { |
446 typingAddedToOpenCommand(DeleteKey); | 455 typingAddedToOpenCommand(DeleteKey); |
447 return; | 456 return; |
448 } | 457 } |
449 // When there are no visible positions in the editing root, delete i
ts entire contents. | 458 // When there are no visible positions in the editing root, delete i
ts entire contents. |
450 if (nextPositionOf(visibleStart, CannotCrossEditingBoundary).isNull(
) && makeEditableRootEmpty()) { | 459 if (nextPositionOf(visibleStart, CannotCrossEditingBoundary).isNull(
) && makeEditableRootEmpty(editingState)) { |
451 typingAddedToOpenCommand(DeleteKey); | 460 typingAddedToOpenCommand(DeleteKey); |
452 return; | 461 return; |
453 } | 462 } |
| 463 if (editingState->isAborted()) |
| 464 return; |
454 } | 465 } |
455 | 466 |
456 // If we have a caret selection at the beginning of a cell, we have noth
ing to do. | 467 // If we have a caret selection at the beginning of a cell, we have noth
ing to do. |
457 Node* enclosingTableCell = enclosingNodeOfType(visibleStart.deepEquivale
nt(), &isTableCell); | 468 Node* enclosingTableCell = enclosingNodeOfType(visibleStart.deepEquivale
nt(), &isTableCell); |
458 if (enclosingTableCell && visibleStart.deepEquivalent() == createVisible
Position(firstPositionInNode(enclosingTableCell)).deepEquivalent()) | 469 if (enclosingTableCell && visibleStart.deepEquivalent() == createVisible
Position(firstPositionInNode(enclosingTableCell)).deepEquivalent()) |
459 return; | 470 return; |
460 | 471 |
461 // If the caret is at the start of a paragraph after a table, move conte
nt into the last table cell. | 472 // If the caret is at the start of a paragraph after a table, move conte
nt into the last table cell. |
462 if (isStartOfParagraph(visibleStart) && isFirstPositionAfterTable(previo
usPositionOf(visibleStart, CannotCrossEditingBoundary))) { | 473 if (isStartOfParagraph(visibleStart) && isFirstPositionAfterTable(previo
usPositionOf(visibleStart, CannotCrossEditingBoundary))) { |
463 // Unless the caret is just before a table. We don't want to move a
table into the last table cell. | 474 // Unless the caret is just before a table. We don't want to move a
table into the last table cell. |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 ASSERT_NOT_REACHED(); | 641 ASSERT_NOT_REACHED(); |
631 m_preservesTypingStyle = false; | 642 m_preservesTypingStyle = false; |
632 } | 643 } |
633 | 644 |
634 bool TypingCommand::isTypingCommand() const | 645 bool TypingCommand::isTypingCommand() const |
635 { | 646 { |
636 return true; | 647 return true; |
637 } | 648 } |
638 | 649 |
639 } // namespace blink | 650 } // namespace blink |
OLD | NEW |