| Index: third_party/WebKit/Source/core/dom/custom/CustomElementsRegistryTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistryTest.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistryTest.cpp
|
| index ea1d265c8cbb8f2f6920e49d58ba72bef9f3ca70..a669cec94f5160648341465ff45231c8442c367a 100644
|
| --- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistryTest.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistryTest.cpp
|
| @@ -268,14 +268,56 @@ public:
|
| // TODO(dominicc): Make this class collect a vector of what's
|
| // upgraded; it will be useful in more tests.
|
| Member<Element> m_element;
|
| - uint32_t m_invocationCount;
|
| + enum MethodType {
|
| + Constructor,
|
| + ConnectedCallback,
|
| + DisconnectedCallback,
|
| + AttributeChangedCallback,
|
| + };
|
| + Vector<MethodType> m_logs;
|
| +
|
| + struct AttributeChanged {
|
| + QualifiedName name;
|
| + AtomicString oldValue;
|
| + AtomicString newValue;
|
| + };
|
| + Vector<AttributeChanged> m_attributeChanged;
|
| +
|
| + void clear()
|
| + {
|
| + m_logs.clear();
|
| + m_attributeChanged.clear();
|
| + }
|
|
|
| bool runConstructor(Element* element) override
|
| {
|
| - m_invocationCount++;
|
| + m_logs.append(Constructor);
|
| m_element = element;
|
| return TestCustomElementDefinition::runConstructor(element);
|
| }
|
| +
|
| + bool hasConnectedCallback() const override { return true; }
|
| + bool hasDisconnectedCallback() const override { return true; }
|
| + bool hasAttributeChangedCallback(const QualifiedName&) const override { return true; }
|
| +
|
| + void runConnectedCallback(Element* element) override
|
| + {
|
| + m_logs.append(ConnectedCallback);
|
| + EXPECT_EQ(element, m_element);
|
| + }
|
| +
|
| + void runDisconnectedCallback(Element* element) override
|
| + {
|
| + m_logs.append(DisconnectedCallback);
|
| + EXPECT_EQ(element, m_element);
|
| + }
|
| +
|
| + void runAttributeChangedCallback(Element* element, const QualifiedName& name, const AtomicString& oldValue, const AtomicString& newValue) override
|
| + {
|
| + m_logs.append(AttributeChangedCallback);
|
| + EXPECT_EQ(element, m_element);
|
| + m_attributeChanged.append(AttributeChanged { name, oldValue, newValue });
|
| + }
|
| };
|
|
|
| class LogUpgradeBuilder final : public CustomElementDefinitionBuilder {
|
| @@ -299,6 +341,8 @@ TEST_F(CustomElementsRegistryFrameTest, define_upgradesInDocumentElements)
|
| ScriptForbiddenScope doNotRelyOnScript;
|
|
|
| Element* element = CreateElement("a-a").inDocument(&document());
|
| + element->setAttribute(QualifiedName(nullAtom, "attr1", HTMLNames::xhtmlNamespaceURI), "v1");
|
| + element->setBooleanAttribute(HTMLNames::contenteditableAttr, true);
|
| document().documentElement()->appendChild(element);
|
|
|
| LogUpgradeBuilder builder;
|
| @@ -313,10 +357,99 @@ TEST_F(CustomElementsRegistryFrameTest, define_upgradesInDocumentElements)
|
| }
|
| LogUpgradeDefinition* definition =
|
| static_cast<LogUpgradeDefinition*>(registry().definitionForName("a-a"));
|
| - EXPECT_EQ(1u, definition->m_invocationCount)
|
| + EXPECT_EQ(LogUpgradeDefinition::Constructor, definition->m_logs[0])
|
| << "defining the element should have 'upgraded' the existing element";
|
| EXPECT_EQ(element, definition->m_element)
|
| << "the existing a-a element should have been upgraded";
|
| +
|
| + EXPECT_EQ(LogUpgradeDefinition::AttributeChangedCallback, definition->m_logs[1])
|
| + << "Upgrade should invoke attributeChangedCallback for all attributes";
|
| + EXPECT_EQ("attr1", definition->m_attributeChanged[0].name);
|
| + EXPECT_EQ(nullAtom, definition->m_attributeChanged[0].oldValue);
|
| + EXPECT_EQ("v1", definition->m_attributeChanged[0].newValue);
|
| +
|
| + EXPECT_EQ(LogUpgradeDefinition::AttributeChangedCallback, definition->m_logs[2])
|
| + << "Upgrade should invoke attributeChangedCallback for all attributes";
|
| + EXPECT_EQ("contenteditable", definition->m_attributeChanged[1].name);
|
| + EXPECT_EQ(nullAtom, definition->m_attributeChanged[1].oldValue);
|
| + EXPECT_EQ(emptyAtom, definition->m_attributeChanged[1].newValue);
|
| + EXPECT_EQ(2u, definition->m_attributeChanged.size())
|
| + << "Upgrade should invoke attributeChangedCallback for all attributes";
|
| +
|
| + EXPECT_EQ(LogUpgradeDefinition::ConnectedCallback, definition->m_logs[3])
|
| + << "upgrade should invoke connectedCallback";
|
| +
|
| + EXPECT_EQ(4u, definition->m_logs.size())
|
| + << "upgrade should not invoke other callbacks";
|
| +}
|
| +
|
| +TEST_F(CustomElementsRegistryFrameTest, attributeChangedCallback)
|
| +{
|
| + ScriptForbiddenScope doNotRelyOnScript;
|
| +
|
| + Element* element = CreateElement("a-a").inDocument(&document());
|
| + document().documentElement()->appendChild(element);
|
| +
|
| + LogUpgradeBuilder builder;
|
| + NonThrowableExceptionState shouldNotThrow;
|
| + {
|
| + CEReactionsScope reactions;
|
| + registry().define(
|
| + "a-a",
|
| + builder,
|
| + ElementRegistrationOptions(),
|
| + shouldNotThrow);
|
| + }
|
| + LogUpgradeDefinition* definition =
|
| + static_cast<LogUpgradeDefinition*>(registry().definitionForName("a-a"));
|
| +
|
| + definition->clear();
|
| + {
|
| + CEReactionsScope reactions;
|
| + element->setAttribute(QualifiedName(nullAtom, "attr2", HTMLNames::xhtmlNamespaceURI), "v2");
|
| + }
|
| + EXPECT_EQ(LogUpgradeDefinition::AttributeChangedCallback, definition->m_logs[0])
|
| + << "Adding an attribute should invoke attributeChangedCallback";
|
| + EXPECT_EQ(1u, definition->m_attributeChanged.size())
|
| + << "Adding an attribute should invoke attributeChangedCallback";
|
| + EXPECT_EQ("attr2", definition->m_attributeChanged[0].name);
|
| + EXPECT_EQ(nullAtom, definition->m_attributeChanged[0].oldValue);
|
| + EXPECT_EQ("v2", definition->m_attributeChanged[0].newValue);
|
| +
|
| + EXPECT_EQ(1u, definition->m_logs.size())
|
| + << "upgrade should not invoke other callbacks";
|
| +}
|
| +
|
| +TEST_F(CustomElementsRegistryFrameTest, disconnectedCallback)
|
| +{
|
| + ScriptForbiddenScope doNotRelyOnScript;
|
| +
|
| + Element* element = CreateElement("a-a").inDocument(&document());
|
| + document().documentElement()->appendChild(element);
|
| +
|
| + LogUpgradeBuilder builder;
|
| + NonThrowableExceptionState shouldNotThrow;
|
| + {
|
| + CEReactionsScope reactions;
|
| + registry().define(
|
| + "a-a",
|
| + builder,
|
| + ElementRegistrationOptions(),
|
| + shouldNotThrow);
|
| + }
|
| + LogUpgradeDefinition* definition =
|
| + static_cast<LogUpgradeDefinition*>(registry().definitionForName("a-a"));
|
| +
|
| + definition->clear();
|
| + {
|
| + CEReactionsScope reactions;
|
| + element->remove(shouldNotThrow);
|
| + }
|
| + EXPECT_EQ(LogUpgradeDefinition::DisconnectedCallback, definition->m_logs[0])
|
| + << "remove() should invoke disconnectedCallback";
|
| +
|
| + EXPECT_EQ(1u, definition->m_logs.size())
|
| + << "remove() should not invoke other callbacks";
|
| }
|
|
|
| // TODO(dominicc): Add tests which adjust the "is" attribute when type
|
|
|