summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2020-01-25 09:05:21 -0500
committerGaming4JC <g4jc@hyperbola.info>2020-01-26 15:50:52 -0500
commit0cea94242a555b7a8a2d956412da809a514814f7 (patch)
treec7522df90cbadd242936308a2818d7bd240b613f
parentd84323905b149cda8063ef73cd92e852f36c96c9 (diff)
downloadUXP-0cea94242a555b7a8a2d956412da809a514814f7.tar
UXP-0cea94242a555b7a8a2d956412da809a514814f7.tar.gz
UXP-0cea94242a555b7a8a2d956412da809a514814f7.tar.lz
UXP-0cea94242a555b7a8a2d956412da809a514814f7.tar.xz
UXP-0cea94242a555b7a8a2d956412da809a514814f7.zip
Bug 1430034 - Fix attributeChangedCallback isn't fired with correct newValue when the attribute value is an empty string;
Tag UXP Issue #1344
-rw-r--r--dom/base/CustomElementRegistry.cpp2
-rw-r--r--testing/web-platform/tests/custom-elements/attribute-changed-callback.html31
2 files changed, 32 insertions, 1 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp
index 4fb18381f..47601aabb 100644
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -909,7 +909,7 @@ CustomElementRegistry::Upgrade(Element* aElement,
LifecycleCallbackArgs args = {
nsDependentAtomString(attrName),
NullString(),
- (attrValue.IsEmpty() ? NullString() : attrValue),
+ attrValue,
(namespaceURI.IsEmpty() ? NullString() : namespaceURI)
};
nsContentUtils::EnqueueLifecycleCallback(nsIDocument::eAttributeChanged,
diff --git a/testing/web-platform/tests/custom-elements/attribute-changed-callback.html b/testing/web-platform/tests/custom-elements/attribute-changed-callback.html
index bd467912b..5090bfbfb 100644
--- a/testing/web-platform/tests/custom-elements/attribute-changed-callback.html
+++ b/testing/web-platform/tests/custom-elements/attribute-changed-callback.html
@@ -11,6 +11,7 @@
</head>
<body>
<div id="log"></div>
+<parser-created-element title></parser-created-element>
<script>
var customElement = define_new_custom_element(['title', 'id', 'r']);
@@ -218,6 +219,36 @@ test(function () {
assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hello', namespace: null});
}, 'attributedChangedCallback must not be enqueued when mutating inline style declaration if the style attribute is not observed');
+test(function () {
+ var calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['title'];
+ customElements.define('parser-created-element', CustomElement);
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+}, 'Upgrading a parser created element must enqueue and invoke attributeChangedCallback for an HTML attribute');
+
+test(function () {
+ var calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['title'];
+ customElements.define('cloned-element-with-attribute', CustomElement);
+
+ var instance = document.createElement('cloned-element-with-attribute');
+ assert_equals(calls.length, 0);
+ instance.title = '';
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+
+ calls = [];
+ var clone = instance.cloneNode(false);
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+}, 'Upgrading a cloned element must enqueue and invoke attributeChangedCallback for an HTML attribute');
+
</script>
</body>
</html>