// Copyright 2013 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/net/client_hints.h"
#include <locale>
#include "base/bind.h"
#include "base/strings/stringprintf.h"
#include "base/task_runner_util.h"
#include "content/public/browser/browser_thread.h"
#include "ui/gfx/screen.h"
namespace {
float FetchScreenInfoOnUIThread() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// TODO(bengr): Consider multi-display scenarios.
gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
return display.device_scale_factor();
}
} // namespace
const char ClientHints::kDevicePixelRatioHeader[] = "CH-DPR";
ClientHints::ClientHints()
: weak_ptr_factory_(this) {
}
ClientHints::~ClientHints() {
}
void ClientHints::Init() {
// TODO(bengr): Observe the device pixel ratio in case it changes during
// the Chrome session.
RetrieveScreenInfo();
}
bool ClientHints::RetrieveScreenInfo() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
return content::BrowserThread::PostTaskAndReplyWithResult(
content::BrowserThread::UI,
FROM_HERE,
base::Bind(&FetchScreenInfoOnUIThread),
base::Bind(
&ClientHints::UpdateScreenInfo, weak_ptr_factory_.GetWeakPtr()));
}
const std::string& ClientHints::GetDevicePixelRatioHeader() const {
return screen_hints_;
}
void ClientHints::UpdateScreenInfo(float device_pixel_ratio_value) {
if (device_pixel_ratio_value <= 0.0)
return;
std::string device_pixel_ratio = base::StringPrintf("%.2f",
device_pixel_ratio_value);
// Make sure the Client Hints value doesn't change
// according to the machine's locale
std::locale locale;
for (std::string::iterator it = device_pixel_ratio.begin();
it != device_pixel_ratio.end(); ++it) {
if (!std::isdigit(*it, locale))
*it = '.';
}
screen_hints_ = device_pixel_ratio;
}