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

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: Updated to read the extension ID from the new ONC property. 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 a5bb977d026962744100575664be3c0fab6e6017..60c0040c9b1fd8bee606b6c9ecb0b3fe0d35cb31 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
@@ -14,6 +14,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
+#include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
@@ -22,6 +23,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 +50,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 +81,7 @@ 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 kUpdateConnectionDataFunction[] =
@@ -81,6 +94,7 @@ const char kUpdateCarrierFunction[] =
const char kSetCarrierMessage[] = "setCarrier";
const char kShowMorePlanInfoMessage[] = "showMorePlanInfo";
const char kSimOperationMessage[] = "simOperation";
+const char kUpdateVPNProviders[] = "updateVPNProviders";
// TODO(stevenjb): Replace these with the matching networkingPrivate methods.
// crbug.com/279351.
@@ -109,6 +123,8 @@ const char kTagSimOpConfigure[] = "configure";
const char kTagSimOpSetLocked[] = "setLocked";
const char kTagSimOpSetUnlocked[] = "setUnlocked";
const char kTagSimOpUnlock[] = "unlock";
+const char kTagVPNProviderName[] = "name";
+const char kTagVPNProviderExtensionID[] = "extensionID";
const char kTagVpnList[] = "vpnList";
const char kTagWifiAvailable[] = "wifiAvailable";
const char kTagWifiEnabled[] = "wifiEnabled";
@@ -202,10 +218,37 @@ bool ShowViewAccountButton(const NetworkState* cellular) {
return true;
}
+bool IsVPNProvider(const extensions::Extension* extension) {
+ return extension->permissions_data()->HasAPIPermission(
+ extensions::APIPermission::kVpnProvider);
+}
+
+Profile* GetProfileForPrimaryUser() {
+ return chromeos::ProfileHelper::Get()->GetProfileByUser(
+ user_manager::UserManager::Get()->GetPrimaryUser());
+}
+
+extensions::ExtensionRegistry* GetExtensionRegistryForPrimaryUser() {
+ return extensions::ExtensionRegistry::Get(GetProfileForPrimaryUser());
+}
+
+scoped_ptr<base::DictionaryValue> BuildVPNProviderDictionary(
+ const std::string& name,
+ const std::string& third_party_provider_extension_id) {
+ scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
+ dict->SetString(kTagVPNProviderName, name);
+ if (!third_party_provider_extension_id.empty()) {
+ dict->SetString(kTagVPNProviderExtensionID,
+ third_party_provider_extension_id);
+ }
+ return dict.Pass();
+}
+
} // namespace
InternetOptionsHandler::InternetOptionsHandler()
: weak_factory_(this) {
+ GetExtensionRegistryForPrimaryUser()->AddObserver(this);
NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
}
@@ -214,6 +257,7 @@ InternetOptionsHandler::~InternetOptionsHandler() {
NetworkHandler::Get()->network_state_handler()->RemoveObserver(
this, FROM_HERE);
}
+ GetExtensionRegistryForPrimaryUser()->RemoveObserver(this);
}
void InternetOptionsHandler::GetLocalizedValues(
@@ -238,6 +282,7 @@ void InternetOptionsHandler::GetLocalizedValues(
}
void InternetOptionsHandler::InitializePage() {
+ UpdateVPNProviders();
NetworkHandler::Get()->network_state_handler()->RequestScan();
RefreshNetworkData();
}
@@ -264,6 +309,10 @@ void InternetOptionsHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(kSimOperationMessage,
base::Bind(&InternetOptionsHandler::SimOperationCallback,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
+ kUpdateVPNProviders,
+ base::Bind(&InternetOptionsHandler::UpdateVPNProvidersCallback,
+ base::Unretained(this)));
web_ui()->RegisterMessageCallback(kSetNetworkGuidMessage,
base::Bind(&InternetOptionsHandler::SetNetworkGuidCallback,
@@ -275,6 +324,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())
@@ -356,6 +425,11 @@ void InternetOptionsHandler::SimOperationCallback(const base::ListValue* args) {
SimDialogDelegate::ShowDialog(GetNativeWindow(), mode);
}
+void InternetOptionsHandler::UpdateVPNProvidersCallback(
+ const base::ListValue* args) {
+ UpdateVPNProviders();
+}
+
////////////////////////////////////////////////////////////////////////////////
// TODO(stevenjb): Deprecate this once events are handled in the JS.
@@ -388,6 +462,25 @@ void InternetOptionsHandler::StartConnectCallback(const base::ListValue* args) {
////////////////////////////////////////////////////////////////////////////////
+void InternetOptionsHandler::UpdateVPNProviders() {
+ extensions::ExtensionRegistry* const registry =
+ GetExtensionRegistryForPrimaryUser();
+
+ base::ListValue vpn_providers;
+ const extensions::ExtensionSet& extensions = registry->enabled_extensions();
+ for (const auto& extension : extensions) {
+ if (IsVPNProvider(extension.get()))
pneubeck (no reviews) 2015/03/18 20:41:30 nit: missing {}
bartfab (slow) 2015/03/18 21:10:48 Done.
+ vpn_providers.Append(BuildVPNProviderDictionary(
+ extension->name(), extension->id()).release());
+ }
+ // Add the built-in OpenVPN/L2TP provider.
+ vpn_providers.Append(
+ BuildVPNProviderDictionary(
pneubeck (no reviews) 2015/03/18 20:41:30 still required?
bartfab (slow) 2015/03/18 21:10:48 Yes, CL 1017443002 will require the full list of a
+ l10n_util::GetStringUTF8(IDS_NETWORK_VPN_BUILT_IN_PROVIDER),
+ std::string() /* third_party_provider_extension_id */).release());
+ web_ui()->CallJavascriptFunction(kSetVPNProvidersFunction, vpn_providers);
+}
+
void InternetOptionsHandler::RefreshNetworkData() {
base::DictionaryValue dictionary;
FillNetworkInfo(&dictionary);
@@ -498,9 +591,25 @@ void InternetOptionsHandler::ConfigureNetwork(const base::ListValue* args) {
NOTREACHED();
return;
}
- std::string service_path = ServicePathFromGuid(guid);
- if (!service_path.empty())
- NetworkConfigView::Show(service_path, GetNativeWindow());
+ const std::string service_path = ServicePathFromGuid(guid);
+ if (service_path.empty())
+ return;
+
+ const NetworkState* network = GetNetworkState(service_path);
+ if (!network)
+ return;
+
+ if (network->type() == shill::kTypeVPN &&
+ network->vpn_provider_type() == shill::kProviderThirdPartyVpn) {
+ // Request that the third-party VPN provider used by the |network| show a
+ // configuration dialog for it.
+ VpnServiceFactory::GetForBrowserContext(GetProfileForPrimaryUser())
+ ->SendShowConfigureDialogToExtension(
+ network->third_party_vpn_provider_extension_id(), network->name());
+ return;
+ }
+
+ NetworkConfigView::Show(service_path, GetNativeWindow());
}
void InternetOptionsHandler::ActivateNetwork(const base::ListValue* args) {

Powered by Google App Engine
This is Rietveld 408576698