| OLD | NEW | 
|---|
|  | 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 Subscription::Subscription(const std::string& url, const std::string& title) | 10 #if FILTER_ENGINE_STUBS | 
| 10   : url(url), title(title) | 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", "comment"); | 
|  | 82   else if (text.find("@@") == 0) | 
|  | 83     SetProperty("type", "exception"); | 
|  | 84   else if (text.find("#@") != std::string::npos) | 
|  | 85     SetProperty("type", "elemhideexception"); | 
|  | 86   else if (text.find("#") != std::string::npos) | 
|  | 87     SetProperty("type", "elemhide"); | 
|  | 88   else | 
|  | 89     SetProperty("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<Filter*>::iterator it = filterEngine.listedFilters.begin(); | 
|  | 101        it != filterEngine.listedFilters.end(); ++it) | 
|  | 102   { | 
|  | 103     if (*it == 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(this); | 
|  | 115 #endif | 
|  | 116 } | 
|  | 117 | 
|  | 118 void Filter::RemoveFromList() | 
|  | 119 { | 
|  | 120   for (std::vector<Filter*>::iterator it = filterEngine.listedFilters.begin(); | 
|  | 121        it != filterEngine.listedFilters.end();) | 
|  | 122   { | 
|  | 123     if (*it == this) | 
|  | 124       it = filterEngine.listedFilters.erase(it); | 
|  | 125     else | 
|  | 126       it++; | 
|  | 127   } | 
|  | 128 } | 
|  | 129 | 
|  | 130 #if FILTER_ENGINE_STUBS | 
|  | 131 Subscription::Subscription(FilterEngine& filterEngine, const std::string& url) | 
|  | 132     : JSObject(filterEngine) | 
|  | 133 { | 
|  | 134   SetProperty("url", url); | 
|  | 135 } | 
|  | 136 #else | 
|  | 137 Subscription::Subscription() | 
|  | 138 { | 
|  | 139 } | 
|  | 140 #endif | 
|  | 141 | 
|  | 142 bool Subscription::IsListed() const | 
|  | 143 { | 
|  | 144 #if FILTER_ENGINE_STUBS | 
|  | 145   for (std::vector<Subscription*>::iterator it = filterEngine.listedSubscription
     s.begin(); | 
|  | 146        it != filterEngine.listedSubscriptions.end(); ++it) | 
|  | 147   { | 
|  | 148     if (*it == this) | 
|  | 149       return true; | 
|  | 150   } | 
|  | 151   return false; | 
|  | 152 #endif | 
|  | 153 } | 
|  | 154 | 
|  | 155 void Subscription::AddToList() | 
|  | 156 { | 
|  | 157 #if FILTER_ENGINE_STUBS | 
|  | 158   if (!IsListed()) | 
|  | 159     filterEngine.listedSubscriptions.push_back(this); | 
|  | 160 #endif | 
|  | 161 } | 
|  | 162 | 
|  | 163 void Subscription::RemoveFromList() | 
|  | 164 { | 
|  | 165   for (std::vector<Subscription*>::iterator it = filterEngine.listedSubscription
     s.begin(); | 
|  | 166        it != filterEngine.listedSubscriptions.end();) | 
|  | 167   { | 
|  | 168     if (*it == this) | 
|  | 169       it = filterEngine.listedSubscriptions.erase(it); | 
|  | 170     else | 
|  | 171       it++; | 
|  | 172   } | 
|  | 173 } | 
|  | 174 | 
|  | 175 void Subscription::UpdateFilters() | 
| 11 { | 176 { | 
| 12 } | 177 } | 
| 13 | 178 | 
| 14 FilterEngine::FilterEngine(JsEngine& jsEngine) : jsEngine(jsEngine) | 179 FilterEngine::FilterEngine(JsEngine& jsEngine) : jsEngine(jsEngine) | 
| 15 { | 180 { | 
| 16 #if !FILTER_ENGINE_STUBS | 181 #if !FILTER_ENGINE_STUBS | 
| 17   for (int i = 0; jsSources[i] && jsSources[i + 1]; i += 2) | 182   for (int i = 0; jsSources[i] && jsSources[i + 1]; i += 2) | 
| 18     jsEngine.Evaluate(jsSources[i + 1], jsSources[i]); | 183     jsEngine.Evaluate(jsSources[i + 1], jsSources[i]); | 
| 19 #endif | 184 #endif | 
| 20 } | 185 } | 
| 21 | 186 | 
| 22 void FilterEngine::AddSubscription(Subscription subscription) | 187 Filter& FilterEngine::GetFilter(const std::string& text) | 
| 23 { | 188 { | 
| 24   subscriptions.push_back(subscription); | 189 #if FILTER_ENGINE_STUBS | 
| 25 } | 190   // Via http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-st
     dstring | 
| 26 | 191   std::string trimmed(text); | 
| 27 void FilterEngine::RemoveSubscription(const Subscription& subscription) | 192   trimmed.erase(trimmed.begin(), std::find_if(trimmed.begin(), trimmed.end(), st
     d::not1(std::ptr_fun<int, int>(std::isspace)))); | 
| 28 { | 193   trimmed.erase(std::find_if(trimmed.rbegin(), trimmed.rend(), std::not1(std::pt
     r_fun<int, int>(std::isspace))).base(), trimmed.end()); | 
| 29   for (std::vector<Subscription>::iterator it = subscriptions.begin(); | 194 | 
| 30        it != subscriptions.end();) | 195   std::map<std::string, Filter*>::const_iterator it = knownFilters.find(trimmed)
     ; | 
| 31     if (it->url == subscription.url) | 196   if (it != knownFilters.end()) | 
| 32       it = subscriptions.erase(it); | 197     return *it->second; | 
| 33     else | 198 | 
| 34       it++; | 199   Filter* result = new Filter(*this, trimmed); | 
| 35 } | 200   knownFilters[trimmed] = result; | 
| 36 | 201   return *result; | 
| 37 const Subscription* FilterEngine::FindSubscription(const std::string& url) const | 202 #endif | 
| 38 { | 203 } | 
| 39   for (std::vector<Subscription>::const_iterator it = subscriptions.begin(); | 204 | 
| 40        it != subscriptions.end(); it++) | 205 Subscription& FilterEngine::GetSubscription(const std::string& url) | 
| 41     if (it->url == url) | 206 { | 
| 42       return &(*it); | 207 #if FILTER_ENGINE_STUBS | 
| 43   return 0; | 208   std::map<std::string, Subscription*>::const_iterator it = knownSubscriptions.f
     ind(url); | 
| 44 } | 209   if (it != knownSubscriptions.end()) | 
| 45 | 210     return *it->second; | 
| 46 const std::vector<Subscription>& FilterEngine::GetSubscriptions() const | 211 | 
| 47 { | 212   Subscription* result = new Subscription(*this, url); | 
| 48   return subscriptions; | 213   knownSubscriptions[url] = result; | 
| 49 } | 214   return *result; | 
| 50 | 215 #endif | 
| 51 void FilterEngine::UpdateSubscriptionFilters(const Subscription& subscription) | 216 } | 
| 52 { | 217 | 
| 53 } | 218 const std::vector<Filter*>& FilterEngine::GetListedFilters() const | 
| 54 | 219 { | 
| 55 std::vector<Subscription> FilterEngine::FetchAvailableSubscriptions() | 220 #if FILTER_ENGINE_STUBS | 
| 56 { | 221   return listedFilters; | 
| 57   std::vector<Subscription> availableSubscriptions; | 222 #endif | 
| 58   availableSubscriptions.push_back(Subscription("https://easylist-downloads.adbl
     ockplus.org/easylist.txt", "EasyList")); | 223 } | 
| 59   availableSubscriptions.push_back(Subscription("https://easylist-downloads.adbl
     ockplus.org/easylistgermany+easylist.txt", "EasyList Germany+EasyList")); | 224 | 
| 60   return availableSubscriptions; | 225 const std::vector<Subscription*>& FilterEngine::GetListedSubscriptions() const | 
| 61 } | 226 { | 
| 62 | 227 #if FILTER_ENGINE_STUBS | 
| 63 bool FilterEngine::Matches(const std::string& url, | 228   return listedSubscriptions; | 
| 64                            const std::string& contentType) const | 229 #endif | 
| 65 { | 230 } | 
|  | 231 | 
|  | 232 void FilterEngine::FetchAvailableSubscriptions(SubscriptionsCallback callback) | 
|  | 233 { | 
|  | 234 #if FILTER_ENGINE_STUBS | 
|  | 235   std::vector<Subscription*> availableSubscriptions; | 
|  | 236 | 
|  | 237   Subscription& subscription1 = GetSubscription("https://easylist-downloads.adbl
     ockplus.org/easylist.txt"); | 
|  | 238   subscription1.SetProperty("title", "EasyList"); | 
|  | 239   availableSubscriptions.push_back(&subscription1); | 
|  | 240 | 
|  | 241   Subscription& subscription2 = GetSubscription("https://easylist-downloads.adbl
     ockplus.org/easylistgermany+easylist.txt"); | 
|  | 242   subscription2.SetProperty("title", "EasyList Germany+EasyList"); | 
|  | 243   availableSubscriptions.push_back(&subscription2); | 
|  | 244 | 
|  | 245   callback(availableSubscriptions); | 
|  | 246 #endif | 
|  | 247 } | 
|  | 248 | 
|  | 249 Filter* FilterEngine::Matches(const std::string& url, | 
|  | 250                               const std::string& contentType, | 
|  | 251                               const std::string& documentUrl) | 
|  | 252 { | 
|  | 253 #if FILTER_ENGINE_STUBS | 
| 66   //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 254   //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 
| 67   return url.find("adbanner.gif") != std::string::npos; | 255   if (url.find("adbanner.gif") != std::string::npos) | 
|  | 256     return &GetFilter("adbanner.gif"); | 
|  | 257   else if (url.find("notbanner.gif") != std::string::npos) | 
|  | 258     return &GetFilter("@@notbanner.gif"); | 
|  | 259   else | 
|  | 260     return 0; | 
|  | 261 #endif | 
| 68 } | 262 } | 
| 69 | 263 | 
| 70 std::vector<std::string> FilterEngine::GetElementHidingRules() const | 264 std::vector<std::string> FilterEngine::GetElementHidingRules() const | 
| 71 { | 265 { | 
|  | 266 #if FILTER_ENGINE_STUBS | 
| 72   std::vector<std::string> hidingRules; | 267   std::vector<std::string> hidingRules; | 
| 73   hidingRules.push_back("###ad"); | 268   hidingRules.push_back("###ad"); | 
| 74   hidingRules.push_back("##.ad"); | 269   hidingRules.push_back("##.ad"); | 
| 75   //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 270   //For test on http://simple-adblock.com/faq/testing-your-adblocker/ | 
| 76   hidingRules.push_back("##.ad_300x250"); | 271   hidingRules.push_back("##.ad_300x250"); | 
| 77   return hidingRules; | 272   return hidingRules; | 
| 78 } | 273 #endif | 
|  | 274 } | 
| OLD | NEW | 
|---|