diff options
Diffstat (limited to 'chromium/components/power')
-rw-r--r-- | chromium/components/power/BUILD.gn | 1 | ||||
-rw-r--r-- | chromium/components/power/origin_power_map.cc | 26 | ||||
-rw-r--r-- | chromium/components/power/origin_power_map.h | 5 | ||||
-rw-r--r-- | chromium/components/power/origin_power_map_unittest.cc | 63 |
4 files changed, 90 insertions, 5 deletions
diff --git a/chromium/components/power/BUILD.gn b/chromium/components/power/BUILD.gn index c0aa6514aba..e8c347ec75d 100644 --- a/chromium/components/power/BUILD.gn +++ b/chromium/components/power/BUILD.gn @@ -26,6 +26,7 @@ source_set("unit_tests") { ] deps = [ ":power", + "//base", "//testing/gtest", ] } diff --git a/chromium/components/power/origin_power_map.cc b/chromium/components/power/origin_power_map.cc index c4b895fa539..10502e9d6db 100644 --- a/chromium/components/power/origin_power_map.cc +++ b/chromium/components/power/origin_power_map.cc @@ -4,6 +4,8 @@ #include "components/power/origin_power_map.h" +#include <algorithm> + #include "base/logging.h" #include "content/public/common/url_constants.h" #include "url/gurl.h" @@ -59,9 +61,27 @@ void OriginPowerMap::OnAllOriginsUpdated() { callback_list_.Notify(); } -void OriginPowerMap::ClearOriginMap() { - origin_map_.clear(); - total_consumed_ = 0; +void OriginPowerMap::ClearOriginMap( + const base::Callback<bool(const GURL&)> url_filter) { + if (url_filter.is_null()) { + origin_map_.clear(); + } else { + for (auto it = origin_map_.begin(); it != origin_map_.end();) { + auto next_it = std::next(it); + + if (url_filter.Run(it->first)) { + total_consumed_ -= it->second; + origin_map_.erase(it); + } + + it = next_it; + } + } + + // Handle the empty case separately to avoid reporting nonzero power usage + // for zero origins in case of double rounding errors. + if (origin_map_.empty()) + total_consumed_ = 0; } } // namespace power diff --git a/chromium/components/power/origin_power_map.h b/chromium/components/power/origin_power_map.h index 514e5b28400..362c023b239 100644 --- a/chromium/components/power/origin_power_map.h +++ b/chromium/components/power/origin_power_map.h @@ -45,8 +45,9 @@ class OriginPowerMap : public KeyedService { // updating for all origins this cycle. void OnAllOriginsUpdated(); - // Clears all URLs out of the map. - void ClearOriginMap(); + // Clears URLs out of the map. If |url_filter| is not null, only clears those + // URLs that are matched by it. + void ClearOriginMap(const base::Callback<bool(const GURL&)> url_filter); private: // OriginMap maps a URL to the amount of power consumed by the URL using the diff --git a/chromium/components/power/origin_power_map_unittest.cc b/chromium/components/power/origin_power_map_unittest.cc index fad9490f63e..15899682b00 100644 --- a/chromium/components/power/origin_power_map_unittest.cc +++ b/chromium/components/power/origin_power_map_unittest.cc @@ -6,8 +6,17 @@ #include <stddef.h> +#include "base/bind.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { + +bool HostFilter(const std::string& host, const GURL& url) { + return url.host() == host; +} + +} // namespace + namespace power { TEST(OriginPowerMapTest, StartEmpty) { @@ -67,4 +76,58 @@ TEST(OriginPowerMapTest, EmptyPercentOriginMapWhenZeroConsumed) { EXPECT_EQ(size_t(0), origin_power_map.GetPercentOriginMap().size()); } +TEST(OriginPowerMapTest, ClearOriginMap) { + GURL url1("https://www.google.com"); + GURL url2("https://www.chrome.com"); + GURL url3("https://www.example.com"); + GURL url4("http://www.chrome.com"); + GURL url5("http://www.example.com"); + + // Add all 5 URLs to the map. + OriginPowerMap origin_power_map; + origin_power_map.AddPowerForOrigin(url1, 50); + origin_power_map.AddPowerForOrigin(url2, 20); + origin_power_map.AddPowerForOrigin(url3, 15); + origin_power_map.AddPowerForOrigin(url4, 5); + origin_power_map.AddPowerForOrigin(url5, 10); + EXPECT_DOUBLE_EQ(50, origin_power_map.GetPowerForOrigin(url1)); + EXPECT_DOUBLE_EQ(20, origin_power_map.GetPowerForOrigin(url2)); + EXPECT_DOUBLE_EQ(15, origin_power_map.GetPowerForOrigin(url3)); + EXPECT_DOUBLE_EQ(5, origin_power_map.GetPowerForOrigin(url4)); + EXPECT_DOUBLE_EQ(10, origin_power_map.GetPowerForOrigin(url5)); + + // Delete |url1|. + origin_power_map.ClearOriginMap( + base::Bind(&GURL::operator==, base::Unretained(&url1))); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url1)); + EXPECT_DOUBLE_EQ(40, origin_power_map.GetPowerForOrigin(url2)); + EXPECT_DOUBLE_EQ(30, origin_power_map.GetPowerForOrigin(url3)); + EXPECT_DOUBLE_EQ(10, origin_power_map.GetPowerForOrigin(url4)); + EXPECT_DOUBLE_EQ(20, origin_power_map.GetPowerForOrigin(url5)); + + // Delete every URL with the host "www.chrome.com", i.e. |url2| and |url4|. + origin_power_map.ClearOriginMap(base::Bind(&HostFilter, "www.chrome.com")); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url1)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url2)); + EXPECT_DOUBLE_EQ(60, origin_power_map.GetPowerForOrigin(url3)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url4)); + EXPECT_DOUBLE_EQ(40, origin_power_map.GetPowerForOrigin(url5)); + + // Delete every URL with the host "www.example.org". There should be none. + origin_power_map.ClearOriginMap(base::Bind(&HostFilter, "www.example.org")); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url1)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url2)); + EXPECT_DOUBLE_EQ(60, origin_power_map.GetPowerForOrigin(url3)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url4)); + EXPECT_DOUBLE_EQ(40, origin_power_map.GetPowerForOrigin(url5)); + + // Null callback means complete deletion. + origin_power_map.ClearOriginMap(base::Callback<bool(const GURL&)>()); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url1)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url2)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url3)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url4)); + EXPECT_DOUBLE_EQ(0, origin_power_map.GetPowerForOrigin(url5)); +} + } // namespace power |