| Index: lib/whitelisting.js | 
| =================================================================== | 
| --- a/lib/whitelisting.js | 
| +++ b/lib/whitelisting.js | 
| @@ -17,57 +17,67 @@ | 
|  | 
| /** @module whitelisting */ | 
|  | 
| +"use strict"; | 
| + | 
| let {defaultMatcher} = require("matcher"); | 
| let {RegExpFilter} = require("filterClasses"); | 
| let {stringifyURL, getDecodedHostname, extractHostFromFrame, isThirdParty} = require("url"); | 
| +let devtools = require("devtools"); | 
|  | 
| let pagesWithKey = new ext.PageMap(); | 
|  | 
| -/** | 
| - * Checks whether a page is whitelisted. | 
| - * | 
| - * @param {Page} page | 
| - * @return {WhitelistFilter} The active filter whitelisting this page or null | 
| - */ | 
| -exports.isPageWhitelisted = function(page) | 
| +function match(page, url, typeMask, docDomain, sitekey) | 
| { | 
| -  let url = page.url; | 
| +  let thirdParty = !!docDomain && isThirdParty(url, docDomain); | 
| +  let urlString = stringifyURL(url); | 
|  | 
| -  return defaultMatcher.whitelist.matchesAny( | 
| -    stringifyURL(url), RegExpFilter.typeMap.DOCUMENT, | 
| -    getDecodedHostname(url), false, null | 
| +  if (!docDomain) | 
| +    docDomain = getDecodedHostname(url); | 
| + | 
| +  let filter = defaultMatcher.whitelist.matchesAny( | 
| +    urlString, typeMask, docDomain, thirdParty, sitekey | 
| ); | 
| -}; | 
| + | 
| +  if (filter && devtools) | 
| +    devtools.logWhitelistedDocument( | 
| +      page, urlString, typeMask, docDomain, filter | 
| +    ); | 
| + | 
| +  return filter; | 
| +} | 
|  | 
| /** | 
| - * Checks whether a frame is whitelisted. | 
| + * Gets the active whitelisting filter for the document associated | 
| + * with the given page/frame, or null if it's not whitelisted. | 
| * | 
| * @param {Page}   page | 
| - * @param {Frame}  frame | 
| - * @param {number} [typeMask=RegExpFilter.typeMap.DOCUMENT]  Bit mask of request / content types to match | 
| - * @return {Boolean} | 
| + * @param {Frame}  [frame] | 
| + * @param {number} [typeMask=RegExpFilter.typeMap.DOCUMENT] | 
| + * @return {?WhitelistFilter} | 
| */ | 
| -exports.isFrameWhitelisted = function(page, frame, typeMask) | 
| +exports.checkWhitelisted = function(page, frame, typeMask) | 
| { | 
| -  while (frame) | 
| +  if (typeof typeMask == "undefined") | 
| +    typeMask = RegExpFilter.typeMap.DOCUMENT; | 
| + | 
| +  if (frame) | 
| { | 
| -    let parent = frame.parent; | 
| -    let url = frame.url; | 
| -    let documentHost = extractHostFromFrame(parent) || getDecodedHostname(url); | 
| +    let filter = null; | 
|  | 
| -    let filter = defaultMatcher.whitelist.matchesAny( | 
| -      stringifyURL(url), typeMask || RegExpFilter.typeMap.DOCUMENT, | 
| -      documentHost, isThirdParty(url, documentHost), | 
| -      getKey(page, frame) | 
| -    ); | 
| +    while (frame && !filter) | 
| +    { | 
| +      let parent = frame.parent; | 
| +      let docDomain = extractHostFromFrame(parent); | 
| +      let sitekey = getKey(page, frame); | 
|  | 
| -    if (filter) | 
| -      return true; | 
| +      filter = match(page, frame.url, typeMask, docDomain, sitekey); | 
| +      frame = parent; | 
| +    } | 
|  | 
| -    frame = parent; | 
| +    return filter; | 
| } | 
|  | 
| -  return false; | 
| +  return match(page, page.url, typeMask); | 
| }; | 
|  | 
| let getKey = | 
|  |