This source file includes following definitions.
- didCreateImport
- embedderCustomElementNames
- addEmbedderCustomElementName
- isValidName
- define
- attributeDidChange
- didEnterDocument
- didLeaveDocument
- wasDestroyed
#include "config.h"
#include "core/dom/custom/CustomElement.h"
#include "HTMLNames.h"
#include "MathMLNames.h"
#include "SVGNames.h"
#include "core/dom/Element.h"
#include "core/dom/custom/CustomElementObserver.h"
#include "core/dom/custom/CustomElementScheduler.h"
namespace WebCore {
CustomElementMicrotaskImportStep* CustomElement::didCreateImport(HTMLImportChild* import)
{
return CustomElementScheduler::scheduleImport(import);
}
Vector<AtomicString>& CustomElement::embedderCustomElementNames()
{
DEFINE_STATIC_LOCAL(Vector<AtomicString>, names, ());
return names;
}
void CustomElement::addEmbedderCustomElementName(const AtomicString& name)
{
AtomicString lower = name.lower();
if (isValidName(lower, EmbedderNames))
return;
embedderCustomElementNames().append(lower);
}
bool CustomElement::isValidName(const AtomicString& name, NameSet validNames)
{
if ((validNames & EmbedderNames) && kNotFound != embedderCustomElementNames().find(name))
return Document::isValidName(name);
if ((validNames & StandardNames) && kNotFound != name.find('-')) {
DEFINE_STATIC_LOCAL(Vector<AtomicString>, reservedNames, ());
if (reservedNames.isEmpty()) {
reservedNames.append(MathMLNames::annotation_xmlTag.localName());
reservedNames.append("color-profile");
reservedNames.append(SVGNames::font_faceTag.localName());
reservedNames.append(SVGNames::font_face_srcTag.localName());
reservedNames.append(SVGNames::font_face_uriTag.localName());
reservedNames.append(SVGNames::font_face_formatTag.localName());
reservedNames.append(SVGNames::font_face_nameTag.localName());
reservedNames.append(SVGNames::missing_glyphTag.localName());
}
if (kNotFound == reservedNames.find(name))
return Document::isValidName(name.string());
}
return false;
}
void CustomElement::define(Element* element, PassRefPtr<CustomElementDefinition> passDefinition)
{
RefPtr<CustomElementDefinition> definition(passDefinition);
switch (element->customElementState()) {
case Element::NotCustomElement:
case Element::Upgraded:
ASSERT_NOT_REACHED();
break;
case Element::WaitingForUpgrade:
element->setCustomElementDefinition(definition);
CustomElementScheduler::scheduleCallback(definition->callbacks(), element, CustomElementLifecycleCallbacks::Created);
break;
}
}
void CustomElement::attributeDidChange(Element* element, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue)
{
ASSERT(element->customElementState() == Element::Upgraded);
CustomElementScheduler::scheduleAttributeChangedCallback(element->customElementDefinition()->callbacks(), element, name, oldValue, newValue);
}
void CustomElement::didEnterDocument(Element* element, const Document& document)
{
ASSERT(element->customElementState() == Element::Upgraded);
if (!document.domWindow())
return;
CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, CustomElementLifecycleCallbacks::Attached);
}
void CustomElement::didLeaveDocument(Element* element, const Document& document)
{
ASSERT(element->customElementState() == Element::Upgraded);
if (!document.domWindow())
return;
CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, CustomElementLifecycleCallbacks::Detached);
}
void CustomElement::wasDestroyed(Element* element)
{
switch (element->customElementState()) {
case Element::NotCustomElement:
ASSERT_NOT_REACHED();
break;
case Element::WaitingForUpgrade:
case Element::Upgraded:
CustomElementObserver::notifyElementWasDestroyed(element);
break;
}
}
}