hid: Whitelist gnubby extension so it won't show the system tray icon
This change suppress the icon being shown for Google corp gnubby
extension as we believe googlers are power users and understand that
their security key is being used.
Bug: 1480078
Change-Id: Iae222ea4aa68944c8ebf46b08eb399c05827c8a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4854080
Reviewed-by: Jack Hsieh <[email protected]>
Commit-Queue: Juan Garza Sanchez <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1196337}
diff --git a/chrome/browser/device_notifications/device_connection_tracker.cc b/chrome/browser/device_notifications/device_connection_tracker.cc
index a7d8cce..f788219 100644
--- a/chrome/browser/device_notifications/device_connection_tracker.cc
+++ b/chrome/browser/device_notifications/device_connection_tracker.cc
@@ -6,6 +6,7 @@
#include <string>
+#include "base/containers/contains.h"
#include "base/notreached.h"
#include "build/build_config.h"
#include "chrome/browser/device_notifications/device_system_tray_icon.h"
@@ -52,6 +53,9 @@
void DeviceConnectionTracker::IncrementConnectionCount(
const url::Origin& origin) {
+ if (base::Contains(whitelisted_origins_, origin)) {
+ return;
+ }
bool to_stage_profile = origins_.empty();
auto& state = origins_[origin];
@@ -76,6 +80,9 @@
void DeviceConnectionTracker::DecrementConnectionCount(
const url::Origin& origin) {
+ if (base::Contains(whitelisted_origins_, origin)) {
+ return;
+ }
auto it = origins_.find(origin);
CHECK(it != origins_.end());
diff --git a/chrome/browser/device_notifications/device_connection_tracker.h b/chrome/browser/device_notifications/device_connection_tracker.h
index 6cc15ab0..9828b0e 100644
--- a/chrome/browser/device_notifications/device_connection_tracker.h
+++ b/chrome/browser/device_notifications/device_connection_tracker.h
@@ -66,6 +66,9 @@
// active connection(s).
base::flat_map<url::Origin, OriginState> origins_;
+ // Connection from whitelisted origins will not be tracked.
+ std::vector<url::Origin> whitelisted_origins_;
+
private:
virtual DeviceSystemTrayIcon* GetSystemTrayIcon() = 0;
diff --git a/chrome/browser/device_notifications/device_connection_tracker_unittest.cc b/chrome/browser/device_notifications/device_connection_tracker_unittest.cc
index a1b4b0cf..a1144e5 100644
--- a/chrome/browser/device_notifications/device_connection_tracker_unittest.cc
+++ b/chrome/browser/device_notifications/device_connection_tracker_unittest.cc
@@ -189,6 +189,50 @@
EXPECT_TRUE(connection_tracker->origins().empty());
}
+void DeviceConnectionTrackerTestBase::TestWhitelistedOrigin(
+ const std::pair<url::Origin, std::string> whitelisted_origin,
+ const std::pair<url::Origin, std::string> non_whitelisted_origin) {
+ auto t0 = TimeTicks::Now();
+ MockDeviceSystemTrayIcon* mock_device_system_tray_icon =
+ GetMockDeviceSystemTrayIcon();
+ auto* connection_tracker = GetDeviceConnectionTracker(profile(), true);
+
+ EXPECT_CALL(*mock_device_system_tray_icon, StageProfile(profile())).Times(0);
+ connection_tracker->IncrementConnectionCount(whitelisted_origin.first);
+ EXPECT_EQ(connection_tracker->total_connection_count(), 0);
+ testing::Mock::VerifyAndClearExpectations(&connection_tracker);
+
+ EXPECT_CALL(*mock_device_system_tray_icon, StageProfile(profile()));
+ connection_tracker->IncrementConnectionCount(non_whitelisted_origin.first);
+ EXPECT_EQ(connection_tracker->total_connection_count(), 1);
+ EXPECT_THAT(connection_tracker->origins(),
+ UnorderedElementsAre(
+ Pair(non_whitelisted_origin.first,
+ OriginState(1, t0, non_whitelisted_origin.second))));
+ testing::Mock::VerifyAndClearExpectations(&connection_tracker);
+
+ EXPECT_CALL(*mock_device_system_tray_icon,
+ UnstageProfile(profile(), /*immediate=*/true))
+ .Times(0);
+ connection_tracker->DecrementConnectionCount(whitelisted_origin.first);
+ EXPECT_EQ(connection_tracker->total_connection_count(), 1);
+ EXPECT_THAT(connection_tracker->origins(),
+ UnorderedElementsAre(
+ Pair(non_whitelisted_origin.first,
+ OriginState(1, t0, non_whitelisted_origin.second))));
+
+ EXPECT_CALL(*mock_device_system_tray_icon,
+ NotifyConnectionCountUpdated(profile()));
+
+ connection_tracker->DecrementConnectionCount(non_whitelisted_origin.first);
+ EXPECT_CALL(*mock_device_system_tray_icon,
+ UnstageProfile(profile(), /*immediate=*/true));
+
+ task_environment()->FastForwardBy(base::Seconds(3));
+ EXPECT_EQ(connection_tracker->total_connection_count(), 0);
+ EXPECT_TRUE(connection_tracker->origins().empty());
+}
+
#if BUILDFLAG(ENABLE_EXTENSIONS)
scoped_refptr<const extensions::Extension>
DeviceConnectionTrackerTestBase::CreateExtensionWithName(
@@ -208,6 +252,26 @@
return extension;
}
+scoped_refptr<const extensions::Extension>
+DeviceConnectionTrackerTestBase::CreateExtensionWithNameAndId(
+ const std::string& extension_name,
+ const std::string& extension_id) {
+ auto manifest = base::Value::Dict()
+ .Set("name", extension_name)
+ .Set("description", "For testing.")
+ .Set("version", "0.1")
+ .Set("manifest_version", 2)
+ .Set("web_accessible_resources",
+ base::Value::List().Append("index.html"));
+ scoped_refptr<const extensions::Extension> extension =
+ extensions::ExtensionBuilder(/*name=*/extension_name)
+ .SetID(extension_id)
+ .MergeManifest(std::move(manifest))
+ .Build();
+ DCHECK(extension);
+ return extension;
+}
+
void DeviceConnectionTrackerTestBase::AddExtensionToProfile(
Profile* profile,
const extensions::Extension* extension) {
@@ -235,6 +299,19 @@
{extension2->origin(), extension2->name()}});
}
+void DeviceConnectionTrackerTestBase::TestSingleProfileWhitelistedExtension(
+ std::string whitelisted_extension_name,
+ std::string whitelisted_extension_id) {
+ auto whitelisted_extension = CreateExtensionWithNameAndId(
+ whitelisted_extension_name, whitelisted_extension_id);
+ auto extension2 = CreateExtensionWithName("Test Extension 2");
+ AddExtensionToProfile(profile(), whitelisted_extension.get());
+ AddExtensionToProfile(profile(), extension2.get());
+ TestWhitelistedOrigin(
+ {whitelisted_extension->origin(), whitelisted_extension->name()},
+ {extension2->origin(), extension2->name()});
+}
+
void DeviceConnectionTrackerTestBase::TestProfileDestroyedExtensionOrigin() {
auto t0 = TimeTicks::Now();
auto* profile_to_be_destroyed = CreateTestingProfile(kTestProfileName);
diff --git a/chrome/browser/device_notifications/device_connection_tracker_unittest.h b/chrome/browser/device_notifications/device_connection_tracker_unittest.h
index f5f26fa1..0fa6317 100644
--- a/chrome/browser/device_notifications/device_connection_tracker_unittest.h
+++ b/chrome/browser/device_notifications/device_connection_tracker_unittest.h
@@ -49,10 +49,20 @@
const std::vector<std::pair<url::Origin, std::string>>&
origin_name_pairs);
+ // Test the scenario when the origin is whitelisted.
+ void TestWhitelistedOrigin(
+ const std::pair<url::Origin, std::string> whitelisted_origin,
+ const std::pair<url::Origin, std::string> origin2);
+
#if BUILDFLAG(ENABLE_EXTENSIONS)
scoped_refptr<const extensions::Extension> CreateExtensionWithName(
const std::string& extension_name);
+ // Create a extension with |extension_name| and |extension_id|.
+ scoped_refptr<const extensions::Extension> CreateExtensionWithNameAndId(
+ const std::string& extension_name,
+ const std::string& extension_id);
+
void AddExtensionToProfile(Profile* profile,
const extensions::Extension* extension);
@@ -60,6 +70,12 @@
void TestProfileDestroyedExtensionOrigin();
+ // Run TestWhitelistedOrigin with a whitelisted origin and a non-whitelisted
+ // origin.
+ void TestSingleProfileWhitelistedExtension(
+ std::string whitelisted_extension_name,
+ std::string whitelisted_extension_id);
+
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
};
diff --git a/chrome/browser/hid/hid_connection_tracker.cc b/chrome/browser/hid/hid_connection_tracker.cc
index 79b911c..2cc680a9 100644
--- a/chrome/browser/hid/hid_connection_tracker.cc
+++ b/chrome/browser/hid/hid_connection_tracker.cc
@@ -9,7 +9,12 @@
#include "chrome/browser/ui/chrome_pages.h"
HidConnectionTracker::HidConnectionTracker(Profile* profile)
- : DeviceConnectionTracker(profile) {}
+ : DeviceConnectionTracker(profile) {
+ whitelisted_origins_.push_back(url::Origin::Create(
+ GURL("chrome-extension://ckcendljdlmgnhghiaomidhiiclmapok")));
+ whitelisted_origins_.push_back(url::Origin::Create(
+ GURL("chrome-extension://lfboplenmmjcmpbkeemecobbadnmpfhi")));
+}
HidConnectionTracker::~HidConnectionTracker() = default;
diff --git a/chrome/browser/hid/hid_connection_tracker_unittest.cc b/chrome/browser/hid/hid_connection_tracker_unittest.cc
index a42c5a6..4265b01 100644
--- a/chrome/browser/hid/hid_connection_tracker_unittest.cc
+++ b/chrome/browser/hid/hid_connection_tracker_unittest.cc
@@ -61,4 +61,14 @@
TEST_F(HidConnectionTrackerTest, ProfileDestroyedExtensionOrigin) {
TestProfileDestroyedExtensionOrigin();
}
+
+TEST_F(HidConnectionTrackerTest, WhitelistedGnubbyDev) {
+ TestSingleProfileWhitelistedExtension("gnubbyd-v3 dev",
+ "ckcendljdlmgnhghiaomidhiiclmapok");
+}
+
+TEST_F(HidConnectionTrackerTest, WhitelistedGnubbyProd) {
+ TestSingleProfileWhitelistedExtension("gnubbyd-v3 prod",
+ "lfboplenmmjcmpbkeemecobbadnmpfhi");
+}
#endif // BUILDFLAG(ENABLE_EXTENSIONS)