Skip to content

Commit e6bf709

Browse files
authored
Merge pull request #138 from github/suggest-textContent-instead-of-innerHTML
Suggest using textContent instead of innerHTML
2 parents 3cf9ed4 + 8a0b80c commit e6bf709

File tree

3 files changed

+26
-28
lines changed

3 files changed

+26
-28
lines changed

docs/rules/no-innter-html.md

+3-3
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` to 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

+6-18
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,19 @@ 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
},
88
schema: []
99
},
1010

1111
create(context) {
1212
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
21-
}
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-
}
29-
}
13+
'MemberExpression[property.name=innerHTML]': function (node) {
14+
context.report({
15+
node: node.property,
16+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.'
17+
})
3018
}
3119
}
3220
}

tests/no-inner-html.js

+17-7
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,37 @@ 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"',
1518
errors: [
1619
{
17-
message:
18-
'Using innerHTML poses a potential security risk and should not be used other than clearing content.',
19-
type: 'AssignmentExpression'
20+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
21+
type: 'Identifier'
2022
}
2123
]
2224
},
2325
{
2426
code: 'document.querySelector("js-flash-text").innerHTML = "<div>code</div>"',
2527
errors: [
2628
{
27-
message:
28-
'Using innerHTML poses a potential security risk and should not be used other than clearing content.',
29-
type: 'AssignmentExpression'
29+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
30+
type: 'Identifier'
31+
}
32+
]
33+
},
34+
{
35+
code: 'document.querySelector("js-flash-text").innerHTML = ""',
36+
errors: [
37+
{
38+
message: 'Using innerHTML poses a potential security risk and should not be used. Prefer using textContent.',
39+
type: 'Identifier'
3040
}
3141
]
3242
}

0 commit comments

Comments
 (0)