// 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.
#ifndef CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_
#define CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_
#include <string>
#include "chrome/browser/prefs/proxy_prefs.h"
#include "net/proxy/proxy_bypass_rules.h"
#include "net/proxy/proxy_server.h"
#include "url/gurl.h"
namespace base {
class DictionaryValue;
}
namespace net {
class ProxyConfig;
}
namespace chromeos {
// Contrary to other platforms which simply use the systems' UI to allow users
// to configure proxies, we have to implement our own UI on the chromeos device.
// This requires extra and specific UI requirements that net::ProxyConfig does
// not supply. So we create an augmented analog to net::ProxyConfig here to
// include and handle these UI requirements, e.g.
// - state of configuration e.g. where it was picked up from - policy,
// extension, etc (refer to ProxyPrefs::ConfigState)
// - the read/write access of a proxy setting
// - may add more stuff later.
// This is then converted to the common net::ProxyConfig before being pushed
// to PrefProxyConfigTrackerImpl::OnProxyConfigChanged and then to the network
// stack.
struct UIProxyConfig {
// Specifies if proxy config is direct, auto-detect, using pac script,
// single-proxy, or proxy-per-scheme.
enum Mode {
MODE_DIRECT,
MODE_AUTO_DETECT,
MODE_PAC_SCRIPT,
MODE_SINGLE_PROXY,
MODE_PROXY_PER_SCHEME,
};
// Proxy setting for mode = direct or auto-detect or using pac script.
struct AutomaticProxy {
GURL pac_url; // Set if proxy is using pac script.
};
// Proxy setting for mode = single-proxy or proxy-per-scheme.
struct ManualProxy {
net::ProxyServer server;
};
UIProxyConfig();
~UIProxyConfig();
void SetPacUrl(const GURL& pac_url);
void SetSingleProxy(const net::ProxyServer& server);
// |scheme| is one of "http", "https", "ftp" or "socks".
void SetProxyForScheme(const std::string& scheme,
const net::ProxyServer& server);
// Only valid for MODE_SINGLE_PROXY or MODE_PROXY_PER_SCHEME.
void SetBypassRules(const net::ProxyBypassRules& rules);
// Converts net::ProxyConfig to |this|.
bool FromNetProxyConfig(const net::ProxyConfig& net_config);
// Converts |this| to Dictionary of ProxyConfigDictionary format (which
// is the same format used by prefs).
base::DictionaryValue* ToPrefProxyConfig() const;
// Map |scheme| (one of "http", "https", "ftp" or "socks") to the correct
// ManualProxy. Returns NULL if scheme is invalid.
ManualProxy* MapSchemeToProxy(const std::string& scheme);
// Encodes the proxy server as "<url-scheme>=<proxy-scheme>://<proxy>"
static void EncodeAndAppendProxyServer(const std::string& url_scheme,
const net::ProxyServer& server,
std::string* spec);
Mode mode;
ProxyPrefs::ConfigState state;
// True if user can modify proxy settings via UI.
// If proxy is managed by policy or extension or other_precde or is for
// shared network but kUseSharedProxies is turned off, it can't be modified
// by user.
bool user_modifiable;
// Set if mode is MODE_DIRECT or MODE_AUTO_DETECT or MODE_PAC_SCRIPT.
AutomaticProxy automatic_proxy;
// Set if mode is MODE_SINGLE_PROXY.
ManualProxy single_proxy;
// Set if mode is MODE_PROXY_PER_SCHEME and has http proxy.
ManualProxy http_proxy;
// Set if mode is MODE_PROXY_PER_SCHEME and has https proxy.
ManualProxy https_proxy;
// Set if mode is MODE_PROXY_PER_SCHEME and has ftp proxy.
ManualProxy ftp_proxy;
// Set if mode is MODE_PROXY_PER_SCHEME and has socks proxy.
ManualProxy socks_proxy;
// Exceptions for when not to use a proxy.
net::ProxyBypassRules bypass_rules;
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_