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

Unified Diff: Source/core/editing/StyledMarkupSerializer.cpp

Issue 1177323005: Move StyledMarkupAccumulator::shouldApplyWrappingStyle to its serializer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: yosin's review Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/editing/StyledMarkupSerializer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/editing/StyledMarkupSerializer.cpp
diff --git a/Source/core/editing/StyledMarkupSerializer.cpp b/Source/core/editing/StyledMarkupSerializer.cpp
index 698676e1c3d1dd07a469b73fd2c250af677074a5..d171a02c2eb223148fd75f7efa7adcf92688d47c 100644
--- a/Source/core/editing/StyledMarkupSerializer.cpp
+++ b/Source/core/editing/StyledMarkupSerializer.cpp
@@ -76,6 +76,7 @@ StyledMarkupSerializer<Strategy>::StyledMarkupSerializer(EAbsoluteURLs shouldRes
, m_shouldAnnotate(shouldAnnotate)
, m_highestNodeToBeSerialized(highestNodeToBeSerialized)
, m_convertBlocksToInlines(convertBlocksToInlines)
+ , m_lastClosed(highestNodeToBeSerialized)
{
}
@@ -117,7 +118,7 @@ static PassRefPtrWillBeRawPtr<EditingStyle> styleFromMatchedRulesAndInlineDecl(c
template<typename Strategy>
String StyledMarkupSerializer<Strategy>::createMarkup()
{
- StyledMarkupAccumulator markupAccumulator(m_shouldResolveURLs, toTextOffset(m_start.parentAnchoredEquivalent()), toTextOffset(m_end.parentAnchoredEquivalent()), m_start.document(), m_shouldAnnotate, m_highestNodeToBeSerialized.get());
+ StyledMarkupAccumulator markupAccumulator(m_shouldResolveURLs, toTextOffset(m_start.parentAnchoredEquivalent()), toTextOffset(m_end.parentAnchoredEquivalent()), m_start.document(), m_shouldAnnotate);
Node* pastEnd = m_end.nodeAsRangePastLastNode();
@@ -172,7 +173,7 @@ String StyledMarkupSerializer<Strategy>::createMarkup()
markupAccumulator.wrapWithStyleNode(fullySelectedRootStyle->style());
}
} else {
- RefPtrWillBeRawPtr<EditingStyle> style = createInlineStyleIfNeeded(markupAccumulator, *ancestor);
+ RefPtrWillBeRawPtr<EditingStyle> style = createInlineStyleIfNeeded(*ancestor);
// Since this node and all the other ancestors are not in the selection we want
// styles that affect the exterior of the node not to be not included.
// If the node is not fully selected by the range, then we don't want to keep styles that affect its relationship to the nodes around it
@@ -197,16 +198,10 @@ String StyledMarkupSerializer<Strategy>::createMarkup()
template<typename Strategy>
Node* StyledMarkupSerializer<Strategy>::serializeNodes(Node* startNode, Node* pastEnd, StyledMarkupAccumulator* markupAccumulator)
{
- if (!markupAccumulator->highestNodeToBeSerialized()) {
- Node* lastClosed = traverseNodesForSerialization(startNode, pastEnd, nullptr);
- markupAccumulator->setHighestNodeToBeSerialized(lastClosed);
- }
-
- Node* highestNodeToBeSerialized = markupAccumulator->highestNodeToBeSerialized();
- if (highestNodeToBeSerialized && Strategy::parent(*highestNodeToBeSerialized)) {
- RefPtrWillBeRawPtr<EditingStyle> wrappingStyle = EditingStyle::wrappingStyleForSerialization(Strategy::parent(*highestNodeToBeSerialized), shouldAnnotate());
- markupAccumulator->setWrappingStyle(wrappingStyle.release());
- }
+ if (!m_lastClosed)
+ m_lastClosed = traverseNodesForSerialization(startNode, pastEnd, nullptr);
+ if (m_lastClosed && Strategy::parent(*m_lastClosed))
+ m_wrappingStyle = EditingStyle::wrappingStyleForSerialization(Strategy::parent(*m_lastClosed), shouldAnnotate());
return traverseNodesForSerialization(startNode, pastEnd, markupAccumulator);
}
@@ -285,7 +280,7 @@ Node* StyledMarkupSerializer<Strategy>::traverseNodesForSerialization(Node* star
ASSERT(startNode);
ASSERT(Strategy::isDescendantOf(*startNode, *parent));
if (markupAccumulator) {
- RefPtrWillBeRawPtr<EditingStyle> style = createInlineStyleIfNeeded(*markupAccumulator, *parent);
+ RefPtrWillBeRawPtr<EditingStyle> style = createInlineStyleIfNeeded(*parent);
wrapWithNode(*markupAccumulator, *parent, style);
}
lastClosed = parent;
@@ -317,7 +312,7 @@ void StyledMarkupSerializer<Strategy>::wrapWithNode(StyledMarkupAccumulator& acc
if (!node.isElementNode())
return;
Element& element = toElement(node);
- if (accumulator.shouldApplyWrappingStyle(element) || needsInlineStyle(element))
+ if (shouldApplyWrappingStyle(element) || needsInlineStyle(element))
accumulator.appendElementWithInlineStyle(markup, element, style);
else
accumulator.appendElement(markup, element);
@@ -326,11 +321,11 @@ void StyledMarkupSerializer<Strategy>::wrapWithNode(StyledMarkupAccumulator& acc
}
template<typename Strategy>
-RefPtrWillBeRawPtr<EditingStyle> StyledMarkupSerializer<Strategy>::createInlineStyleIfNeeded(StyledMarkupAccumulator& accumulator, Node& node)
+RefPtrWillBeRawPtr<EditingStyle> StyledMarkupSerializer<Strategy>::createInlineStyleIfNeeded(Node& node)
{
if (!node.isElementNode())
return nullptr;
- RefPtrWillBeRawPtr<EditingStyle> inlineStyle = createInlineStyle(accumulator, toElement(node));
+ RefPtrWillBeRawPtr<EditingStyle> inlineStyle = createInlineStyle(toElement(node));
if (convertBlocksToInlines() && isBlock(&node))
inlineStyle->forceInline();
return inlineStyle;
@@ -346,13 +341,26 @@ void StyledMarkupSerializer<Strategy>::appendStartMarkup(StyledMarkupAccumulator
accumulator.appendText(text);
break;
}
- accumulator.appendTextWithInlineStyle(text);
+ RefPtrWillBeRawPtr<EditingStyle> inlineStyle = nullptr;
+ if (shouldApplyWrappingStyle(text)) {
+ inlineStyle = m_wrappingStyle->copy();
+ // FIXME: <rdar://problem/5371536> Style rules that match pasted content can change it's appearance
+ // Make sure spans are inline style in paste side e.g. span { display: block }.
+ inlineStyle->forceInline();
+ // FIXME: Should this be included in forceInline?
+ inlineStyle->style()->setProperty(CSSPropertyFloat, CSSValueNone);
+ }
+ accumulator.appendTextWithInlineStyle(text, inlineStyle);
break;
}
case Node::ELEMENT_NODE: {
Element& element = toElement(node);
- RefPtrWillBeRawPtr<EditingStyle> inlineStyle = createInlineStyle(accumulator, element);
- accumulator.appendElement(element, inlineStyle);
+ if ((element.isHTMLElement() && shouldAnnotate()) || shouldApplyWrappingStyle(element)) {
+ RefPtrWillBeRawPtr<EditingStyle> inlineStyle = createInlineStyle(element);
+ accumulator.appendElementWithInlineStyle(element, inlineStyle);
+ break;
+ }
+ accumulator.appendElement(element);
break;
}
default:
@@ -362,12 +370,19 @@ void StyledMarkupSerializer<Strategy>::appendStartMarkup(StyledMarkupAccumulator
}
template<typename Strategy>
-RefPtrWillBeRawPtr<EditingStyle> StyledMarkupSerializer<Strategy>::createInlineStyle(StyledMarkupAccumulator& accumulator, Element& element)
+bool StyledMarkupSerializer<Strategy>::shouldApplyWrappingStyle(const Node& node) const
+{
+ return m_lastClosed && Strategy::parent(*m_lastClosed) == Strategy::parent(node)
+ && m_wrappingStyle && m_wrappingStyle->style();
+}
+
+template<typename Strategy>
+RefPtrWillBeRawPtr<EditingStyle> StyledMarkupSerializer<Strategy>::createInlineStyle(Element& element)
{
RefPtrWillBeRawPtr<EditingStyle> inlineStyle = nullptr;
- if (accumulator.shouldApplyWrappingStyle(element)) {
- inlineStyle = accumulator.wrappingStyle()->copy();
+ if (shouldApplyWrappingStyle(element)) {
+ inlineStyle = m_wrappingStyle->copy();
inlineStyle->removePropertiesInElementDefaultStyle(&element);
inlineStyle->removeStyleConflictingWithStyleOfElement(&element);
} else {
« no previous file with comments | « Source/core/editing/StyledMarkupSerializer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698