summaryrefslogtreecommitdiffstats
path: root/toolkit/components/reader/ReaderMode.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/reader/ReaderMode.jsm')
-rw-r--r--toolkit/components/reader/ReaderMode.jsm114
1 files changed, 6 insertions, 108 deletions
diff --git a/toolkit/components/reader/ReaderMode.jsm b/toolkit/components/reader/ReaderMode.jsm
index 218e12d60..ebc333495 100644
--- a/toolkit/components/reader/ReaderMode.jsm
+++ b/toolkit/components/reader/ReaderMode.jsm
@@ -30,13 +30,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", "resource://services-comm
XPCOMUtils.defineLazyModuleGetter(this, "EventDispatcher", "resource://gre/modules/Messaging.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ReaderWorker", "resource://gre/modules/reader/ReaderWorker.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "Readability", function() {
- let scope = {};
- scope.dump = this.dump;
- Services.scriptloader.loadSubScript("resource://gre/modules/reader/Readability.js", scope);
- return scope.Readability;
-});
+XPCOMUtils.defineLazyModuleGetter(this, "Readerable", "resource://gre/modules/Readerable.jsm");
this.ReaderMode = {
// Version of the cache schema.
@@ -53,33 +47,6 @@ this.ReaderMode = {
return this.parseNodeLimit = Services.prefs.getIntPref("reader.parse-node-limit");
},
- get isEnabledForParseOnLoad() {
- delete this.isEnabledForParseOnLoad;
-
- // Listen for future pref changes.
- Services.prefs.addObserver("reader.parse-on-load.", this, false);
-
- return this.isEnabledForParseOnLoad = this._getStateForParseOnLoad();
- },
-
- _getStateForParseOnLoad() {
- let isEnabled = Services.prefs.getBoolPref("reader.parse-on-load.enabled");
- let isForceEnabled = Services.prefs.getBoolPref("reader.parse-on-load.force-enabled");
- return isForceEnabled || isEnabled;
- },
-
- observe(aMessage, aTopic, aData) {
- switch (aTopic) {
- case "nsPref:changed":
- if (aData.startsWith("reader.parse-on-load.")) {
- this.isEnabledForParseOnLoad = this._getStateForParseOnLoad();
- } else if (aData === "reader.parse-node-limit") {
- this.parseNodeLimit = Services.prefs.getIntPref(aData);
- }
- break;
- }
- },
-
/**
* Enter the reader mode by going forward one step in history if applicable,
* if not, append the about:reader page in the history instead.
@@ -175,39 +142,6 @@ this.ReaderMode = {
},
/**
- * 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;
- }
-
- let utils = this.getUtilsForWin(doc.defaultView);
- // We pass in a helper function to determine if a node is visible, because
- // it uses gecko APIs that the engine-agnostic readability code can't rely
- // upon.
- return new Readability(doc).isProbablyReaderable(this.isNodeVisible.bind(this, utils));
- },
-
- isNodeVisible(utils, node) {
- let bounds = utils.getBoundsWithoutFlushing(node);
- return bounds.height > 0 && bounds.width > 0;
- },
-
- getUtilsForWin(win) {
- return win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
- },
-
- /**
* Gets an article from a loaded browser's document. This method will not attempt
* to parse certain URIs (e.g. about: URIs).
*
@@ -216,7 +150,8 @@ this.ReaderMode = {
* @resolves JS object representing the article, or null if no article is found.
*/
parseDocument(doc) {
- if (!this._shouldCheckUri(doc.documentURIObject) || !this._shouldCheckUri(doc.baseURIObject, true)) {
+ if (!Readerable.shouldCheckUri(doc.documentURIObject) ||
+ !Readerable.shouldCheckUri(doc.baseURIObject, true)) {
this.log("Reader mode disabled for URI");
return null;
}
@@ -236,7 +171,8 @@ this.ReaderMode = {
if (!doc) {
return null;
}
- if (!this._shouldCheckUri(doc.documentURIObject) || !this._shouldCheckUri(doc.baseURIObject, true)) {
+ if (!Readerable.shouldCheckUri(doc.documentURIObject) ||
+ !Readerable.shouldCheckUri(doc.baseURIObject, true)) {
this.log("Reader mode disabled for URI");
return null;
}
@@ -246,7 +182,7 @@ this.ReaderMode = {
_downloadDocument(url) {
try {
- if (!this._shouldCheckUri(Services.io.newURI(url))) {
+ if (!Readerable.shouldCheckUri(Services.io.newURI(url))) {
return null;
}
} catch (ex) {
@@ -388,44 +324,6 @@ this.ReaderMode = {
dump("Reader: " + msg);
},
- _blockedHosts: [
- "amazon.com",
- "basilisk-browser.org",
- "github.com",
- "mail.google.com",
- "palemoon.org",
- "pinterest.com",
- "reddit.com",
- "twitter.com",
- "youtube.com",
- ],
-
- _shouldCheckUri(uri, isBaseUri = false) {
- if (!(uri.schemeIs("http") || uri.schemeIs("https"))) {
- this.log("Not parsing URI scheme: " + uri.scheme);
- return false;
- }
-
- try {
- uri.QueryInterface(Ci.nsIURL);
- } catch (ex) {
- // If this doesn't work, presumably the URL is not well-formed or something
- return false;
- }
- // Sadly, some high-profile pages have false positives, so bail early for those:
- let asciiHost = uri.asciiHost;
- if (!isBaseUri && this._blockedHosts.some(blockedHost => asciiHost.endsWith(blockedHost))) {
- return false;
- }
-
- if (!isBaseUri && (!uri.filePath || uri.filePath == "/")) {
- this.log("Not parsing home page: " + uri.spec);
- return false;
- }
-
- return true;
- },
-
/**
* Attempts to parse a document into an article. Heavy lifting happens
* in readerWorker.js.