| Index: Source/core/editing/markup.cpp
|
| diff --git a/Source/core/editing/markup.cpp b/Source/core/editing/markup.cpp
|
| index d6f21373d46312daa8e3bb0b3c17e7f4833c6fda..c58d828319b0af89fd79888ccd56782f36902319 100644
|
| --- a/Source/core/editing/markup.cpp
|
| +++ b/Source/core/editing/markup.cpp
|
| @@ -69,13 +69,14 @@ using namespace HTMLNames;
|
| static bool propertyMissingOrEqualToNone(StylePropertySet*, CSSPropertyID);
|
|
|
| class AttributeChange {
|
| + ALLOW_ONLY_INLINE_ALLOCATION();
|
| public:
|
| AttributeChange()
|
| : m_name(nullAtom, nullAtom, nullAtom)
|
| {
|
| }
|
|
|
| - AttributeChange(PassRefPtr<Element> element, const QualifiedName& name, const String& value)
|
| + AttributeChange(PassRefPtrWillBeRawPtr<Element> element, const QualifiedName& name, const String& value)
|
| : m_element(element), m_name(name), m_value(value)
|
| {
|
| }
|
| @@ -85,15 +86,26 @@ public:
|
| m_element->setAttribute(m_name, AtomicString(m_value));
|
| }
|
|
|
| + void trace(Visitor* visitor)
|
| + {
|
| + visitor->trace(m_element);
|
| + }
|
| +
|
| private:
|
| - RefPtr<Element> m_element;
|
| + RefPtrWillBeMember<Element> m_element;
|
| QualifiedName m_name;
|
| String m_value;
|
| };
|
|
|
| +} // namespace WebCore
|
| +
|
| +WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(WebCore::AttributeChange);
|
| +
|
| +namespace WebCore {
|
| +
|
| static void completeURLs(DocumentFragment& fragment, const String& baseURL)
|
| {
|
| - Vector<AttributeChange> changes;
|
| + WillBeHeapVector<AttributeChange> changes;
|
|
|
| KURL parsedBaseURL(ParsedURLString, baseURL);
|
|
|
| @@ -117,7 +129,7 @@ class StyledMarkupAccumulator FINAL : public MarkupAccumulator {
|
| public:
|
| enum RangeFullySelectsNode { DoesFullySelectNode, DoesNotFullySelectNode };
|
|
|
| - StyledMarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs, EAnnotateForInterchange, const Range*, Node* highestNodeToBeSerialized = 0);
|
| + StyledMarkupAccumulator(WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, EAbsoluteURLs, EAnnotateForInterchange, RawPtr<const Range>, Node* highestNodeToBeSerialized = 0);
|
| Node* serializeNodes(Node* startNode, Node* pastEnd);
|
| void appendString(const String& s) { return MarkupAccumulator::appendString(s); }
|
| void wrapWithNode(Node&, bool convertBlocksToInlines = false, RangeFullySelectsNode = DoesFullySelectNode);
|
| @@ -145,12 +157,11 @@ private:
|
|
|
| Vector<String> m_reversedPrecedingMarkup;
|
| const EAnnotateForInterchange m_shouldAnnotate;
|
| - Node* m_highestNodeToBeSerialized;
|
| - RefPtr<EditingStyle> m_wrappingStyle;
|
| + RawPtrWillBeMember<Node> m_highestNodeToBeSerialized;
|
| + RefPtrWillBeMember<EditingStyle> m_wrappingStyle;
|
| };
|
|
|
| -inline StyledMarkupAccumulator::StyledMarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, EAnnotateForInterchange shouldAnnotate,
|
| - const Range* range, Node* highestNodeToBeSerialized)
|
| +inline StyledMarkupAccumulator::StyledMarkupAccumulator(WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, EAbsoluteURLs shouldResolveURLs, EAnnotateForInterchange shouldAnnotate, RawPtr<const Range> range, Node* highestNodeToBeSerialized)
|
| : MarkupAccumulator(nodes, shouldResolveURLs, range)
|
| , m_shouldAnnotate(shouldAnnotate)
|
| , m_highestNodeToBeSerialized(highestNodeToBeSerialized)
|
| @@ -216,7 +227,7 @@ void StyledMarkupAccumulator::appendText(StringBuilder& out, Text& text)
|
| const bool parentIsTextarea = text.parentElement() && text.parentElement()->tagQName() == textareaTag;
|
| const bool wrappingSpan = shouldApplyWrappingStyle(text) && !parentIsTextarea;
|
| if (wrappingSpan) {
|
| - RefPtr<EditingStyle> wrappingStyle = m_wrappingStyle->copy();
|
| + RefPtrWillBeRawPtr<EditingStyle> wrappingStyle = 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 }.
|
| wrappingStyle->forceInline();
|
| @@ -289,7 +300,7 @@ void StyledMarkupAccumulator::appendElement(StringBuilder& out, Element& element
|
| }
|
|
|
| if (shouldOverrideStyleAttr) {
|
| - RefPtr<EditingStyle> newInlineStyle;
|
| + RefPtrWillBeRawPtr<EditingStyle> newInlineStyle = nullptr;
|
|
|
| if (shouldApplyWrappingStyle(element)) {
|
| newInlineStyle = m_wrappingStyle->copy();
|
| @@ -340,7 +351,7 @@ Node* StyledMarkupAccumulator::serializeNodes(Node* startNode, Node* pastEnd)
|
| Node* StyledMarkupAccumulator::traverseNodesForSerialization(Node* startNode, Node* pastEnd, NodeTraversalMode traversalMode)
|
| {
|
| const bool shouldEmit = traversalMode == EmitString;
|
| - Vector<Node*> ancestorsToClose;
|
| + WillBeHeapVector<RawPtrWillBeMember<Node> > ancestorsToClose;
|
| Node* next;
|
| Node* lastClosed = 0;
|
| for (Node* n = startNode; n != pastEnd; n = next) {
|
| @@ -475,7 +486,7 @@ static bool needInterchangeNewlineAfter(const VisiblePosition& v)
|
| return isEndOfParagraph(v) && isStartOfParagraph(next) && !(isHTMLBRElement(*upstreamNode) && upstreamNode == downstreamNode);
|
| }
|
|
|
| -static PassRefPtr<EditingStyle> styleFromMatchedRulesAndInlineDecl(const Node* node)
|
| +static PassRefPtrWillBeRawPtr<EditingStyle> styleFromMatchedRulesAndInlineDecl(const Node* node)
|
| {
|
| if (!node->isHTMLElement())
|
| return nullptr;
|
| @@ -483,7 +494,7 @@ static PassRefPtr<EditingStyle> styleFromMatchedRulesAndInlineDecl(const Node* n
|
| // FIXME: Having to const_cast here is ugly, but it is quite a bit of work to untangle
|
| // the non-const-ness of styleFromMatchedRulesForElement.
|
| HTMLElement* element = const_cast<HTMLElement*>(toHTMLElement(node));
|
| - RefPtr<EditingStyle> style = EditingStyle::create(element->inlineStyle());
|
| + RefPtrWillBeRawPtr<EditingStyle> style = EditingStyle::create(element->inlineStyle());
|
| style->mergeStyleFromRules(element);
|
| return style.release();
|
| }
|
| @@ -541,7 +552,7 @@ static Node* highestAncestorToWrapMarkup(const Range* range, EAnnotateForInterch
|
|
|
| // FIXME: Shouldn't we omit style info when annotate == DoNotAnnotateForInterchange?
|
| // FIXME: At least, annotation and style info should probably not be included in range.markupString()
|
| -static String createMarkupInternal(Document& document, const Range* range, const Range* updatedRange, Vector<Node*>* nodes,
|
| +static String createMarkupInternal(Document& document, const Range* range, const Range* updatedRange, WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes,
|
| EAnnotateForInterchange shouldAnnotate, bool convertBlocksToInlines, EAbsoluteURLs shouldResolveURLs, Node* constrainingAncestor)
|
| {
|
| ASSERT(range);
|
| @@ -586,7 +597,7 @@ static String createMarkupInternal(Document& document, const Range* range, const
|
| // Also include all of the ancestors of lastClosed up to this special ancestor.
|
| for (ContainerNode* ancestor = lastClosed->parentNode(); ancestor; ancestor = ancestor->parentNode()) {
|
| if (ancestor == fullySelectedRoot && !convertBlocksToInlines) {
|
| - RefPtr<EditingStyle> fullySelectedRootStyle = styleFromMatchedRulesAndInlineDecl(fullySelectedRoot);
|
| + RefPtrWillBeRawPtr<EditingStyle> fullySelectedRootStyle = styleFromMatchedRulesAndInlineDecl(fullySelectedRoot);
|
|
|
| // Bring the background attribute over, but not as an attribute because a background attribute on a div
|
| // appears to have no effect.
|
| @@ -624,7 +635,7 @@ static String createMarkupInternal(Document& document, const Range* range, const
|
| return accumulator.takeResults();
|
| }
|
|
|
| -String createMarkup(const Range* range, Vector<Node*>* nodes, EAnnotateForInterchange shouldAnnotate, bool convertBlocksToInlines, EAbsoluteURLs shouldResolveURLs, Node* constrainingAncestor)
|
| +String createMarkup(const Range* range, WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, EAnnotateForInterchange shouldAnnotate, bool convertBlocksToInlines, EAbsoluteURLs shouldResolveURLs, Node* constrainingAncestor)
|
| {
|
| if (!range)
|
| return emptyString();
|
| @@ -734,7 +745,7 @@ PassRefPtrWillBeRawPtr<DocumentFragment> createFragmentFromMarkupWithContext(Doc
|
| return fragment;
|
| }
|
|
|
| -String createMarkup(const Node* node, EChildrenOnly childrenOnly, Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, Vector<QualifiedName>* tagNamesToSkip)
|
| +String createMarkup(const Node* node, EChildrenOnly childrenOnly, WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, EAbsoluteURLs shouldResolveURLs, Vector<QualifiedName>* tagNamesToSkip)
|
| {
|
| if (!node)
|
| return "";
|
| @@ -832,7 +843,7 @@ PassRefPtrWillBeRawPtr<DocumentFragment> createFragmentFromText(Range* context,
|
| if (shouldPreserveNewline(*context)) {
|
| fragment->appendChild(document.createTextNode(string));
|
| if (string.endsWith('\n')) {
|
| - RefPtr<Element> element = createBreakElement(document);
|
| + RefPtrWillBeRawPtr<Element> element = createBreakElement(document);
|
| element->setAttribute(classAttr, AppleInterchangeNewline);
|
| fragment->appendChild(element.release());
|
| }
|
| @@ -861,7 +872,7 @@ PassRefPtrWillBeRawPtr<DocumentFragment> createFragmentFromText(Range* context,
|
| for (size_t i = 0; i < numLines; ++i) {
|
| const String& s = list[i];
|
|
|
| - RefPtr<Element> element;
|
| + RefPtrWillBeRawPtr<Element> element = nullptr;
|
| if (s.isEmpty() && i + 1 == numLines) {
|
| // For last line, use the "magic BR" rather than a P.
|
| element = createBreakElement(document);
|
|
|