Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(542)

Side by Side Diff: Source/WebCore/editing/CompositeEditCommand.cpp

Issue 13954003: Remove mail blockquote special case handling. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 void CompositeEditCommand::applyStyledElement(PassRefPtr<Element> element) 281 void CompositeEditCommand::applyStyledElement(PassRefPtr<Element> element)
282 { 282 {
283 applyCommandToComposite(ApplyStyleCommand::create(element, false)); 283 applyCommandToComposite(ApplyStyleCommand::create(element, false));
284 } 284 }
285 285
286 void CompositeEditCommand::removeStyledElement(PassRefPtr<Element> element) 286 void CompositeEditCommand::removeStyledElement(PassRefPtr<Element> element)
287 { 287 {
288 applyCommandToComposite(ApplyStyleCommand::create(element, true)); 288 applyCommandToComposite(ApplyStyleCommand::create(element, true));
289 } 289 }
290 290
291 void CompositeEditCommand::insertParagraphSeparator(bool useDefaultParagraphElem ent, bool pasteBlockqutoeIntoUnquotedArea) 291 void CompositeEditCommand::insertParagraphSeparator(bool useDefaultParagraphElem ent)
292 { 292 {
293 applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), useDefaultParagraphElement, pasteBlockqutoeIntoUnquotedArea)); 293 applyCommandToComposite(InsertParagraphSeparatorCommand::create(document(), useDefaultParagraphElement));
294 } 294 }
295 295
296 void CompositeEditCommand::insertLineBreak() 296 void CompositeEditCommand::insertLineBreak()
297 { 297 {
298 applyCommandToComposite(InsertLineBreakCommand::create(document())); 298 applyCommandToComposite(InsertLineBreakCommand::create(document()));
299 } 299 }
300 300
301 bool CompositeEditCommand::isRemovableBlock(const Node* node) 301 bool CompositeEditCommand::isRemovableBlock(const Node* node)
302 { 302 {
303 if (!node->hasTagName(divTag)) 303 if (!node->hasTagName(divTag))
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 appendBlockPlaceholder(newBlock); 1314 appendBlockPlaceholder(newBlock);
1315 setEndingSelection(VisibleSelection(firstPositionInNode(newBlock.get()), DOW NSTREAM, endingSelection().isDirectional())); 1315 setEndingSelection(VisibleSelection(firstPositionInNode(newBlock.get()), DOW NSTREAM, endingSelection().isDirectional()));
1316 1316
1317 style->prepareToApplyAt(endingSelection().start()); 1317 style->prepareToApplyAt(endingSelection().start());
1318 if (!style->isEmpty()) 1318 if (!style->isEmpty())
1319 applyStyle(style.get()); 1319 applyStyle(style.get());
1320 1320
1321 return true; 1321 return true;
1322 } 1322 }
1323 1323
1324 // If the caret is in an empty quoted paragraph, and either there is nothing bef ore that
1325 // paragraph, or what is before is unquoted, and the user presses delete, unquot e that paragraph.
1326 bool CompositeEditCommand::breakOutOfEmptyMailBlockquotedParagraph()
1327 {
1328 if (!endingSelection().isCaret())
1329 return false;
1330
1331 VisiblePosition caret(endingSelection().visibleStart());
1332 Node* highestBlockquote = highestEnclosingNodeOfType(caret.deepEquivalent(), &isMailBlockquote);
1333 if (!highestBlockquote)
1334 return false;
1335
1336 if (!isStartOfParagraph(caret) || !isEndOfParagraph(caret))
1337 return false;
1338
1339 VisiblePosition previous(caret.previous(CannotCrossEditingBoundary));
1340 // Only move forward if there's nothing before the caret, or if there's unqu oted content before it.
1341 if (enclosingNodeOfType(previous.deepEquivalent(), &isMailBlockquote))
1342 return false;
1343
1344 RefPtr<Node> br = createBreakElement(document());
1345 // We want to replace this quoted paragraph with an unquoted one, so insert a br
1346 // to hold the caret before the highest blockquote.
1347 insertNodeBefore(br, highestBlockquote);
1348 VisiblePosition atBR(positionBeforeNode(br.get()));
1349 // If the br we inserted collapsed, for example foo<br><blockquote>...</bloc kquote>, insert
1350 // a second one.
1351 if (!isStartOfParagraph(atBR))
1352 insertNodeBefore(createBreakElement(document()), br);
1353 setEndingSelection(VisibleSelection(atBR, endingSelection().isDirectional()) );
1354
1355 // If this is an empty paragraph there must be a line break here.
1356 if (!lineBreakExistsAtVisiblePosition(caret))
1357 return false;
1358
1359 Position caretPos(caret.deepEquivalent().downstream());
1360 // A line break is either a br or a preserved newline.
1361 ASSERT(caretPos.deprecatedNode()->hasTagName(brTag) || (caretPos.deprecatedN ode()->isTextNode() && caretPos.deprecatedNode()->renderer()->style()->preserveN ewline()));
1362
1363 if (caretPos.deprecatedNode()->hasTagName(brTag))
1364 removeNodeAndPruneAncestors(caretPos.deprecatedNode());
1365 else if (caretPos.deprecatedNode()->isTextNode()) {
1366 ASSERT(caretPos.deprecatedEditingOffset() == 0);
1367 Text* textNode = toText(caretPos.deprecatedNode());
1368 ContainerNode* parentNode = textNode->parentNode();
1369 // The preserved newline must be the first thing in the node, since othe rwise the previous
1370 // paragraph would be quoted, and we verified that it wasn't above.
1371 deleteTextFromNode(textNode, 0, 1);
1372 prune(parentNode);
1373 }
1374
1375 return true;
1376 }
1377
1378 // Operations use this function to avoid inserting content into an anchor when a t the start or the end of 1324 // Operations use this function to avoid inserting content into an anchor when a t the start or the end of
1379 // that anchor, as in NSTextView. 1325 // that anchor, as in NSTextView.
1380 // FIXME: This is only an approximation of NSTextViews insertion behavior, which varies depending on how 1326 // FIXME: This is only an approximation of NSTextViews insertion behavior, which varies depending on how
1381 // the caret was made. 1327 // the caret was made.
1382 Position CompositeEditCommand::positionAvoidingSpecialElementBoundary(const Posi tion& original) 1328 Position CompositeEditCommand::positionAvoidingSpecialElementBoundary(const Posi tion& original)
1383 { 1329 {
1384 if (original.isNull()) 1330 if (original.isNull())
1385 return original; 1331 return original;
1386 1332
1387 VisiblePosition visiblePos(original); 1333 VisiblePosition visiblePos(original);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 return node.release(); 1408 return node.release();
1463 } 1409 }
1464 1410
1465 PassRefPtr<Element> createBlockPlaceholderElement(Document* document) 1411 PassRefPtr<Element> createBlockPlaceholderElement(Document* document)
1466 { 1412 {
1467 RefPtr<Element> breakNode = document->createElement(brTag, false); 1413 RefPtr<Element> breakNode = document->createElement(brTag, false);
1468 return breakNode.release(); 1414 return breakNode.release();
1469 } 1415 }
1470 1416
1471 } // namespace WebCore 1417 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698