Skip to content

Commit 21c911e

Browse files
committed
Suggest using textContent instead of innerHTML
1 parent 3cf9ed4 commit 21c911e

File tree

3 files changed

+37
-26
lines changed

3 files changed

+37
-26
lines changed

docs/rules/no-innter-html.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# No `innerHTML`
22

3-
Using `innerHTML` poses a potential security risk. It should only be used when clearing content.
3+
Using `innerHTML` poses a potential security risk. Prefer using `textContent` so set text to an element.
44

55
```js
66
// bad
@@ -9,8 +9,8 @@ function setContent(element, content) {
99
}
1010

1111
// good
12-
function clearContent(element) {
13-
element.innerHTML = ''
12+
function setContent(element, content) {
13+
element.textContent = content
1414
}
1515
```
1616

lib/rules/no-inner-html.js

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,28 @@ module.exports = {
22
meta: {
33
type: 'problem',
44
docs: {
5-
description: 'disallow `Element.prototype.innerHTML``',
5+
description: 'disallow `Element.prototype.innerHTML` in favor of `Element.prototype.textContent`',
66
url: require('../url')(module)
77
},
8+
fixable: 'code',
89
schema: []
910
},
1011

1112
create(context) {
1213
return {
13-
AssignmentExpression(node) {
14-
if (node.operator === '=') {
15-
const leftNode = node.left
16-
const rightNode = node.right
17-
18-
if (leftNode.property && leftNode.property.name === 'innerHTML') {
19-
if (rightNode.type === 'Literal' && rightNode.value === '') {
20-
return
14+
MemberExpression(node) {
15+
if (node.property && node.property.name === 'innerHTML') {
16+
context.report({
17+
node: node.property,
18+
meta: {
19+
fixable: 'code'
20+
},
21+
message:
22+
'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
23+
fix(fixer) {
24+
return fixer.replaceText(node.property, 'textContent')
2125
}
22-
23-
context.report({
24-
node,
25-
message:
26-
'Using innerHTML poses a potential security risk and should not be used other than clearing content.'
27-
})
28-
}
26+
})
2927
}
3028
}
3129
}

tests/no-inner-html.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,40 @@ const ruleTester = new RuleTester()
66
ruleTester.run('no-innter-html', rule, {
77
valid: [
88
{
9-
code: 'document.createElement("js-flash-text").innerHTML = ""'
9+
code: 'document.createElement("js-flash-text").textContent = ""'
10+
},
11+
{
12+
code: 'document.createElement("js-flash-text").textContent = "foo"'
1013
}
1114
],
1215
invalid: [
1316
{
1417
code: 'document.createElement("js-flash-text").innerHTML = "foo"',
18+
output: 'document.createElement("js-flash-text").textContent = "foo"',
1519
errors: [
1620
{
17-
message:
18-
'Using innerHTML poses a potential security risk and should not be used other than clearing content.',
19-
type: 'AssignmentExpression'
21+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
22+
type: 'Identifier'
2023
}
2124
]
2225
},
2326
{
2427
code: 'document.querySelector("js-flash-text").innerHTML = "<div>code</div>"',
28+
output: 'document.querySelector("js-flash-text").textContent = "<div>code</div>"',
29+
errors: [
30+
{
31+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
32+
type: 'Identifier'
33+
}
34+
]
35+
},
36+
{
37+
code: 'document.querySelector("js-flash-text").innerHTML = ""',
38+
output: 'document.querySelector("js-flash-text").textContent = ""',
2539
errors: [
2640
{
27-
message:
28-
'Using innerHTML poses a potential security risk and should not be used other than clearing content.',
29-
type: 'AssignmentExpression'
41+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
42+
type: 'Identifier'
3043
}
3144
]
3245
}

0 commit comments

Comments
 (0)