Index: lib/elemHide.js
===================================================================
--- a/lib/elemHide.js
+++ b/lib/elemHide.js
@@ -18,16 +18,17 @@
 "use strict";
 
 /**
  * @fileOverview Element hiding implementation.
  */
 
 const {ElemHideExceptions} = require("./elemHideExceptions");
 const {filterNotifier} = require("./filterNotifier");
+const {suffixes} = require("./domain");
 
 /**
  * The maximum number of selectors in a CSS rule. This is used by
  * <code>{@link createStyleSheet}</code> to split up a long list of selectors
  * into multiple rules.
  * @const {number}
  * @default
  */
@@ -164,25 +165,19 @@
  *
  * @returns {Array.<string>} The list of selectors.
  */
 function getConditionalSelectors(domain, specificOnly)
 {
   let selectors = [];
 
   let excluded = new Set();
-  let currentDomain = domain;
 
-  // This code is a performance hot-spot, which is why we've made certain
-  // micro-optimisations. Please be careful before making changes.
-  while (true)
+  for (let currentDomain of suffixes(domain, !specificOnly))
   {
-    if (specificOnly && currentDomain == "")
-      break;
-
     let filters = filtersByDomain.get(currentDomain);
     if (filters)
     {
       for (let [filter, isIncluded] of filters)
       {
         if (!isIncluded)
         {
           excluded.add(filter);
@@ -193,22 +188,16 @@
           if ((excluded.size == 0 || !excluded.has(filter)) &&
               !ElemHideExceptions.getException(selector, domain))
           {
             selectors.push(selector);
           }
         }
       }
     }
-
-    if (currentDomain == "")
-      break;
-
-    let nextDot = currentDomain.indexOf(".");
-    currentDomain = nextDot == -1 ? "" : currentDomain.substr(nextDot + 1);
   }
 
   return selectors;
 }
 
 /**
  * Returns the default style sheet that applies on all domains.
  * @returns {string}
