+2016-01-21 Ryosuke Niwa <rniwa@webkit.org>
+
+ createElementFromSavedToken shouldn't have the code to create a non-HTML element
+ https://bugs.webkit.org/show_bug.cgi?id=153327
+
+ Reviewed by Chris Dumez.
+
+ Since HTMLConstructionSite::createElementFromSavedToken is only used to instantiate a formatting element,
+ there is no need for it to support creating a non-HTML elements. Remove the branch and assert that this
+ is indeed the case.
+
+ createElementFromSavedToken is called in HTMLTreeBuilder::callTheAdoptionAgency and HTMLConstructionSite's
+ reconstructTheActiveFormattingElements. In both cases, the stack item passed to createElementFromSavedToken
+ is guaranteed to be in the list of active formatting elements, which only contains formatting elements.
+
+ No new tests since there is no behavioral change.
+
+ * html/parser/HTMLConstructionSite.cpp:
+ (WebCore::HTMLConstructionSite::insertHTMLHeadElement):
+ (WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML):
+ (WebCore::HTMLConstructionSite::insertFormattingElement):
+ (WebCore::HTMLConstructionSite::createElement): Returns Ref<Element> instead of PassRefPtr<Element>.
+ (WebCore::HTMLConstructionSite::createHTMLElement): Ditto.
+ (WebCore::HTMLConstructionSite::createElementFromSavedToken): Ditto. Removed the code to instantiate
+ a non-HTML element. Also assert that an element created by this function is a formatting tag.
+ * html/parser/HTMLConstructionSite.h:
+ * html/parser/HTMLTreeBuilder.cpp:
+ (WebCore::HTMLConstructionSite::isFormattingTag): Put into HTMLConstructionSite to add an assertion.
+ (WebCore::HTMLTreeBuilder::processEndTagForInBody):
+
2016-01-21 Andreas Kling <akling@apple.com>
CGImageSource sometimes retains temporary SharedBuffer data indefinitely, doubling memory cost.
using namespace HTMLNames;
-static inline void setAttributes(Element* element, AtomicHTMLToken* token, ParserContentPolicy parserContentPolicy)
+static inline void setAttributes(Element& element, AtomicHTMLToken* token, ParserContentPolicy parserContentPolicy)
{
if (!scriptingContentIsAllowed(parserContentPolicy))
- element->stripScriptingAttributes(token->attributes());
- element->parserSetAttributes(token->attributes());
+ element.stripScriptingAttributes(token->attributes());
+ element.parserSetAttributes(token->attributes());
}
static bool hasImpliedEndTag(const HTMLStackItem& item)
void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken* token)
{
Ref<HTMLHtmlElement> element = HTMLHtmlElement::create(*m_document);
- setAttributes(element.ptr(), token, m_parserContentPolicy);
+ setAttributes(element.get(), token, m_parserContentPolicy);
attachLater(m_attachmentRoot, element.ptr());
m_openElements.pushHTMLHtmlElement(HTMLStackItem::create(element.copyRef(), *token));
void HTMLConstructionSite::insertHTMLHeadElement(AtomicHTMLToken* token)
{
ASSERT(!shouldFosterParent());
- m_head = HTMLStackItem::create(*createHTMLElement(token), *token);
+ m_head = HTMLStackItem::create(createHTMLElement(token), *token);
attachLater(¤tNode(), &m_head->element());
m_openElements.pushHTMLHeadElement(m_head);
}
// http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements
// Possible active formatting elements include:
// a, b, big, code, em, font, i, nobr, s, small, strike, strong, tt, and u.
+ ASSERT(isFormattingTag(token->name()));
insertHTMLElement(token);
m_activeFormattingElements.append(¤tStackItem());
}
// those flags or effects thereof.
const bool parserInserted = m_parserContentPolicy != AllowScriptingContentAndDoNotMarkAlreadyStarted;
const bool alreadyStarted = m_isParsingFragment && parserInserted;
- RefPtr<HTMLScriptElement> element = HTMLScriptElement::create(scriptTag, ownerDocumentForCurrentNode(), parserInserted, alreadyStarted);
+ Ref<HTMLScriptElement> element = HTMLScriptElement::create(scriptTag, ownerDocumentForCurrentNode(), parserInserted, alreadyStarted);
setAttributes(element.get(), token, m_parserContentPolicy);
if (scriptingContentIsAllowed(m_parserContentPolicy))
- attachLater(¤tNode(), element);
- m_openElements.push(HTMLStackItem::create(element.releaseNonNull(), *token));
+ attachLater(¤tNode(), element.ptr());
+ m_openElements.push(HTMLStackItem::create(WTFMove(element), *token));
}
void HTMLConstructionSite::insertForeignElement(AtomicHTMLToken* token, const AtomicString& namespaceURI)
m_taskQueue.append(task);
}
-PassRefPtr<Element> HTMLConstructionSite::createElement(AtomicHTMLToken* token, const AtomicString& namespaceURI)
+Ref<Element> HTMLConstructionSite::createElement(AtomicHTMLToken* token, const AtomicString& namespaceURI)
{
QualifiedName tagName(nullAtom, token->name(), namespaceURI);
- RefPtr<Element> element = ownerDocumentForCurrentNode().createElement(tagName, true);
+ Ref<Element> element = ownerDocumentForCurrentNode().createElement(tagName, true);
setAttributes(element.get(), token, m_parserContentPolicy);
- return element.release();
+ return element;
}
inline Document& HTMLConstructionSite::ownerDocumentForCurrentNode()
return currentNode().document();
}
-PassRefPtr<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken* token)
+Ref<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken* token)
{
QualifiedName tagName(nullAtom, token->name(), xhtmlNamespaceURI);
// FIXME: This can't use HTMLConstructionSite::createElement because we
// http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#create-an-element-for-the-token
Document& ownerDocument = ownerDocumentForCurrentNode();
bool insideTemplateElement = !ownerDocument.frame();
- RefPtr<Element> element = HTMLElementFactory::createElement(tagName, ownerDocument, insideTemplateElement ? nullptr : form(), true);
+ Ref<Element> element = HTMLElementFactory::createElement(tagName, ownerDocument, insideTemplateElement ? nullptr : form(), true);
// FIXME: This is a hack to connect images to pictures before the image has
// been inserted into the document. It can be removed once asynchronous image
// loading is working.
- if (is<HTMLPictureElement>(currentNode()) && is<HTMLImageElement>(*element.get()))
- downcast<HTMLImageElement>(*element.get()).setPictureElement(&downcast<HTMLPictureElement>(currentNode()));
+ if (is<HTMLPictureElement>(currentNode()) && is<HTMLImageElement>(element))
+ downcast<HTMLImageElement>(element.get()).setPictureElement(&downcast<HTMLPictureElement>(currentNode()));
setAttributes(element.get(), token, m_parserContentPolicy);
ASSERT(element->isHTMLElement());
- return element.release();
+ return element;
}
-PassRefPtr<HTMLStackItem> HTMLConstructionSite::createElementFromSavedToken(HTMLStackItem* item)
+Ref<HTMLStackItem> HTMLConstructionSite::createElementFromSavedToken(HTMLStackItem* item)
{
- RefPtr<Element> element;
// NOTE: Moving from item -> token -> item copies the Attribute vector twice!
AtomicHTMLToken fakeToken(HTMLToken::StartTag, item->localName(), Vector<Attribute>(item->attributes()));
- if (item->namespaceURI() == HTMLNames::xhtmlNamespaceURI)
- element = createHTMLElement(&fakeToken);
- else
- element = createElement(&fakeToken, item->namespaceURI());
- return HTMLStackItem::create(element.releaseNonNull(), fakeToken, item->namespaceURI());
+ ASSERT(item->namespaceURI() == HTMLNames::xhtmlNamespaceURI);
+ ASSERT(isFormattingTag(item->localName()));
+ return HTMLStackItem::create(createHTMLElement(&fakeToken), fakeToken, item->namespaceURI());
}
bool HTMLConstructionSite::indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const