// 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/net/prediction_options.h"

#include "base/logging.h"
#include "chrome/browser/profiles/profile_io_data.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/network_change_notifier.h"

namespace chrome_browser_net {

namespace {

// Since looking up preferences and current network connection are presumably
// both cheap, we do not cache them here.
NetworkPredictionStatus CanPrefetchAndPrerender(
    int network_prediction_options) {
  switch (network_prediction_options) {
    case NETWORK_PREDICTION_ALWAYS:
    case NETWORK_PREDICTION_WIFI_ONLY:
      if (base::FeatureList::IsEnabled(
              features::kPredictivePrefetchingAllowedOnAllConnectionTypes) ||
          !net::NetworkChangeNotifier::IsConnectionCellular(
              net::NetworkChangeNotifier::GetConnectionType())) {
        return NetworkPredictionStatus::ENABLED;
      }
      return NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK;
    default:
      DCHECK_EQ(NETWORK_PREDICTION_NEVER, network_prediction_options);
      return NetworkPredictionStatus::DISABLED_ALWAYS;
  }
}

bool CanPreresolveAndPreconnect(int network_prediction_options) {
  // DNS preresolution and TCP preconnect are performed even on cellular
  // networks if the user setting is WIFI_ONLY.
  return network_prediction_options != NETWORK_PREDICTION_NEVER;
}

}  // namespace

void RegisterPredictionOptionsProfilePrefs(
    user_prefs::PrefRegistrySyncable* registry) {
  registry->RegisterIntegerPref(
      prefs::kNetworkPredictionOptions,
      NETWORK_PREDICTION_DEFAULT,
      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
}

NetworkPredictionStatus CanPrefetchAndPrerenderIO(
    ProfileIOData* profile_io_data) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
  DCHECK(profile_io_data);
  return CanPrefetchAndPrerender(
      profile_io_data->network_prediction_options()->GetValue());
}

NetworkPredictionStatus CanPrefetchAndPrerenderUI(PrefService* prefs) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  DCHECK(prefs);
  return CanPrefetchAndPrerender(
      prefs->GetInteger(prefs::kNetworkPredictionOptions));
}

bool CanPreresolveAndPreconnectIO(ProfileIOData* profile_io_data) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
  DCHECK(profile_io_data);
  return CanPreresolveAndPreconnect(
      profile_io_data->network_prediction_options()->GetValue());
}

bool CanPreresolveAndPreconnectUI(PrefService* prefs) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  DCHECK(prefs);
  return CanPreresolveAndPreconnect(
      prefs->GetInteger(prefs::kNetworkPredictionOptions));
}

}  // namespace chrome_browser_net
