Commit 34ebd35d authored by Kelvin Jiang's avatar Kelvin Jiang Committed by Commit Bot

[DNR] Refactor ActionTracker to use a struct as a key

Bug: 983761
Change-Id: Ic3dd22708d8d20ce2a1cb9a1228835a81681f2ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1935718
Commit-Queue: Kelvin Jiang <kelvinjiang@chromium.org>
Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719442}
parent 9c3e4679
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
#include "extensions/browser/api/declarative_net_request/action_tracker.h" #include "extensions/browser/api/declarative_net_request/action_tracker.h"
#include <tuple>
#include <utility>
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/values.h" #include "base/values.h"
#include "extensions/browser/api/declarative_net_request/request_action.h" #include "extensions/browser/api/declarative_net_request/request_action.h"
...@@ -47,9 +50,9 @@ void ActionTracker::OnRuleMatched(const RequestAction& request_action, ...@@ -47,9 +50,9 @@ void ActionTracker::OnRuleMatched(const RequestAction& request_action,
return; return;
const ExtensionId& extension_id = request_action.extension_id; const ExtensionId& extension_id = request_action.extension_id;
auto key = std::make_pair(extension_id, tab_id); ExtensionTabIdKey key(extension_id, tab_id);
int action_count = ++actions_matched_[key];
size_t action_count = ++actions_matched_[std::move(key)].action_count;
if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) { if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) {
DCHECK(ExtensionsAPIClient::Get()); DCHECK(ExtensionsAPIClient::Get());
ExtensionsAPIClient::Get()->UpdateActionCount( ExtensionsAPIClient::Get()->UpdateActionCount(
...@@ -62,21 +65,23 @@ void ActionTracker::OnPreferenceEnabled(const ExtensionId& extension_id) const { ...@@ -62,21 +65,23 @@ void ActionTracker::OnPreferenceEnabled(const ExtensionId& extension_id) const {
DCHECK(extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)); DCHECK(extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id));
for (auto it = actions_matched_.begin(); it != actions_matched_.end(); ++it) { for (auto it = actions_matched_.begin(); it != actions_matched_.end(); ++it) {
if (it->first.first != extension_id) const ExtensionTabIdKey& key = it->first;
const TrackedInfo& value = it->second;
if (key.extension_id != extension_id)
continue; continue;
int tab_id = it->first.second;
int action_count = it->second;
ExtensionsAPIClient::Get()->UpdateActionCount( ExtensionsAPIClient::Get()->UpdateActionCount(
browser_context_, extension_id, tab_id, action_count, browser_context_, extension_id, key.tab_id, value.action_count,
true /* clear_badge_text */); true /* clear_badge_text */);
} }
} }
void ActionTracker::ClearExtensionData(const ExtensionId& extension_id) { void ActionTracker::ClearExtensionData(const ExtensionId& extension_id) {
auto compare_by_extension_id = auto compare_by_extension_id =
[&extension_id](const std::pair<ExtensionTabKey, size_t>& it) { [&extension_id](
return it.first.first == extension_id; const std::pair<const ExtensionTabIdKey, TrackedInfo>& it) {
return it.first.extension_id == extension_id;
}; };
base::EraseIf(actions_matched_, compare_by_extension_id); base::EraseIf(actions_matched_, compare_by_extension_id);
...@@ -84,22 +89,24 @@ void ActionTracker::ClearExtensionData(const ExtensionId& extension_id) { ...@@ -84,22 +89,24 @@ void ActionTracker::ClearExtensionData(const ExtensionId& extension_id) {
void ActionTracker::ClearTabData(int tab_id) { void ActionTracker::ClearTabData(int tab_id) {
auto compare_by_tab_id = auto compare_by_tab_id =
[&tab_id](const std::pair<ExtensionTabKey, size_t>& it) { [&tab_id](const std::pair<const ExtensionTabIdKey, TrackedInfo>& it) {
return it.first.second == tab_id; return it.first.tab_id == tab_id;
}; };
base::EraseIf(actions_matched_, compare_by_tab_id); base::EraseIf(actions_matched_, compare_by_tab_id);
} }
void ActionTracker::ResetActionCountForTab(int tab_id) { void ActionTracker::ResetActionCountForTab(int tab_id) {
DCHECK_NE(tab_id, extension_misc::kUnknownTabId);
RulesMonitorService* rules_monitor_service = RulesMonitorService* rules_monitor_service =
RulesMonitorService::Get(browser_context_); RulesMonitorService::Get(browser_context_);
DCHECK(rules_monitor_service); DCHECK(rules_monitor_service);
for (const auto& extension_id : for (const auto& extension_id :
rules_monitor_service->extensions_with_rulesets()) { rules_monitor_service->extensions_with_rulesets()) {
auto key = std::make_pair(extension_id, tab_id); ExtensionTabIdKey key(extension_id, tab_id);
actions_matched_[key] = 0; actions_matched_[std::move(key)].action_count = 0;
if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) { if (extension_prefs_->GetDNRUseActionCountAsBadgeText(extension_id)) {
DCHECK(ExtensionsAPIClient::Get()); DCHECK(ExtensionsAPIClient::Get());
...@@ -110,6 +117,22 @@ void ActionTracker::ResetActionCountForTab(int tab_id) { ...@@ -110,6 +117,22 @@ void ActionTracker::ResetActionCountForTab(int tab_id) {
} }
} }
ActionTracker::ExtensionTabIdKey::ExtensionTabIdKey(ExtensionId extension_id,
int tab_id)
: extension_id(std::move(extension_id)), tab_id(tab_id) {}
ActionTracker::ExtensionTabIdKey::ExtensionTabIdKey(
ActionTracker::ExtensionTabIdKey&&) = default;
ActionTracker::ExtensionTabIdKey& ActionTracker::ExtensionTabIdKey::operator=(
ActionTracker::ExtensionTabIdKey&&) = default;
bool ActionTracker::ExtensionTabIdKey::operator<(
const ExtensionTabIdKey& other) const {
return std::tie(tab_id, extension_id) <
std::tie(other.tab_id, other.extension_id);
}
void ActionTracker::DispatchOnRuleMatchedDebugIfNeeded( void ActionTracker::DispatchOnRuleMatchedDebugIfNeeded(
const RequestAction& request_action, const RequestAction& request_action,
dnr_api::RequestDetails request_details) { dnr_api::RequestDetails request_details) {
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include "base/macros.h"
#include "extensions/common/api/declarative_net_request.h" #include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/extension_id.h" #include "extensions/common/extension_id.h"
...@@ -28,6 +27,8 @@ class ActionTracker { ...@@ -28,6 +27,8 @@ class ActionTracker {
public: public:
explicit ActionTracker(content::BrowserContext* browser_context); explicit ActionTracker(content::BrowserContext* browser_context);
~ActionTracker(); ~ActionTracker();
ActionTracker(const ActionTracker& other) = delete;
ActionTracker& operator=(const ActionTracker& other) = delete;
// Called whenever a request matches with a rule. // Called whenever a request matches with a rule.
void OnRuleMatched(const RequestAction& request_action, void OnRuleMatched(const RequestAction& request_action,
...@@ -53,23 +54,37 @@ class ActionTracker { ...@@ -53,23 +54,37 @@ class ActionTracker {
void ResetActionCountForTab(int tab_id); void ResetActionCountForTab(int tab_id);
private: private:
struct ExtensionTabIdKey {
ExtensionTabIdKey(ExtensionId extension_id, int tab_id);
ExtensionTabIdKey(const ExtensionTabIdKey& other) = delete;
ExtensionTabIdKey& operator=(const ExtensionTabIdKey& other) = delete;
ExtensionTabIdKey(ExtensionTabIdKey&&);
ExtensionTabIdKey& operator=(ExtensionTabIdKey&&);
ExtensionId extension_id;
int tab_id;
bool operator<(const ExtensionTabIdKey& other) const;
};
// Info tracked for each ExtensionTabIdKey.
struct TrackedInfo {
size_t action_count = 0;
};
// Called from OnRuleMatched. Dispatches a OnRuleMatchedDebug event to the // Called from OnRuleMatched. Dispatches a OnRuleMatchedDebug event to the
// observer for the extension specified by |request_action.extension_id|. // observer for the extension specified by |request_action.extension_id|.
void DispatchOnRuleMatchedDebugIfNeeded( void DispatchOnRuleMatchedDebugIfNeeded(
const RequestAction& request_action, const RequestAction& request_action,
api::declarative_net_request::RequestDetails request_details); api::declarative_net_request::RequestDetails request_details);
using ExtensionTabKey = std::pair<ExtensionId, int>;
// Maps a pair of (extension ID, tab ID) to the number of actions matched for // Maps a pair of (extension ID, tab ID) to the number of actions matched for
// the extension and tab specified. // the extension and tab specified.
std::map<ExtensionTabKey, int> actions_matched_; std::map<ExtensionTabIdKey, TrackedInfo> actions_matched_;
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
ExtensionPrefs* extension_prefs_; ExtensionPrefs* extension_prefs_;
DISALLOW_COPY_AND_ASSIGN(ActionTracker);
}; };
} // namespace declarative_net_request } // namespace declarative_net_request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment