forked from mirrors/gecko-dev
		
	Differential Revision: https://phabricator.services.mozilla.com/D37217 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			107 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 | 
						|
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
this.util = (function() { // eslint-disable-line no-unused-vars
 | 
						|
  const exports = {};
 | 
						|
 | 
						|
  /** Removes a node from its document, if it's a node and the node is attached to a parent */
 | 
						|
  exports.removeNode = function(el) {
 | 
						|
    if (el && el.parentNode) {
 | 
						|
      el.remove();
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  /** Truncates the X coordinate to the document size */
 | 
						|
  exports.truncateX = function(x) {
 | 
						|
    const max = Math.max(document.documentElement.clientWidth, document.body.clientWidth, document.documentElement.scrollWidth, document.body.scrollWidth);
 | 
						|
    if (x < 0) {
 | 
						|
      return 0;
 | 
						|
    } else if (x > max) {
 | 
						|
      return max;
 | 
						|
    }
 | 
						|
    return x;
 | 
						|
  };
 | 
						|
 | 
						|
  /** Truncates the Y coordinate to the document size */
 | 
						|
  exports.truncateY = function(y) {
 | 
						|
    const max = Math.max(document.documentElement.clientHeight, document.body.clientHeight, document.documentElement.scrollHeight, document.body.scrollHeight);
 | 
						|
    if (y < 0) {
 | 
						|
      return 0;
 | 
						|
    } else if (y > max) {
 | 
						|
      return max;
 | 
						|
    }
 | 
						|
    return y;
 | 
						|
  };
 | 
						|
 | 
						|
  // Pixels of wiggle the captured region gets in captureSelectedText:
 | 
						|
  const CAPTURE_WIGGLE = 10;
 | 
						|
  const ELEMENT_NODE = document.ELEMENT_NODE;
 | 
						|
 | 
						|
  exports.captureEnclosedText = function(box) {
 | 
						|
    const scrollX = window.scrollX;
 | 
						|
    const scrollY = window.scrollY;
 | 
						|
    const text = [];
 | 
						|
    function traverse(el) {
 | 
						|
      let elBox = el.getBoundingClientRect();
 | 
						|
      elBox = {
 | 
						|
        top: elBox.top + scrollY,
 | 
						|
        bottom: elBox.bottom + scrollY,
 | 
						|
        left: elBox.left + scrollX,
 | 
						|
        right: elBox.right + scrollX,
 | 
						|
      };
 | 
						|
      if (elBox.bottom < box.top ||
 | 
						|
          elBox.top > box.bottom ||
 | 
						|
          elBox.right < box.left ||
 | 
						|
          elBox.left > box.right) {
 | 
						|
        // Totally outside of the box
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      if (elBox.bottom > box.bottom + CAPTURE_WIGGLE ||
 | 
						|
          elBox.top < box.top - CAPTURE_WIGGLE ||
 | 
						|
          elBox.right > box.right + CAPTURE_WIGGLE ||
 | 
						|
          elBox.left < box.left - CAPTURE_WIGGLE) {
 | 
						|
        // Partially outside the box
 | 
						|
        for (let i = 0; i < el.childNodes.length; i++) {
 | 
						|
          const child = el.childNodes[i];
 | 
						|
          if (child.nodeType === ELEMENT_NODE) {
 | 
						|
            traverse(child);
 | 
						|
          }
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      addText(el);
 | 
						|
    }
 | 
						|
    function addText(el) {
 | 
						|
      let t;
 | 
						|
      if (el.tagName === "IMG") {
 | 
						|
        t = el.getAttribute("alt") || el.getAttribute("title");
 | 
						|
      } else if (el.tagName === "A") {
 | 
						|
        t = el.innerText;
 | 
						|
        if (el.getAttribute("href") && !el.getAttribute("href").startsWith("#")) {
 | 
						|
          t += " (" + el.href + ")";
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        t = el.innerText;
 | 
						|
      }
 | 
						|
      if (t) {
 | 
						|
        text.push(t);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    traverse(document.body);
 | 
						|
    if (text.length) {
 | 
						|
      let result = text.join("\n");
 | 
						|
      result = result.replace(/^\s+/, "");
 | 
						|
      result = result.replace(/\s+$/, "");
 | 
						|
      result = result.replace(/[ \t]+\n/g, "\n");
 | 
						|
      return result;
 | 
						|
    }
 | 
						|
    return null;
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
  return exports;
 | 
						|
})();
 | 
						|
null;
 |