blob: 2fea9a0f8eb2d736400cb3c1cbea533f00254395 [file] [log] [blame]
// Copyright 2015 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 "content/public/common/navigation_policy.h"
#include "base/command_line.h"
#include "base/metrics/histogram_macros.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "services/network/public/cpp/features.h"
namespace content {
namespace {
void LogPerPolicyApplied(NavigationDownloadType type) {
UMA_HISTOGRAM_ENUMERATION("Navigation.DownloadPolicy.LogPerPolicyApplied",
type);
}
void LogArbitraryPolicyPerDownload(NavigationDownloadType type) {
UMA_HISTOGRAM_ENUMERATION(
"Navigation.DownloadPolicy.LogArbitraryPolicyPerDownload", type);
}
} // namespace
bool IsPerNavigationMojoInterfaceEnabled() {
return base::FeatureList::IsEnabled(features::kPerNavigationMojoInterface);
}
bool IsBackForwardCacheEnabled() {
return base::FeatureList::IsEnabled(features::kBackForwardCache);
}
NavigationDownloadPolicy::NavigationDownloadPolicy() = default;
NavigationDownloadPolicy::~NavigationDownloadPolicy() = default;
NavigationDownloadPolicy::NavigationDownloadPolicy(
const NavigationDownloadPolicy&) = default;
void NavigationDownloadPolicy::SetAllowed(NavigationDownloadType type) {
DCHECK(type != NavigationDownloadType::kDefaultAllow);
observed_types.set(static_cast<size_t>(type));
}
void NavigationDownloadPolicy::SetDisallowed(NavigationDownloadType type) {
DCHECK(type != NavigationDownloadType::kDefaultAllow);
observed_types.set(static_cast<size_t>(type));
disallowed_types.set(static_cast<size_t>(type));
}
bool NavigationDownloadPolicy::IsType(NavigationDownloadType type) const {
DCHECK(type != NavigationDownloadType::kDefaultAllow);
return observed_types.test(static_cast<size_t>(type));
}
ResourceInterceptPolicy NavigationDownloadPolicy::GetResourceInterceptPolicy()
const {
if (disallowed_types.test(
static_cast<size_t>(NavigationDownloadType::kSandboxNoGesture)) ||
disallowed_types.test(
static_cast<size_t>(NavigationDownloadType::kOpenerCrossOrigin)) ||
disallowed_types.test(
static_cast<size_t>(NavigationDownloadType::kAdFrameNoGesture)) ||
disallowed_types.test(
static_cast<size_t>(NavigationDownloadType::kAdFrameGesture))) {
return ResourceInterceptPolicy::kAllowPluginOnly;
}
return disallowed_types.any() ? ResourceInterceptPolicy::kAllowNone
: ResourceInterceptPolicy::kAllowAll;
}
bool NavigationDownloadPolicy::IsDownloadAllowed() const {
return disallowed_types.none();
}
void NavigationDownloadPolicy::RecordHistogram() const {
if (observed_types.none()) {
LogPerPolicyApplied(NavigationDownloadType::kDefaultAllow);
LogArbitraryPolicyPerDownload(NavigationDownloadType::kDefaultAllow);
return;
}
bool first_type_seen = false;
for (size_t i = 0; i < observed_types.size(); ++i) {
if (observed_types.test(i)) {
NavigationDownloadType policy = static_cast<NavigationDownloadType>(i);
DCHECK(policy != NavigationDownloadType::kDefaultAllow);
LogPerPolicyApplied(policy);
if (!first_type_seen) {
LogArbitraryPolicyPerDownload(policy);
first_type_seen = true;
}
}
}
DCHECK(first_type_seen);
}
} // namespace content