Reviewed by harrison
<rdar://problem/
4237467> REGRESSION: Pasting word from quoted text quotes the destination
<rdar://problem/
4017358> quoted text is wrong color, when pasted as quotation
Fixed:
* editing/pasteboard/merge-end-blockquote-expected.checksum:
* editing/pasteboard/merge-end-blockquote-expected.png:
* editing/pasteboard/merge-end-blockquote-expected.txt:
* editing/pasteboard/merge-end-blockquote.html:
Added:
* editing/pasteboard/paste-blockquote-1-expected.checksum: Added.
* editing/pasteboard/paste-blockquote-1-expected.png: Added.
* editing/pasteboard/paste-blockquote-1-expected.txt: Added.
* editing/pasteboard/paste-blockquote-1.html: Added.
* editing/pasteboard/paste-blockquote-2-expected.checksum: Added.
* editing/pasteboard/paste-blockquote-2-expected.png: Added.
* editing/pasteboard/paste-blockquote-2-expected.txt: Added.
* editing/pasteboard/paste-blockquote-2.html: Added.
* editing/pasteboard/paste-blockquote-3-expected.checksum: Added.
* editing/pasteboard/paste-blockquote-3-expected.png: Added.
* editing/pasteboard/paste-blockquote-3-expected.txt: Added.
* editing/pasteboard/paste-blockquote-3.html: Added.
WebCore:
Reviewed by harrison
<rdar://problem/
4237467> REGRESSION: Pasting word from quoted text quotes the destination
<rdar://problem/
4017358> quoted text is wrong color, when pasted as quotation
* editing/ReplaceSelectionCommand.cpp:
(WebCore::isMailPasteAsQuotationNode): Added. Checks for the node
that Mail wraps around an incoming fragment when it wants it to be pasted
with quoting (no merging should be done).
(WebCore::ReplaceSelectionCommand::removeNodePreservingChildren): Added
this virtual method in order to adjust the nodes that ReplaceSelectionCommand
tracks.
(WebCore::ReplaceSelectionCommand::shouldMerge): Don't merge from content
inside a Mail Paste as Quotation node. Allow merging from Mail blockquotes.
(WebCore::ReplaceSelectionCommand::removeRedundantStyles): When pasting into
a Mail blockquote, we ignore the parts of the source document's default style
that are overriden by styles from the Mail blockquote. This is necessary in order
for text that's black (because black is the source document's default font color)
to appear blue/green/whatever when it's pasted into a Mail blockquote.
(WebCore::ReplaceSelectionCommand::handlePasteAsQuotationNode): Turn an inserted
Mail Paste as Quotation node into a normal Mail blockquote. This will prevent
a copied blockquote that was inserted into the document using Paste as Quotation
from triggering Paste as Quotation behavior when it's pasted.
(WebCore::ReplaceSelectionCommand::doApply): Call the new/altered methods.
* editing/ReplaceSelectionCommand.h:
* editing/markup.cpp:
(WebCore::styleFromMatchedRulesForElement): Put this code into a subroutine.
(WebCore::removeEnclosingMailBlockquoteStyle): Added.
(WebCore::startMarkup): When wrapping text nodes in style spans, leave out
styles that Mail blockquotes contribute, so that Mail blockquote styles can
be differentiated from styles that the user has applied. When creating markup
for elements, do the same thing.
(WebCore::createMarkup): Call the new subroutine.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@17832
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-11-17 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by harrison
+
+ <rdar://problem/4237467> REGRESSION: Pasting word from quoted text quotes the destination
+ <rdar://problem/4017358> quoted text is wrong color, when pasted as quotation
+
+ Fixed:
+ * editing/pasteboard/merge-end-blockquote-expected.checksum:
+ * editing/pasteboard/merge-end-blockquote-expected.png:
+ * editing/pasteboard/merge-end-blockquote-expected.txt:
+ * editing/pasteboard/merge-end-blockquote.html:
+
+ Added:
+ * editing/pasteboard/paste-blockquote-1-expected.checksum: Added.
+ * editing/pasteboard/paste-blockquote-1-expected.png: Added.
+ * editing/pasteboard/paste-blockquote-1-expected.txt: Added.
+ * editing/pasteboard/paste-blockquote-1.html: Added.
+ * editing/pasteboard/paste-blockquote-2-expected.checksum: Added.
+ * editing/pasteboard/paste-blockquote-2-expected.png: Added.
+ * editing/pasteboard/paste-blockquote-2-expected.txt: Added.
+ * editing/pasteboard/paste-blockquote-2.html: Added.
+ * editing/pasteboard/paste-blockquote-3-expected.checksum: Added.
+ * editing/pasteboard/paste-blockquote-3-expected.png: Added.
+ * editing/pasteboard/paste-blockquote-3-expected.txt: Added.
+ * editing/pasteboard/paste-blockquote-3.html: Added.
+
2006-11-16 Rob Buis <buis@kde.org>
Reviewed and landed by Brady
-e109b0d0ef8241dca4013225c26f810d
\ No newline at end of file
+b9bb3eabc2e4ac3ed8dbee3a6c3af7b3
\ No newline at end of file
EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > BODY > HTML > #document to 1 of DIV > BODY > HTML > #document
EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of #text > DIV > BODY > HTML > #document to 0 of #text > DIV > BODY > HTML > #document toDOMRange:range from 16 of #text > DIV > BLOCKQUOTE > DIV > BODY > HTML > #document to 16 of #text > DIV > BLOCKQUOTE > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
+EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 16 of #text > DIV > BODY > HTML > #document to 16 of #text > DIV > BODY > HTML > #document toDOMRange:range from 16 of #text > DIV > BODY > HTML > #document to 16 of #text > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
EDITING DELEGATE: shouldEndEditingInDOMRange:range from 0 of DIV > BODY > HTML > #document to 2 of DIV > BODY > HTML > #document
RenderBlock {HTML} at (0,0) size 800x600
RenderBody {BODY} at (8,8) size 784x576
RenderBlock {P} at (0,0) size 784x18
- RenderText {#text} at (0,0) size 597x18
- text run at (0,0) width 597: "This tests pasting a Mail blockquote into a position that would normally result in an end merge."
- RenderBlock {DIV} at (0,34) size 784x52
- RenderBlock {BLOCKQUOTE} at (40,0) size 704x18
- RenderBlock {DIV} at (0,0) size 704x18
- RenderText {#text} at (0,0) size 114x18
- text run at (0,0) width 114: "Blockquoted Text"
- RenderBlock (anonymous) at (0,34) size 784x18
- RenderText {#text} at (0,0) size 8x18
- text run at (0,0) width 8: "x"
- RenderBlock {P} at (0,102) size 784x36
+ RenderText {#text} at (0,0) size 606x18
+ text run at (0,0) width 397: "This tests pasting a Mail blockquote at the start of a paragraph. "
+ text run at (397,0) width 209: "Blockquoting should be stripped."
+ RenderBlock {DIV} at (0,34) size 784x18
+ RenderText {#text} at (0,0) size 114x18
+ text run at (0,0) width 114: "Blockquoted Text"
+ RenderText {#text} at (114,0) size 8x18
+ text run at (114,0) width 8: "x"
+ RenderBlock {P} at (0,68) size 784x36
RenderText {#text} at (0,0) size 759x36
text run at (0,0) width 289: "This tests pasting text into a Mail blockquote. "
text run at (289,0) width 470: "The last bit of content in the incoming fragment should be merged with the"
text run at (0,18) width 287: "paragraph after the position being pasted into."
- RenderBlock {DIV} at (0,154) size 784x36
+ RenderBlock {DIV} at (0,120) size 784x36
RenderBlock {BLOCKQUOTE} at (40,0) size 704x36
RenderBlock {DIV} at (0,0) size 704x18
RenderText {#text} at (0,0) size 81x18
if (window.layoutTestController)
layoutTestController.dumpEditingCallbacks();
</script>
-<p>This tests pasting a Mail blockquote into a position that would normally result in an end merge.</p>
+<p>This tests pasting a Mail blockquote at the start of a paragraph. Blockquoting should be stripped.</p>
<div id="test1" contenteditable="true">x</div>
<script type="text/javascript" src="../editing.js"></script>
--- /dev/null
+f52fe7ca5b3b3e8fe1d198ad6d1a275f
\ No newline at end of file
--- /dev/null
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x18
+ RenderText {#text} at (0,0) size 354x18
+ text run at (0,0) width 354: "This tests pasting a blockquote into an empty paragraph."
+ RenderBlock {DIV} at (0,34) size 784x18
+ RenderBlock {BLOCKQUOTE} at (0,0) size 784x18 [color=#0000FF] [border: (2px solid #0000FF)]
+ RenderText {#text} at (22,0) size 179x18
+ text run at (22,0) width 179: "This should be blockquoted."
+caret: position 27 of child 0 {#text} of child 0 {BLOCKQUOTE} of child 2 {DIV} of child 1 {BODY} of child 0 {HTML} of document
--- /dev/null
+<style>
+blockquote {
+ color: blue;
+ border-left: 2px solid blue;
+ margin: 0px;
+ padding: 0 0 0 20px;
+}
+</style>
+
+<p>This tests pasting a blockquote into an empty paragraph.</p>
+<div id="div" contenteditable="true"></div>
+
+<script>
+var sel = window.getSelection();
+var div = document.getElementById("div");
+
+sel.setPosition(div, 0);
+document.execCommand("InsertHTML", false, "<blockquote type='cite'>This should be blockquoted.</blockquote>");
+</script>
--- /dev/null
+dd43c28115c2cdedd20809ff26199c39
\ No newline at end of file
--- /dev/null
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x18
+ RenderText {#text} at (0,0) size 360x18
+ text run at (0,0) width 360: "This tests pasting a blockquote at the start of a paragraph."
+ RenderBlock {DIV} at (0,34) size 784x18
+ RenderText {#text} at (0,0) size 203x18
+ text run at (0,0) width 203: "This should not be blockquoted."
+ RenderText {#text} at (203,0) size 207x18
+ text run at (203,0) width 207: " This should not be blockquoted."
+caret: position 31 of child 0 {#text} of child 2 {DIV} of child 1 {BODY} of child 0 {HTML} of document
--- /dev/null
+<style>
+blockquote {
+ color: blue;
+ border-left: 2px solid blue;
+ margin: 0px;
+ padding: 0 0 0 20px;
+}
+</style>
+
+<p>This tests pasting a blockquote at the start of a paragraph.</p>
+<div id="div" contenteditable="true"> This should not be blockquoted.</div>
+
+<script>
+var sel = window.getSelection();
+var div = document.getElementById("div");
+
+sel.setPosition(div, 0);
+document.execCommand("InsertHTML", false, "<blockquote type='cite'>This should not be blockquoted.</blockquote>");
+</script>
--- /dev/null
+b9e381e60a79b5781cc29a605ba5f6d5
\ No newline at end of file
--- /dev/null
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x18
+ RenderText {#text} at (0,0) size 390x18
+ text run at (0,0) width 390: "This tests pasting a blockquote into the middle of a paragraph."
+ RenderBlock {DIV} at (0,34) size 784x54
+ RenderBlock (anonymous) at (0,0) size 784x18
+ RenderText {#text} at (0,0) size 203x18
+ text run at (0,0) width 203: "This should not be blockquoted."
+ RenderText {#text} at (203,0) size 207x18
+ text run at (203,0) width 207: " This should not be blockquoted."
+ RenderBlock {BLOCKQUOTE} at (0,18) size 784x18 [color=#0000FF] [border: (2px solid #0000FF)]
+ RenderText {#text} at (22,0) size 179x18
+ text run at (22,0) width 179: "This should be blockquoted."
+ RenderBR {BR} at (201,14) size 0x0
+ RenderBlock (anonymous) at (0,36) size 784x18
+ RenderText {#text} at (0,0) size 203x18
+ text run at (0,0) width 203: "This should not be blockquoted."
+ RenderText {#text} at (203,0) size 207x18
+ text run at (203,0) width 207: " This should not be blockquoted."
+caret: position 31 of child 3 {#text} of child 2 {DIV} of child 1 {BODY} of child 0 {HTML} of document
--- /dev/null
+<style>
+blockquote {
+ color: blue;
+ border-left: 2px solid blue;
+ margin: 0px;
+ padding: 0 0 0 20px;
+}
+</style>
+
+<p>This tests pasting a blockquote into the middle of a paragraph.</p>
+<div id="div" contenteditable="true">This should not be blockquoted. This should not be blockquoted.</div>
+
+<script>
+var sel = window.getSelection();
+var div = document.getElementById("div");
+
+sel.setPosition(div, 0);
+sel.modify("move", "forward", "word");
+sel.modify("move", "forward", "word");
+sel.modify("move", "forward", "word");
+sel.modify("move", "forward", "word");
+sel.modify("move", "forward", "word");
+sel.modify("move", "forward", "character");
+document.execCommand("InsertHTML", false, "<blockquote type='cite'> This should not be blockquoted.<br>This should be blockquoted.<br>This should not be blockquoted.</blockquote>");
+</script>
+2006-11-17 Justin Garcia <justin.garcia@apple.com>
+
+ Reviewed by harrison
+
+ <rdar://problem/4237467> REGRESSION: Pasting word from quoted text quotes the destination
+ <rdar://problem/4017358> quoted text is wrong color, when pasted as quotation
+
+ * editing/ReplaceSelectionCommand.cpp:
+ (WebCore::isMailPasteAsQuotationNode): Added. Checks for the node
+ that Mail wraps around an incoming fragment when it wants it to be pasted
+ with quoting (no merging should be done).
+ (WebCore::ReplaceSelectionCommand::removeNodePreservingChildren): Added
+ this virtual method in order to adjust the nodes that ReplaceSelectionCommand
+ tracks.
+ (WebCore::ReplaceSelectionCommand::shouldMerge): Don't merge from content
+ inside a Mail Paste as Quotation node. Allow merging from Mail blockquotes.
+ (WebCore::ReplaceSelectionCommand::removeRedundantStyles): When pasting into
+ a Mail blockquote, we ignore the parts of the source document's default style
+ that are overriden by styles from the Mail blockquote. This is necessary in order
+ for text that's black (because black is the source document's default font color)
+ to appear blue/green/whatever when it's pasted into a Mail blockquote.
+ (WebCore::ReplaceSelectionCommand::handlePasteAsQuotationNode): Turn an inserted
+ Mail Paste as Quotation node into a normal Mail blockquote. This will prevent
+ a copied blockquote that was inserted into the document using Paste as Quotation
+ from triggering Paste as Quotation behavior when it's pasted.
+ (WebCore::ReplaceSelectionCommand::doApply): Call the new/altered methods.
+ * editing/ReplaceSelectionCommand.h:
+ * editing/markup.cpp:
+ (WebCore::styleFromMatchedRulesForElement): Put this code into a subroutine.
+ (WebCore::removeEnclosingMailBlockquoteStyle): Added.
+ (WebCore::startMarkup): When wrapping text nodes in style spans, leave out
+ styles that Mail blockquotes contribute, so that Mail blockquote styles can
+ be differentiated from styles that the user has applied. When creating markup
+ for elements, do the same thing.
+ (WebCore::createMarkup): Call the new subroutine.
+
2006-11-17 Rob Buis <buis@kde.org>
Reviewed by Mitz.
shouldMerge(endOfInsertedContent, next);
}
+static bool isMailPasteAsQuotationNode(Node* node)
+{
+ return node && node->hasTagName(blockquoteTag) && node->isElementNode() && static_cast<Element*>(node)->getAttribute(classAttr) == ApplePasteAsQuotation;
+}
+
+// Virtual method used so that ReplaceSelectionCommand can update the node's it tracks.
+void ReplaceSelectionCommand::removeNodePreservingChildren(Node* node)
+{
+ if (m_firstNodeInserted == node)
+ m_firstNodeInserted = node->traverseNextNode();
+ if (m_lastNodeInserted == node)
+ m_lastNodeInserted = node->lastChild() ? node->lastChild() : node->traverseNextSibling();
+ CompositeEditCommand::removeNodePreservingChildren(node);
+}
+
bool ReplaceSelectionCommand::shouldMerge(const VisiblePosition& from, const VisiblePosition& to)
{
if (from.isNull() || to.isNull())
Node* fromNode = from.deepEquivalent().node();
Node* toNode = to.deepEquivalent().node();
- return nearestMailBlockquote(fromNode) == nearestMailBlockquote(toNode) &&
- !enclosingBlock(fromNode)->hasTagName(blockquoteTag) &&
+ return !enclosingNodeOfType(fromNode, &isMailPasteAsQuotationNode) &&
+ (!enclosingBlock(fromNode)->hasTagName(blockquoteTag) || isMailBlockquote(enclosingBlock(fromNode))) &&
enclosingListChild(fromNode) == enclosingListChild(toNode) &&
enclosingTableCell(fromNode) == enclosingTableCell(toNode) &&
!(fromNode->renderer() && fromNode->renderer()->isTable()) &&
!fromNode->hasTagName(hrTag) && !toNode->hasTagName(hrTag);
}
-void ReplaceSelectionCommand::removeRedundantStyles()
+void ReplaceSelectionCommand::removeRedundantStyles(Node* mailBlockquoteEnclosingSelectionStart)
{
// There's usually a top level style span that holds the document's default style, push it down.
Node* node = m_firstNodeInserted.get();
- if (isStyleSpan(node)) {
+ if (isStyleSpan(node) && mailBlockquoteEnclosingSelectionStart) {
+ // Calculate the document default style.
+ RefPtr<CSSMutableStyleDeclaration> blockquoteStyle = Position(mailBlockquoteEnclosingSelectionStart, 0).computedStyle()->copyInheritableProperties();
+ RefPtr<CSSMutableStyleDeclaration> spanStyle = static_cast<HTMLElement*>(node)->inlineStyleDecl();
+ spanStyle->merge(blockquoteStyle.get());
+ }
+ else if (isStyleSpan(node)) {
+
RefPtr<CSSMutableStyleDeclaration> parentStyle
= Position(node, 0).computedStyle()->copyInheritableProperties();
}
child = next;
}
-
- if (m_firstNodeInserted == node)
- m_firstNodeInserted = node->firstChild();
- if (m_lastNodeInserted == node)
- m_lastNodeInserted = node->lastChild();
+
removeNodePreservingChildren(node);
}
|| element->hasTagName(fontTag)
|| element->hasTagName(iTag)
|| element->hasTagName(uTag))) {
- if (element == m_firstNodeInserted)
- m_firstNodeInserted = element->traverseNextNode();
- if (element == m_lastNodeInserted)
- m_lastNodeInserted = element->traverseNextNode();
removeNodePreservingChildren(element);
continue;
}
}
}
+void ReplaceSelectionCommand::handlePasteAsQuotationNode()
+{
+ Node* node = m_firstNodeInserted.get();
+ if (isMailPasteAsQuotationNode(node))
+ static_cast<Element*>(node)->setAttribute(classAttr, "");
+}
+
void ReplaceSelectionCommand::doApply()
{
Selection selection = endingSelection();
bool selectionEndWasEndOfParagraph = isEndOfParagraph(visibleEnd);
bool selectionStartWasStartOfParagraph = isStartOfParagraph(visibleStart);
+ Node* mailBlockquoteEnclosingSelectionStart = nearestMailBlockquote(visibleStart.deepEquivalent().node());
Node* startBlock = enclosingBlock(visibleStart.deepEquivalent().node());
node = next;
}
- removeRedundantStyles();
+ removeRedundantStyles(mailBlockquoteEnclosingSelectionStart);
endOfInsertedContent = VisiblePosition(Position(m_lastNodeInserted.get(), maxDeepOffset(m_lastNodeInserted.get())));
startOfInsertedContent = VisiblePosition(Position(m_firstNodeInserted.get(), 0));
}
}
+ handlePasteAsQuotationNode();
+
endOfInsertedContent = VisiblePosition(Position(m_lastNodeInserted.get(), maxDeepOffset(m_lastNodeInserted.get())));
startOfInsertedContent = VisiblePosition(Position(m_firstNodeInserted.get(), 0));
bool shouldMergeEnd(bool);
bool shouldMerge(const VisiblePosition&, const VisiblePosition&);
- void removeRedundantStyles();
+ void removeRedundantStyles(Node*);
+
+ void handlePasteAsQuotationNode();
+
+ virtual void removeNodePreservingChildren(Node*);
RefPtr<Node> m_firstNodeInserted;
RefPtr<Node> m_lastNodeInserted;
return plainText(&r);
}
+static PassRefPtr<CSSMutableStyleDeclaration> styleFromMatchedRulesForElement(Element* element, bool authorOnly = true)
+{
+ RefPtr<CSSMutableStyleDeclaration> style = new CSSMutableStyleDeclaration();
+ RefPtr<CSSRuleList> matchedRules = element->document()->styleSelector()->styleRulesForElement(element, authorOnly);
+ if (matchedRules) {
+ for (unsigned i = 0; i < matchedRules->length(); i++) {
+ if (matchedRules->item(i)->type() == CSSRule::STYLE_RULE) {
+ RefPtr<CSSMutableStyleDeclaration> s = static_cast<CSSStyleRule*>(matchedRules->item(i))->style();
+ style->merge(s.get(), true);
+ }
+ }
+ }
+
+ return style.release();
+}
+
+static void removeEnclosingMailBlockquoteStyle(CSSMutableStyleDeclaration* style, Node* node)
+{
+ Node* blockquote = nearestMailBlockquote(node);
+ if (!blockquote || !blockquote->parentNode())
+ return;
+
+ RefPtr<CSSMutableStyleDeclaration> parentStyle = Position(blockquote->parentNode(), 0).computedStyle()->copyInheritableProperties();
+ RefPtr<CSSMutableStyleDeclaration> blockquoteStyle = Position(blockquote, 0).computedStyle()->copyInheritableProperties();
+ parentStyle->diff(blockquoteStyle.get());
+ blockquoteStyle->diff(style);
+}
+
static DeprecatedString startMarkup(const Node *node, const Range *range, EAnnotateForInterchange annotate, CSSMutableStyleDeclaration *defaultStyle)
{
bool documentIsHTML = node->document()->isHTMLDocument();
if (element) {
RefPtr<CSSComputedStyleDeclaration> computedStyle = Position(element, 0).computedStyle();
RefPtr<CSSMutableStyleDeclaration> style = computedStyle->copyInheritableProperties();
+ // Styles that Mail blockquotes contribute should only be placed on the Mail blockquote, to help
+ // us differentiate those styles from ones that the user has applied. This helps us
+ // get the color of content pasted into blockquotes right.
+ removeEnclosingMailBlockquoteStyle(style.get(), const_cast<Node*>(node));
+
defaultStyle->diff(style.get());
if (style->length() > 0) {
// FIXME: Handle case where style->cssText() has illegal characters in it, like "
const Element* el = static_cast<const Element*>(node);
markup += el->nodeNamePreservingCase().deprecatedString();
String additionalStyle;
- if (defaultStyle && el->isHTMLElement()) {
+ if (defaultStyle && el->isHTMLElement() && !isMailBlockquote(node)) {
RefPtr<CSSComputedStyleDeclaration> computedStyle = Position(const_cast<Element*>(el), 0).computedStyle();
RefPtr<CSSMutableStyleDeclaration> style = computedStyle->copyInheritableProperties();
- RefPtr<CSSRuleList> matchedRules = node->document()->styleSelector()->styleRulesForElement(const_cast<Element*>(el), true);
- if (matchedRules) {
- for (unsigned i = 0; i < matchedRules->length(); i++) {
- if (matchedRules->item(i)->type() == CSSRule::STYLE_RULE) {
- RefPtr<CSSMutableStyleDeclaration> s = static_cast<CSSStyleRule*>(matchedRules->item(i))->style();
- style->merge(s.get(), true);
- }
- }
- }
+ style->merge(styleFromMatchedRulesForElement(const_cast<Element*>(el)).get());
+
+ // Styles that Mail blockquotes contribute should only be placed on the Mail blockquote, to help
+ // us differentiate those styles from ones that the user has applied. This helps us
+ // get the color of content pasted into blockquotes right.
+ removeEnclosingMailBlockquoteStyle(style.get(), const_cast<Node*>(node));
+
defaultStyle->diff(style.get());
if (style->length() > 0) {
CSSMutableStyleDeclaration *inlineStyleDecl = static_cast<const HTMLElement*>(el)->inlineStyleDecl();
if (root && *Selection::selectionFromContentsOfNode(root).toRange() == *range) {
CSSMutableStyleDeclaration* inlineStyleDecl = static_cast<HTMLElement*>(root)->inlineStyleDecl();
RefPtr<CSSMutableStyleDeclaration> style = inlineStyleDecl ? inlineStyleDecl->copy() : new CSSMutableStyleDeclaration();
- RefPtr<CSSRuleList> matchedRules = root->document()->styleSelector()->styleRulesForElement(static_cast<Element*>(root), true);
- if (matchedRules) {
- for (unsigned i = 0; i < matchedRules->length(); i++) {
- if (matchedRules->item(i)->type() == CSSRule::STYLE_RULE) {
- RefPtr<CSSMutableStyleDeclaration> s = static_cast<CSSStyleRule*>(matchedRules->item(i))->style();
- style->merge(s.get(), true);
- }
- }
- }
+ style->merge(styleFromMatchedRulesForElement(static_cast<Element*>(root)).get());
+
defaultStyle->diff(style.get());
// Bring the background attribute over, but not as an attribute because a background attribute on a div