Skip to content

Commit c232b36

Browse files
committed
Improving the detection of valid/invalid elements
1 parent 360168d commit c232b36

File tree

2 files changed

+60
-15
lines changed

2 files changed

+60
-15
lines changed

src/data/AutoScroll.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -274,25 +274,36 @@ chrome.storage.local.get(defaults, function (options) {
274274
}
275275

276276

277+
// TODO maybe handle `contentEditable` ?
277278
function isInvalid(elem) {
279+
return (elem.localName === "a" && elem.href) ||
280+
(elem.localName === "textarea") ||
281+
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input
282+
(elem.localName === "input" &&
283+
!(elem.type === "button" ||
284+
elem.type === "checkbox" ||
285+
elem.type === "file" ||
286+
elem.type === "hidden" ||
287+
elem.type === "image" ||
288+
elem.type === "radio" ||
289+
elem.type === "reset" ||
290+
elem.type === "submit"));
291+
}
292+
293+
function isValid(elem) {
278294
if (options["scrollOnLinks"]) {
279-
return false
280-
// <input> tags can't have children, so the only time it will ever occur is as event.target
281-
} else if (elem.localName === "input") {
282-
return !(elem.type === "button" ||
283-
elem.type === "checkbox" ||
284-
elem.type === "file" ||
285-
elem.type === "hidden" ||
286-
elem.type === "image" ||
287-
elem.type === "radio" ||
288-
elem.type === "reset" ||
289-
elem.type === "submit")
295+
return true
296+
290297
} else {
291298
while (true) {
292-
if (elem === document || elem === document.body || elem === htmlNode) {
293-
return false
294-
} else if (elem.localName === "a" && elem.href || elem.localName === "textarea") {
299+
if (elem === document ||
300+
elem === document.body ||
301+
elem === htmlNode) {
295302
return true
303+
304+
} else if (isInvalid(elem)) {
305+
return false
306+
296307
} else {
297308
elem = elem.parentNode
298309
}
@@ -446,7 +457,7 @@ chrome.storage.local.get(defaults, function (options) {
446457
if (((e.button === 1 && options.middleClick) ||
447458
(e.button === 0 && (e.ctrlKey || e.metaKey) && options.ctrlClick)) &&
448459
e.clientX < htmlNode.clientWidth &&
449-
!isInvalid(e.target)) {
460+
isValid(e.target)) {
450461

451462
var elem = findScroll(e.target)
452463

test/Valid.html

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5+
6+
<style>
7+
body {
8+
margin: 0px;
9+
}
10+
11+
#page {
12+
height: 9999px;
13+
padding: 30px;
14+
}
15+
</style>
16+
</head>
17+
<body>
18+
<div id="page">
19+
<p>
20+
<a href="http://example.com">Example</a>
21+
</p>
22+
<p>
23+
<a href="http://example.com"><button>Example</button></a>
24+
</p>
25+
<p>
26+
<a href="http://example.com"><input type="button" value="Example"></input></a>
27+
</p>
28+
29+
<p>
30+
<input type="button" value="Example"></input>
31+
</p>
32+
</div>
33+
</body>
34+
</html>

0 commit comments

Comments
 (0)