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

Unified Diff: chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc

Issue 1006553002: Add third-party VPN support to network details dialog (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@f_2_460428_add_ash_ui
Patch Set: Prepare for removal of GetManagedPropertiesResult() by tracking VPN providers and networks separate… Created 5 years, 9 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/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());
}

Powered by Google App Engine
This is Rietveld 408576698