Chromium Code Reviews| Index: chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc |
| diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc |
| index d84e355a0bcb34da53dfa9348ca7cf6fbd5b1741..c70aaa5a0157f462d721f678b70f77b078a7f967 100644 |
| --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc |
| +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc |
| @@ -22,6 +22,7 @@ |
| #include "chrome/browser/chromeos/net/onc_utils.h" |
| #include "chrome/browser/chromeos/options/network_config_view.h" |
| #include "chrome/browser/chromeos/options/network_property_ui_data.h" |
| +#include "chrome/browser/chromeos/profiles/profile_helper.h" |
| #include "chrome/browser/chromeos/settings/cros_settings.h" |
| #include "chrome/browser/chromeos/sim_dialog_delegate.h" |
| #include "chrome/browser/chromeos/ui/choose_mobile_network_dialog.h" |
| @@ -48,11 +49,21 @@ |
| #include "chromeos/network/onc/onc_translator.h" |
| #include "chromeos/network/onc/onc_utils.h" |
| #include "components/onc/onc_constants.h" |
| +#include "components/user_manager/user_manager.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/browser/web_ui.h" |
| +#include "extensions/browser/api/vpn_provider/vpn_service.h" |
| +#include "extensions/browser/api/vpn_provider/vpn_service_factory.h" |
| +#include "extensions/browser/extension_registry.h" |
| +#include "extensions/common/extension.h" |
| +#include "extensions/common/extension_set.h" |
| +#include "extensions/common/permissions/api_permission.h" |
| +#include "extensions/common/permissions/permissions_data.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/webui/web_ui_util.h" |
| #include "ui/chromeos/network/network_connect.h" |
| +#include "ui/chromeos/strings/grit/ui_chromeos_strings.h" |
| namespace chromeos { |
| namespace options { |
| @@ -69,6 +80,8 @@ const char kNetworkDataKey[] = "networkData"; |
| const char kNetworkInfoKeyPolicyManaged[] = "policyManaged"; |
| // Functions we call in JavaScript. |
| +const char kSetVPNProvidersFunction[] = |
| + "options.VPNProviders.setProviders"; |
| const char kRefreshNetworkDataFunction[] = |
| "options.network.NetworkList.refreshNetworkData"; |
| const char kGetManagedPropertiesResultFunction[] = |
| @@ -122,6 +135,11 @@ const char kTagWirelessList[] = "wirelessList"; |
| const char kNetworkInfoKeyServicePath[] = "servicePath"; |
| const char kTagErrorMessage[] = "errorMessage"; |
| const char kTagShowViewAccountButton[] = "showViewAccountButton"; |
| +const char kTagVPNProviderID[] = "VPNProviderID"; |
| + |
| +// ID used for the built-in OpenVPN/L2TP VPN provider. This must be kept in sync |
| +// with chrome/browser/resources/options/chromeos/vpn_providers.js. |
| +const char kBuiltInVPNProviderID[] = "built-in"; |
|
michaelpg
2015/03/16 05:45:20
nit: make this a @const in vpn_providers.js and ad
bartfab (slow)
2015/03/16 10:04:51
Done.
|
| void ShillError(const std::string& function, |
| const std::string& error_name, |
| @@ -155,6 +173,13 @@ base::DictionaryValue* BuildNetworkDictionary( |
| network_info->SetString(kNetworkInfoKeyServicePath, network->path()); |
| + if (network->type() == shill::kTypeVPN) { |
| + std::string provider_id = network->vpn_provider_extension_id(); |
| + if (provider_id.empty()) |
| + provider_id = kBuiltInVPNProviderID; |
| + network_info->SetString(kTagVPNProviderID, provider_id); |
| + } |
|
stevenjb
2015/03/15 17:00:08
This should be done in network_state.cc, not here,
bartfab (slow)
2015/03/16 10:04:51
Fully ack. My goal was to prepare things so that w
|
| + |
| return network_info.release(); |
| } |
| @@ -200,10 +225,25 @@ bool ShowViewAccountButton(const NetworkState* cellular) { |
| return true; |
| } |
| +bool IsVPNProvider(const extensions::Extension* extension) { |
| + return extension->permissions_data()->HasAPIPermission( |
| + extensions::APIPermission::kVpnProvider); |
|
michaelpg
2015/03/16 05:45:20
nit: remove extra indentation
bartfab (slow)
2015/03/16 10:04:51
Done.
|
| +} |
| + |
| +Profile* GetProfileForPrimaryUser() { |
| + return chromeos::ProfileHelper::Get()->GetProfileByUser( |
| + user_manager::UserManager::Get()->GetPrimaryUser()); |
| +} |
| + |
| +extensions::ExtensionRegistry* GetExtensionRegistryForPrimaryUser() { |
| + return extensions::ExtensionRegistry::Get(GetProfileForPrimaryUser()); |
| +} |
| + |
| } // namespace |
| InternetOptionsHandler::InternetOptionsHandler() |
| : weak_factory_(this) { |
| + GetExtensionRegistryForPrimaryUser()->AddObserver(this); |
| NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE); |
| } |
| @@ -212,6 +252,7 @@ InternetOptionsHandler::~InternetOptionsHandler() { |
| NetworkHandler::Get()->network_state_handler()->RemoveObserver( |
| this, FROM_HERE); |
| } |
| + GetExtensionRegistryForPrimaryUser()->RemoveObserver(this); |
| } |
| void InternetOptionsHandler::GetLocalizedValues( |
| @@ -236,6 +277,7 @@ void InternetOptionsHandler::GetLocalizedValues( |
| } |
| void InternetOptionsHandler::InitializePage() { |
| + UpdateVPNProviders(); |
| NetworkHandler::Get()->network_state_handler()->RequestScan(); |
| RefreshNetworkData(); |
| } |
| @@ -275,6 +317,26 @@ void InternetOptionsHandler::RegisterMessages() { |
| base::Unretained(this))); |
| } |
| +void InternetOptionsHandler::OnExtensionLoaded( |
| + content::BrowserContext* browser_context, |
| + const extensions::Extension* extension) { |
| + if (IsVPNProvider(extension)) |
| + UpdateVPNProviders(); |
| +} |
| + |
| +void InternetOptionsHandler::OnExtensionUnloaded( |
| + content::BrowserContext* browser_context, |
| + const extensions::Extension* extension, |
| + extensions::UnloadedExtensionInfo::Reason reason) { |
| + if (IsVPNProvider(extension)) |
| + UpdateVPNProviders(); |
| +} |
| + |
| +void InternetOptionsHandler::OnShutdown( |
| + extensions::ExtensionRegistry* registry) { |
| + registry->RemoveObserver(this); |
| +} |
| + |
| void InternetOptionsHandler::ShowMorePlanInfoCallback( |
| const base::ListValue* args) { |
| if (!web_ui()) |
| @@ -393,6 +455,24 @@ void InternetOptionsHandler::StartConnectCallback(const base::ListValue* args) { |
| //////////////////////////////////////////////////////////////////////////////// |
| +void InternetOptionsHandler::UpdateVPNProviders() { |
| + extensions::ExtensionRegistry* const registry = |
| + GetExtensionRegistryForPrimaryUser(); |
| + |
| + base::DictionaryValue vpn_providers; |
| + const extensions::ExtensionSet& extensions = registry->enabled_extensions(); |
| + for (const auto& extension : extensions) { |
| + if (IsVPNProvider(extension.get())) |
| + vpn_providers.SetString(extension->id(), extension->name()); |
| + } |
| + // Add the built-in OpenVPN/L2TP provider. |
| + vpn_providers.SetString( |
| + kBuiltInVPNProviderID, |
| + l10n_util::GetStringUTF8(IDS_NETWORK_VPN_BUILT_IN_PROVIDER)); |
| + |
| + web_ui()->CallJavascriptFunction(kSetVPNProvidersFunction, vpn_providers); |
| +} |
| + |
| void InternetOptionsHandler::RefreshNetworkData() { |
| base::DictionaryValue dictionary; |
| FillNetworkInfo(&dictionary); |
| @@ -430,6 +510,11 @@ void InternetOptionsHandler::GetManagedPropertiesResult( |
| if (network->type() == shill::kTypeCellular) { |
| dictionary->SetBoolean(kTagShowViewAccountButton, |
| ShowViewAccountButton(network)); |
| + } else if (network->type() == shill::kTypeVPN) { |
| + std::string provider_id = network->vpn_provider_extension_id(); |
| + if (provider_id.empty()) |
| + provider_id = kBuiltInVPNProviderID; |
| + dictionary->SetString(kTagVPNProviderID, provider_id); |
| } |
| } |
| web_ui()->CallJavascriptFunction(js_callback_function, *dictionary); |
| @@ -528,6 +613,21 @@ void InternetOptionsHandler::ConfigureNetwork(const base::ListValue* args) { |
| NOTREACHED(); |
| return; |
| } |
| + |
| + const NetworkState* network = GetNetworkState(service_path); |
| + if (!network) |
| + return; |
| + |
| + if (network->type() == shill::kTypeVPN && |
| + !network->vpn_provider_extension_id().empty()) { |
| + // Request that the third-party VPN provider used by the |network| show a |
| + // configuration dialog for it. |
| + VpnServiceFactory::GetForBrowserContext(GetProfileForPrimaryUser())-> |
| + SendShowConfigureDialogToExtension( |
| + network->vpn_provider_extension_id(), network->name()); |
| + return; |
| + } |
| + |
| NetworkConfigView::Show(service_path, GetNativeWindow()); |
| } |