forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
 | 
						|
/* 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 file and Readability-readerable.js are merged together into
 | 
						|
// Readerable.sys.mjs.
 | 
						|
 | 
						|
/* exported Readerable */
 | 
						|
/* import-globals-from Readability-readerable.js */
 | 
						|
 | 
						|
const { XPCOMUtils } = ChromeUtils.importESModule(
 | 
						|
  "resource://gre/modules/XPCOMUtils.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
var Readerable = {
 | 
						|
  get isEnabledForParseOnLoad() {
 | 
						|
    return this.isEnabled;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Decides whether or not a document is reader-able without parsing the whole thing.
 | 
						|
   *
 | 
						|
   * @param doc A document to parse.
 | 
						|
   * @return boolean Whether or not we should show the reader mode button.
 | 
						|
   */
 | 
						|
  isProbablyReaderable(doc) {
 | 
						|
    // Only care about 'real' HTML documents:
 | 
						|
    if (
 | 
						|
      doc.mozSyntheticDocument ||
 | 
						|
      !doc.defaultView.HTMLDocument.isInstance(doc)
 | 
						|
    ) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    let uri = Services.io.newURI(doc.location.href);
 | 
						|
    if (!this.shouldCheckUri(uri)) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    return isProbablyReaderable(doc, this._isNodeVisible);
 | 
						|
  },
 | 
						|
 | 
						|
  _isNodeVisible(node) {
 | 
						|
    return node.clientHeight > 0 && node.clientWidth > 0;
 | 
						|
  },
 | 
						|
 | 
						|
  _blockedHosts: [
 | 
						|
    "amazon.com",
 | 
						|
    "github.com",
 | 
						|
    "mail.google.com",
 | 
						|
    "pinterest.com",
 | 
						|
    "reddit.com",
 | 
						|
    "twitter.com",
 | 
						|
    "youtube.com",
 | 
						|
    "app.slack.com",
 | 
						|
  ],
 | 
						|
 | 
						|
  shouldCheckUri(uri, isBaseUri = false) {
 | 
						|
    if (!["http", "https", "file", "moz-nullprincipal"].includes(uri.scheme)) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!isBaseUri && uri.scheme.startsWith("http")) {
 | 
						|
      // Sadly, some high-profile pages have false positives, so bail early for those:
 | 
						|
      let { host } = uri;
 | 
						|
      if (this._blockedHosts.some(blockedHost => host.endsWith(blockedHost))) {
 | 
						|
        // Allow github on non-project pages
 | 
						|
        if (
 | 
						|
          host == "github.com" &&
 | 
						|
          !uri.filePath.includes("/projects") &&
 | 
						|
          !uri.filePath.includes("/issues")
 | 
						|
        ) {
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
 | 
						|
      if (uri.filePath == "/") {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    return true;
 | 
						|
  },
 | 
						|
};
 | 
						|
 | 
						|
XPCOMUtils.defineLazyPreferenceGetter(
 | 
						|
  Readerable,
 | 
						|
  "isEnabled",
 | 
						|
  "reader.parse-on-load.enabled",
 | 
						|
  true
 | 
						|
);
 |