blob: 2af2084063e2d25868f23c1ad7ccdfbfbb2588df [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/client_hints/common/client_hints.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "third_party/blink/public/common/client_hints/enabled_client_hints.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace client_hints {
void GetAllowedClientHintsFromSource(
const url::Origin& origin,
const ContentSettingsForOneType& client_hints_rules,
blink::EnabledClientHints* client_hints) {
if (client_hints_rules.empty())
return;
const GURL& url = origin.GetURL();
if (!network::IsUrlPotentiallyTrustworthy(url))
return;
for (const auto& rule : client_hints_rules) {
// Look for an exact match since persisted client hints are disabled by
// default, and enabled only on per-host basis.
if (rule.primary_pattern == ContentSettingsPattern::Wildcard() ||
!rule.primary_pattern.Matches(url)) {
continue;
}
// Found an exact match.
DCHECK(ContentSettingsPattern::Wildcard() == rule.secondary_pattern);
DCHECK(rule.setting_value.is_dict());
const base::Value* list_value =
rule.setting_value.GetDict().Find(kClientHintsSettingKey);
if (list_value == nullptr)
continue;
// We should guarantee client hints list value always be Type::List since we
// save the client hints as base::Value::List in the Prefs. For details,
// check components/client_hints/browser/client_hints.cc
DCHECK(list_value->is_list());
for (const auto& client_hint : list_value->GetList()) {
DCHECK(client_hint.is_int());
network::mojom::WebClientHintsType client_hint_mojo =
static_cast<network::mojom::WebClientHintsType>(client_hint.GetInt());
if (network::mojom::IsKnownEnumValue(client_hint_mojo))
client_hints->SetIsEnabled(client_hint_mojo, true);
}
// Match found for |url| and client hints have been set.
return;
}
}
} // namespace client_hints