Index: src/engine/Main.cpp |
diff --git a/src/engine/Main.cpp b/src/engine/Main.cpp |
index 01ddcb6ca49a5ca2dc8dbc692d364abaae0ef70e..759931d9cca638102b0d3a2dc7f95631ac3434bd 100644 |
--- a/src/engine/Main.cpp |
+++ b/src/engine/Main.cpp |
@@ -40,6 +40,26 @@ namespace |
CriticalSection activeConnectionsLock; |
HWND callbackWindow; |
+ std::string CreateDomainWhitelistingFilterText(const std::string& domain) |
+ { |
+ return "@@||" + domain + "^$document"; |
+ } |
+ |
+ void AddWhitelistedUrl(const std::string& url) |
+ { |
+ std::string host = ASCIIStringToLower(url); |
+ if (BeginsWith<std::string>(host, "https://") || BeginsWith<std::string>(host, "http://")) |
Eric
2015/02/26 16:14:10
Explicit type specification for template function.
sergei
2015/03/02 13:01:04
Actually, I guess, we don't need this test at all
|
+ { |
+ host = filterEngine->GetHostFromURL(host); |
+ } |
+ |
+ ReplaceString<std::string>(host, "www.", ""); |
Eric
2015/02/26 16:14:10
Explicit type for template function.
Eric
2015/02/26 18:16:01
More importantly, this algorithm is not correct. I
sergei
2015/03/02 13:01:04
Right, it's incorrect, we need to replace only the
|
+ if (!host.empty()) |
+ { |
+ filterEngine->GetFilter(CreateDomainWhitelistingFilterText(host))->AddToList(); |
+ } |
+ } |
+ |
void WriteSubscriptions(Communication::OutputBuffer& response, |
const std::vector<AdblockPlus::SubscriptionPtr>& subscriptions) |
{ |
@@ -217,19 +237,40 @@ namespace |
response << (match && match->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION); |
break; |
} |
- case Communication::PROC_ADD_FILTER: |
+ case Communication::PROC_ADD_WHITELSITED_DOMAIN: |
{ |
- std::string text; |
- request >> text; |
- |
- filterEngine->GetFilter(text)->AddToList(); |
+ std::string url; |
+ request >> url; |
+ AddWhitelistedUrl(url); |
break; |
} |
- case Communication::PROC_REMOVE_FILTER: |
+ case Communication::PROC_REMOVE_WHITELSITED_DOMAIN: |
{ |
Eric
2015/02/26 18:16:01
As a point of code clarity, if we have a function
sergei
2015/03/02 13:01:04
I cannot say that their implementations are opposi
Eric
2015/03/02 19:24:31
I doesn't matter if their implementations are exac
|
- std::string text; |
- request >> text; |
- filterEngine->GetFilter(text)->RemoveFromList(); |
+ std::string domain; |
+ request >> domain; |
+ AdblockPlus::FilterPtr filter |
+ = filterEngine->GetFilter(CreateDomainWhitelistingFilterText(domain)); |
+ if (filter && filter->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION) |
+ { |
+ filter->RemoveFromList(); |
+ } |
+ break; |
+ } |
+ case Communication::PROC_TOGGLE_WHITELISTING: |
+ { |
+ std::string url; |
+ request >> url; |
+ auto filter = filterEngine->Matches(url, |
+ AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_DOCUMENT, ""); |
+ bool isWhitelisted = filter && filter->GetType() == AdblockPlus::Filter::TYPE_EXCEPTION; |
+ if (isWhitelisted) |
+ { |
+ filter->RemoveFromList(); |
+ } |
+ else |
+ { |
+ AddWhitelistedUrl(url); |
+ } |
break; |
} |
case Communication::PROC_SET_PREF: |