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
|
// Copyright 2023 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/tpcd/metadata/devtools_observer.h"
#include "chrome/browser/content_settings/cookie_settings_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tpcd/metadata/manager_factory.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/cookie_settings_base.h"
#include "components/tpcd/metadata/browser/manager.h"
#include "content/public/browser/cookie_access_details.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "net/cookies/site_for_cookies.h"
#include "third_party/blink/public/mojom/devtools/inspector_issue.mojom.h"
namespace tpcd::metadata {
TpcdMetadataDevtoolsObserver::TpcdMetadataDevtoolsObserver(
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
content::WebContentsUserData<TpcdMetadataDevtoolsObserver>(
*web_contents) {
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
cookie_settings_ = CookieSettingsFactory::GetForProfile(profile);
tpcd_metadata_manager_ =
tpcd::metadata::ManagerFactory::GetForProfile(profile);
}
TpcdMetadataDevtoolsObserver::~TpcdMetadataDevtoolsObserver() = default;
void TpcdMetadataDevtoolsObserver::OnCookiesAccessed(
content::RenderFrameHost* render_frame_host,
const content::CookieAccessDetails& details) {
OnCookiesAccessedImpl(details);
}
void TpcdMetadataDevtoolsObserver::OnCookiesAccessed(
content::NavigationHandle* navigation_handle,
const content::CookieAccessDetails& details) {
OnCookiesAccessedImpl(details);
}
void TpcdMetadataDevtoolsObserver::OnCookiesAccessedImpl(
const content::CookieAccessDetails& details) {
if (content_settings::CookieSettingsBase::IsAnyTpcdMetadataAllowMechanism(
cookie_settings_->GetThirdPartyCookieAllowMechanism(
details.url,
net::SiteForCookies::FromUrl(details.first_party_url),
details.first_party_url, details.cookie_setting_overrides))) {
EmitMetadataGrantDevtoolsIssue(details.url, details.first_party_url,
details.type);
}
}
void TpcdMetadataDevtoolsObserver::EmitMetadataGrantDevtoolsIssue(
const GURL& third_party_url,
const GURL& first_party_url,
const content::CookieAccessDetails::Type cookie_access_type) {
auto details = blink::mojom::InspectorIssueDetails::New();
auto metadata_issue_details =
blink::mojom::CookieDeprecationMetadataIssueDetails::New();
metadata_issue_details->allowed_sites.push_back(third_party_url.host());
metadata_issue_details->operation =
cookie_access_type == content::CookieAccessDetails::Type::kRead
? blink::mojom::CookieOperation::kReadCookie
: blink::mojom::CookieOperation::kSetCookie;
if (tpcd_metadata_manager_) {
content_settings::SettingInfo out_info;
bool allowed = tpcd_metadata_manager_->IsAllowed(
third_party_url, first_party_url, &out_info);
if (allowed) {
metadata_issue_details->opt_out_percentage =
out_info.metadata.tpcd_metadata_elected_dtrp();
metadata_issue_details->is_opt_out_top_level =
out_info.metadata.tpcd_metadata_rule_source() ==
TpcdMetadataRuleSource::SOURCE_1P_DT ||
out_info.primary_pattern == ContentSettingsPattern::Wildcard();
}
}
details->cookie_deprecation_metadata_issue_details =
std::move(metadata_issue_details);
web_contents()->GetPrimaryMainFrame()->ReportInspectorIssue(
blink::mojom::InspectorIssueInfo::New(
blink::mojom::InspectorIssueCode::kCookieDeprecationMetadataIssue,
std::move(details)));
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(TpcdMetadataDevtoolsObserver);
} // namespace tpcd::metadata
|