r) { // Have some text, let's figure out if it looks like a URL that isn't // actually a link. linkText = selectionStr.trim(); if ( lazy.UrlUtils.looksLikeUrl(linkText, { requirePath: false, validateOrigin: true, }) ) { // Now let's see if this is an intentional link selection. Our guess is // based on whether the selection begins/ends with whitespace or is // preceded/followed by a non-word character. // selection.toString() trims trailing whitespace, so we look for // that explicitly in the first and last ranges. let beginRange = selection.getRangeAt(0); let delimitedAtStart = /^\s/.test(beginRange); if (!delimitedAtStart) { let container = beginRange.startContainer; let offset = beginRange.startOffset; if (container.nodeType == container.TEXT_NODE && offset > 0) { delimitedAtStart = /\W/.test(container.textContent[offset - 1]); } else { delimitedAtStart = true; } } let delimitedAtEnd = false; if (delimitedAtStart) { let endRange = selection.getRangeAt(selection.rangeCount - 1); delimitedAtEnd = /\s$/.test(endRange); if (!delimitedAtEnd) { let container = endRange.endContainer; let offset = endRange.endOffset; if ( container.nodeType == container.TEXT_NODE && offset < container.textContent.length ) { delimitedAtEnd = /\W/.test(container.textContent[offset]); } else { delimitedAtEnd = true; } } } if (delimitedAtStart && delimitedAtEnd) { try { url = Services.uriFixup.getFixupURIInfo(linkText).preferredURI; } catch (ex) {} } } } if (selectionStr) { // Pass up to 16K through unmolested. If an add-on needs more, they will // have to use a content script. fullText = selectionStr.substr(0, 16384); selectionStr = this.trimSelection(selectionStr, aCharLen); } // This try catch is necessary since in rare cases, we think some text is a // link, but the host is actually invalid so we fail in nsIURI.host try { if (url && !url.host) { url = null; } } catch (ex) { url = null; } return { text: selectionStr, docSelectionIsCollapsed: collapsed, isDocumentLevelSelection, fullText, linkURL: url ? url.spec : null, linkText: url ? linkText : "", }; }, }; PK