| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/extensions/updater/extension_updater.h" | 5 #include "chrome/browser/extensions/updater/extension_updater.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 | 9 | 
| 10 #include <list> | 10 #include <list> | 
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 500   void AddFakeCrxInstaller(const std::string& id, CrxInstaller* crx_installer) { | 500   void AddFakeCrxInstaller(const std::string& id, CrxInstaller* crx_installer) { | 
| 501     fake_crx_installers_[id] = crx_installer; | 501     fake_crx_installers_[id] = crx_installer; | 
| 502   } | 502   } | 
| 503 | 503 | 
| 504   bool UpdateExtension(const CRXFileInfo& file, | 504   bool UpdateExtension(const CRXFileInfo& file, | 
| 505                        bool file_ownership_passed, | 505                        bool file_ownership_passed, | 
| 506                        CrxInstaller** out_crx_installer) override { | 506                        CrxInstaller** out_crx_installer) override { | 
| 507     extension_id_ = file.extension_id; | 507     extension_id_ = file.extension_id; | 
| 508     install_path_ = file.path; | 508     install_path_ = file.path; | 
| 509 | 509 | 
| 510     if (ContainsKey(fake_crx_installers_, extension_id_)) { | 510     if (base::ContainsKey(fake_crx_installers_, extension_id_)) { | 
| 511       *out_crx_installer = fake_crx_installers_[extension_id_]; | 511       *out_crx_installer = fake_crx_installers_[extension_id_]; | 
| 512       return true; | 512       return true; | 
| 513     } | 513     } | 
| 514 | 514 | 
| 515     return false; | 515     return false; | 
| 516   } | 516   } | 
| 517 | 517 | 
| 518   PendingExtensionManager* pending_extension_manager() override { | 518   PendingExtensionManager* pending_extension_manager() override { | 
| 519     return &pending_extension_manager_; | 519     return &pending_extension_manager_; | 
| 520   } | 520   } | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 587     // We've found "x=<something>", now unescape <something> and look for | 587     // We've found "x=<something>", now unescape <something> and look for | 
| 588     // the "id=<id>&ping=<ping_value>" parameters within. | 588     // the "id=<id>&ping=<ping_value>" parameters within. | 
| 589     std::string unescaped = net::UnescapeURLComponent( | 589     std::string unescaped = net::UnescapeURLComponent( | 
| 590         param.second, | 590         param.second, | 
| 591         net::UnescapeRule::PATH_SEPARATORS | | 591         net::UnescapeRule::PATH_SEPARATORS | | 
| 592             net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); | 592             net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); | 
| 593     base::StringPairs extension_params; | 593     base::StringPairs extension_params; | 
| 594     base::SplitStringIntoKeyValuePairs(unescaped, '=', '&', &extension_params); | 594     base::SplitStringIntoKeyValuePairs(unescaped, '=', '&', &extension_params); | 
| 595     std::multimap<std::string, std::string> param_map; | 595     std::multimap<std::string, std::string> param_map; | 
| 596     param_map.insert(extension_params.begin(), extension_params.end()); | 596     param_map.insert(extension_params.begin(), extension_params.end()); | 
| 597     if (ContainsKey(param_map, "id") && ContainsKey(param_map, "ping")) { | 597     if (base::ContainsKey(param_map, "id") && | 
|  | 598         base::ContainsKey(param_map, "ping")) { | 
| 598       std::string id = param_map.find("id")->second; | 599       std::string id = param_map.find("id")->second; | 
| 599       result[id] = ParamsMap(); | 600       result[id] = ParamsMap(); | 
| 600 | 601 | 
| 601       // Pull the key=value pairs out of the ping parameter for this id and | 602       // Pull the key=value pairs out of the ping parameter for this id and | 
| 602       // put into the result. | 603       // put into the result. | 
| 603       std::string ping = net::UnescapeURLComponent( | 604       std::string ping = net::UnescapeURLComponent( | 
| 604           param_map.find("ping")->second, | 605           param_map.find("ping")->second, | 
| 605           net::UnescapeRule::PATH_SEPARATORS | | 606           net::UnescapeRule::PATH_SEPARATORS | | 
| 606               net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); | 607               net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); | 
| 607       base::StringPairs ping_params; | 608       base::StringPairs ping_params; | 
| 608       base::SplitStringIntoKeyValuePairs(ping, '=', '&', &ping_params); | 609       base::SplitStringIntoKeyValuePairs(ping, '=', '&', &ping_params); | 
| 609       for (const auto& ping_param : ping_params) { | 610       for (const auto& ping_param : ping_params) { | 
| 610         if (!ContainsKey(result[id], ping_param.first)) | 611         if (!base::ContainsKey(result[id], ping_param.first)) | 
| 611           result[id][ping_param.first] = std::set<std::string>(); | 612           result[id][ping_param.first] = std::set<std::string>(); | 
| 612         result[id][ping_param.first].insert(ping_param.second); | 613         result[id][ping_param.first].insert(ping_param.second); | 
| 613       } | 614       } | 
| 614     } | 615     } | 
| 615   } | 616   } | 
| 616   return result; | 617   return result; | 
| 617 } | 618 } | 
| 618 | 619 | 
| 619 static void VerifyQueryAndExtractParameters( | 620 static void VerifyQueryAndExtractParameters( | 
| 620     const std::string& query, | 621     const std::string& query, | 
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1701       url2_fetch_url = fetched_urls[0]; | 1702       url2_fetch_url = fetched_urls[0]; | 
| 1702       url1_query = fetched_urls[1].query(); | 1703       url1_query = fetched_urls[1].query(); | 
| 1703       url2_query = fetched_urls[0].query(); | 1704       url2_query = fetched_urls[0].query(); | 
| 1704     } else { | 1705     } else { | 
| 1705       NOTREACHED(); | 1706       NOTREACHED(); | 
| 1706     } | 1707     } | 
| 1707 | 1708 | 
| 1708     std::map<std::string, ParamsMap> url1_ping_data = | 1709     std::map<std::string, ParamsMap> url1_ping_data = | 
| 1709         GetPingDataFromURL(url1_fetch_url); | 1710         GetPingDataFromURL(url1_fetch_url); | 
| 1710     ParamsMap url1_params = ParamsMap(); | 1711     ParamsMap url1_params = ParamsMap(); | 
| 1711     if (!url1_ping_data.empty() && ContainsKey(url1_ping_data, id)) | 1712     if (!url1_ping_data.empty() && base::ContainsKey(url1_ping_data, id)) | 
| 1712       url1_params = url1_ping_data[id]; | 1713       url1_params = url1_ping_data[id]; | 
| 1713 | 1714 | 
| 1714     // First make sure the non-google query had no ping parameter. | 1715     // First make sure the non-google query had no ping parameter. | 
| 1715     EXPECT_TRUE(GetPingDataFromURL(url2_fetch_url).empty()); | 1716     EXPECT_TRUE(GetPingDataFromURL(url2_fetch_url).empty()); | 
| 1716 | 1717 | 
| 1717     // Now make sure the google query had the correct ping parameter. | 1718     // Now make sure the google query had the correct ping parameter. | 
| 1718     bool did_rollcall = false; | 1719     bool did_rollcall = false; | 
| 1719     if (rollcall_ping_days != 0) { | 1720     if (rollcall_ping_days != 0) { | 
| 1720       ASSERT_TRUE(ContainsKey(url1_params, "r")); | 1721       ASSERT_TRUE(base::ContainsKey(url1_params, "r")); | 
| 1721       ASSERT_EQ(1u, url1_params["r"].size()); | 1722       ASSERT_EQ(1u, url1_params["r"].size()); | 
| 1722       EXPECT_EQ(base::IntToString(rollcall_ping_days), | 1723       EXPECT_EQ(base::IntToString(rollcall_ping_days), | 
| 1723                 *url1_params["r"].begin()); | 1724                 *url1_params["r"].begin()); | 
| 1724       did_rollcall = true; | 1725       did_rollcall = true; | 
| 1725     } | 1726     } | 
| 1726     if (active_bit && active_ping_days != 0 && did_rollcall) { | 1727     if (active_bit && active_ping_days != 0 && did_rollcall) { | 
| 1727       ASSERT_TRUE(ContainsKey(url1_params, "a")); | 1728       ASSERT_TRUE(base::ContainsKey(url1_params, "a")); | 
| 1728       ASSERT_EQ(1u, url1_params["a"].size()); | 1729       ASSERT_EQ(1u, url1_params["a"].size()); | 
| 1729       EXPECT_EQ(base::IntToString(active_ping_days), | 1730       EXPECT_EQ(base::IntToString(active_ping_days), | 
| 1730                 *url1_params["a"].begin()); | 1731                 *url1_params["a"].begin()); | 
| 1731     } | 1732     } | 
| 1732 | 1733 | 
| 1733     // Make sure the non-google query has no brand parameter. | 1734     // Make sure the non-google query has no brand parameter. | 
| 1734     const std::string brand_string = "brand%3D"; | 1735     const std::string brand_string = "brand%3D"; | 
| 1735     EXPECT_TRUE(url2_query.find(brand_string) == std::string::npos); | 1736     EXPECT_TRUE(url2_query.find(brand_string) == std::string::npos); | 
| 1736 | 1737 | 
| 1737 #if defined(GOOGLE_CHROME_BUILD) | 1738 #if defined(GOOGLE_CHROME_BUILD) | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1836     const GURL& url = fetcher->GetOriginalURL(); | 1837     const GURL& url = fetcher->GetOriginalURL(); | 
| 1837     EXPECT_FALSE(url.is_empty()); | 1838     EXPECT_FALSE(url.is_empty()); | 
| 1838     EXPECT_TRUE(url.is_valid()); | 1839     EXPECT_TRUE(url.is_valid()); | 
| 1839     EXPECT_TRUE(url.has_query()); | 1840     EXPECT_TRUE(url.has_query()); | 
| 1840 | 1841 | 
| 1841     std::map<std::string, ParamsMap> all_pings = GetPingDataFromURL(url); | 1842     std::map<std::string, ParamsMap> all_pings = GetPingDataFromURL(url); | 
| 1842 | 1843 | 
| 1843     // Make sure that all the enabled extensions have "e=1" in their ping | 1844     // Make sure that all the enabled extensions have "e=1" in their ping | 
| 1844     // parameter. | 1845     // parameter. | 
| 1845     for (const auto& ext : enabled_extensions) { | 1846     for (const auto& ext : enabled_extensions) { | 
| 1846       ASSERT_TRUE(ContainsKey(all_pings, ext->id())); | 1847       ASSERT_TRUE(base::ContainsKey(all_pings, ext->id())); | 
| 1847       ParamsMap& ping = all_pings[ext->id()]; | 1848       ParamsMap& ping = all_pings[ext->id()]; | 
| 1848       EXPECT_FALSE(ContainsKey(ping, "dr")); | 1849       EXPECT_FALSE(base::ContainsKey(ping, "dr")); | 
| 1849       ASSERT_TRUE(ContainsKey(ping, "e")) << url; | 1850       ASSERT_TRUE(base::ContainsKey(ping, "e")) << url; | 
| 1850       std::set<std::string> e = ping["e"]; | 1851       std::set<std::string> e = ping["e"]; | 
| 1851       ASSERT_EQ(1u, e.size()) << url; | 1852       ASSERT_EQ(1u, e.size()) << url; | 
| 1852       EXPECT_EQ(std::string("1"), *e.begin()) << url; | 1853       EXPECT_EQ(std::string("1"), *e.begin()) << url; | 
| 1853       EXPECT_FALSE(ContainsKey(ping, "dr")); | 1854       EXPECT_FALSE(base::ContainsKey(ping, "dr")); | 
| 1854     } | 1855     } | 
| 1855 | 1856 | 
| 1856     // Make sure that all the disable extensions have the appropriate | 1857     // Make sure that all the disable extensions have the appropriate | 
| 1857     // "dr=<num>" values in their ping parameter if metrics are on, or omit | 1858     // "dr=<num>" values in their ping parameter if metrics are on, or omit | 
| 1858     // it otherwise. | 1859     // it otherwise. | 
| 1859     ASSERT_EQ(disabled_extensions.size(), disabled.size()); | 1860     ASSERT_EQ(disabled_extensions.size(), disabled.size()); | 
| 1860     for (size_t i = 0; i < disabled.size(); i++) { | 1861     for (size_t i = 0; i < disabled.size(); i++) { | 
| 1861       scoped_refptr<const Extension>& ext = disabled_extensions[i]; | 1862       scoped_refptr<const Extension>& ext = disabled_extensions[i]; | 
| 1862       int disable_reasons = disabled[i]; | 1863       int disable_reasons = disabled[i]; | 
| 1863       ASSERT_TRUE(ContainsKey(all_pings, ext->id())) << url; | 1864       ASSERT_TRUE(base::ContainsKey(all_pings, ext->id())) << url; | 
| 1864       ParamsMap& ping = all_pings[ext->id()]; | 1865       ParamsMap& ping = all_pings[ext->id()]; | 
| 1865 | 1866 | 
| 1866       ASSERT_TRUE(ContainsKey(ping, "e")) << url; | 1867       ASSERT_TRUE(base::ContainsKey(ping, "e")) << url; | 
| 1867       std::set<std::string> e = ping["e"]; | 1868       std::set<std::string> e = ping["e"]; | 
| 1868       ASSERT_EQ(1u, e.size()) << url; | 1869       ASSERT_EQ(1u, e.size()) << url; | 
| 1869       EXPECT_EQ(std::string("0"), *e.begin()) << url; | 1870       EXPECT_EQ(std::string("0"), *e.begin()) << url; | 
| 1870 | 1871 | 
| 1871       if (disable_reasons == 0) { | 1872       if (disable_reasons == 0) { | 
| 1872         EXPECT_FALSE(ContainsKey(ping, "dr")); | 1873         EXPECT_FALSE(base::ContainsKey(ping, "dr")); | 
| 1873       } else { | 1874       } else { | 
| 1874         ASSERT_TRUE(ContainsKey(ping, "dr")); | 1875         ASSERT_TRUE(base::ContainsKey(ping, "dr")); | 
| 1875         int found_reasons = 0; | 1876         int found_reasons = 0; | 
| 1876         for (const auto& reason_string : ping["dr"]) { | 1877         for (const auto& reason_string : ping["dr"]) { | 
| 1877           int reason = 0; | 1878           int reason = 0; | 
| 1878           ASSERT_TRUE(base::StringToInt(reason_string, &reason)); | 1879           ASSERT_TRUE(base::StringToInt(reason_string, &reason)); | 
| 1879           // Make sure it's a power of 2. | 1880           // Make sure it's a power of 2. | 
| 1880           ASSERT_TRUE(reason < 2 || !(reason & (reason - 1))) << reason; | 1881           ASSERT_TRUE(reason < 2 || !(reason & (reason - 1))) << reason; | 
| 1881           found_reasons |= reason; | 1882           found_reasons |= reason; | 
| 1882         } | 1883         } | 
| 1883         EXPECT_EQ(disable_reasons, found_reasons); | 1884         EXPECT_EQ(disable_reasons, found_reasons); | 
| 1884       } | 1885       } | 
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2262 // -prodversionmin (shouldn't update if browser version too old) | 2263 // -prodversionmin (shouldn't update if browser version too old) | 
| 2263 // -manifests & updates arriving out of order / interleaved | 2264 // -manifests & updates arriving out of order / interleaved | 
| 2264 // -malformed update url (empty, file://, has query, has a # fragment, etc.) | 2265 // -malformed update url (empty, file://, has query, has a # fragment, etc.) | 
| 2265 // -An extension gets uninstalled while updates are in progress (so it doesn't | 2266 // -An extension gets uninstalled while updates are in progress (so it doesn't | 
| 2266 //  "come back from the dead") | 2267 //  "come back from the dead") | 
| 2267 // -An extension gets manually updated to v3 while we're downloading v2 (ie | 2268 // -An extension gets manually updated to v3 while we're downloading v2 (ie | 
| 2268 //  you don't get downgraded accidentally) | 2269 //  you don't get downgraded accidentally) | 
| 2269 // -An update manifest mentions multiple updates | 2270 // -An update manifest mentions multiple updates | 
| 2270 | 2271 | 
| 2271 }  // namespace extensions | 2272 }  // namespace extensions | 
| OLD | NEW | 
|---|