summaryrefslogtreecommitdiff
path: root/chromium/components/power
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/power')
-rw-r--r--chromium/components/power/BUILD.gn1
-rw-r--r--chromium/components/power/origin_power_map.cc26
-rw-r--r--chromium/components/power/origin_power_map.h5
-rw-r--r--chromium/components/power/origin_power_map_unittest.cc63
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