blob: 567f816738bcc7f011dfc87a234658c015afaf75 [file] [log] [blame]
// Copyright 2014 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/chromeos/login/auth/auth_prewarmer.h"
#include <stddef.h>
#include "base/task/post_task.h"
#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/network/network_handler.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "google_apis/gaia/gaia_urls.h"
#include "net/base/load_flags.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "url/gurl.h"
namespace chromeos {
AuthPrewarmer::AuthPrewarmer() : doing_prewarm_(false) {}
AuthPrewarmer::~AuthPrewarmer() {
NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
FROM_HERE);
}
void AuthPrewarmer::PrewarmAuthentication(
base::OnceClosure completion_callback) {
if (doing_prewarm_) {
LOG(ERROR) << "PrewarmAuthentication called twice.";
return;
}
doing_prewarm_ = true;
completion_callback_ = std::move(completion_callback);
if (IsNetworkConnected()) {
DoPrewarm();
} else {
// DefaultNetworkChanged will get called when a network becomes connected.
NetworkHandler::Get()->network_state_handler()->AddObserver(this,
FROM_HERE);
}
}
void AuthPrewarmer::DefaultNetworkChanged(const NetworkState* network) {
if (!network)
return; // Still no default (connected) network.
NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
FROM_HERE);
DoPrewarm();
}
void AuthPrewarmer::DoPrewarm() {
const int kConnectionsNeeded = 1;
const int kLoadFlags = net::LOAD_NORMAL;
const bool kShouldUsePrivacyMode = false;
const GURL& url = GaiaUrls::GetInstance()->service_login_url();
network::mojom::NetworkContext* network_context =
login::GetSigninNetworkContext();
if (network_context) {
// Do nothing if NetworkContext isn't available.
network_context->PreconnectSockets(kConnectionsNeeded, url, kLoadFlags,
kShouldUsePrivacyMode);
}
if (!completion_callback_.is_null()) {
base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI},
std::move(completion_callback_));
}
}
bool AuthPrewarmer::IsNetworkConnected() const {
NetworkStateHandler* nsh = NetworkHandler::Get()->network_state_handler();
return (nsh->ConnectedNetworkByType(NetworkTypePattern::Default()) != NULL);
}
} // namespace chromeos