(ele, addID, exact)
| 4641 | } |
| 4642 | |
| 4643 | function geneSelector(ele, addID, exact) { |
| 4644 | let selector = ele.nodeName.toLowerCase(); |
| 4645 | //Google id class都是隨機。百度更過分,style script順序都是隨機的 |
| 4646 | if (selector !== "html" && selector !== "body") { |
| 4647 | let hasId = false; |
| 4648 | if (addID && ele.id && /^[a-z_][\w\-_]*$/i.test(ele.id)) { |
| 4649 | if (ele.ownerDocument && ele.ownerDocument.querySelectorAll("#" + ele.id).length === 1) { |
| 4650 | hasId = true; |
| 4651 | selector = '#' + ele.id; |
| 4652 | } |
| 4653 | } |
| 4654 | if (!hasId) { |
| 4655 | let className = ""; |
| 4656 | if (ele.className) { |
| 4657 | let classList = ele.classList; |
| 4658 | for (let i = 0; i < classList.length; i++) { |
| 4659 | let c = classList[i]; |
| 4660 | if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) { |
| 4661 | className += '.' + c; |
| 4662 | } |
| 4663 | } |
| 4664 | selector += className; |
| 4665 | } |
| 4666 | let parent = ele.parentElement; |
| 4667 | if (parent) { |
| 4668 | if (exact) { |
| 4669 | let i, nth = 0, all = 0; |
| 4670 | for (i = 0; i < parent.children.length; i++) { |
| 4671 | if (parent.children[i].nodeName === ele.nodeName) { |
| 4672 | all++; |
| 4673 | if (parent.children[i] === ele) { |
| 4674 | nth = all; |
| 4675 | } |
| 4676 | if (nth > 0 && all > 1) { |
| 4677 | break; |
| 4678 | } |
| 4679 | } |
| 4680 | } |
| 4681 | selector += (all === 1 ? "" : `:nth-of-type(${nth})`); |
| 4682 | } else if (!className && !hasId && parent.children.length > 1 && !compareNodeName(parent, ["html"])) { |
| 4683 | let prevE = ele.previousElementSibling; |
| 4684 | if (prevE && prevE.className) { |
| 4685 | let classList = prevE.classList; |
| 4686 | for (let i = 0; i < classList.length; i++) { |
| 4687 | let c = classList[i]; |
| 4688 | if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) { |
| 4689 | className += '.' + c; |
| 4690 | } |
| 4691 | } |
| 4692 | if (className) { |
| 4693 | selector = prevE.nodeName.toLowerCase() + className + "+" + selector; |
| 4694 | } |
| 4695 | } |
| 4696 | if (!className) { |
| 4697 | let i, nth = 0, all = 0; |
| 4698 | for (i = 0; i < parent.children.length; i++) { |
| 4699 | if (parent.children[i].nodeName === ele.nodeName) { |
| 4700 | all++; |
no test coverage detected