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
|
// 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/extensions/api/permissions/permissions_event_router.h"
#include <memory>
#include "base/scoped_observation.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/permissions/permissions_api_helpers.h"
#include "chrome/common/extensions/api/permissions.h"
#include "extensions/browser/event_router.h"
#include "extensions/common/extension.h"
#include "extensions/common/permissions/permission_set.h"
namespace extensions {
PermissionsEventRouter::PermissionsEventRouter(content::BrowserContext* context)
: browser_context_(context),
permissions_manager_(PermissionsManager::Get(browser_context_)),
event_router_(EventRouter::Get(browser_context_)) {
permissions_manager_observer_.Observe(permissions_manager_);
}
PermissionsEventRouter::~PermissionsEventRouter() = default;
void PermissionsEventRouter::Shutdown() {
permissions_manager_observer_.Reset();
permissions_manager_ = nullptr;
event_router_ = nullptr;
}
void PermissionsEventRouter::OnExtensionPermissionsUpdated(
const Extension& extension,
const PermissionSet& permissions,
PermissionsManager::UpdateReason reason) {
events::HistogramValue histogram_value = events::UNKNOWN;
const char* event_name = nullptr;
switch (reason) {
case PermissionsManager::UpdateReason::kAdded:
histogram_value = events::PERMISSIONS_ON_ADDED;
event_name = api::permissions::OnAdded::kEventName;
break;
case PermissionsManager::UpdateReason::kRemoved:
histogram_value = events::PERMISSIONS_ON_REMOVED;
event_name = api::permissions::OnRemoved::kEventName;
break;
case PermissionsManager::UpdateReason::kPolicy:
// Explicitly don't trigger onAdded and onRemoved for policy-related
// events.
return;
}
// Trigger the onAdded and onRemoved events in the extension.
base::Value::List event_args;
std::unique_ptr<api::permissions::Permissions> packed_permissions =
permissions_api_helpers::PackPermissionSet(permissions);
event_args.Append(packed_permissions->ToValue());
auto event = std::make_unique<Event>(histogram_value, event_name,
std::move(event_args), browser_context_);
// `event_router_` may be null in tests.
if (event_router_) {
event_router_->DispatchEventToExtension(extension.id(), std::move(event));
}
}
} // namespace extensions
|