blob: 3367cc2f9a734a79c8c62204b70fce69b9d0e636 [file] [log] [blame]
Illia Klimov44d7250742023-03-09 22:16:371// Copyright 2023 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/permissions/permission_recovery_success_rate_tracker.h"
6
Illia Klimov44d7250742023-03-09 22:16:377#include "components/permissions/permission_uma_util.h"
8#include "content/public/browser/web_contents.h"
9
10namespace permissions {
11
12PermissionRecoverySuccessRateTracker::PermissionRecoverySuccessRateTracker(
13 content::WebContents* web_contents)
14 : content::WebContentsObserver(web_contents),
15 content::WebContentsUserData<PermissionRecoverySuccessRateTracker>(
16 *web_contents) {
17 DCHECK(web_contents);
18}
19
20PermissionRecoverySuccessRateTracker::~PermissionRecoverySuccessRateTracker() {
21 DCHECK(reallowed_permissions_.empty());
22}
23
24void PermissionRecoverySuccessRateTracker::PermissionStatusChanged(
25 ContentSettingsType permission,
26 ContentSetting setting,
27 bool show_infobar) {
28 // If permission is not allowed, it is not actionable for origins.
29 if (setting != ContentSetting::CONTENT_SETTING_ALLOW) {
30 return;
31 }
32
33 reallowed_permissions_[permission] = show_infobar;
34}
35
36void PermissionRecoverySuccessRateTracker::ClearTrackingMap() {
37 for (const auto& [permission, show_infobar] : reallowed_permissions_) {
38 Track(permission, /*is_used=*/false, show_infobar);
39 }
40
41 reallowed_permissions_.clear();
42}
43
44void PermissionRecoverySuccessRateTracker::TrackUsage(
45 ContentSettingsType permission) {
46 if (reallowed_permissions_.find(permission) != reallowed_permissions_.end()) {
47 Track(permission, /*is_used=*/true, reallowed_permissions_[permission]);
48 reallowed_permissions_.erase(permission);
49 }
50}
51
52void PermissionRecoverySuccessRateTracker::Track(ContentSettingsType permission,
53 bool is_used,
54 bool show_infobar) {
55 PermissionUmaUtil::RecordPermissionRecoverySuccessRate(
56 permission, is_used, show_infobar, page_reload_);
57}
58
59void PermissionRecoverySuccessRateTracker::WebContentsDestroyed() {
60 ClearTrackingMap();
61}
62
63void PermissionRecoverySuccessRateTracker::PrimaryPageChanged(
64 content::Page& page) {
65 if (origin_ != page.GetMainDocument().GetLastCommittedOrigin()) {
66 origin_ = page.GetMainDocument().GetLastCommittedOrigin();
67 // Clear tracking map only for cross-origin navigation.
68 ClearTrackingMap();
69 page_reload_ = false;
70 } else {
71 page_reload_ = true;
72 }
73}
74
75WEB_CONTENTS_USER_DATA_KEY_IMPL(PermissionRecoverySuccessRateTracker);
76
77} // namespace permissions