summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/resources/options/chromeos/network_list.js118
-rw-r--r--chrome/browser/resources/options/chromeos/vpn_providers.js90
-rw-r--r--chrome/browser/resources/options/compiled_resources.gyp1
-rw-r--r--chrome/browser/resources/options/options_bundle.js1
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc83
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler.h21
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.cc2
-rw-r--r--extensions/common/api/_api_features.json5
-rw-r--r--third_party/closure_compiler/externs/management.js246
9 files changed, 351 insertions, 216 deletions
diff --git a/chrome/browser/resources/options/chromeos/network_list.js b/chrome/browser/resources/options/chromeos/network_list.js
index 27deb6d..3d81804 100644
--- a/chrome/browser/resources/options/chromeos/network_list.js
+++ b/chrome/browser/resources/options/chromeos/network_list.js
@@ -2,15 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// TODO: /** @typedef {chrome.networkingPrivate.ThirdPartyVPNProperties} */
-/**
- * @typedef {{
- * ExtensionID: string,
- * ProviderName: string
- * }}
- */
-var ThirdPartyVPNProperties;
-
/**
* Partial definition of the result of networkingPrivate.getProperties()).
* TODO(stevenjb): Replace with chrome.networkingPrivate.NetworkStateProperties
@@ -29,13 +20,15 @@ var ThirdPartyVPNProperties;
* Type: string,
* VPN: ?{
* Type: string,
- * ThirdPartyVPN: ThirdPartyVPNProperties
+ * ThirdPartyVPN: chrome.networkingPrivate.ThirdPartyVPNProperties
* }
* }}
* @see extensions/common/api/networking_private.idl
*/
var NetworkProperties;
+/** @typedef {chrome.management.ExtensionInfo} */ var ExtensionInfo;
+
cr.define('options.network', function() {
var ArrayDataModel = cr.ui.ArrayDataModel;
var List = cr.ui.List;
@@ -118,6 +111,13 @@ cr.define('options.network', function() {
var wimaxDeviceState_ = undefined;
/**
+ * The current list of third-party VPN providers.
+ * @type {!Array<!chrome.networkingPrivate.ThirdPartyVPNProperties>}}
+ * @private
+ */
+ var vpnProviders_ = [];
+
+ /**
* Indicates if mobile data roaming is enabled.
* @type {boolean}
* @private
@@ -917,9 +917,18 @@ cr.define('options.network', function() {
chrome.networkingPrivate.onDeviceStateListChanged.addListener(
this.onNetworkListChanged_.bind(this));
+ chrome.management.onInstalled.addListener(
+ this.onExtensionAdded_.bind(this));
+ chrome.management.onEnabled.addListener(
+ this.onExtensionAdded_.bind(this));
+ chrome.management.onUninstalled.addListener(
+ this.onExtensionRemoved_.bind(this));
+ chrome.management.onDisabled.addListener(function(extension) {
+ this.onExtensionRemoved_(extension.id);
+ }.bind(this));
+
+ chrome.management.getAll(this.onGetAllExtensions_.bind(this));
chrome.networkingPrivate.requestNetworkScan();
-
- options.VPNProviders.addObserver(this.onVPNProvidersChanged_.bind(this));
},
/**
@@ -938,11 +947,71 @@ cr.define('options.network', function() {
},
/**
- * Called when the list of VPN providers changes. Refreshes the contents of
- * menus that list VPN providers.
+ * chrome.management.getAll callback.
+ * @param {!Array<!ExtensionInfo>} extensions
+ * @private
+ */
+ onGetAllExtensions_: function(extensions) {
+ vpnProviders_ = [];
+ for (var extension of extensions)
+ this.addVpnProvider_(extension);
+ },
+
+ /**
+ * If |extension| is a third-party VPN provider, add it to vpnProviders_.
+ * @param {!ExtensionInfo} extension
+ * @private
+ */
+ addVpnProvider_: function(extension) {
+ if (!extension.enabled ||
+ extension.permissions.indexOf('vpnProvider') == -1) {
+ return;
+ }
+ // Ensure that we haven't already added this provider, e.g. if
+ // the onExtensionAdded_ callback gets invoked after onGetAllExtensions_
+ // for an extension in the returned list.
+ for (var provider of vpnProviders_) {
+ if (provider.ExtensionID == extension.id)
+ return;
+ }
+ var newProvider = {
+ ExtensionID: extension.id,
+ ProviderName: extension.name
+ };
+ vpnProviders_.push(newProvider);
+ this.refreshVpnProviders_();
+ },
+
+ /**
+ * chrome.management.onInstalled or onEnabled event.
+ * @param {!ExtensionInfo} extension
+ * @private
+ */
+ onExtensionAdded_: function(extension) {
+ this.addVpnProvider_(extension);
+ },
+
+ /**
+ * chrome.management.onUninstalled or onDisabled event.
+ * @param {string} extensionId
+ * @private
+ */
+ onExtensionRemoved_: function(extensionId) {
+ for (var i = 0; i < vpnProviders_.length; ++i) {
+ var provider = vpnProviders_[i];
+ if (provider.ExtensionID == extensionId) {
+ vpnProviders_.splice(i, 1);
+ this.refreshVpnProviders_();
+ break;
+ }
+ }
+ },
+
+ /**
+ * Rebuilds the list of VPN providers.
* @private
*/
- onVPNProvidersChanged_: function() {
+ refreshVpnProviders_: function() {
// Refresh the contents of the VPN menu.
var index = this.indexOf('VPN');
if (index != undefined)
@@ -957,7 +1026,7 @@ cr.define('options.network', function() {
/**
* Updates the entries in the "add connection" menu, based on the VPN
- * providers currently enabled in the primary user's profile.
+ * providers currently enabled in the user's profile.
* @private
*/
updateAddConnectionMenuEntries_: function() {
@@ -1417,23 +1486,28 @@ cr.define('options.network', function() {
/**
* Generates an "add network" entry for each VPN provider currently enabled in
- * the primary user's profile.
+ * the user's profile.
* @return {!Array<{label: string, command: function(), data: !Object}>} The
* list of entries.
* @private
*/
function createAddVPNConnectionEntries_() {
var entries = [];
- var providers = options.VPNProviders.getProviders();
- for (var i = 0; i < providers.length; ++i) {
+ for (var i = 0; i < vpnProviders_.length; ++i) {
+ var provider = vpnProviders_[i];
entries.push({
label: loadTimeData.getStringF('addConnectionVPNTemplate',
- providers[i].name),
- command: createVPNConnectionCallback_(
- providers[i].extensionID || undefined),
+ provider.ProviderName),
+ command: createVPNConnectionCallback_(provider.ExtensionID),
data: {}
});
}
+ // Add an entry for the built-in OpenVPN/L2TP provider.
+ entries.push({
+ label: loadTimeData.getString('vpnBuiltInProvider'),
+ command: createVPNConnectionCallback_(),
+ data: {}
+ });
return entries;
}
diff --git a/chrome/browser/resources/options/chromeos/vpn_providers.js b/chrome/browser/resources/options/chromeos/vpn_providers.js
deleted file mode 100644
index 9ec7145..0000000
--- a/chrome/browser/resources/options/chromeos/vpn_providers.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2015 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.
-
-/**
- * @fileoverview A singleton that keeps track of the VPN providers enabled in
- * the primary user's profile.
- */
-
-cr.define('options', function() {
- /**
- * @constructor
- */
- function VPNProviders() {
- }
-
- cr.addSingletonGetter(VPNProviders);
-
- VPNProviders.prototype = {
- /**
- * The VPN providers enabled in the primary user's profile. Each provider
- * has a name. Third-party VPN providers additionally have an extension ID.
- * @type {!Array<{name: string, extensionID: ?string}>}
- * @private
- */
- providers_: [],
-
- /**
- * Observers who will be called when the list of VPN providers changes.
- * @type {!Array<!function()>}
- */
- observers_: [],
-
- /**
- * The VPN providers enabled in the primary user's profile.
- * @type {!Array<{name: string, extensionID: ?string}>}
- */
- get providers() {
- return this.providers_;
- },
- set providers(providers) {
- this.providers_ = providers;
- for (var i = 0; i < this.observers_.length; ++i)
- this.observers_[i]();
- },
-
- /**
- * Adds an observer to be called when the list of VPN providers changes.
- * @param {!function()} observer The observer to add.
- * @private
- */
- addObserver_: function(observer) {
- this.observers_.push(observer);
- },
- };
-
- /**
- * Adds an observer to be called when the list of VPN providers changes. Note
- * that an observer may in turn call setProviders() but should be careful not
- * to get stuck in an infinite loop as every change to the list of VPN
- * providers will cause the observers to be called again.
- * @param {!function()} observer The observer to add.
- */
- VPNProviders.addObserver = function(observer) {
- VPNProviders.getInstance().addObserver_(observer);
- };
-
- /**
- * Returns the list of VPN providers enabled in the primary user's profile.
- * @return {!Array<{name: string, extensionID: ?string}>} The list of VPN
- * providers enabled in the primary user's profile.
- */
- VPNProviders.getProviders = function() {
- return VPNProviders.getInstance().providers;
- };
-
- /**
- * Replaces the list of VPN providers enabled in the primary user's profile.
- * @param {!Array<{name: string, extensionID: ?string}>} providers The list
- * of VPN providers enabled in the primary user's profile.
- */
- VPNProviders.setProviders = function(providers) {
- VPNProviders.getInstance().providers = providers;
- };
-
- // Export
- return {
- VPNProviders: VPNProviders
- };
-});
diff --git a/chrome/browser/resources/options/compiled_resources.gyp b/chrome/browser/resources/options/compiled_resources.gyp
index a5ccac8..5b92fa5 100644
--- a/chrome/browser/resources/options/compiled_resources.gyp
+++ b/chrome/browser/resources/options/compiled_resources.gyp
@@ -46,6 +46,7 @@
# no possibility to use gyp variable expansion to it, so we don't use
# <(CLOSURE_DIR) in the "externs" line.
'externs': [
+ '../../../../third_party/closure_compiler/externs/management.js',
'../../../../third_party/closure_compiler/externs/networking_private.js',
'../../../../third_party/closure_compiler/externs/chrome_send.js',
'../../../../ui/webui/resources/cr_elements/v1_0/network/cr_network_icon_externs.js',
diff --git a/chrome/browser/resources/options/options_bundle.js b/chrome/browser/resources/options/options_bundle.js
index 075754a..30be7eb 100644
--- a/chrome/browser/resources/options/options_bundle.js
+++ b/chrome/browser/resources/options/options_bundle.js
@@ -20,7 +20,6 @@
<include src="../help/channel_change_page.js">
<include src="../../../../ui/webui/resources/js/chromeos/ui_account_tweaks.js">
<include src="chromeos/onc_data.js">
-<include src="chromeos/vpn_providers.js">
<include src="chromeos/change_picture_options.js">
<include src="chromeos/internet_detail_ip_address_field.js">
<include src="chromeos/internet_detail.js">
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 a91b591..99fed2f 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
@@ -13,7 +13,6 @@
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
-#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "chrome/browser/chromeos/enrollment_dialog_view.h"
#include "chrome/browser/chromeos/mobile_config.h"
@@ -36,16 +35,9 @@
#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 {
@@ -55,9 +47,6 @@ namespace {
// Keys for the initial "localized" dictionary values.
const char kLoggedInAsOwnerKey[] = "loggedInAsOwner";
-// Functions we call in JavaScript.
-const char kSetVPNProvidersFunction[] = "options.VPNProviders.setProviders";
-
// JS methods to show additional UI.
const char kShowMorePlanInfoMessage[] = "showMorePlanInfo";
const char kSimOperationMessage[] = "simOperation";
@@ -73,8 +62,6 @@ 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 NetworkState* GetNetworkState(const std::string& service_path) {
return NetworkHandler::Get()->network_state_handler()->
@@ -88,41 +75,18 @@ std::string ServicePathFromGuid(const std::string& guid) {
return network ? network->path() : "";
}
-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);
}
InternetOptionsHandler::~InternetOptionsHandler() {
- GetExtensionRegistryForPrimaryUser()->RemoveObserver(this);
}
void InternetOptionsHandler::GetLocalizedValues(
@@ -130,8 +94,7 @@ void InternetOptionsHandler::GetLocalizedValues(
DCHECK(localized_strings);
internet_options_strings::RegisterLocalizedStrings(localized_strings);
- // TODO(stevenjb): Find a better way to populate initial data before
- // InitializePage() gets called.
+ // TODO(stevenjb): Find a better way to populate initial data.
std::string owner;
chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
bool logged_in_as_owner = LoginState::Get()->GetLoggedInUserType() ==
@@ -139,10 +102,6 @@ void InternetOptionsHandler::GetLocalizedValues(
localized_strings->SetBoolean(kLoggedInAsOwnerKey, logged_in_as_owner);
}
-void InternetOptionsHandler::InitializePage() {
- UpdateVPNProviders();
-}
-
void InternetOptionsHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(kAddVPNConnectionMessage,
base::Bind(&InternetOptionsHandler::AddVPNConnection,
@@ -161,26 +120,6 @@ 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())
@@ -229,26 +168,6 @@ void InternetOptionsHandler::SimOperationCallback(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())) {
- vpn_providers.Append(BuildVPNProviderDictionary(
- extension->name(), extension->id()).release());
- }
- }
- // Add the built-in OpenVPN/L2TP provider.
- vpn_providers.Append(
- BuildVPNProviderDictionary(
- l10n_util::GetStringUTF8(IDS_NETWORK_VPN_BUILT_IN_PROVIDER),
- std::string() /* third_party_provider_extension_id */).release());
- web_ui()->CallJavascriptFunction(kSetVPNProvidersFunction, vpn_providers);
-}
-
gfx::NativeWindow InternetOptionsHandler::GetNativeWindow() const {
return web_ui()->GetWebContents()->GetTopLevelNativeWindow();
}
diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h
index 17c3030..d3c7da2 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h
@@ -10,7 +10,6 @@
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/webui/options/options_ui.h"
-#include "extensions/browser/extension_registry_observer.h"
#include "ui/gfx/native_widget_types.h"
class Browser;
@@ -28,8 +27,7 @@ namespace chromeos {
namespace options {
// ChromeOS internet options page UI handler.
-class InternetOptionsHandler : public ::options::OptionsPageUIHandler,
- public extensions::ExtensionRegistryObserver {
+class InternetOptionsHandler : public ::options::OptionsPageUIHandler {
public:
InternetOptionsHandler();
~InternetOptionsHandler() override;
@@ -37,27 +35,14 @@ class InternetOptionsHandler : public ::options::OptionsPageUIHandler,
private:
// OptionsPageUIHandler
void GetLocalizedValues(base::DictionaryValue* localized_strings) override;
- void InitializePage() override;
// WebUIMessageHandler (from OptionsPageUIHandler)
void RegisterMessages() override;
- // ExtensionRegistryObserver
- void OnExtensionLoaded(content::BrowserContext* browser_context,
- const extensions::Extension* extension) override;
- void OnExtensionUnloaded(
- content::BrowserContext* browser_context,
- const extensions::Extension* extension,
- extensions::UnloadedExtensionInfo::Reason reason) override;
- void OnShutdown(extensions::ExtensionRegistry* registry) override;
-
// Callbacks to set network state properties.
void ShowMorePlanInfoCallback(const base::ListValue* args);
void SimOperationCallback(const base::ListValue* args);
- // Updates the list of VPN providers enabled in the primary user's profile.
- void UpdateVPNProviders();
-
// Gets the native window for hosting dialogs, etc.
gfx::NativeWindow GetNativeWindow() const;
@@ -69,10 +54,6 @@ class InternetOptionsHandler : public ::options::OptionsPageUIHandler,
void AddNonVPNConnection(const base::ListValue* args);
void ConfigureNetwork(const base::ListValue* args);
- // Requests that a list of VPN providers enabled in the primary user's
- // profile be sent to JavaScript.
- void LoadVPNProvidersCallback(const base::ListValue* args);
-
// Weak pointer factory so we can start connections at a later time
// without worrying that they will actually try to happen after the lifetime
// of this object.
diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.cc
index 7493004..86ffa09 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.cc
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.cc
@@ -8,6 +8,7 @@
#include "base/values.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/chromeos/strings/grit/ui_chromeos_strings.h"
namespace chromeos {
namespace internet_options_strings {
@@ -31,6 +32,7 @@ StringResource kStringResources[] = {
IDS_OPTIONS_SETTINGS_SECTION_THIRD_PARTY_VPN_NAME_TEMPLATE},
{"defaultThirdPartyProviderName",
IDS_OPTIONS_SETTINGS_SECTION_DEFAULT_THIRD_PARTY_PROVIDER_NAME},
+ {"vpnBuiltInProvider", IDS_NETWORK_VPN_BUILT_IN_PROVIDER},
{"joinOtherNetwork", IDS_OPTIONS_SETTINGS_NETWORK_OTHER},
{"networkDisabled", IDS_OPTIONS_SETTINGS_NETWORK_DISABLED},
{"turnOffWifi", IDS_OPTIONS_SETTINGS_NETWORK_DISABLE_WIFI},
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index 46eade6..bba4b4f 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -195,7 +195,10 @@
"matches": [
"chrome://extensions/*",
"chrome://extensions-frame/*",
- "chrome://chrome/extensions/*"
+ "chrome://chrome/extensions/*",
+ "chrome://md-settings/*",
+ "chrome://settings/*",
+ "chrome://settings-frame/*"
]
}],
"management.getPermissionWarningsByManifest": {
diff --git a/third_party/closure_compiler/externs/management.js b/third_party/closure_compiler/externs/management.js
new file mode 100644
index 0000000..9233173
--- /dev/null
+++ b/third_party/closure_compiler/externs/management.js
@@ -0,0 +1,246 @@
+// Copyright 2015 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.
+
+// This file was generated by:
+// ./tools/json_schema_compiler/compiler.py.
+// NOTE: The format of types has changed. 'FooType' is now
+// 'chrome.management.FooType'.
+// Please run the closure compiler before committing changes.
+// See https://code.google.com/p/chromium/wiki/ClosureCompilation.
+
+/** @fileoverview Externs generated from namespace: management */
+
+/**
+ * @const
+ */
+chrome.management = {};
+
+/**
+ * Information about an icon belonging to an extension, app, or theme.
+ * @typedef {{
+ * size: number,
+ * url: string
+ * }}
+ * @see https://developer.chrome.com/extensions/management#type-IconInfo
+ */
+chrome.management.IconInfo;
+
+/**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/management#type-LaunchType
+ */
+chrome.management.LaunchType = {
+ OPEN_AS_REGULAR_TAB: 'OPEN_AS_REGULAR_TAB',
+ OPEN_AS_PINNED_TAB: 'OPEN_AS_PINNED_TAB',
+ OPEN_AS_WINDOW: 'OPEN_AS_WINDOW',
+ OPEN_FULL_SCREEN: 'OPEN_FULL_SCREEN',
+};
+
+/**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/management#type-ExtensionDisabledReason
+ */
+chrome.management.ExtensionDisabledReason = {
+ UNKNOWN: 'unknown',
+ PERMISSIONS_INCREASE: 'permissions_increase',
+};
+
+/**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/management#type-ExtensionType
+ */
+chrome.management.ExtensionType = {
+ EXTENSION: 'extension',
+ HOSTED_APP: 'hosted_app',
+ PACKAGED_APP: 'packaged_app',
+ LEGACY_PACKAGED_APP: 'legacy_packaged_app',
+ THEME: 'theme',
+};
+
+/**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/management#type-ExtensionInstallType
+ */
+chrome.management.ExtensionInstallType = {
+ ADMIN: 'admin',
+ DEVELOPMENT: 'development',
+ NORMAL: 'normal',
+ SIDELOAD: 'sideload',
+ OTHER: 'other',
+};
+
+/**
+ * Information about an installed extension, app, or theme.
+ * @typedef {{
+ * id: string,
+ * name: string,
+ * shortName: string,
+ * description: string,
+ * version: string,
+ * mayDisable: boolean,
+ * enabled: boolean,
+ * disabledReason: (!chrome.management.ExtensionDisabledReason|undefined),
+ * isApp: boolean,
+ * type: !chrome.management.ExtensionType,
+ * appLaunchUrl: (string|undefined),
+ * homepageUrl: (string|undefined),
+ * updateUrl: (string|undefined),
+ * offlineEnabled: boolean,
+ * optionsUrl: string,
+ * icons: (!Array<!chrome.management.IconInfo>|undefined),
+ * permissions: !Array<string>,
+ * hostPermissions: !Array<string>,
+ * installType: !chrome.management.ExtensionInstallType,
+ * launchType: (!chrome.management.LaunchType|undefined),
+ * availableLaunchTypes: (!Array<!chrome.management.LaunchType>|undefined)
+ * }}
+ * @see https://developer.chrome.com/extensions/management#type-ExtensionInfo
+ */
+chrome.management.ExtensionInfo;
+
+/**
+ * Returns a list of information about installed extensions and apps.
+ * @param {function(!Array<!chrome.management.ExtensionInfo>):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-getAll
+ */
+chrome.management.getAll = function(callback) {};
+
+/**
+ * Returns information about the installed extension, app, or theme that has the
+ * given ID.
+ * @param {string} id The ID from an item of $(ref:management.ExtensionInfo).
+ * @param {function(!chrome.management.ExtensionInfo):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-get
+ */
+chrome.management.get = function(id, callback) {};
+
+/**
+ * Returns information about the calling extension, app, or theme. Note: This
+ * function can be used without requesting the 'management' permission in the
+ * manifest.
+ * @param {function(!chrome.management.ExtensionInfo):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-getSelf
+ */
+chrome.management.getSelf = function(callback) {};
+
+/**
+ * Returns a list of <a href='permission_warnings'>permission warnings</a> for
+ * the given extension id.
+ * @param {string} id The ID of an already installed extension.
+ * @param {function(!Array<string>):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-getPermissionWarningsById
+ */
+chrome.management.getPermissionWarningsById = function(id, callback) {};
+
+/**
+ * Returns a list of <a href='permission_warnings'>permission warnings</a> for
+ * the given extension manifest string. Note: This function can be used without
+ * requesting the 'management' permission in the manifest.
+ * @param {string} manifestStr Extension manifest JSON string.
+ * @param {function(!Array<string>):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-getPermissionWarningsByManifest
+ */
+chrome.management.getPermissionWarningsByManifest = function(manifestStr, callback) {};
+
+/**
+ * Enables or disables an app or extension.
+ * @param {string} id This should be the id from an item of
+ * $(ref:management.ExtensionInfo).
+ * @param {boolean} enabled Whether this item should be enabled or disabled.
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-setEnabled
+ */
+chrome.management.setEnabled = function(id, enabled, callback) {};
+
+/**
+ * Uninstalls a currently installed app or extension.
+ * @param {string} id This should be the id from an item of
+ * $(ref:management.ExtensionInfo).
+ * @param {{
+ * showConfirmDialog: (boolean|undefined)
+ * }=} options
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-uninstall
+ */
+chrome.management.uninstall = function(id, options, callback) {};
+
+/**
+ * Uninstalls the calling extension. Note: This function can be used without
+ * requesting the 'management' permission in the manifest.
+ * @param {{
+ * showConfirmDialog: (boolean|undefined)
+ * }=} options
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-uninstallSelf
+ */
+chrome.management.uninstallSelf = function(options, callback) {};
+
+/**
+ * Launches an application.
+ * @param {string} id The extension id of the application.
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-launchApp
+ */
+chrome.management.launchApp = function(id, callback) {};
+
+/**
+ * Display options to create shortcuts for an app. On Mac, only packaged app
+ * shortcuts can be created.
+ * @param {string} id This should be the id from an app item of
+ * $(ref:management.ExtensionInfo).
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-createAppShortcut
+ */
+chrome.management.createAppShortcut = function(id, callback) {};
+
+/**
+ * Set the launch type of an app.
+ * @param {string} id This should be the id from an app item of
+ * $(ref:management.ExtensionInfo).
+ * @param {!chrome.management.LaunchType} launchType The target launch type.
+ * Always check and make sure this launch type is in
+ * $(ref:ExtensionInfo.availableLaunchTypes), because the available launch
+ * types vary on different platforms and configurations.
+ * @param {function():void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-setLaunchType
+ */
+chrome.management.setLaunchType = function(id, launchType, callback) {};
+
+/**
+ * Generate an app for a URL. Returns the generated bookmark app.
+ * @param {string} url The URL of a web page. The scheme of the URL can only be
+ * "http" or "https".
+ * @param {string} title The title of the generated app.
+ * @param {function(!chrome.management.ExtensionInfo):void=} callback
+ * @see https://developer.chrome.com/extensions/management#method-generateAppForLink
+ */
+chrome.management.generateAppForLink = function(url, title, callback) {};
+
+/**
+ * Fired when an app or extension has been installed.
+ * @type {!ChromeEvent}
+ * @see https://developer.chrome.com/extensions/management#event-onInstalled
+ */
+chrome.management.onInstalled;
+
+/**
+ * Fired when an app or extension has been uninstalled.
+ * @type {!ChromeEvent}
+ * @see https://developer.chrome.com/extensions/management#event-onUninstalled
+ */
+chrome.management.onUninstalled;
+
+/**
+ * Fired when an app or extension has been enabled.
+ * @type {!ChromeEvent}
+ * @see https://developer.chrome.com/extensions/management#event-onEnabled
+ */
+chrome.management.onEnabled;
+
+/**
+ * Fired when an app or extension has been disabled.
+ * @type {!ChromeEvent}
+ * @see https://developer.chrome.com/extensions/management#event-onDisabled
+ */
+chrome.management.onDisabled;