Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1696)

Unified Diff: chrome/browser/chromeos/proxy_config_service_impl.h

Issue 3047052: chromeos: 1st draft of ProxyConfigService for chromeos... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/proxy_config_service_impl.h
===================================================================
--- chrome/browser/chromeos/proxy_config_service_impl.h (revision 0)
+++ chrome/browser/chromeos/proxy_config_service_impl.h (revision 0)
@@ -0,0 +1,191 @@
+// Copyright (c) 2010 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_PROXY_CONFIG_SERVICE_IMPL_H_
+#define CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/observer_list.h"
+#include "base/ref_counted.h"
+#include "base/scoped_ptr.h"
+#include "net/proxy/proxy_config.h"
+#include "net/proxy/proxy_config_service.h"
+#include "net/proxy/proxy_server.h"
+
+namespace chromeos {
+
+// Implementation of proxy config service for chromeos that:
+// - is RefCountedThreadSafe
+// - is wrapped by chromeos::ProxyConfigService which implements
+// net::ProxyConfigService interface by fowarding the methods to this class
+// - retrieves initial system proxy configuration from cros settings persisted
+// on chromeos device
+// - provides network stack with latest system proxy configuration for use on
+// IO thread
+// - provides UI with methods to retrieve and modify system proxy configuration
+// on UI thread
+// - TODO(kuan): persists proxy configuration settings on chromeos device using
+// cros settings
+class ProxyConfigServiceImpl
+ : public base::RefCountedThreadSafe<ProxyConfigServiceImpl> {
+ public:
+ // ProxyConfigServiceImpl is created on the UI thread in
+ // chrome/browser/net/chrome_url_request_context.cc::CreateProxyConfigService
+ // via ProfileImpl::GetChromeOSProxyConfigServiceImpl, and stored in Profile
+ // as a scoped_refptr (because it's RefCountedThreadSafe).
+ //
+ // Past that point, it can be accessed from the IO or UI threads.
+ //
+ // From the IO thread, it is accessed periodically through the wrapper class
+ // chromeos::ProxyConfigService via net::ProxyConfigService interface
+ // (GetLatestProxyConfig, AddObserver, RemoveObserver).
+ //
+ // From the UI thread, it is accessed via
+ // DOMUI::GetProfile::GetChromeOSProxyConfigServiceImpl to allow user to read
+ // or modify the proxy configuration via UIGetProxyConfig or
+ // UISetProxyConfigTo* respectively.
+ // The new modified proxy config is posted to the IO thread through
+ // SetNewProxyConfig(). We then notify observers on the IO thread of the
+ // configuration change.
+
+ // In 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 suffice. So we create an augmented analog to
+ // net:ProxyConfig here to include and handle these UI requirements, e.g.
+ // - where configuration was picked up from - policy or owner
+ // - the read/write access of a proxy setting
+ // - may add more stuff later.
+ // This is then converted to the common net::ProxyConfig before being returned
+ // to ProxyService::GetLatestProxyConfig on the IO thread to be used on the
+ // network stack.
+ struct ProxyConfig {
+ // 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,
+ };
+
+ // Specifies where proxy configuration was picked up from.
+ enum Source {
+ SOURCE_NONE, // No default configuration.
+ SOURCE_POLICY, // Configuration is from policy.
+ SOURCE_OWNER, // Configuration is from owner.
+ };
+
+ struct Setting {
+ Setting() : source(SOURCE_NONE) {}
+
+ Source source;
+ bool CanBeWrittenByUser(bool user_is_owner);
+ };
+
+ // Proxy setting for mode = direct or auto-detect or using pac script.
+ struct AutomaticProxy : public Setting {
+ GURL pac_url; // Set if proxy is using pac script.
+ };
+
+ // Proxy setting for mode = single-proxy or proxy-per-scheme.
+ struct ManualProxy : public Setting {
+ net::ProxyServer server;
+ };
+
+ ProxyConfig() : mode(MODE_DIRECT) {}
+
+ // Converts |this| to net::ProxyConfig.
+ void ConvertToNetProxyConfig(net::ProxyConfig* net_config);
+
+ // Creates a textual dump of the configuration.
+ std::string ToString() const;
+
+ Mode mode;
+
+ // 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;
+ };
+
+ // Usual constructor.
+ ProxyConfigServiceImpl();
+ // Constructor for testing.
+ // |init_config| specifies the ProxyConfig to use for initialization.
+ explicit ProxyConfigServiceImpl(const ProxyConfig& init_config);
+ virtual ~ProxyConfigServiceImpl();
+
+ // Methods called on IO thread from wrapper class chromeos::ProxyConfigService
+ // as ProxyConfigService methods.
+ void AddObserver(net::ProxyConfigService::Observer* observer);
+ void RemoveObserver(net::ProxyConfigService::Observer* observer);
+ // Called from GetLatestProxyConfig.
+ bool IOGetProxyConfig(net::ProxyConfig* config);
+
+ // Called from UI thread to retrieve proxy configuration in |config|.
+ void UIGetProxyConfig(ProxyConfig* config);
+
+ // Called from UI thread to update proxy configuration for different modes.
+ void UISetProxyConfigToDirect();
+ void UISetProxyConfigToAutoDetect();
+ void UISetProxyConfigToPACScript(const GURL& url);
+ void UISetProxyConfigToSingleProxy(const net::ProxyServer& server);
+ void UISetProxyConfigToProxyPerScheme(const std::string& scheme,
+ const net::ProxyServer& server);
+ // Only valid for MODE_SINGLE_PROXY or MODE_PROXY_PER_SCHEME.
+ void UISetProxyConfigBypassRules(const net::ProxyBypassRules& bypass_rules);
+
+ private:
+ friend class base::RefCountedThreadSafe<ProxyConfigServiceImpl>;
+
+ // Called from UI thread from the various UISetProxyConfigTo*
+ void OnUISetProxyConfig();
+
+ // Posted from UI thread to IO thread to carry the new config information.
+ void IOSetProxyConfig(const ProxyConfig& new_config);
+
+ // Checks that method is called on ChromeThread::IO thread.
+ void CheckCurrentlyOnIOThread();
+
+ // Checks that method is called on ChromeThread::UI thread.
+ void CheckCurrentlyOnUIThread();
+
+ // Data members.
+
+ // Cached proxy configuration, to be converted to net::ProxyConfig and
+ // returned by IOGetProxyConfig.
+ // Initially populated from the UI thread, but afterwards only accessed from
+ // the IO thread.
+ ProxyConfig cached_config_;
+
+ // Copy of the proxy configuration kept on the UI thread of the last seen
+ // proxy config, so as to avoid posting a call to SetNewProxyConfig when we
+ // are called by UI to set new proxy but the config has not actually changed.
+ ProxyConfig reference_config_;
+
+ ObserverList<net::ProxyConfigService::Observer> observers_;
+
+ DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceImpl);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
Property changes on: chrome\browser\chromeos\proxy_config_service_impl.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/chromeos/proxy_config_service.h ('k') | chrome/browser/chromeos/proxy_config_service_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698