blob: 44a47b6224d22bad0d4036da84a43b4f8e641c5d [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 "chrome/browser/media/router/media_router_feature.h"
#include "base/base64.h"
#include "base/feature_list.h"
#include "base/strings/string_util.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile.h"
#include "components/mirroring/service/features.h"
#include "content/public/browser/browser_context.h"
#include "content/public/common/content_features.h"
#include "crypto/random.h"
#include "extensions/buildflags/buildflags.h"
#include "services/network/public/cpp/features.h"
#include "ui/base/ui_features.h"
#if defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/user_prefs/user_prefs.h"
#include "ui/base/ui_base_features.h"
#endif // defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
#if !defined(OS_ANDROID)
#include "components/prefs/pref_registry_simple.h"
#endif
namespace media_router {
#if !defined(OS_ANDROID)
// Controls if browser side DialMediaRouteProvider is enabled.
const base::Feature kDialMediaRouteProvider{"DialMediaRouteProvider",
base::FEATURE_DISABLED_BY_DEFAULT};
// Controls if browser side Cast device discovery is enabled.
const base::Feature kEnableCastDiscovery{"EnableCastDiscovery",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kCastMediaRouteProvider{"CastMediaRouteProvider",
base::FEATURE_DISABLED_BY_DEFAULT};
#endif
#if defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
namespace {
const PrefService::Preference* GetMediaRouterPref(
content::BrowserContext* context) {
return user_prefs::UserPrefs::Get(context)->FindPreference(
::prefs::kEnableMediaRouter);
}
} // namespace
#endif // defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
bool MediaRouterEnabled(content::BrowserContext* context) {
#if defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
const PrefService::Preference* pref = GetMediaRouterPref(context);
// Only use the pref value if it set from a mandatory policy.
if (pref->IsManaged() && !pref->IsDefaultValue()) {
bool allowed = false;
CHECK(pref->GetValue()->GetAsBoolean(&allowed));
return allowed;
}
// The component extension cannot be loaded in guest sessions.
// TODO(crbug.com/756243): Figure out why.
return !Profile::FromBrowserContext(context)->IsGuestSession();
#else // !(defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS))
return false;
#endif // defined(OS_ANDROID) || BUILDFLAG(ENABLE_EXTENSIONS)
}
#if !defined(OS_ANDROID)
void RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(prefs::kMediaRouterCastAllowAllIPs, false,
PrefRegistry::PUBLIC);
}
void RegisterProfilePrefs(PrefRegistrySimple* registry) {
// TODO(imcheng): Migrate existing Media Router prefs to here.
registry->RegisterStringPref(prefs::kMediaRouterReceiverIdHashToken, "",
PrefRegistry::PUBLIC);
}
const base::Feature kCastAllowAllIPsFeature{"CastAllowAllIPs",
base::FEATURE_DISABLED_BY_DEFAULT};
bool GetCastAllowAllIPsPref(PrefService* pref_service) {
auto* pref = pref_service->FindPreference(prefs::kMediaRouterCastAllowAllIPs);
// Only use the pref value if it is set from a mandatory policy.
bool allow_all_ips = false;
if (pref->IsManaged() && !pref->IsDefaultValue()) {
CHECK(pref->GetValue()->GetAsBoolean(&allow_all_ips));
} else {
allow_all_ips = base::FeatureList::IsEnabled(kCastAllowAllIPsFeature);
}
return allow_all_ips;
}
std::string GetReceiverIdHashToken(PrefService* pref_service) {
static constexpr size_t kHashTokenSize = 64;
std::string token =
pref_service->GetString(prefs::kMediaRouterReceiverIdHashToken);
if (token.empty()) {
crypto::RandBytes(base::WriteInto(&token, kHashTokenSize + 1),
kHashTokenSize);
base::Base64Encode(token, &token);
pref_service->SetString(prefs::kMediaRouterReceiverIdHashToken, token);
}
return token;
}
bool DialMediaRouteProviderEnabled() {
return base::FeatureList::IsEnabled(kDialMediaRouteProvider);
}
bool CastDiscoveryEnabled() {
return base::FeatureList::IsEnabled(kEnableCastDiscovery);
}
bool CastMediaRouteProviderEnabled() {
return base::FeatureList::IsEnabled(kCastMediaRouteProvider);
}
bool ShouldUseViewsDialog() {
return base::FeatureList::IsEnabled(features::kViewsCastDialog) ||
base::FeatureList::IsEnabled(features::kExperimentalUi);
}
bool ShouldUseMirroringService() {
return base::FeatureList::IsEnabled(mirroring::features::kMirroringService) &&
base::FeatureList::IsEnabled(features::kAudioServiceAudioStreams) &&
base::FeatureList::IsEnabled(network::features::kNetworkService);
}
#endif // !defined(OS_ANDROID)
} // namespace media_router