| Index: src/engine/Main.cpp | 
| diff --git a/src/engine/Main.cpp b/src/engine/Main.cpp | 
| index 5c06428d324eebf1263deac78d6703e7c5fcccc4..0e2302f4be4460abbbab641f725537f464590ad3 100644 | 
| --- a/src/engine/Main.cpp | 
| +++ b/src/engine/Main.cpp | 
| @@ -93,6 +93,40 @@ namespace | 
| CriticalSection activeConnectionsLock; | 
| HWND callbackWindow; | 
|  | 
| +  // it's a helper for the function below. | 
| +  std::string GetWhitelistingFilter(const std::string& url, const std::string& parent, AdblockPlus::FilterEngine::ContentType type) | 
| +  { | 
| +    AdblockPlus::FilterPtr match = filterEngine->Matches(url, type, parent); | 
| +    if (match && match->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION) | 
| +    { | 
| +      return match->GetProperty("text")->AsString(); | 
| +    } | 
| +    return ""; | 
| +  }; | 
| + | 
| +  std::string GetWhitelistingFilter(const std::string& urlArg, | 
| +    const std::vector<std::string>& frameHierarchy, AdblockPlus::FilterEngine::ContentType type) | 
| +  { | 
| +    if (frameHierarchy.empty()) | 
| +    { | 
| +      return GetWhitelistingFilter(urlArg, "", type); | 
| +    } | 
| +    auto frameIterator = frameHierarchy.begin(); | 
| +    std::string url = urlArg; | 
| +    do | 
| +    { | 
| +      std::string parentUrl = *frameIterator++; | 
| +      auto filterText = GetWhitelistingFilter(url, parentUrl, type); | 
| +      if (!filterText.empty()) | 
| +      { | 
| +        return filterText; | 
| +      } | 
| +      url = parentUrl; | 
| +    } | 
| +    while (frameIterator != frameHierarchy.end()); | 
| +    return ""; | 
| +  } | 
| + | 
| void WriteSubscriptions(Communication::OutputBuffer& response, | 
| const std::vector<AdblockPlus::SubscriptionPtr>& subscriptions) | 
| { | 
| @@ -256,23 +290,18 @@ namespace | 
| { | 
| std::string url; | 
| request >> url; | 
| -        AdblockPlus::FilterPtr match = filterEngine->Matches(url, | 
| -          AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_DOCUMENT, url); | 
| -        std::string filterText; | 
| -        if (match && match->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION) | 
| -        { | 
| -          filterText = match->GetProperty("text")->AsString(); | 
| -        } | 
| -        response << filterText; | 
| +        std::vector<std::string> frameHierarchy; | 
| +        request >> frameHierarchy; | 
| +        response << GetWhitelistingFilter(url, frameHierarchy, AdblockPlus::FilterEngine::CONTENT_TYPE_DOCUMENT); | 
| break; | 
| } | 
| case Communication::PROC_IS_ELEMHIDE_WHITELISTED_ON_URL: | 
| { | 
| std::string url; | 
| request >> url; | 
| -        AdblockPlus::FilterPtr match = filterEngine->Matches(url, | 
| -          AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_ELEMHIDE, url); | 
| -        response << (match && match->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION); | 
| +        std::vector<std::string> frameHierarchy; | 
| +        request >> frameHierarchy; | 
| +        response << !GetWhitelistingFilter(url, frameHierarchy, AdblockPlus::FilterEngine::CONTENT_TYPE_ELEMHIDE).empty(); | 
| break; | 
| } | 
| case Communication::PROC_ADD_FILTER: | 
|  |