Index: lib/domain.js
===================================================================
--- a/lib/domain.js
+++ b/lib/domain.js
@@ -15,16 +15,28 @@
  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 "use strict";
 
 const publicSuffixes = require("../data/publicSuffixList.json");
 
 /**
+ * Maximum number of entries to keep in <code>{@link cache}</code>.
+ * @type {number}
+ */
+const maxCacheEntries = 1000;
+
+/**
+ * Cached results from previous <code>{@link isThirdParty}</code> calls.
+ * @type {Map.<string,boolean>}
+ */
+let cache = new Map();
+
+/**
  * Checks whether the given hostname is a domain.
  *
  * @param {string} hostname
  * @returns {boolean}
  */
 function isDomain(hostname)
 {
   // No hostname or IPv4 address, also considering hexadecimal octets.
@@ -69,21 +81,37 @@
  *
  * @param {URL} url The request URL.
  * @param {string} documentHostname The IDNA-encoded hostname of the document.
  *
  * @returns {boolean}
  */
 function isThirdParty(url, documentHostname)
 {
-  let requestHostname = url.hostname.replace(/\.+$/, "");
-  documentHostname = documentHostname.replace(/\.+$/, "");
+  let requestHostname = url.hostname;
+
+  if (requestHostname[requestHostname.length - 1] == ".")
+    requestHostname = requestHostname.replace(/\.+$/, "");
+
+  if (documentHostname[documentHostname.length - 1] == ".")
+    documentHostname = documentHostname.replace(/\.+$/, "");
 
   if (requestHostname == documentHostname)
     return false;
 
-  if (!isDomain(requestHostname) || !isDomain(documentHostname))
-    return true;
+  let key = requestHostname + " " + documentHostname;
+  let value = cache.get(key);
+
+  if (typeof value != "undefined")
+    return value;
 
-  return getDomain(requestHostname) != getDomain(documentHostname);
+  value = !isDomain(requestHostname) || !isDomain(documentHostname) ||
+          getDomain(requestHostname) != getDomain(documentHostname);
+
+  if (cache.size >= maxCacheEntries)
+    cache.clear();
+
+  cache.set(key, value);
+
+  return value;
 }
 
 exports.isThirdParty = isThirdParty;
