From b7f0487d32dd50b73cf7729bbb4a900db9b786c8 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Sun, 13 Mar 2016 08:10:23 +0000 Subject: Global link hints; revert b7535a604954b5873d825eb66bfecd08f1f2c99b. Here's why: - b7535a604954b5873d825eb66bfecd08f1f2c99b is complicated and complex (O(n^2)). - With experience, it is not obviously better than what was there before, and in some cases it's worse. - b7535a604954b5873d825eb66bfecd08f1f2c99b selects way too much text in some cases; e.g. on Google Inbox, it selects text lengths in the tens of thousands of characters. That cannot be useful. - With global hints, this extra cost (resulting from passing large objects between frames) is significant and noticable. - The simpler approach of accounting for text length when scoring filtered hints (tweaked here: 5cbc5ad702a01a81b98f8c82edb3b6d227c2c7b5) works better in practice. --- content_scripts/link_hints.coffee | 5 ++--- lib/dom_utils.coffee | 19 ------------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index 32d67ab9..fae255c6 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -321,7 +321,6 @@ LocalHints = hint.hasHref = hint.element.href? for hint in localHints if Settings.get "filterLinkHints" - DomUtils.textContent.reset() @generateLabelMap() extend hint, @generateLinkText hint.element for hint in localHints @@ -354,14 +353,14 @@ LocalHints = linkText = element.value if not linkText and 'placeholder' of element linkText = element.placeholder - # check if there is an image embedded in the tag + # Check if there is an image embedded in the tag. else if (nodeName == "a" && !element.textContent.trim() && element.firstElementChild && element.firstElementChild.nodeName.toLowerCase() == "img") linkText = element.firstElementChild.alt || element.firstElementChild.title showLinkText = true if (linkText) else - linkText = DomUtils.textContent.get element + linkText = (element.textContent.trim() || element.innerHTML.trim())[...512] {linkText, showLinkText} diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index 39e1fecd..014a1f50 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -316,25 +316,6 @@ DomUtils = else sel.focusNode - # Get the text content of an element (and its descendents), but omit the text content of previously-visited - # nodes. See #1514. - # NOTE(smblott). This is currently O(N^2) (when called on N elements). An alternative would be to mark - # each node visited, and then clear the marks when we're done. - textContent: do -> - visitedNodes = null - reset: -> visitedNodes = [] - get: (element) -> - nodes = document.createTreeWalker element, NodeFilter.SHOW_TEXT - texts = - while node = nodes.nextNode() - continue unless node.nodeType == 3 - continue if node in visitedNodes - text = node.data.trim() - continue unless 0 < text.length - visitedNodes.push node - text - texts.join " " - # Get the element in the DOM hierachy that contains `element`. # If the element is rendered in a shadow DOM via a element, the element will be # returned, so the shadow DOM is traversed rather than passed over. -- cgit v1.2.3