| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 #include <algorithm> | |
| 1 #include <AdblockPlus.h> | 2 #include <AdblockPlus.h> |
| 2 | 3 |
| 3 using namespace AdblockPlus; | 4 using namespace AdblockPlus; |
| 4 | 5 |
| 5 #if !FILTER_ENGINE_STUBS | 6 #if !FILTER_ENGINE_STUBS |
| 6 extern const char* jsSources[]; | 7 extern const char* jsSources[]; |
| 7 #endif | 8 #endif |
| 8 | 9 |
| 9 #if FILTER_ENGINE_STUBS | 10 #if FILTER_ENGINE_STUBS |
| 11 JsObject::JsObject(FilterEngine& filterEngine) | |
| 12 : filterEngine(filterEngine) | |
| 13 { | |
| 14 } | |
| 15 #else | |
| 16 JsObject::JsObject() | |
| 17 { | |
| 18 } | |
| 19 #endif | |
| 20 | |
| 21 std::string JsObject::GetProperty(const std::string& name, const std::string& de faultValue) const | |
| 22 { | |
| 23 #if FILTER_ENGINE_STUBS | |
| 24 std::map<std::string, std::string>::const_iterator it = stringProperties.find( name); | |
| 25 if (it == stringProperties.end()) | |
| 26 return defaultValue; | |
| 27 else | |
| 28 return it->second; | |
| 29 #endif | |
| 30 } | |
| 31 | |
| 32 int JsObject::GetProperty(const std::string& name, int defaultValue) const | |
| 33 { | |
| 34 #if FILTER_ENGINE_STUBS | |
| 35 std::map<std::string, int>::const_iterator it = intProperties.find(name); | |
| 36 if (it == intProperties.end()) | |
| 37 return defaultValue; | |
| 38 else | |
| 39 return it->second; | |
| 40 #endif | |
| 41 } | |
| 42 | |
| 43 bool JsObject::GetProperty(const std::string& name, bool defaultValue) const | |
| 44 { | |
| 45 #if FILTER_ENGINE_STUBS | |
| 46 std::map<std::string, bool>::const_iterator it = boolProperties.find(name); | |
| 47 if (it == boolProperties.end()) | |
| 48 return defaultValue; | |
| 49 else | |
| 50 return it->second; | |
| 51 #endif | |
| 52 } | |
| 53 | |
| 54 void JsObject::SetProperty(const std::string& name, const std::string& value) | |
| 55 { | |
| 56 #if FILTER_ENGINE_STUBS | |
| 57 stringProperties[name] = value; | |
| 58 #endif | |
| 59 } | |
| 60 | |
| 61 void JsObject::SetProperty(const std::string& name, int value) | |
| 62 { | |
| 63 #if FILTER_ENGINE_STUBS | |
| 64 intProperties[name] = value; | |
| 65 #endif | |
| 66 } | |
| 67 | |
| 68 void JsObject::SetProperty(const std::string& name, bool value) | |
| 69 { | |
| 70 #if FILTER_ENGINE_STUBS | |
| 71 boolProperties[name] = value; | |
| 72 #endif | |
| 73 } | |
| 74 | |
| 75 #if FILTER_ENGINE_STUBS | |
| 76 Filter::Filter(FilterEngine& filterEngine, const std::string& text) | |
| 77 : JsObject(filterEngine) | |
| 78 { | |
| 79 SetProperty("text", text); | |
| 80 if (text.find("!") == 0) | |
| 81 SetProperty("type", TYPE_COMMENT); | |
| 82 else if (text.find("@@") == 0) | |
| 83 SetProperty("type", TYPE_EXCEPTION); | |
| 84 else if (text.find("#@") != std::string::npos) | |
| 85 SetProperty("type", TYPE_ELEMHIDE_EXCEPTION); | |
| 86 else if (text.find("#") != std::string::npos) | |
| 87 SetProperty("type", TYPE_ELEMHIDE); | |
| 88 else | |
| 89 SetProperty("type", TYPE_BLOCKING); | |
| 90 } | |
| 91 #else | |
| 92 Filter::Filter() | |
| 93 { | |
| 94 } | |
| 95 #endif | |
| 96 | |
| 97 bool Filter::IsListed() const | |
| 98 { | |
| 99 #if FILTER_ENGINE_STUBS | |
| 100 for (std::vector<FilterPtr>::iterator it = filterEngine.listedFilters.begin(); | |
| 101 it != filterEngine.listedFilters.end(); ++it) | |
| 102 { | |
| 103 if (it->get() == this) | |
| 104 return true; | |
| 105 } | |
| 106 return false; | |
| 107 #endif | |
| 108 } | |
| 109 | |
| 110 void Filter::AddToList() | |
| 111 { | |
| 112 #if FILTER_ENGINE_STUBS | |
| 113 if (!IsListed()) | |
| 114 filterEngine.listedFilters.push_back(shared_from_this()); | |
| 115 #endif | |
| 116 } | |
| 117 | |
| 118 void Filter::RemoveFromList() | |
| 119 { | |
| 120 for (std::vector<FilterPtr>::iterator it = filterEngine.listedFilters.begin(); | |
| 121 it != filterEngine.listedFilters.end();) | |
| 122 { | |
| 123 if (it->get() == this) | |
| 124 it = filterEngine.listedFilters.erase(it); | |
| 125 else | |
| 126 it++; | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 #if FILTER_ENGINE_STUBS | |
| 10 Subscription::Subscription(FilterEngine& filterEngine, const std::string& url) | 131 Subscription::Subscription(FilterEngine& filterEngine, const std::string& url) |
| 11 : filterEngine(filterEngine) | 132 : JsObject(filterEngine) |
| 12 { | 133 { |
| 13 properties["url"] = url; | 134 SetProperty("url", url); |
| 14 } | 135 } |
| 15 #else | 136 #else |
| 16 Subscription::Subscription() | 137 Subscription::Subscription() |
| 17 { | 138 { |
| 18 } | 139 } |
| 19 #endif | 140 #endif |
| 20 | 141 |
| 21 const std::string Subscription::GetProperty(const std::string& name) const | |
| 22 { | |
| 23 #if FILTER_ENGINE_STUBS | |
| 24 std::map<std::string,std::string>::const_iterator it = properties.find(name); | |
| 25 if (it == properties.end()) | |
| 26 return ""; | |
| 27 else | |
| 28 return it->second; | |
| 29 #endif | |
| 30 } | |
| 31 | |
| 32 int Subscription::GetIntProperty(const std::string& name) const | |
| 33 { | |
| 34 #if FILTER_ENGINE_STUBS | |
| 35 std::map<std::string,int>::const_iterator it = intProperties.find(name); | |
| 36 if (it == intProperties.end()) | |
| 37 return 0; | |
| 38 else | |
| 39 return it->second; | |
| 40 #endif | |
| 41 } | |
| 42 | |
| 43 void Subscription::SetProperty(const std::string& name, const std::string& value ) | |
| 44 { | |
| 45 #if FILTER_ENGINE_STUBS | |
| 46 properties[name] = value; | |
| 47 #endif | |
| 48 } | |
| 49 | |
| 50 void Subscription::SetIntProperty(const std::string& name, int value) | |
| 51 { | |
| 52 #if FILTER_ENGINE_STUBS | |
| 53 intProperties[name] = value; | |
| 54 #endif | |
| 55 } | |
| 56 | |
| 57 bool Subscription::IsListed() const | 142 bool Subscription::IsListed() const |
| 58 { | 143 { |
| 59 #if FILTER_ENGINE_STUBS | 144 #if FILTER_ENGINE_STUBS |
| 60 for (std::vector<Subscription*>::iterator it = filterEngine.listedSubscription s.begin(); | 145 for (std::vector<SubscriptionPtr>::iterator it = filterEngine.listedSubscripti ons.begin(); |
| 61 it != filterEngine.listedSubscriptions.end(); ++it) | 146 it != filterEngine.listedSubscriptions.end(); ++it) |
| 62 { | 147 { |
| 63 if (*it == this) | 148 if (it->get() == this) |
| 64 return true; | 149 return true; |
| 65 } | 150 } |
| 66 return false; | 151 return false; |
| 67 #endif | 152 #endif |
| 68 } | 153 } |
| 69 | 154 |
| 70 void Subscription::AddToList() | 155 void Subscription::AddToList() |
| 71 { | 156 { |
| 72 #if FILTER_ENGINE_STUBS | 157 #if FILTER_ENGINE_STUBS |
| 73 if (!IsListed()) | 158 if (!IsListed()) |
| 74 filterEngine.listedSubscriptions.push_back(this); | 159 filterEngine.listedSubscriptions.push_back(shared_from_this()); |
| 75 #endif | 160 #endif |
| 76 } | 161 } |
| 77 | 162 |
| 78 void Subscription::RemoveFromList() | 163 void Subscription::RemoveFromList() |
| 79 { | 164 { |
| 80 for (std::vector<Subscription*>::iterator it = filterEngine.listedSubscription s.begin(); | 165 for (std::vector<SubscriptionPtr>::iterator it = filterEngine.listedSubscripti ons.begin(); |
| 81 it != filterEngine.listedSubscriptions.end();) | 166 it != filterEngine.listedSubscriptions.end();) |
| 82 { | 167 { |
| 83 if (*it == this) | 168 if (it->get() == this) |
| 84 it = filterEngine.listedSubscriptions.erase(it); | 169 it = filterEngine.listedSubscriptions.erase(it); |
| 85 else | 170 else |
| 86 it++; | 171 it++; |
| 87 } | 172 } |
| 88 } | 173 } |
| 89 | 174 |
| 90 void Subscription::UpdateFilters() | 175 void Subscription::UpdateFilters() |
| 91 { | 176 { |
| 92 } | 177 } |
| 93 | 178 |
| 94 FilterEngine::FilterEngine(JsEngine& jsEngine) : jsEngine(jsEngine) | 179 FilterEngine::FilterEngine(JsEngine& jsEngine) : jsEngine(jsEngine) |
| 95 { | 180 { |
| 96 #if !FILTER_ENGINE_STUBS | 181 #if !FILTER_ENGINE_STUBS |
| 97 for (int i = 0; jsSources[i] && jsSources[i + 1]; i += 2) | 182 for (int i = 0; jsSources[i] && jsSources[i + 1]; i += 2) |
| 98 jsEngine.Evaluate(jsSources[i + 1], jsSources[i]); | 183 jsEngine.Evaluate(jsSources[i + 1], jsSources[i]); |
| 99 #endif | 184 #endif |
| 100 } | 185 } |
| 101 | 186 |
| 187 Filter& FilterEngine::GetFilter(const std::string& text) | |
| 188 { | |
| 189 #if FILTER_ENGINE_STUBS | |
| 190 // Via http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-st dstring | |
| 191 std::string trimmed(text); | |
| 192 trimmed.erase(trimmed.begin(), std::find_if(trimmed.begin(), trimmed.end(), st d::not1(std::ptr_fun<int, int>(std::isspace)))); | |
| 193 trimmed.erase(std::find_if(trimmed.rbegin(), trimmed.rend(), std::not1(std::pt r_fun<int, int>(std::isspace))).base(), trimmed.end()); | |
| 194 | |
| 195 std::map<std::string, FilterPtr>::const_iterator it = knownFilters.find(trimme d); | |
| 196 if (it != knownFilters.end()) | |
| 197 return *it->second; | |
| 198 | |
| 199 FilterPtr result(new Filter(*this, trimmed)); | |
| 200 knownFilters[trimmed] = result->shared_from_this(); | |
| 201 return *result; | |
| 202 #endif | |
| 203 } | |
| 204 | |
| 102 Subscription& FilterEngine::GetSubscription(const std::string& url) | 205 Subscription& FilterEngine::GetSubscription(const std::string& url) |
| 103 { | 206 { |
| 104 #if FILTER_ENGINE_STUBS | 207 #if FILTER_ENGINE_STUBS |
| 105 std::map<std::string,Subscription*>::const_iterator it = knownSubscriptions.fi nd(url); | 208 std::map<std::string, SubscriptionPtr>::const_iterator it = knownSubscriptions .find(url); |
| 106 if (it != knownSubscriptions.end()) | 209 if (it != knownSubscriptions.end()) |
| 107 return *it->second; | 210 return *it->second; |
| 108 | 211 |
| 109 Subscription* result = new Subscription(*this, url); | 212 SubscriptionPtr result(new Subscription(*this, url)); |
| 110 knownSubscriptions[url] = result; | 213 knownSubscriptions[url] = result->shared_from_this(); |
| 111 return *result; | 214 return *result; |
| 112 #endif | 215 #endif |
| 113 } | 216 } |
| 114 | 217 |
| 115 const std::vector<Subscription*>& FilterEngine::GetListedSubscriptions() const | 218 const std::vector<FilterPtr>& FilterEngine::GetListedFilters() const |
| 219 { | |
| 220 #if FILTER_ENGINE_STUBS | |
| 221 return listedFilters; | |
| 222 #endif | |
| 223 } | |
| 224 | |
| 225 const std::vector<SubscriptionPtr>& FilterEngine::GetListedSubscriptions() const | |
| 116 { | 226 { |
| 117 #if FILTER_ENGINE_STUBS | 227 #if FILTER_ENGINE_STUBS |
| 118 return listedSubscriptions; | 228 return listedSubscriptions; |
| 119 #endif | 229 #endif |
| 120 } | 230 } |
| 121 | 231 |
| 122 void FilterEngine::FetchAvailableSubscriptions(SubscriptionsCallback callback) | 232 void FilterEngine::FetchAvailableSubscriptions(SubscriptionsCallback callback) |
| 123 { | 233 { |
| 124 #if FILTER_ENGINE_STUBS | 234 #if FILTER_ENGINE_STUBS |
| 125 std::vector<Subscription*> availableSubscriptions; | 235 std::vector<SubscriptionPtr> availableSubscriptions; |
| 126 | 236 |
| 127 Subscription& subscription1 = GetSubscription("https://easylist-downloads.adbl ockplus.org/easylist.txt"); | 237 Subscription& subscription1 = GetSubscription("https://easylist-downloads.adbl ockplus.org/easylist.txt"); |
| 128 subscription1.SetProperty("title", "EasyList"); | 238 subscription1.SetProperty("title", "EasyList"); |
| 129 availableSubscriptions.push_back(&subscription1); | 239 availableSubscriptions.push_back(subscription1.shared_from_this()); |
| 130 | 240 |
| 131 Subscription& subscription2 = GetSubscription("https://easylist-downloads.adbl ockplus.org/easylistgermany+easylist.txt"); | 241 Subscription& subscription2 = GetSubscription("https://easylist-downloads.adbl ockplus.org/easylistgermany+easylist.txt"); |
| 132 subscription2.SetProperty("title", "EasyList Germany+EasyList"); | 242 subscription2.SetProperty("title", "EasyList Germany+EasyList"); |
| 133 availableSubscriptions.push_back(&subscription2); | 243 availableSubscriptions.push_back(subscription2.shared_from_this()); |
| 134 | 244 |
| 135 callback(availableSubscriptions); | 245 callback(availableSubscriptions); |
| 136 #endif | 246 #endif |
| 137 } | 247 } |
| 138 | 248 |
| 139 bool FilterEngine::Matches(const std::string& url, | 249 AdblockPlus::FilterPtr FilterEngine::Matches(const std::string& url, |
| 140 const std::string& contentType, | 250 const std::string& contentType, |
| 141 const std::string& documentUrl) const | 251 const std::string& documentUrl) |
|
Oleksandr
2013/04/05 07:31:51
How about returning the filter definition rule tha
Wladimir Palant
2013/04/05 12:15:16
Yes, I want to do that in the next step, while imp
| |
| 142 { | 252 { |
| 143 #if FILTER_ENGINE_STUBS | 253 #if FILTER_ENGINE_STUBS |
| 144 //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 254 //For test on http://simple-adblock.com/faq/testing-your-adblocker/ |
| 145 return url.find("adbanner.gif") != std::string::npos; | 255 if (url.find("adbanner.gif") != std::string::npos) |
| 146 #endif | 256 return GetFilter("adbanner.gif").shared_from_this(); |
| 147 } | 257 else if (url.find("notbanner.gif") != std::string::npos) |
| 148 | 258 return GetFilter("@@notbanner.gif").shared_from_this(); |
| 149 std::vector<std::string> FilterEngine::GetElementHidingRules() const | 259 else |
| 150 { | 260 return AdblockPlus::FilterPtr(); |
| 151 #if FILTER_ENGINE_STUBS | 261 #endif |
| 152 std::vector<std::string> hidingRules; | 262 } |
| 153 hidingRules.push_back("###ad"); | 263 |
| 154 hidingRules.push_back("##.ad"); | 264 std::vector<std::string> FilterEngine::GetElementHidingSelectors(const std::stri ng& domain) const |
| 265 { | |
| 266 #if FILTER_ENGINE_STUBS | |
| 267 std::vector<std::string> selectors; | |
| 268 selectors.push_back("#ad"); | |
| 269 selectors.push_back(".ad"); | |
| 155 //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 270 //For test on http://simple-adblock.com/faq/testing-your-adblocker/ |
| 156 hidingRules.push_back("##.ad_300x250"); | 271 if (domain == "simple-adblock.com") |
| 157 return hidingRules; | 272 selectors.push_back(".ad_300x250"); |
| 158 #endif | 273 return selectors; |
| 159 } | 274 #endif |
| 275 } | |
| LEFT | RIGHT |