| LEFT | RIGHT | 
|---|
| (no file at all) |  | 
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2014 Eyeo GmbH | 3  * Copyright (C) 2006-2014 Eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 12  * GNU General Public License for more details. | 12  * GNU General Public License for more details. | 
| 13  * | 13  * | 
| 14  * You should have received a copy of the GNU General Public License | 14  * You should have received a copy of the GNU General Public License | 
| 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 16  */ | 16  */ | 
| 17 | 17 | 
| 18 #include <AdblockPlus/ReferrerMapping.h> | 18 #include <AdblockPlus/ReferrerMapping.h> | 
| 19 | 19 | 
| 20 using namespace AdblockPlus; | 20 using namespace AdblockPlus; | 
| 21 | 21 | 
| 22 ReferrerMapping::ReferrerMapping(const int maxCachedUrls) | 22 ReferrerMapping::ReferrerMapping(const int maxCachedUrls) | 
| 23   : maxCachedUrls(maxCachedUrls) | 23   : maxCachedUrls(maxCachedUrls) | 
| 24 { | 24 { | 
| 25 } | 25 } | 
| 26 | 26 | 
| 27 void ReferrerMapping::Add(const std::string& url, const std::string& referrer) | 27 void ReferrerMapping::Add(const Url& url, const Url& referrer, FrameIndicator is
    Frame) | 
| 28 { | 28 { | 
| 29   if (mapping.find(url) != mapping.end()) | 29   if (mapping.find(url) != mapping.end()) | 
| 30     cachedUrls.remove(url); | 30     cachedUrls.remove(url); | 
| 31   cachedUrls.push_back(url); | 31   cachedUrls.push_back(url); | 
| 32   mapping[url] = referrer; | 32   mapping[url] = RequestInfo(referrer, isFrame); | 
| 33 | 33 | 
| 34   const int urlsToPop = cachedUrls.size() - maxCachedUrls; | 34   const int urlsToPop = cachedUrls.size() - maxCachedUrls; | 
| 35   for (int i = 0; i < urlsToPop; i++) | 35   for (int i = 0; i < urlsToPop; i++) | 
| 36   { | 36   { | 
| 37     const std::string poppedUrl = cachedUrls.front(); | 37     const std::string poppedUrl = cachedUrls.front(); | 
| 38     cachedUrls.pop_front(); | 38     cachedUrls.pop_front(); | 
| 39     mapping.erase(poppedUrl); | 39     mapping.erase(poppedUrl); | 
| 40   } | 40   } | 
| 41 } | 41 } | 
| 42 | 42 | 
| 43 std::vector<std::string> ReferrerMapping::BuildReferrerChain( | 43 ReferrerMapping::Urls ReferrerMapping::BuildFrameStructure(const Url& url) const | 
| 44   const std::string& url) const |  | 
| 45 { | 44 { | 
| 46   std::vector<std::string> referrerChain; | 45   Urls frames; | 
| 47   referrerChain.push_back(url); |  | 
| 48   // We need to limit the chain length to ensure we don't block indefinitely | 46   // We need to limit the chain length to ensure we don't block indefinitely | 
| 49   // if there's a referrer loop. | 47   // if there's a referrer loop. | 
| 50   const int maxChainLength = 10; | 48   const int maxChainLength = 10; | 
| 51   std::map<std::string, std::string>::const_iterator currentEntry = | 49   ReferrerMap::const_iterator currentEntry = url.empty() ? mapping.end() : | 
| 52     mapping.find(url); | 50     mapping.find(url); | 
|  | 51   ReferrerMap::const_iterator prevEntry = mapping.end(); | 
| 53   for (int i = 0; i < maxChainLength && currentEntry != mapping.end(); i++) | 52   for (int i = 0; i < maxChainLength && currentEntry != mapping.end(); i++) | 
| 54   { | 53   { | 
| 55     const std::string& currentUrl = currentEntry->second; | 54     if (currentEntry->second.IsFrame()) | 
| 56     referrerChain.insert(referrerChain.begin(), currentUrl); | 55     { | 
| 57     currentEntry = mapping.find(currentUrl); | 56       frames.insert(frames.begin(), currentEntry->first); | 
|  | 57     } | 
|  | 58     prevEntry = currentEntry; | 
|  | 59     currentEntry = mapping.find(currentEntry->second.referrer); | 
| 58   } | 60   } | 
| 59   return referrerChain; | 61   if (prevEntry == mapping.end()) | 
|  | 62   { | 
|  | 63     if (!url.empty()) | 
|  | 64     { | 
|  | 65       // No data, just assume that the url is a frame. | 
|  | 66       frames.push_back(url); | 
|  | 67     } | 
|  | 68   } | 
|  | 69   else if (!prevEntry->second.referrer.empty()) | 
|  | 70   { | 
|  | 71     frames.insert(frames.begin(), prevEntry->second.referrer); | 
|  | 72   } | 
|  | 73   return frames; | 
| 60 } | 74 } | 
| LEFT | RIGHT | 
|---|