blob: e085392bce1f42d59da84009e47836774a56d027 [file] [log] [blame]
// Copyright 2020 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/ui/views/frame/webui_tab_strip_field_trial.h"
#include "base/feature_list.h"
#include "base/logging.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "chrome/browser/ui/ui_features.h"
// Platform-specific headers for detecting tablet devices.
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/public/cpp/tablet_mode.h"
#elif BUILDFLAG(IS_WIN)
#include <windows.h>
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace {
#if BUILDFLAG(IS_WIN)
// Returns whether the screen supports touch input. Returns false if it
// couldn't be checked.
bool HasBuiltInTouchScreen() {
int result = ::GetSystemMetrics(SM_DIGITIZER);
// The |result| can be a combination of the following:
// - NID_INTEGRATED_TOUCH: built-in touch screen
// - NID_EXTERNAL_TOUCH: external touch screen or tablet
// - NID_INTEGRATED_PEN: built-in pen support
// - NID_EXTERNAL_PEN: external pen screen or tablet
// - NID_MULTI_INPUT: not sure what this means
// - NID_READY: currently ready to receive touch or pen input
//
// Ideally, we want to determine if a device is a tablet or
// convertible. This means it supports entering system tablet mode.
// There is no direct way to check this, however having a built-in
// touch screen is a good proxy. Ignore pen digitizers; if a device
// only supports pen input it probably isn't a tablet.
return (result & NID_INTEGRATED_TOUCH) != 0;
}
#endif // BUILDFLAG(IS_WIN)
} // namespace
// static
void WebUITabStripFieldTrial::RegisterFieldTrialIfNecessary() {
static WebUITabStripFieldTrial instance;
}
WebUITabStripFieldTrial::WebUITabStripFieldTrial() {
if (!DeviceIsTabletModeCapable())
return;
base::FeatureList* const feature_list = base::FeatureList::GetInstance();
if (feature_list->IsFeatureOverriddenFromCommandLine(
features::kWebUITabStrip.name))
return;
const char* group_name;
if (!feature_list->IsFeatureOverridden(features::kWebUITabStrip.name))
group_name = "Default";
else if (base::FeatureList::IsEnabled(features::kWebUITabStrip))
group_name = "Enabled";
else
group_name = "Disabled";
ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(
"WebUITabStripOnTablets", group_name);
}
// static
bool WebUITabStripFieldTrial::DeviceIsTabletModeCapable() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
return ash::TabletMode::IsBoardTypeMarkedAsTabletCapable();
#elif BUILDFLAG(IS_WIN)
return HasBuiltInTouchScreen();
#else
// No known way to determine tablet-capability on other platforms.
// Since returning true will record the synthetic field trial for all
// devices, it'll do no better than the existing field trial. So,
// return false and don't record this synthetic field trial.
return false;
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}