diff options
Diffstat (limited to 'toolkit/components/reader/Readerable.js')
-rw-r--r-- | toolkit/components/reader/Readerable.js | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/toolkit/components/reader/Readerable.js b/toolkit/components/reader/Readerable.js new file mode 100644 index 0000000000..3ad3916c71 --- /dev/null +++ b/toolkit/components/reader/Readerable.js @@ -0,0 +1,92 @@ +// -*- 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.jsm. + +/* exported Readerable */ +/* import-globals-from Readability-readerable.js */ + +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); +const { XPCOMUtils } = ChromeUtils.import( + "resource://gre/modules/XPCOMUtils.jsm" +); + +function isNodeVisible(node) { + return node.clientHeight > 0 && node.clientWidth > 0; +} + +var Readerable = { + get isEnabledForParseOnLoad() { + return this.isEnabled || this.isForceEnabled; + }, + + /** + * 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 instanceof doc.defaultView.HTMLDocument) + ) { + return false; + } + + let uri = Services.io.newURI(doc.location.href); + if (!this.shouldCheckUri(uri)) { + return false; + } + + return isProbablyReaderable(doc, isNodeVisible); + }, + + _blockedHosts: [ + "amazon.com", + "github.com", + "mail.google.com", + "pinterest.com", + "reddit.com", + "twitter.com", + "youtube.com", + ], + + shouldCheckUri(uri, isBaseUri = false) { + if (!["http", "https", "file"].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))) { + return false; + } + + if (uri.filePath == "/") { + return false; + } + } + + return true; + }, +}; + +XPCOMUtils.defineLazyPreferenceGetter( + Readerable, + "isEnabled", + "reader.parse-on-load.enabled", + true +); +XPCOMUtils.defineLazyPreferenceGetter( + Readerable, + "isForceEnabled", + "reader.parse-on-load.force-enabled", + false +); |