File: notification_permission_review_result.cc

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (131 lines) | stat: -rw-r--r-- 5,066 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/safety_hub/notification_permission_review_result.h"

#include <set>

#include "chrome/app/chrome_command_ids.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"

NotificationPermissions::NotificationPermissions(
    const ContentSettingsPattern& primary_pattern,
    const ContentSettingsPattern& secondary_pattern,
    int notification_count)
    : primary_pattern(primary_pattern),
      secondary_pattern(secondary_pattern),
      notification_count(notification_count) {}
NotificationPermissions::~NotificationPermissions() = default;

NotificationPermissionsReviewResult::NotificationPermissionsReviewResult() =
    default;
NotificationPermissionsReviewResult::~NotificationPermissionsReviewResult() =
    default;

NotificationPermissionsReviewResult::NotificationPermissionsReviewResult(
    const NotificationPermissionsReviewResult&) = default;

void NotificationPermissionsReviewResult::AddNotificationPermission(
    const NotificationPermissions& notification_permission) {
  notification_permissions_.push_back(std::move(notification_permission));
}

base::Value::List
NotificationPermissionsReviewResult::GetSortedListValueForUI() {
  base::Value::List result;

// Setting up the list for UI is done on the Android side.
#if !BUILDFLAG(IS_ANDROID)
  const auto sorted_notification_permissions =
      GetSortedNotificationPermissions();

  // Each entry is a dictionary with origin as key and notification count as
  // value.
  for (const auto& notification_permission : sorted_notification_permissions) {
    base::Value::Dict permission;
    permission.Set(kSafetyHubOriginKey,
                   notification_permission.primary_pattern.ToString());
    std::string notification_info_string = l10n_util::GetPluralStringFUTF8(
        IDS_SETTINGS_SAFETY_CHECK_REVIEW_NOTIFICATION_PERMISSIONS_COUNT_LABEL,
        notification_permission.notification_count);
    permission.Set(kSafetyHubNotificationInfoString, notification_info_string);
    result.Append(std::move(permission));
  }
#endif
  return result;
}

std::vector<NotificationPermissions>
NotificationPermissionsReviewResult::GetSortedNotificationPermissions() {
  // Sort notification permissions by their priority for surfacing to the user.
  auto notification_permission_ordering = [](const auto& left,
                                             const auto& right) {
    return left.notification_count > right.notification_count;
  };
  std::sort(notification_permissions_.begin(), notification_permissions_.end(),
            notification_permission_ordering);

  std::vector<NotificationPermissions> result(notification_permissions_);
  return result;
}

std::set<ContentSettingsPattern>
NotificationPermissionsReviewResult::GetOrigins() const {
  std::set<ContentSettingsPattern> origins;
  for (const auto& permission : notification_permissions_) {
    origins.insert(permission.primary_pattern);
  }
  return origins;
}

std::unique_ptr<SafetyHubService::Result>
NotificationPermissionsReviewResult::Clone() const {
  return std::make_unique<NotificationPermissionsReviewResult>(*this);
}

base::Value::Dict NotificationPermissionsReviewResult::ToDictValue() const {
  base::Value::Dict result = BaseToDictValue();
  base::Value::List notification_permissions;
  for (const auto& permission : notification_permissions_) {
    base::Value::Dict permission_dict;
    permission_dict.Set(kSafetyHubOriginKey,
                        permission.primary_pattern.ToString());
    notification_permissions.Append(std::move(permission_dict));
  }
  result.Set(kSafetyHubNotificationPermissionsReviewResultKey,
             std::move(notification_permissions));
  return result;
}

bool NotificationPermissionsReviewResult::IsTriggerForMenuNotification() const {
  return !notification_permissions_.empty();
}

bool NotificationPermissionsReviewResult::WarrantsNewMenuNotification(
    const base::Value::Dict& previous_result_dict) const {
  std::set<ContentSettingsPattern> old_origins;
  for (const base::Value& permission : *previous_result_dict.FindList(
           kSafetyHubNotificationPermissionsReviewResultKey)) {
    const base::Value::Dict& notification_permission = permission.GetDict();
    old_origins.insert(ContentSettingsPattern::FromString(
        *notification_permission.FindString(kSafetyHubOriginKey)));
  }
  std::set<ContentSettingsPattern> new_origins = GetOrigins();
  return !std::ranges::includes(old_origins, new_origins);
}

std::u16string NotificationPermissionsReviewResult::GetNotificationString()
    const {
  if (notification_permissions_.empty()) {
    return std::u16string();
  }
  return l10n_util::GetPluralStringFUTF16(
      IDS_SETTINGS_SAFETY_HUB_REVIEW_NOTIFICATION_PERMISSIONS_MENU_NOTIFICATION,
      GetOrigins().size());
}

int NotificationPermissionsReviewResult::GetNotificationCommandId() const {
  return IDC_OPEN_SAFETY_HUB;
}