Skip to content

Commit b2bf972

Browse files
authored
Supports set vs remove attribute (tbranyen#262)
1 parent 693a161 commit b2bf972

3 files changed

Lines changed: 24 additions & 4 deletions

File tree

packages/diffhtml/lib/html.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,13 @@ delete /** @type {any} */(handleTaggedTemplate)[$$strict];
147147
*/
148148
function setStrictMode(markup, ...args) {
149149
/** @type {any} */(handleTaggedTemplate)[$$strict] = true;
150-
return handleTaggedTemplate(markup, ...args);
150+
try {
151+
return handleTaggedTemplate(markup, ...args);
152+
}
153+
catch (e) {
154+
/** @type {any} */(handleTaggedTemplate)[$$strict] = false;
155+
throw e;
156+
}
151157
}
152158

153-
handleTaggedTemplate.strict = setStrictMode;
159+
handleTaggedTemplate.strict = setStrictMode;

packages/diffhtml/lib/node/patch.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const setAttribute = (vTree, domNode, name, value) => {
3838
const lowerName = isEvent ? name.toLowerCase() : name;
3939

4040
// Runtime checking if the property can be set.
41-
const blocklistName = vTree.nodeName + '-' + lowerName;
41+
const blocklistName = 's-' + vTree.nodeName + '-' + lowerName;
4242

4343
/** @type {HTMLElement} */
4444
const htmlElement = /** @type {any} */ (domNode);
@@ -86,7 +86,7 @@ const setAttribute = (vTree, domNode, name, value) => {
8686
*/
8787
const removeAttribute = (vTree, domNode, name) => {
8888
// Runtime checking if the property can be set.
89-
const blocklistName = vTree.nodeName + '-' + name;
89+
const blocklistName = 'r-' + vTree.nodeName + '-' + name;
9090
const anyNode = /** @type {any} */ (domNode);
9191

9292
if (allowlist.has(blocklistName)) {

packages/diffhtml/test/integration/basics.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,20 @@ describe('Integration: Basics', function() {
165165

166166
diff.Internals.memory.gc();
167167
});
168+
169+
it('will support safely removing properties with delete disabled', function() {
170+
const element = new Proxy(document.createElement('div'), {
171+
deleteProperty() {
172+
throw new Error('Should not cause uncaught failure');
173+
}
174+
});
175+
176+
assert.doesNotThrow(() => {
177+
diff.outerHTML(element, diff.html`<div of="true" />`);
178+
diff.outerHTML(element, diff.html`<div />`);
179+
diff.release(element);
180+
});
181+
});
168182
});
169183

170184
describe('Special features', function() {

0 commit comments

Comments
 (0)