| Index: lib/whitelisting.js | 
| =================================================================== | 
| --- a/lib/whitelisting.js | 
| +++ b/lib/whitelisting.js | 
| @@ -17,30 +17,40 @@ | 
|  | 
| let {defaultMatcher} = require("matcher"); | 
| let {WhitelistFilter} = require("filterClasses"); | 
| +let {stringifyURL, getDecodedHostname, extractHostFromFrame, isThirdParty} = require("url"); | 
|  | 
| let pagesWithKey = new ext.PageMap(); | 
|  | 
| -function isWhitelisted(url, parentUrl, type, key) | 
| +function isPageWhitelisted(page) | 
| { | 
| +  let url = page.url; | 
| let filter = defaultMatcher.matchesAny( | 
| -    stripFragmentFromURL(url), | 
| -    type || "DOCUMENT", | 
| -    extractHostFromURL(parentUrl || url), | 
| -    false, | 
| -    key | 
| +    stringifyURL(url), "DOCUMENT", | 
| +    getDecodedHostname(url), false, null | 
| ); | 
|  | 
| return (filter instanceof WhitelistFilter ? filter : null); | 
| } | 
| -exports.isWhitelisted = isWhitelisted; | 
| +exports.isPageWhitelisted = isPageWhitelisted; | 
|  | 
| function isFrameWhitelisted(page, frame, type) | 
| { | 
| -  for (; frame != null; frame = frame.parent) | 
| +  while (frame) | 
| { | 
| -    let key = getKey(page, frame); | 
| -    if (isWhitelisted(frame.url, (frame.parent || {}).url, type, key)) | 
| +    let parent = frame.parent; | 
| +    let url = frame.url; | 
| +    let documentHost = extractHostFromFrame(parent) || getDecodedHostname(url); | 
| + | 
| +    let filter = defaultMatcher.matchesAny( | 
| +      stringifyURL(url), type || "DOCUMENT", | 
| +      documentHost, isThirdParty(url, documentHost), | 
| +      getKey(page, frame) | 
| +    ); | 
| + | 
| +    if (filter instanceof WhitelistFilter) | 
| return true; | 
| + | 
| +    frame = parent; | 
| } | 
|  | 
| return false; | 
| @@ -55,8 +65,9 @@ | 
|  | 
| for (; frame != null; frame = frame.parent) | 
| { | 
| -    if (urlsWithKey[frame.url]) | 
| -      return urlsWithKey[frame.url]; | 
| +    let key = urlsWithKey[stringifyURL(frame.url)]; | 
| +    if (key) | 
| +      return key; | 
| } | 
|  | 
| return null; | 
| @@ -65,7 +76,6 @@ | 
|  | 
| function verifyKey(key, signature, url) | 
| { | 
| -  url = new URL(url); | 
| let params = [ | 
| url.pathname + url.search, // REQUEST_URI | 
| url.host,                  // HTTP_HOST | 
| @@ -85,20 +95,18 @@ | 
| pagesWithKey.set(page, urlsWithKey); | 
| } | 
|  | 
| -  urlsWithKey[url] = key; | 
| +  urlsWithKey[stringifyURL(url)] = key; | 
| } | 
|  | 
| function processKey(token, page, frame) | 
| { | 
| -  let url = stripFragmentFromURL(frame.url); | 
| - | 
| if (token.indexOf("_") < 0) | 
| return; | 
|  | 
| let [key, signature] = token.split("_", 2); | 
| key = key.replace(/=/g, ""); | 
|  | 
| -  if (verifyKey(key, signature, url)) | 
| -    recordKey(page, url, key); | 
| +  if (verifyKey(key, signature, frame.url)) | 
| +    recordKey(page, frame.url, key); | 
| } | 
| exports.processKey = processKey; | 
|  |