summaryrefslogtreecommitdiff
path: root/chromium/extensions/common
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/extensions/common')
-rw-r--r--chromium/extensions/common/BUILD.gn6
-rw-r--r--chromium/extensions/common/api/API_OWNERS1
-rw-r--r--chromium/extensions/common/api/PRESUBMIT.py27
-rw-r--r--chromium/extensions/common/api/_api_features.json10
-rw-r--r--chromium/extensions/common/api/_behavior_features.json46
-rw-r--r--chromium/extensions/common/api/_manifest_features.json4
-rw-r--r--chromium/extensions/common/api/_permission_features.json25
-rw-r--r--chromium/extensions/common/api/automation.idl1
-rw-r--r--chromium/extensions/common/api/declarative_net_request.idl16
-rw-r--r--chromium/extensions/common/api/declarative_net_request/constants.cc1
-rw-r--r--chromium/extensions/common/api/declarative_net_request/constants.h1
-rw-r--r--chromium/extensions/common/api/declarative_net_request/dnr_manifest_handler.cc16
-rw-r--r--chromium/extensions/common/api/declarative_net_request/test_utils.cc9
-rw-r--r--chromium/extensions/common/api/declarative_net_request/test_utils.h5
-rw-r--r--chromium/extensions/common/api/externs_checker.py30
-rw-r--r--chromium/extensions/common/api/generated_externs_list.txt12
-rw-r--r--chromium/extensions/common/api/networking_onc.idl4
-rw-r--r--chromium/extensions/common/api/networking_private.idl2
-rw-r--r--chromium/extensions/common/common_manifest_handlers.cc4
-rw-r--r--chromium/extensions/common/constants.cc6
-rw-r--r--chromium/extensions/common/constants.h14
-rw-r--r--chromium/extensions/common/event_filter.cc1
-rw-r--r--chromium/extensions/common/extension_features.cc4
-rw-r--r--chromium/extensions/common/extension_features.h2
-rw-r--r--chromium/extensions/common/extension_l10n_util_unittest.cc6
-rw-r--r--chromium/extensions/common/extension_resource.h15
-rw-r--r--chromium/extensions/common/features/behavior_feature.cc2
-rw-r--r--chromium/extensions/common/features/behavior_feature.h1
-rw-r--r--chromium/extensions/common/features/feature_flags.cc6
-rw-r--r--chromium/extensions/common/features/feature_flags.h4
-rw-r--r--chromium/extensions/common/features/simple_feature_unittest.cc2
-rw-r--r--chromium/extensions/common/file_util_unittest.cc6
-rw-r--r--chromium/extensions/common/manifest.cc1
-rw-r--r--chromium/extensions/common/manifest_constants.cc47
-rw-r--r--chromium/extensions/common/manifest_constants.h23
-rw-r--r--chromium/extensions/common/manifest_handlers/app_isolation_info.cc1
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.cc145
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h62
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons_unittest.cc87
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.cc195
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.h70
-rw-r--r--chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items_unittest.cc135
-rw-r--r--chromium/extensions/common/permissions/api_permission.h1
-rw-r--r--chromium/extensions/common/permissions/base_set_operators.h2
-rw-r--r--chromium/extensions/common/switches.cc7
-rw-r--r--chromium/extensions/common/switches.h3
46 files changed, 638 insertions, 430 deletions
diff --git a/chromium/extensions/common/BUILD.gn b/chromium/extensions/common/BUILD.gn
index 8758250168a..29b9155bcc8 100644
--- a/chromium/extensions/common/BUILD.gn
+++ b/chromium/extensions/common/BUILD.gn
@@ -244,8 +244,8 @@ if (enable_extensions) {
"manifest_handlers/web_accessible_resources_info.h",
"manifest_handlers/web_app_file_handler.cc",
"manifest_handlers/web_app_file_handler.h",
- "manifest_handlers/web_app_linked_shortcut_icons.cc",
- "manifest_handlers/web_app_linked_shortcut_icons.h",
+ "manifest_handlers/web_app_linked_shortcut_items.cc",
+ "manifest_handlers/web_app_linked_shortcut_items.h",
"manifest_handlers/web_app_shortcut_icons_handler.cc",
"manifest_handlers/web_app_shortcut_icons_handler.h",
"manifest_handlers/webview_info.cc",
@@ -451,7 +451,7 @@ if (enable_extensions) {
"manifest_handlers/replacement_apps_unittest.cc",
"manifest_handlers/shared_module_manifest_unittest.cc",
"manifest_handlers/web_app_file_handler_manifest_unittest.cc",
- "manifest_handlers/web_app_linked_shortcut_icons_unittest.cc",
+ "manifest_handlers/web_app_linked_shortcut_items_unittest.cc",
"manifest_handlers/web_app_shortcut_icons_handler_unittest.cc",
"manifest_unittest.cc",
"message_bundle_unittest.cc",
diff --git a/chromium/extensions/common/api/API_OWNERS b/chromium/extensions/common/api/API_OWNERS
index 95791851c0b..79613138af2 100644
--- a/chromium/extensions/common/api/API_OWNERS
+++ b/chromium/extensions/common/api/API_OWNERS
@@ -17,5 +17,4 @@ karandeepb@chromium.org
tbarzic@chromium.org
mukai@chromium.org
xiyuan@chromium.org
-stevenjb@chromium.org
benwells@chromium.org
diff --git a/chromium/extensions/common/api/PRESUBMIT.py b/chromium/extensions/common/api/PRESUBMIT.py
index 5c2df127158..ded0ec9cc23 100644
--- a/chromium/extensions/common/api/PRESUBMIT.py
+++ b/chromium/extensions/common/api/PRESUBMIT.py
@@ -13,38 +13,13 @@ import sys
def _CheckExterns(input_api, output_api):
original_sys_path = sys.path
-
try:
sys.path.append(input_api.PresubmitLocalPath())
from externs_checker import ExternsChecker
finally:
sys.path = original_sys_path
- join = input_api.os_path.join
- api_root = input_api.PresubmitLocalPath()
- externs_root = input_api.os_path.abspath(join(
- api_root, '..', '..', '..', 'third_party', 'closure_compiler', 'externs'))
-
- api_pairs = {
- join(api_root, 'audio.idl'): join(externs_root, 'audio.js'),
- join(api_root, 'automation.idl'): join(externs_root, 'automation.js'),
- join(api_root, 'bluetooth.idl'): join(externs_root, 'bluetooth.js'),
- join(api_root, 'bluetooth_private.idl'):
- join(externs_root, 'bluetooth_private.js'),
- join(api_root, 'clipboard.idl'): join(externs_root, 'clipboard.js'),
- join(api_root, 'management.json'): join(externs_root, 'management.js'),
- join(api_root, 'metrics_private.json'):
- join(externs_root, 'metrics_private.js'),
- join(api_root, 'mime_handler_private.idl'):
- join(externs_root, 'mime_handler_private.js'),
- join(api_root, 'networking_private.idl'):
- join(externs_root, 'networking_private.js'),
- join(api_root, 'system_display.idl'):
- join(externs_root, 'system_display.js'),
- # TODO(rdevlin.cronin): Add more!
- }
-
- return ExternsChecker(input_api, output_api, api_pairs).RunChecks()
+ return ExternsChecker(input_api, output_api).RunChecks()
def CheckChangeOnUpload(input_api, output_api):
diff --git a/chromium/extensions/common/api/_api_features.json b/chromium/extensions/common/api/_api_features.json
index 9cc9ff8bf54..95c06c0ac92 100644
--- a/chromium/extensions/common/api/_api_features.json
+++ b/chromium/extensions/common/api/_api_features.json
@@ -217,7 +217,6 @@
"matches": [
"chrome://add-supervision/*",
"chrome://assistant-optin/*",
- "chrome://cast/*",
"chrome://cellular-setup/*",
"chrome://discards/*",
"chrome://extensions/*",
@@ -498,7 +497,7 @@
"content_script"
]
},
- "runtime.sendMessage": {
+ "runtime.sendMessage": [{
// Everything except WebUI.
"contexts": [
"blessed_web_page",
@@ -509,7 +508,12 @@
"web_page"
],
"matches": ["<all_urls>"]
- },
+ },{
+ "contexts": ["webui"],
+ "matches": [
+ "chrome://password-change/*"
+ ]
+ }],
"runtime.sendNativeMessage": {
"dependencies": ["permission:nativeMessaging"],
"contexts": ["blessed_extension"]
diff --git a/chromium/extensions/common/api/_behavior_features.json b/chromium/extensions/common/api/_behavior_features.json
index aacb10e7e9a..de9b8486065 100644
--- a/chromium/extensions/common/api/_behavior_features.json
+++ b/chromium/extensions/common/api/_behavior_features.json
@@ -29,17 +29,15 @@
"session_types": ["kiosk"]
},
"signin_screen": [ {
- "blacklist": [
- // https://crbug.com/626342
- "9E527CDA9D7C50844E8A5DB964A54A640AE48F98" // Chrome remote desktop
- ],
- // Allow developers to test new features.
- "channel": "dev",
+ "channel": "canary",
"component_extensions_auto_granted": false,
- "extension_types": ["platform_app"],
- "location": "policy",
- "platforms": ["chromeos"]
- }, {
+ "platforms": ["chromeos"],
+ "location": "unpacked",
+ "whitelist": [
+ "05D1DBD6E8B9C4690FFA7D50E6F60C5290DC662A" // crbug.com/941107
+ ]
+ },
+ {
// Strict restrictions for stable channel.
// For now only whitelisted apps.
"channel": "stable",
@@ -121,5 +119,33 @@
"allow_secondary_kiosk_app_enabled_on_launch": {
"channel": "dev",
"extension_types": ["platform_app"]
+ },
+ // Allowlist KeyPermissions for login screen extensions that cannot set the
+ // user policy (they don't have a user yet).
+ "key_permissions_in_login_screen": {
+ "channel": "stable",
+ "extension_types": ["login_screen_extension"],
+ "location": "policy",
+ "platforms": ["chromeos"],
+ "whitelist": [
+ // The Imprivata login extension should be able to sign more than once,
+ // see crbug.com/1073466. In it's authorization protocol, Imprivata needs
+ // to sign data in order to authorize requests to the server. We cannot
+ // apply the KeyPermissions policy to the Imprivata login screen since
+ // it's a User Policy, but we do need to be able to sign data on the login
+ // screen.
+ "E219EE36A3B40612FD2A8CD6937B03EF0C97D3FE", // Imprivata (login screen) crbug.com/1065112
+ "4DBFC1C52D6660DD90791976DF7FEF7B3D360509", // Imprivata (login screen) crbug.com/1065112
+ "CDA6A10BE50CE65C59B766D0CE6A27E8E0A1533F", // Imprivata (login screen) crbug.com/1065112
+ "D85454743B32D9F5ABF3E5F18DF78809F3A0ABD4", // Imprivata (login screen) crbug.com/1065112
+ "04569B963251EB28C0906099668D98EE65ECA2D8", // Imprivata (login screen) crbug.com/1065112
+ "7BF5B69C3ACA9E6ACA5C480661B8073EB9FA32A9", // Imprivata (login screen) crbug.com/1065112
+ "5F2EF8E9F7E975090278D6A0AD039860430C5684", // Imprivata (login screen) crbug.com/1065112
+ "97A4DC8AFC1FCF665C71B624A55675C297AB256C", // Imprivata (login screen) crbug.com/1065112
+ "A00EB72B456C374F1EA86C09833C7DBB6CD95CAE", // Imprivata (login screen) crbug.com/1065112
+ "51DDBADA37EF4D25AD03CB1BB6451799456FE183", // Imprivata (login screen) crbug.com/1065112
+ "DD97CAE4D8658003658140109BC119188A19A5B8", // Imprivata (login screen) crbug.com/1065112
+ "320857126E2180A5751AA384B7B7332A4964BD8C" // Imprivata (login screen) crbug.com/1065112
+ ]
}
}
diff --git a/chromium/extensions/common/api/_manifest_features.json b/chromium/extensions/common/api/_manifest_features.json
index 425ec6a0cf0..4b7376a0734 100644
--- a/chromium/extensions/common/api/_manifest_features.json
+++ b/chromium/extensions/common/api/_manifest_features.json
@@ -363,10 +363,10 @@
"channel": "stable",
"extension_types": ["hosted_app"]
},
- // TODO(https://crbug.com/1065748): Remove web_app_linked_shortcut_icons and
+ // TODO(https://crbug.com/1065748): Remove web_app_linked_shortcut_items and
// web_app_shortcut_icons keys once we've transitioned PWAs from the current
// Extensions based representation to WebApp based representation.
- "web_app_linked_shortcut_icons" : {
+ "web_app_linked_shortcut_items" : {
"channel": "stable",
"extension_types": ["hosted_app"]
},
diff --git a/chromium/extensions/common/api/_permission_features.json b/chromium/extensions/common/api/_permission_features.json
index 1391e798dce..2623a401ba3 100644
--- a/chromium/extensions/common/api/_permission_features.json
+++ b/chromium/extensions/common/api/_permission_features.json
@@ -290,8 +290,10 @@
"BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/407693
"4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/407693
"81986D4F846CEDDDB962643FA501D1780DD441BB", // http://crbug.com/407693
- "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7" // http://crbug.com/839189
- ]
+ "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7", // http://crbug.com/839189
+ "D7986543275120831B39EF28D1327552FC343960", // http://crbug.com/1103025
+ "A291B26E088FA6BA53FFD72F0916F06EBA7C585A" // http://crbug.com/1103025
+ ]
},
"fileSystem": [{
"channel": "stable",
@@ -477,12 +479,7 @@
"session_types": ["kiosk.autolaunched"]
}, {
"channel": "stable",
- "extension_types": [
- "extension",
- "legacy_packaged_app",
- "platform_app",
- "login_screen_extension"
- ],
+ "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
"platforms": ["chromeos", "mac", "win", "linux"],
"whitelist": [
"0DE0F05680A4A056BCEC864ED8DDA84296F82B40", // http://crbug.com/434651
@@ -509,14 +506,10 @@
"6FB7E1B6C0247B687AC14772E87A117F5F5E4497", // http://crbug.com/731941
"9834387FDA1F66A1B5CA06CB442137B556F12F2A", // http://crbug.com/772346
"A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7", // http://crbug.com/839189
- // TODO(crbug.com/1075877, hendrich) remove this when
- // enterprise.networkingAttributes has landed
- "E219EE36A3B40612FD2A8CD6937B03EF0C97D3FE", // Imprivata (login screen) crbug.com/1075877
- "4DBFC1C52D6660DD90791976DF7FEF7B3D360509", // Imprivata (login screen) crbug.com/1075877
- "CDA6A10BE50CE65C59B766D0CE6A27E8E0A1533F", // Imprivata (login screen) crbug.com/1075877
- "A24DE1B21A67E25FB62AC8491642038FE25DA75B", // Imprivata (in-session) crbug.com/1075877
- "6B25164FFE2BADB5F1DBBD301CC022170267022D", // Imprivata (in-session) crbug.com/1075877
- "4D15F9AFCF54E56F0A6E06D22DD15F133DCF0882" // Imprivata (in-session) crbug.com/1075877
+ "F2BCE012B9B7E2D57902B5A4F954EB01A7E548FD", // http://crbug.com/1105137
+ "D467F51D3846ED6D137F9FD403AE11CE416CD995", // http://crbug.com/1105137
+ "3823525AD445E0025E449F964C20922996B0F97F", // http://crbug.com/1105137
+ "827B5D482FADCE120F4694AD0FA0680E3717C6EC" // http://crbug.com/1105137
]
}],
"networkingPrivate": {
diff --git a/chromium/extensions/common/api/automation.idl b/chromium/extensions/common/api/automation.idl
index bcfe507e5cc..ca0a93a3bc1 100644
--- a/chromium/extensions/common/api/automation.idl
+++ b/chromium/extensions/common/api/automation.idl
@@ -46,7 +46,6 @@
menuListItemSelected,
menuListValueChanged,
menuPopupEnd,
- menuPopupHide,
menuPopupStart,
menuStart,
mouseCanceled,
diff --git a/chromium/extensions/common/api/declarative_net_request.idl b/chromium/extensions/common/api/declarative_net_request.idl
index 9edc8568eda..fd25367568f 100644
--- a/chromium/extensions/common/api/declarative_net_request.idl
+++ b/chromium/extensions/common/api/declarative_net_request.idl
@@ -37,6 +37,10 @@ namespace declarativeNetRequest {
// TODO(crbug.com/947591): Add documentation once implementation is complete.
[nodoc]
enum HeaderOperation {
+ // Adds a new entry for the specified header. This operation is not
+ // supported for request headers.
+ append,
+ set,
remove
};
@@ -88,6 +92,7 @@ namespace declarativeNetRequest {
};
// Describes modification to various url components.
+ [noinline_doc]
dictionary URLTransform {
// The new scheme for the request. Allowed values are "http", "https",
// "ftp" and "chrome-extension".
@@ -136,6 +141,7 @@ namespace declarativeNetRequest {
DOMString? regexSubstitution;
};
+ [noinline_doc]
dictionary RuleCondition {
// The pattern which is matched against the network request url.
@@ -232,8 +238,10 @@ namespace declarativeNetRequest {
dictionary ModifyHeaderInfo {
DOMString header;
HeaderOperation operation;
+ DOMString? value;
};
+ [noinline_doc]
dictionary RuleAction {
// The type of action to perform.
RuleActionType type;
@@ -283,6 +291,7 @@ namespace declarativeNetRequest {
DOMString rulesetId;
};
+ [noinline_doc]
dictionary MatchedRuleInfo {
MatchedRule rule;
@@ -309,6 +318,7 @@ namespace declarativeNetRequest {
MatchedRuleInfo[] rulesMatchedInfo;
};
+ [noinline_doc]
dictionary RequestDetails {
// The ID of the request. Request IDs are unique within a browser session.
DOMString requestId;
@@ -470,8 +480,8 @@ namespace declarativeNetRequest {
// Fired when a rule is matched with a request. Only available for unpacked
// extensions with the <code>declarativeNetRequestFeedback</code> permission
// as this is intended to be used for debugging purposes only.
- // |matched_rule_info|: The rule that has been matched along with
- // information about the associated request.
- static void onRuleMatchedDebug(MatchedRuleInfoDebug matched_rule_info);
+ // |info|: The rule that has been matched along with information about the
+ // associated request.
+ static void onRuleMatchedDebug(MatchedRuleInfoDebug info);
};
};
diff --git a/chromium/extensions/common/api/declarative_net_request/constants.cc b/chromium/extensions/common/api/declarative_net_request/constants.cc
index 6ded009261f..232659080f1 100644
--- a/chromium/extensions/common/api/declarative_net_request/constants.cc
+++ b/chromium/extensions/common/api/declarative_net_request/constants.cc
@@ -57,6 +57,7 @@ const char kRequestHeadersPath[] = "action.requestHeaders";
const char kResponseHeadersPath[] = "action.responseHeaders";
const char kHeaderNameKey[] = "header";
const char kHeaderOperationKey[] = "operation";
+const char kHeaderValueKey[] = "value";
} // namespace declarative_net_request
} // namespace extensions
diff --git a/chromium/extensions/common/api/declarative_net_request/constants.h b/chromium/extensions/common/api/declarative_net_request/constants.h
index 85a12631fb3..bd11880cbb0 100644
--- a/chromium/extensions/common/api/declarative_net_request/constants.h
+++ b/chromium/extensions/common/api/declarative_net_request/constants.h
@@ -79,6 +79,7 @@ extern const char kRequestHeadersPath[];
extern const char kResponseHeadersPath[];
extern const char kHeaderNameKey[];
extern const char kHeaderOperationKey[];
+extern const char kHeaderValueKey[];
} // namespace declarative_net_request
} // namespace extensions
diff --git a/chromium/extensions/common/api/declarative_net_request/dnr_manifest_handler.cc b/chromium/extensions/common/api/declarative_net_request/dnr_manifest_handler.cc
index bd665f9891d..a4876bcb162 100644
--- a/chromium/extensions/common/api/declarative_net_request/dnr_manifest_handler.cc
+++ b/chromium/extensions/common/api/declarative_net_request/dnr_manifest_handler.cc
@@ -28,19 +28,6 @@ namespace dnr_api = api::declarative_net_request;
namespace declarative_net_request {
-namespace {
-
-bool IsEmptyExtensionResource(const ExtensionResource& resource) {
- // Note that just checking for ExtensionResource::empty() isn't correct since
- // it checks |ExtensionResource::extension_root()::empty()| which can return
- // true for a dummy extension created as part of the webstore installation
- // flow. See crbug.com/1087348.
- return resource.extension_id().empty() && resource.extension_root().empty() &&
- resource.relative_path().empty();
-}
-
-} // namespace
-
DNRManifestHandler::DNRManifestHandler() = default;
DNRManifestHandler::~DNRManifestHandler() = default;
@@ -96,8 +83,7 @@ bool DNRManifestHandler::Parse(Extension* extension, base::string16* error) {
int index, DNRManifestData::RulesetInfo* info) {
// Path validation.
ExtensionResource resource = extension->GetResource(rulesets[index].path);
- if (IsEmptyExtensionResource(resource) ||
- resource.relative_path().ReferencesParent()) {
+ if (resource.empty() || resource.relative_path().ReferencesParent()) {
*error = ErrorUtils::FormatErrorMessageUTF16(
errors::kRulesFileIsInvalid, keys::kDeclarativeNetRequestKey,
keys::kDeclarativeRuleResourcesKey, rulesets[index].path);
diff --git a/chromium/extensions/common/api/declarative_net_request/test_utils.cc b/chromium/extensions/common/api/declarative_net_request/test_utils.cc
index ad0382daa0f..c5a54e160e5 100644
--- a/chromium/extensions/common/api/declarative_net_request/test_utils.cc
+++ b/chromium/extensions/common/api/declarative_net_request/test_utils.cc
@@ -147,8 +147,12 @@ std::unique_ptr<base::DictionaryValue> TestRuleRedirect::ToValue() const {
return dict;
}
-TestHeaderInfo::TestHeaderInfo(std::string header, std::string operation)
- : header(std::move(header)), operation(std::move(operation)) {}
+TestHeaderInfo::TestHeaderInfo(std::string header,
+ std::string operation,
+ base::Optional<std::string> value)
+ : header(std::move(header)),
+ operation(std::move(operation)),
+ value(std::move(value)) {}
TestHeaderInfo::~TestHeaderInfo() = default;
TestHeaderInfo::TestHeaderInfo(const TestHeaderInfo&) = default;
TestHeaderInfo& TestHeaderInfo::operator=(const TestHeaderInfo&) = default;
@@ -157,6 +161,7 @@ std::unique_ptr<base::DictionaryValue> TestHeaderInfo::ToValue() const {
auto dict = std::make_unique<base::DictionaryValue>();
SetValue(dict.get(), kHeaderNameKey, header);
SetValue(dict.get(), kHeaderOperationKey, operation);
+ SetValue(dict.get(), kHeaderValueKey, value);
return dict;
}
diff --git a/chromium/extensions/common/api/declarative_net_request/test_utils.h b/chromium/extensions/common/api/declarative_net_request/test_utils.h
index cd3200cd0b2..50e9253e12b 100644
--- a/chromium/extensions/common/api/declarative_net_request/test_utils.h
+++ b/chromium/extensions/common/api/declarative_net_request/test_utils.h
@@ -107,13 +107,16 @@ struct TestRuleRedirect : public DictionarySource {
};
struct TestHeaderInfo : public DictionarySource {
- TestHeaderInfo(std::string header, std::string operation);
+ TestHeaderInfo(std::string header,
+ std::string operation,
+ base::Optional<std::string> value);
~TestHeaderInfo() override;
TestHeaderInfo(const TestHeaderInfo&);
TestHeaderInfo& operator=(const TestHeaderInfo&);
base::Optional<std::string> header;
base::Optional<std::string> operation;
+ base::Optional<std::string> value;
std::unique_ptr<base::DictionaryValue> ToValue() const override;
};
diff --git a/chromium/extensions/common/api/externs_checker.py b/chromium/extensions/common/api/externs_checker.py
index 74906bd4883..09a97bb108a 100644
--- a/chromium/extensions/common/api/externs_checker.py
+++ b/chromium/extensions/common/api/externs_checker.py
@@ -7,7 +7,10 @@ class ExternsChecker(object):
src/ $ python tools/json_schema_compiler/compiler.py\
%s --root=. --generator=externs > %s"""
- def __init__(self, input_api, output_api, api_pairs):
+ def __init__(self, input_api, output_api, api_pairs=None, api_root=None):
+ if api_pairs is None:
+ api_pairs = self.ParseApiFileList(input_api, api_root=api_root)
+
self._input_api = input_api
self._output_api = output_api
self._api_pairs = api_pairs
@@ -16,6 +19,31 @@ class ExternsChecker(object):
if not input_api.os_path.exists(path):
raise OSError('Path Not Found: %s' % path)
+ @staticmethod
+ def ParseApiFileList(input_api, api_root=None):
+ """Extract the API pairs from the registered list."""
+ if api_root is None:
+ api_root = input_api.PresubmitLocalPath()
+ externs_root = input_api.os_path.join(
+ input_api.change.RepositoryRoot(), 'third_party', 'closure_compiler',
+ 'externs')
+
+ ret = {}
+ listing = input_api.os_path.join(api_root, 'generated_externs_list.txt')
+ for line in input_api.ReadFile(listing).splitlines():
+ # Skip blank & comment lines.
+ if not line.split('#', 1)[0].strip():
+ continue
+
+ source = input_api.os_path.join(api_root, line)
+ api_name, ext = line.rsplit('.', 1)
+ assert ext == 'json' or ext == 'idl'
+ externs = input_api.os_path.join(externs_root, api_name + '.js')
+ ret[source] = externs
+
+ assert ret
+ return ret
+
def RunChecks(self):
bad_files = []
affected = [f.AbsoluteLocalPath() for f in
diff --git a/chromium/extensions/common/api/generated_externs_list.txt b/chromium/extensions/common/api/generated_externs_list.txt
new file mode 100644
index 00000000000..e035738dc72
--- /dev/null
+++ b/chromium/extensions/common/api/generated_externs_list.txt
@@ -0,0 +1,12 @@
+# APIs that have their externs generated.
+# TODO(rdevlin.cronin): Add more!
+audio.idl
+automation.idl
+bluetooth.idl
+bluetooth_private.idl
+clipboard.idl
+management.json
+metrics_private.json
+mime_handler_private.idl
+networking_private.idl
+system_display.idl
diff --git a/chromium/extensions/common/api/networking_onc.idl b/chromium/extensions/common/api/networking_onc.idl
index a6071c99bcb..85691350559 100644
--- a/chromium/extensions/common/api/networking_onc.idl
+++ b/chromium/extensions/common/api/networking_onc.idl
@@ -706,6 +706,8 @@ namespace networking.onc {
IPConfigProperties[]? IPConfigs;
// The network's MAC address.
DOMString? MacAddress;
+ // Whether the network is metered.
+ boolean? Metered;
// A user friendly network name.
DOMString? Name;
// The IP configuration type for the name servers used by the network.
@@ -762,6 +764,8 @@ namespace networking.onc {
IPConfigProperties[]? IPConfigs;
// See $(ref:NetworkProperties.MacAddress).
DOMString? MacAddress;
+ // See $(ref:NetworkProperties.Metered).
+ ManagedBoolean? Metered;
// See $(ref:NetworkProperties.Name).
ManagedDOMString? Name;
// See $(ref:NetworkProperties.NameServersConfigType).
diff --git a/chromium/extensions/common/api/networking_private.idl b/chromium/extensions/common/api/networking_private.idl
index ec5efed3bde..ddedf0e4218 100644
--- a/chromium/extensions/common/api/networking_private.idl
+++ b/chromium/extensions/common/api/networking_private.idl
@@ -711,6 +711,7 @@ namespace networkingPrivate {
IPConfigType? IPAddressConfigType;
IPConfigProperties[]? IPConfigs;
DOMString? MacAddress;
+ boolean? Metered;
DOMString? Name;
IPConfigType? NameServersConfigType;
long? Priority;
@@ -739,6 +740,7 @@ namespace networkingPrivate {
ManagedIPConfigType? IPAddressConfigType;
IPConfigProperties[]? IPConfigs;
DOMString? MacAddress;
+ ManagedBoolean? Metered;
ManagedDOMString? Name;
ManagedIPConfigType? NameServersConfigType;
ManagedLong? Priority;
diff --git a/chromium/extensions/common/common_manifest_handlers.cc b/chromium/extensions/common/common_manifest_handlers.cc
index 432cfeec250..e1416e2faa0 100644
--- a/chromium/extensions/common/common_manifest_handlers.cc
+++ b/chromium/extensions/common/common_manifest_handlers.cc
@@ -33,7 +33,7 @@
#include "extensions/common/manifest_handlers/shared_module_info.h"
#include "extensions/common/manifest_handlers/web_accessible_resources_info.h"
#include "extensions/common/manifest_handlers/web_app_file_handler.h"
-#include "extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h"
+#include "extensions/common/manifest_handlers/web_app_linked_shortcut_items.h"
#include "extensions/common/manifest_handlers/web_app_shortcut_icons_handler.h"
#include "extensions/common/manifest_handlers/webview_info.h"
#include "extensions/common/manifest_url_handlers.h"
@@ -82,7 +82,7 @@ void RegisterCommonManifestHandlers() {
registry->RegisterHandler(std::make_unique<WebAccessibleResourcesHandler>());
registry->RegisterHandler(std::make_unique<WebAppFileHandlersParser>());
registry->RegisterHandler(
- std::make_unique<WebAppLinkedShortcutIconsHandler>());
+ std::make_unique<WebAppLinkedShortcutItemsHandler>());
registry->RegisterHandler(std::make_unique<WebAppShortcutIconsHandler>());
registry->RegisterHandler(std::make_unique<WebviewHandler>());
}
diff --git a/chromium/extensions/common/constants.cc b/chromium/extensions/common/constants.cc
index d698704e7cd..b83cd47e002 100644
--- a/chromium/extensions/common/constants.cc
+++ b/chromium/extensions/common/constants.cc
@@ -124,7 +124,9 @@ const char kLacrosAppId[] = "jaimifaeiicidiikhmjedcgdimealfbh";
const char kFilesManagerAppId[] = "hhaomjibdihmijegdhdafkllkbggdgoj";
const char kCalculatorAppId[] = "joodangkbfjnajiiifokapkpmhfnpleo";
const char kCalendarDemoAppId[] = "fpgfohogebplgnamlafljlcidjedbdeb";
+const char kGMailAppId[] = "pjkljhegncpnkpknbcohdijeoejaedia";
const char kGoogleDocsDemoAppId[] = "chdaoodbokekbiiphekbfjdmiodccljl";
+const char kGoogleDriveAppId[] = "apdfllckaahabafndbhieahigkjlhalf";
const char kGoogleSheetsDemoAppId[] = "nifkmgcdokhkjghdlgflonppnefddien";
const char kGoogleSlidesDemoAppId[] = "hdmobeajeoanbanmdlabnbnlopepchip";
const char kGoogleKeepAppId[] = "hmjkmjkepdijhoojdojkdfohbdgmmhki";
@@ -142,6 +144,7 @@ const char kScreensaverEveAppId[] = "gdobaoeekhiklaljmhladjfdfkigampc";
const char kScreensaverNocturneAppId[] = "lminefdanffajachfahfpmphfkhahcnj";
const char kScreensaverAtlasAppId[] = "bnabjkecnachpogjlfilfcnlpcmacglh";
const char kScreensaverKukuiAppId[] = "fafhbhdboeiciklpkminlncemohljlkj";
+const char kSigninProfileTestExtensionId[] = "mecfefiddjlmabpeilblgegnbioikfmp";
bool IsSystemUIApp(base::StringPiece extension_id) {
static const char* const kApps[] = {
@@ -187,4 +190,7 @@ const int kContentVerificationDefaultBlockSize = 4096;
const logging::LogSeverity kMinimumSeverityToReportError = logging::LOG_WARNING;
+const char kCastExtensionIdRelease[] = "pkedcjkdefgpdelpbcmbmeomcjbeemfm";
+const char kCastExtensionIdDev[] = "enhhojjnijigcajfphajepfemndkmdlo";
+
} // namespace extension_misc
diff --git a/chromium/extensions/common/constants.h b/chromium/extensions/common/constants.h
index 08ca81734b4..747906a062f 100644
--- a/chromium/extensions/common/constants.h
+++ b/chromium/extensions/common/constants.h
@@ -6,7 +6,6 @@
#define EXTENSIONS_COMMON_CONSTANTS_H_
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/strings/string_piece_forward.h"
#include "components/services/app_service/public/mojom/types.mojom.h"
#include "components/version_info/channel.h"
@@ -216,9 +215,15 @@ extern const char kCalculatorAppId[];
// The extension id of the demo Calendar application.
extern const char kCalendarDemoAppId[];
+// The extension id of the GMail application.
+extern const char kGMailAppId[];
+
// The extension id of the demo Google Docs application.
extern const char kGoogleDocsDemoAppId[];
+// The extension id of the Google Drive application.
+extern const char kGoogleDriveAppId[];
+
// The extension id of the demo Google Sheets application.
extern const char kGoogleSheetsDemoAppId[];
@@ -262,6 +267,9 @@ extern const char kScreensaverAtlasAppId[];
// The extension id of the kukui Demo Mode screensaver app.
extern const char kScreensaverKukuiAppId[];
+// The id of the testing extension allowed in the signin profile.
+extern const char kSigninProfileTestExtensionId[];
+
// Returns true if this app is part of the "system UI". Generally this is UI
// that that on other operating systems would be considered part of the OS,
// for example the file manager.
@@ -287,6 +295,10 @@ extern const logging::LogSeverity kMinimumSeverityToReportError;
constexpr version_info::Channel kMinChannelForServiceWorkerBasedExtension =
version_info::Channel::DEV;
+// IDs for the Media Router Component Extension.
+extern const char kCastExtensionIdRelease[];
+extern const char kCastExtensionIdDev[];
+
} // namespace extension_misc
#endif // EXTENSIONS_COMMON_CONSTANTS_H_
diff --git a/chromium/extensions/common/event_filter.cc b/chromium/extensions/common/event_filter.cc
index 2b31915603c..0a493530170 100644
--- a/chromium/extensions/common/event_filter.cc
+++ b/chromium/extensions/common/event_filter.cc
@@ -7,6 +7,7 @@
#include <string>
#include <utility>
+#include "base/logging.h"
#include "components/url_matcher/url_matcher_factory.h"
#include "ipc/ipc_message.h"
diff --git a/chromium/extensions/common/extension_features.cc b/chromium/extensions/common/extension_features.cc
index 05d5d73d437..5b25e5b92fc 100644
--- a/chromium/extensions/common/extension_features.cc
+++ b/chromium/extensions/common/extension_features.cc
@@ -43,4 +43,8 @@ const base::Feature kAllowWithholdingExtensionPermissionsOnInstall{
"AllowWithholdingExtensionPermissionsOnInstall",
base::FEATURE_DISABLED_BY_DEFAULT};
+// Reports Extensions.WebRequest.KeepaliveRequestFinished when enabled.
+const base::Feature kReportKeepaliveUkm{"ReportKeepaliveUkm",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+
} // namespace extensions_features
diff --git a/chromium/extensions/common/extension_features.h b/chromium/extensions/common/extension_features.h
index c94fef4a707..8b80c3b3d64 100644
--- a/chromium/extensions/common/extension_features.h
+++ b/chromium/extensions/common/extension_features.h
@@ -25,6 +25,8 @@ extern const base::Feature kForceWebRequestProxyForTest;
extern const base::Feature kAllowWithholdingExtensionPermissionsOnInstall;
+extern const base::Feature kReportKeepaliveUkm;
+
} // namespace extensions_features
#endif // EXTENSIONS_COMMON_EXTENSION_FEATURES_H_
diff --git a/chromium/extensions/common/extension_l10n_util_unittest.cc b/chromium/extensions/common/extension_l10n_util_unittest.cc
index 41bdf7fa135..debef722da6 100644
--- a/chromium/extensions/common/extension_l10n_util_unittest.cc
+++ b/chromium/extensions/common/extension_l10n_util_unittest.cc
@@ -178,11 +178,11 @@ TEST(ExtensionL10nUtil, LoadMessageCatalogsBadJSONFormat) {
std::string error;
EXPECT_FALSE(extension_l10n_util::LoadMessageCatalogs(
src_path, "en_US", GzippedMessagesPermission::kDisallow, &error));
- EXPECT_EQ(ErrorUtils::FormatErrorMessage(
+ EXPECT_NE(std::string::npos,
+ error.find(ErrorUtils::FormatErrorMessage(
errors::kLocalesInvalidLocale,
base::UTF16ToUTF8(messages_file.LossyDisplayName()),
- "Line: 1, column: 10, Unexpected token."),
- error);
+ "Line: 1, column: 10,")));
}
TEST(ExtensionL10nUtil, LoadMessageCatalogsDuplicateKeys) {
diff --git a/chromium/extensions/common/extension_resource.h b/chromium/extensions/common/extension_resource.h
index 43281cc87cb..1ed42a1788a 100644
--- a/chromium/extensions/common/extension_resource.h
+++ b/chromium/extensions/common/extension_resource.h
@@ -11,10 +11,11 @@
namespace extensions {
-// Represents a resource inside an extension. For example, an image, or a
-// JavaScript file. This is more complicated than just a simple FilePath
-// because extension resources can come from multiple physical file locations
-// depending on locale.
+// Represents a resource inside an extension. Hence a resource pointing to the
+// root extension directory isn't a valid ExtensionResource.
+// Examples include an image, or a JavaScript file. This is more complicated
+// than just a simple FilePath because extension resources can come from
+// multiple physical file locations depending on locale.
class ExtensionResource {
public:
// SymlinkPolicy decides whether we'll allow resources to be a symlink to
@@ -58,10 +59,14 @@ class ExtensionResource {
// Getters
const std::string& extension_id() const { return extension_id_; }
+
+ // Note that this might be empty for a valid ExtensionResource since dummy
+ // Extension objects may be created with an empty extension root path in code.
const base::FilePath& extension_root() const { return extension_root_; }
+
const base::FilePath& relative_path() const { return relative_path_; }
- bool empty() const { return extension_root().empty(); }
+ bool empty() const { return relative_path().empty(); }
// Unit test helpers.
base::FilePath::StringType NormalizeSeperators(
diff --git a/chromium/extensions/common/features/behavior_feature.cc b/chromium/extensions/common/features/behavior_feature.cc
index 3aa34f46376..472638b3bf7 100644
--- a/chromium/extensions/common/features/behavior_feature.cc
+++ b/chromium/extensions/common/features/behavior_feature.cc
@@ -22,6 +22,8 @@ const char kAllowDeprecatedAudioApi[] = "allow_deprecated_audio_api";
const char kAllowSecondaryKioskAppEnabledOnLaunch[] =
"allow_secondary_kiosk_app_enabled_on_launch";
+const char kKeyPermissionsInLoginScreen[] = "key_permissions_in_login_screen";
+
} // namespace behavior_feature
} // namespace extensions
diff --git a/chromium/extensions/common/features/behavior_feature.h b/chromium/extensions/common/features/behavior_feature.h
index 89ab9ebfbc0..150638888b2 100644
--- a/chromium/extensions/common/features/behavior_feature.h
+++ b/chromium/extensions/common/features/behavior_feature.h
@@ -17,6 +17,7 @@ extern const char kAllowUsbDevicesPermissionInterfaceClass[];
extern const char kSigninScreen[];
extern const char kAllowDeprecatedAudioApi[];
extern const char kAllowSecondaryKioskAppEnabledOnLaunch[];
+extern const char kKeyPermissionsInLoginScreen[];
} // namespace behavior_feature
diff --git a/chromium/extensions/common/features/feature_flags.cc b/chromium/extensions/common/features/feature_flags.cc
index 5b63764e4c1..7efa308dbec 100644
--- a/chromium/extensions/common/features/feature_flags.cc
+++ b/chromium/extensions/common/features/feature_flags.cc
@@ -19,7 +19,7 @@ namespace {
constexpr base::Feature kFeatureFlags[] = {
{"DeclarativeNetRequest", base::FEATURE_ENABLED_BY_DEFAULT}};
-const std::vector<const base::Feature>* g_feature_flags_test_override = nullptr;
+const std::vector<base::Feature>* g_feature_flags_test_override = nullptr;
template <typename T>
const base::Feature* GetFeature(T begin,
@@ -52,8 +52,8 @@ bool IsFeatureFlagEnabled(const std::string& feature_flag) {
}
ScopedFeatureFlagsOverride CreateScopedFeatureFlagsOverrideForTesting(
- const std::vector<const base::Feature>* features) {
- return base::AutoReset<const std::vector<const base::Feature>*>(
+ const std::vector<base::Feature>* features) {
+ return base::AutoReset<const std::vector<base::Feature>*>(
&g_feature_flags_test_override, features);
}
diff --git a/chromium/extensions/common/features/feature_flags.h b/chromium/extensions/common/features/feature_flags.h
index d1a5dd3720b..b57740b25cf 100644
--- a/chromium/extensions/common/features/feature_flags.h
+++ b/chromium/extensions/common/features/feature_flags.h
@@ -25,9 +25,9 @@ bool IsFeatureFlagEnabled(const std::string& feature_flag);
// in scope. Clients must ensure that |features| remains alive (non-dangling)
// while the returned value is in scope.
using ScopedFeatureFlagsOverride =
- base::AutoReset<const std::vector<const base::Feature>*>;
+ base::AutoReset<const std::vector<base::Feature>*>;
ScopedFeatureFlagsOverride CreateScopedFeatureFlagsOverrideForTesting(
- const std::vector<const base::Feature>* features);
+ const std::vector<base::Feature>* features);
} // namespace extensions
diff --git a/chromium/extensions/common/features/simple_feature_unittest.cc b/chromium/extensions/common/features/simple_feature_unittest.cc
index 8d9e0ad3153..659d4ef7c90 100644
--- a/chromium/extensions/common/features/simple_feature_unittest.cc
+++ b/chromium/extensions/common/features/simple_feature_unittest.cc
@@ -718,7 +718,7 @@ TEST_F(SimpleFeatureTest, CommandLineSwitch) {
}
TEST_F(SimpleFeatureTest, FeatureFlags) {
- const std::vector<const base::Feature> features(
+ const std::vector<base::Feature> features(
{{"stub_feature_1", base::FEATURE_ENABLED_BY_DEFAULT},
{"stub_feature_2", base::FEATURE_DISABLED_BY_DEFAULT}});
auto scoped_feature_override =
diff --git a/chromium/extensions/common/file_util_unittest.cc b/chromium/extensions/common/file_util_unittest.cc
index 027af59223e..8726a472684 100644
--- a/chromium/extensions/common/file_util_unittest.cc
+++ b/chromium/extensions/common/file_util_unittest.cc
@@ -341,9 +341,9 @@ TEST_F(FileUtilTest, LoadExtensionGivesHelpfullErrorOnBadManifest) {
install_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
ASSERT_TRUE(extension.get() == nullptr);
ASSERT_FALSE(error.empty());
- ASSERT_EQ(manifest_errors::kManifestParseError +
- std::string(" Line: 2, column: 16, Syntax error."),
- error);
+ ASSERT_NE(std::string::npos,
+ error.find(manifest_errors::kManifestParseError +
+ std::string(" Line: 2, column: 16,")));
}
TEST_F(FileUtilTest, ValidateThemeUTF8) {
diff --git a/chromium/extensions/common/manifest.cc b/chromium/extensions/common/manifest.cc
index f350560a78a..f25d96e66c4 100644
--- a/chromium/extensions/common/manifest.cc
+++ b/chromium/extensions/common/manifest.cc
@@ -9,6 +9,7 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
#include "base/strings/string_split.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
diff --git a/chromium/extensions/common/manifest_constants.cc b/chromium/extensions/common/manifest_constants.cc
index e2ad539af77..953978c53c2 100644
--- a/chromium/extensions/common/manifest_constants.cc
+++ b/chromium/extensions/common/manifest_constants.cc
@@ -190,11 +190,12 @@ const char kWebAccessibleResources[] = "web_accessible_resources";
const char kWebAppFileHandlers[] = "web_app_file_handlers";
const char kWebAppFileHandlerAccept[] = "accept";
const char kWebAppFileHandlerAction[] = "action";
-const char kWebAppLinkedShortcutIcons[] = "web_app_linked_shortcut_icons";
-const char kWebAppLinkedShortcutIconSize[] = "size";
-const char kWebAppLinkedShortcutIconURL[] = "url";
-const char kWebAppLinkedShortcutItemIndex[] = "shortcut_item_index";
-const char kWebAppLinkedShortcutItemName[] = "shortcut_item_name";
+const char kWebAppLinkedShortcutItems[] = "web_app_linked_shortcut_items";
+const char kWebAppLinkedShortcutItemIcons[] = "shortcut_item_icons";
+const char kWebAppLinkedShortcutItemIconSize[] = "size";
+const char kWebAppLinkedShortcutItemIconURL[] = "url";
+const char kWebAppLinkedShortcutItemName[] = "name";
+const char kWebAppLinkedShortcutItemURL[] = "url";
const char kWebAppShortcutIcons[] = "web_app_shortcut_icons";
const char kWebURLs[] = "app.urls";
const char kWebview[] = "webview";
@@ -721,24 +722,28 @@ const char kInvalidWebAppFileHandlerFileExtensions[] =
"Invalid value for 'web_app_file_handlers[*].accept[*].file_extensions'.";
const char kInvalidWebAppFileHandlerFileExtension[] =
"Invalid value for web_app_file_handlers[*].accept[*].file_extensions[*]'.";
-const char kInvalidWebAppLinkedShortcutIcon[] =
- "Invalid 'web_app_linked_shortcut_icon'. Must be a dictionary";
-const char kInvalidWebAppLinkedShortcutIcons[] =
- "Invalid 'web_app_linked_shortcut_icons'. Must be an array";
-const char kInvalidWebAppLinkedShortcutIconsNotBookmarkApp[] =
- "The 'web_app_linked_shortcut_icons' manifest key is only supported for "
+const char kInvalidWebAppLinkedShortcutItem[] =
+ "Invalid 'web_app_linked_shortcut_item'. Must be a dictionary";
+const char kInvalidWebAppLinkedShortcutItems[] =
+ "Invalid 'web_app_linked_shortcut_items'. Must be an array";
+const char kInvalidWebAppLinkedShortcutItemsNotBookmarkApp[] =
+ "The 'web_app_linked_shortcut_items' manifest key is only supported for "
"Bookmark Apps.";
-const char kInvalidWebAppLinkedShortcutIconSize[] =
- "Invalid 'size' for 'web_app_linked_shortcut_icon'. Must be an integer";
-const char kInvalidWebAppLinkedShortcutIconURL[] =
- "Invalid 'url' for 'web_app_linked_shortcut_icon'. Must be a string that "
- "is a valid URL";
-const char kInvalidWebAppLinkedShortcutItemIndex[] =
- "Invalid 'shortcut_item_index' for 'web_app_linked_shortcut_icon'. Must be "
- "an integer";
+const char kInvalidWebAppLinkedShortcutItemIcons[] =
+ "Invalid 'shortcut_item_icons'. Must be an array";
+const char kInvalidWebAppLinkedShortcutItemIcon[] =
+ "Invalid 'shortcut_item_icon'. Must be a dictionary";
+const char kInvalidWebAppLinkedShortcutItemIconSize[] =
+ "Invalid 'size' for 'shortcut_item_icon'. Must be an "
+ "integer";
+const char kInvalidWebAppLinkedShortcutItemIconUrl[] =
+ "Invalid 'url' for 'shortcut_item_icon'. Must be a "
+ "string that is a valid URL";
const char kInvalidWebAppLinkedShortcutItemName[] =
- "Invalid 'shortcut_item_name' for 'web_app_linked_shortcut_icon'. Must be "
- "a string.";
+ "Invalid 'name' for 'web_app_linked_shortcut_item'. Must be a string.";
+const char kInvalidWebAppLinkedShortcutItemUrl[] =
+ "Invalid 'url' for 'web_app_linked_shortcut_item'. Must be a string that "
+ "is a valid URL";
const char kInvalidWebAppShortcutItemIcons[] =
"Invalid value for web app shortcut item's icons. Must be a Dictionary.";
const char kInvalidWebAppShortcutIcons[] =
diff --git a/chromium/extensions/common/manifest_constants.h b/chromium/extensions/common/manifest_constants.h
index 1a9031ca359..ebe69de9cd8 100644
--- a/chromium/extensions/common/manifest_constants.h
+++ b/chromium/extensions/common/manifest_constants.h
@@ -191,11 +191,12 @@ extern const char kWebAccessibleResources[];
extern const char kWebAppFileHandlers[];
extern const char kWebAppFileHandlerAccept[];
extern const char kWebAppFileHandlerAction[];
-extern const char kWebAppLinkedShortcutIcons[];
-extern const char kWebAppLinkedShortcutIconSize[];
-extern const char kWebAppLinkedShortcutIconURL[];
-extern const char kWebAppLinkedShortcutItemIndex[];
+extern const char kWebAppLinkedShortcutItems[];
+extern const char kWebAppLinkedShortcutItemIcons[];
+extern const char kWebAppLinkedShortcutItemIconSize[];
+extern const char kWebAppLinkedShortcutItemIconURL[];
extern const char kWebAppLinkedShortcutItemName[];
+extern const char kWebAppLinkedShortcutItemURL[];
extern const char kWebAppShortcutIcons[];
extern const char kWebURLs[];
extern const char kWebview[];
@@ -492,13 +493,15 @@ extern const char kInvalidWebAppFileHandlerAction[];
extern const char kInvalidWebAppFileHandlerEmptyAccept[];
extern const char kInvalidWebAppFileHandlerFileExtensions[];
extern const char kInvalidWebAppFileHandlerFileExtension[];
-extern const char kInvalidWebAppLinkedShortcutIcon[];
-extern const char kInvalidWebAppLinkedShortcutIcons[];
-extern const char kInvalidWebAppLinkedShortcutIconsNotBookmarkApp[];
-extern const char kInvalidWebAppLinkedShortcutIconSize[];
-extern const char kInvalidWebAppLinkedShortcutIconURL[];
-extern const char kInvalidWebAppLinkedShortcutItemIndex[];
+extern const char kInvalidWebAppLinkedShortcutItem[];
+extern const char kInvalidWebAppLinkedShortcutItems[];
+extern const char kInvalidWebAppLinkedShortcutItemsNotBookmarkApp[];
+extern const char kInvalidWebAppLinkedShortcutItemIcon[];
+extern const char kInvalidWebAppLinkedShortcutItemIcons[];
+extern const char kInvalidWebAppLinkedShortcutItemIconSize[];
+extern const char kInvalidWebAppLinkedShortcutItemIconUrl[];
extern const char kInvalidWebAppLinkedShortcutItemName[];
+extern const char kInvalidWebAppLinkedShortcutItemUrl[];
extern const char kInvalidWebAppShortcutItemIcons[];
extern const char kInvalidWebAppShortcutIcons[];
extern const char kInvalidWebAppShortcutIconsNotBookmarkApp[];
diff --git a/chromium/extensions/common/manifest_handlers/app_isolation_info.cc b/chromium/extensions/common/manifest_handlers/app_isolation_info.cc
index dba036aa573..66fb4cad4ea 100644
--- a/chromium/extensions/common/manifest_handlers/app_isolation_info.cc
+++ b/chromium/extensions/common/manifest_handlers/app_isolation_info.cc
@@ -8,6 +8,7 @@
#include <memory>
+#include "base/logging.h"
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.cc b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.cc
deleted file mode 100644
index 8fc3404310a..00000000000
--- a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2020 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.
-
-#include "extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/no_destructor.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/manifest_constants.h"
-
-namespace extensions {
-
-namespace keys = manifest_keys;
-namespace errors = manifest_errors;
-
-namespace {
-
-bool ParseShortcutIconValue(const base::Value& value,
- WebAppLinkedShortcutIcons::ShortcutIconInfo* info,
- base::string16* error) {
- const base::DictionaryValue* shortcut_icon_dict = nullptr;
- if (!value.GetAsDictionary(&shortcut_icon_dict)) {
- *error =
- base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutIcon);
- return false;
- }
-
- std::string url_string;
- if (!shortcut_icon_dict->GetString(keys::kWebAppLinkedShortcutIconURL,
- &url_string)) {
- *error =
- base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutIconURL);
- return false;
- }
-
- info->url = GURL(url_string);
- if (!info->url.is_valid()) {
- *error =
- base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutIconURL);
- return false;
- }
-
- if (!shortcut_icon_dict->GetInteger(keys::kWebAppLinkedShortcutIconSize,
- &info->size)) {
- *error = base::UTF8ToUTF16(
- manifest_errors::kInvalidWebAppLinkedShortcutIconSize);
- return false;
- }
-
- if (!shortcut_icon_dict->GetInteger(keys::kWebAppLinkedShortcutItemIndex,
- &info->shortcut_item_index)) {
- *error = base::UTF8ToUTF16(
- manifest_errors::kInvalidWebAppLinkedShortcutItemIndex);
- return false;
- }
-
- if (!shortcut_icon_dict->GetString(keys::kWebAppLinkedShortcutItemName,
- &info->shortcut_item_name)) {
- *error = base::UTF8ToUTF16(
- manifest_errors::kInvalidWebAppLinkedShortcutItemName);
- return false;
- }
- return true;
-}
-
-} // namespace
-
-WebAppLinkedShortcutIcons::ShortcutIconInfo::ShortcutIconInfo() = default;
-
-WebAppLinkedShortcutIcons::ShortcutIconInfo::~ShortcutIconInfo() = default;
-
-WebAppLinkedShortcutIcons::WebAppLinkedShortcutIcons() = default;
-
-WebAppLinkedShortcutIcons::WebAppLinkedShortcutIcons(
- const WebAppLinkedShortcutIcons& other) = default;
-
-WebAppLinkedShortcutIcons::~WebAppLinkedShortcutIcons() = default;
-
-// static
-const WebAppLinkedShortcutIcons&
-WebAppLinkedShortcutIcons::GetWebAppLinkedShortcutIcons(
- const Extension* extension) {
- WebAppLinkedShortcutIcons* info = static_cast<WebAppLinkedShortcutIcons*>(
- extension->GetManifestData(keys::kWebAppLinkedShortcutIcons));
- if (info)
- return *info;
-
- static base::NoDestructor<WebAppLinkedShortcutIcons>
- empty_web_app_linked_shortcut_icons;
- return *empty_web_app_linked_shortcut_icons;
-}
-
-WebAppLinkedShortcutIconsHandler::WebAppLinkedShortcutIconsHandler() = default;
-
-WebAppLinkedShortcutIconsHandler::~WebAppLinkedShortcutIconsHandler() = default;
-
-bool WebAppLinkedShortcutIconsHandler::Parse(Extension* extension,
- base::string16* error) {
- // The "web_app_linked_shortcut_icons" key is only available for Bookmark
- // Apps. Including it elsewhere results in an install warning, and the linked
- // shortcut icons are not parsed.
- if (!extension->from_bookmark()) {
- extension->AddInstallWarning(InstallWarning(
- errors::kInvalidWebAppLinkedShortcutIconsNotBookmarkApp));
- return true;
- }
-
- auto web_app_linked_shortcut_icons =
- std::make_unique<WebAppLinkedShortcutIcons>();
-
- const base::Value* shortcut_icons_value = nullptr;
- if (!extension->manifest()->GetList(keys::kWebAppLinkedShortcutIcons,
- &shortcut_icons_value)) {
- *error =
- base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutIcons);
- return false;
- }
-
- base::Value::ConstListView shortcut_icons_list =
- shortcut_icons_value->GetList();
- web_app_linked_shortcut_icons->shortcut_icon_infos.reserve(
- shortcut_icons_list.size());
- for (const auto& shortcut_icon_value : shortcut_icons_list) {
- WebAppLinkedShortcutIcons::ShortcutIconInfo info;
- if (!ParseShortcutIconValue(shortcut_icon_value, &info, error)) {
- return false;
- }
- web_app_linked_shortcut_icons->shortcut_icon_infos.push_back(info);
- }
- extension->SetManifestData(keys::kWebAppLinkedShortcutIcons,
- std::move(web_app_linked_shortcut_icons));
- return true;
-}
-
-base::span<const char* const> WebAppLinkedShortcutIconsHandler::Keys() const {
- static constexpr const char* kKeys[] = {keys::kWebAppLinkedShortcutIcons};
- return kKeys;
-}
-
-} // namespace extensions
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h
deleted file mode 100644
index 6cbe933882f..00000000000
--- a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2020 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 EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ICONS_H_
-#define EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ICONS_H_
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/manifest_handler.h"
-
-class GURL;
-
-namespace extensions {
-
-// A structure to hold the parsed web app linked shortcut icon data.
-struct WebAppLinkedShortcutIcons : public Extension::ManifestData {
- struct ShortcutIconInfo {
- ShortcutIconInfo();
- ~ShortcutIconInfo();
-
- int shortcut_item_index;
- base::string16 shortcut_item_name;
- GURL url;
- int size;
- };
-
- WebAppLinkedShortcutIcons();
- WebAppLinkedShortcutIcons(const WebAppLinkedShortcutIcons& other);
- ~WebAppLinkedShortcutIcons() override;
-
- static const WebAppLinkedShortcutIcons& GetWebAppLinkedShortcutIcons(
- const Extension* extension);
-
- std::vector<ShortcutIconInfo> shortcut_icon_infos;
-};
-
-// Parses the "web_app_linked_shortcut_icons" manifest key.
-class WebAppLinkedShortcutIconsHandler : public ManifestHandler {
- public:
- WebAppLinkedShortcutIconsHandler();
- ~WebAppLinkedShortcutIconsHandler() override;
- WebAppLinkedShortcutIconsHandler(const WebAppLinkedShortcutIconsHandler&) =
- delete;
- WebAppLinkedShortcutIconsHandler& operator=(
- const WebAppLinkedShortcutIconsHandler&) = delete;
-
- // ManifestHandler:
- bool Parse(Extension* extension, base::string16* error) override;
-
- private:
- // ManifestHandler:
- base::span<const char* const> Keys() const override;
-};
-
-} // namespace extensions
-
-#endif // EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ICONS_H_
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons_unittest.cc b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons_unittest.cc
deleted file mode 100644
index 8630a351929..00000000000
--- a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_icons_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2020 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.
-
-#include <string>
-
-#include "extensions/common/extension.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/manifest_constants.h"
-#include "extensions/common/manifest_handlers/web_app_linked_shortcut_icons.h"
-#include "extensions/common/manifest_test.h"
-
-namespace extensions {
-
-namespace errors = manifest_errors;
-
-using WebAppLinkedShortcutIconsHandlerTest = ManifestTest;
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, Valid) {
- scoped_refptr<Extension> extension =
- LoadAndExpectSuccess("web_app_linked_shortcut_icons_valid.json",
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
- ASSERT_TRUE(extension.get());
- ASSERT_TRUE(extension->from_bookmark());
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidNotFromBookmarkApp) {
- scoped_refptr<Extension> extension =
- LoadAndExpectSuccess("web_app_linked_shortcut_icons_valid.json");
-
- ASSERT_TRUE(extension.get());
- ASSERT_FALSE(extension->from_bookmark());
-
- std::vector<InstallWarning> expected_install_warnings;
- expected_install_warnings.push_back(
- InstallWarning(errors::kInvalidWebAppLinkedShortcutIconsNotBookmarkApp));
- EXPECT_EQ(expected_install_warnings, extension->install_warnings());
-
- const WebAppLinkedShortcutIcons& web_app_linked_shortcut_icons =
- WebAppLinkedShortcutIcons::GetWebAppLinkedShortcutIcons(extension.get());
- ASSERT_TRUE(web_app_linked_shortcut_icons.shortcut_icon_infos.empty());
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutIndex) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid1.json",
- errors::kInvalidWebAppLinkedShortcutItemIndex,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutName) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid2.json",
- errors::kInvalidWebAppLinkedShortcutItemName,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutIconUrl) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid3.json",
- errors::kInvalidWebAppLinkedShortcutIconURL,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutIconSize) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid4.json",
- errors::kInvalidWebAppLinkedShortcutIconSize,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutIcons) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid5.json",
- errors::kInvalidWebAppLinkedShortcutIcons,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-TEST_F(WebAppLinkedShortcutIconsHandlerTest, InvalidLinkedShortcutIcon) {
- LoadAndExpectError("web_app_linked_shortcut_icons_invalid6.json",
- errors::kInvalidWebAppLinkedShortcutIcon,
- extensions::Manifest::Location::INTERNAL,
- extensions::Extension::FROM_BOOKMARK);
-}
-
-} // namespace extensions
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.cc b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.cc
new file mode 100644
index 00000000000..e2e7b21bfc9
--- /dev/null
+++ b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.cc
@@ -0,0 +1,195 @@
+// Copyright 2020 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.
+
+#include "extensions/common/manifest_handlers/web_app_linked_shortcut_items.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/no_destructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/manifest_constants.h"
+
+namespace extensions {
+
+namespace keys = manifest_keys;
+namespace errors = manifest_errors;
+
+namespace {
+
+bool ParseShortcutItemIconValue(
+ const base::Value& value,
+ WebAppLinkedShortcutItems::ShortcutItemInfo::IconInfo* icon_info,
+ base::string16* error) {
+ const base::DictionaryValue* shortcut_item_icon_dict = nullptr;
+ if (!value.GetAsDictionary(&shortcut_item_icon_dict)) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemIcon);
+ return false;
+ }
+
+ std::string icon_url;
+ if (!shortcut_item_icon_dict->GetString(
+ keys::kWebAppLinkedShortcutItemIconURL, &icon_url)) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemIconUrl);
+ return false;
+ }
+
+ icon_info->url = GURL(icon_url);
+ if (!icon_info->url.is_valid()) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemIconUrl);
+ return false;
+ }
+
+ if (!shortcut_item_icon_dict->GetInteger(
+ keys::kWebAppLinkedShortcutItemIconSize, &icon_info->size)) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemIconSize);
+ return false;
+ }
+
+ return true;
+}
+
+bool ParseShortcutItemValue(const base::Value& value,
+ WebAppLinkedShortcutItems::ShortcutItemInfo* info,
+ base::string16* error) {
+ const base::DictionaryValue* shortcut_item_dict = nullptr;
+ if (!value.GetAsDictionary(&shortcut_item_dict)) {
+ *error =
+ base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutItem);
+ return false;
+ }
+
+ if (!shortcut_item_dict->GetString(keys::kWebAppLinkedShortcutItemName,
+ &info->name)) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemName);
+ return false;
+ }
+
+ std::string url_string;
+ if (!shortcut_item_dict->GetString(keys::kWebAppLinkedShortcutItemURL,
+ &url_string)) {
+ *error =
+ base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutItemUrl);
+ return false;
+ }
+
+ info->url = GURL(url_string);
+ if (!info->url.is_valid()) {
+ *error =
+ base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutItemUrl);
+ return false;
+ }
+
+ const base::ListValue* shortcut_item_icons_value = nullptr;
+ if (!shortcut_item_dict->GetList(keys::kWebAppLinkedShortcutItemIcons,
+ &shortcut_item_icons_value)) {
+ *error = base::UTF8ToUTF16(
+ manifest_errors::kInvalidWebAppLinkedShortcutItemIcons);
+ return false;
+ }
+
+ base::Value::ConstListView shortcut_item_icons_list =
+ shortcut_item_icons_value->GetList();
+ info->shortcut_item_icon_infos.reserve(shortcut_item_icons_list.size());
+
+ for (const auto& shortcut_item_icon_value : shortcut_item_icons_list) {
+ WebAppLinkedShortcutItems::ShortcutItemInfo::IconInfo icon_info;
+ if (!ParseShortcutItemIconValue(shortcut_item_icon_value, &icon_info,
+ error)) {
+ return false;
+ }
+ info->shortcut_item_icon_infos.push_back(icon_info);
+ }
+
+ return true;
+}
+
+} // namespace
+
+WebAppLinkedShortcutItems::ShortcutItemInfo::IconInfo::IconInfo() = default;
+
+WebAppLinkedShortcutItems::ShortcutItemInfo::IconInfo::~IconInfo() = default;
+
+WebAppLinkedShortcutItems::ShortcutItemInfo::ShortcutItemInfo() = default;
+
+WebAppLinkedShortcutItems::ShortcutItemInfo::ShortcutItemInfo(
+ const WebAppLinkedShortcutItems::ShortcutItemInfo& other) = default;
+
+WebAppLinkedShortcutItems::ShortcutItemInfo::~ShortcutItemInfo() = default;
+
+WebAppLinkedShortcutItems::WebAppLinkedShortcutItems() = default;
+
+WebAppLinkedShortcutItems::WebAppLinkedShortcutItems(
+ const WebAppLinkedShortcutItems& other) = default;
+
+WebAppLinkedShortcutItems::~WebAppLinkedShortcutItems() = default;
+
+// static
+const WebAppLinkedShortcutItems&
+WebAppLinkedShortcutItems::GetWebAppLinkedShortcutItems(
+ const Extension* extension) {
+ WebAppLinkedShortcutItems* info = static_cast<WebAppLinkedShortcutItems*>(
+ extension->GetManifestData(keys::kWebAppLinkedShortcutItems));
+ if (info)
+ return *info;
+
+ static base::NoDestructor<WebAppLinkedShortcutItems>
+ empty_web_app_linked_shortcut_items;
+ return *empty_web_app_linked_shortcut_items;
+}
+
+WebAppLinkedShortcutItemsHandler::WebAppLinkedShortcutItemsHandler() = default;
+
+WebAppLinkedShortcutItemsHandler::~WebAppLinkedShortcutItemsHandler() = default;
+
+bool WebAppLinkedShortcutItemsHandler::Parse(Extension* extension,
+ base::string16* error) {
+ // The "web_app_linked_shortcut_items" key is only available for Bookmark
+ // Apps. Including it elsewhere results in an install warning, and the linked
+ // shortcut items are not parsed.
+ if (!extension->from_bookmark()) {
+ extension->AddInstallWarning(InstallWarning(
+ errors::kInvalidWebAppLinkedShortcutItemsNotBookmarkApp));
+ return true;
+ }
+
+ auto web_app_linked_shortcut_items =
+ std::make_unique<WebAppLinkedShortcutItems>();
+
+ const base::Value* shortcut_items_value = nullptr;
+ if (!extension->manifest()->GetList(keys::kWebAppLinkedShortcutItems,
+ &shortcut_items_value)) {
+ *error =
+ base::UTF8ToUTF16(manifest_errors::kInvalidWebAppLinkedShortcutItems);
+ return false;
+ }
+
+ base::Value::ConstListView shortcut_items_list =
+ shortcut_items_value->GetList();
+ web_app_linked_shortcut_items->shortcut_item_infos.reserve(
+ shortcut_items_list.size());
+ for (const auto& shortcut_item_value : shortcut_items_list) {
+ WebAppLinkedShortcutItems::ShortcutItemInfo info;
+ if (!ParseShortcutItemValue(shortcut_item_value, &info, error))
+ return false;
+ web_app_linked_shortcut_items->shortcut_item_infos.push_back(info);
+ }
+ extension->SetManifestData(keys::kWebAppLinkedShortcutItems,
+ std::move(web_app_linked_shortcut_items));
+ return true;
+}
+
+base::span<const char* const> WebAppLinkedShortcutItemsHandler::Keys() const {
+ static constexpr const char* kKeys[] = {keys::kWebAppLinkedShortcutItems};
+ return kKeys;
+}
+
+} // namespace extensions
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.h b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.h
new file mode 100644
index 00000000000..7baae167e00
--- /dev/null
+++ b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items.h
@@ -0,0 +1,70 @@
+// Copyright 2020 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 EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ITEMS_H_
+#define EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ITEMS_H_
+
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/strings/string16.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest_handler.h"
+
+class GURL;
+
+namespace extensions {
+
+// A structure to hold the parsed web app linked shortcut item data.
+struct WebAppLinkedShortcutItems : public Extension::ManifestData {
+ struct ShortcutItemInfo {
+ struct IconInfo {
+ IconInfo();
+ ~IconInfo();
+
+ GURL url;
+ int size;
+ };
+
+ ShortcutItemInfo();
+ ShortcutItemInfo(const ShortcutItemInfo& other);
+ ~ShortcutItemInfo();
+
+ base::string16 name;
+ GURL url;
+ std::vector<IconInfo> shortcut_item_icon_infos;
+ };
+
+ WebAppLinkedShortcutItems();
+ WebAppLinkedShortcutItems(const WebAppLinkedShortcutItems& other);
+ ~WebAppLinkedShortcutItems() override;
+
+ static const WebAppLinkedShortcutItems& GetWebAppLinkedShortcutItems(
+ const Extension* extension);
+
+ std::vector<ShortcutItemInfo> shortcut_item_infos;
+};
+
+// Parses the "web_app_linked_shortcut_items" manifest key.
+class WebAppLinkedShortcutItemsHandler : public ManifestHandler {
+ public:
+ WebAppLinkedShortcutItemsHandler();
+ WebAppLinkedShortcutItemsHandler(const WebAppLinkedShortcutItemsHandler&) =
+ delete;
+ WebAppLinkedShortcutItemsHandler& operator=(
+ const WebAppLinkedShortcutItemsHandler&) = delete;
+ ~WebAppLinkedShortcutItemsHandler() override;
+
+ // ManifestHandler:
+ bool Parse(Extension* extension, base::string16* error) override;
+
+ private:
+ // ManifestHandler:
+ base::span<const char* const> Keys() const override;
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_COMMON_MANIFEST_HANDLERS_WEB_APP_LINKED_SHORTCUT_ITEMS_H_
diff --git a/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items_unittest.cc b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items_unittest.cc
new file mode 100644
index 00000000000..818e54eedef
--- /dev/null
+++ b/chromium/extensions/common/manifest_handlers/web_app_linked_shortcut_items_unittest.cc
@@ -0,0 +1,135 @@
+// Copyright 2020 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.
+
+#include <string>
+
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/manifest_handlers/web_app_linked_shortcut_items.h"
+#include "extensions/common/manifest_test.h"
+
+namespace extensions {
+
+namespace errors = manifest_errors;
+
+using WebAppLinkedShortcutItemsHandlerTest = ManifestTest;
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, Valid) {
+ scoped_refptr<Extension> extension =
+ LoadAndExpectSuccess("web_app_linked_shortcut_items_valid.json",
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+ ASSERT_TRUE(extension.get());
+ ASSERT_TRUE(extension->from_bookmark());
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidNotFromBookmarkApp) {
+ scoped_refptr<Extension> extension =
+ LoadAndExpectSuccess("web_app_linked_shortcut_items_valid.json");
+ ASSERT_TRUE(extension.get());
+ ASSERT_FALSE(extension->from_bookmark());
+
+ std::vector<InstallWarning> expected_install_warnings;
+ expected_install_warnings.emplace_back(
+ InstallWarning(errors::kInvalidWebAppLinkedShortcutItemsNotBookmarkApp));
+ EXPECT_EQ(expected_install_warnings, extension->install_warnings());
+
+ const WebAppLinkedShortcutItems& web_app_linked_shortcut_items =
+ WebAppLinkedShortcutItems::GetWebAppLinkedShortcutItems(extension.get());
+ EXPECT_TRUE(web_app_linked_shortcut_items.shortcut_item_infos.empty());
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItems) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid1.json",
+ errors::kInvalidWebAppLinkedShortcutItems,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItem) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid2.json",
+ errors::kInvalidWebAppLinkedShortcutItem,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemName) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid3.json",
+ errors::kInvalidWebAppLinkedShortcutItemName,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemUrl) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid4.json",
+ errors::kInvalidWebAppLinkedShortcutItemUrl,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemUrl2) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid10.json",
+ errors::kInvalidWebAppLinkedShortcutItemUrl,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemIcons) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid5.json",
+ errors::kInvalidWebAppLinkedShortcutItemIcons,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemIcon) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid6.json",
+ errors::kInvalidWebAppLinkedShortcutItemIcon,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, InvalidLinkedShortcutItemIconUrl) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid7.json",
+ errors::kInvalidWebAppLinkedShortcutItemIconUrl,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest,
+ InvalidLinkedShortcutItemIconUrl2) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid8.json",
+ errors::kInvalidWebAppLinkedShortcutItemIconUrl,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest,
+ InvalidLinkedShortcutItemIconSize) {
+ LoadAndExpectError("web_app_linked_shortcut_items_invalid9.json",
+ errors::kInvalidWebAppLinkedShortcutItemIconSize,
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest, ValidLinkedShortcutItemNoIcons) {
+ scoped_refptr<Extension> extension =
+ LoadAndExpectSuccess("web_app_linked_shortcut_items_valid_no_icons.json",
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+ ASSERT_TRUE(extension.get());
+ ASSERT_TRUE(extension->from_bookmark());
+}
+
+TEST_F(WebAppLinkedShortcutItemsHandlerTest,
+ ValidLinkedShortcutItemMultipleIcons) {
+ scoped_refptr<Extension> extension = LoadAndExpectSuccess(
+ "web_app_linked_shortcut_items_valid_multiple_icons.json",
+ extensions::Manifest::Location::INTERNAL,
+ extensions::Extension::FROM_BOOKMARK);
+ ASSERT_TRUE(extension.get());
+ ASSERT_TRUE(extension->from_bookmark());
+}
+
+} // namespace extensions
diff --git a/chromium/extensions/common/permissions/api_permission.h b/chromium/extensions/common/permissions/api_permission.h
index cd40e2de53a..392acbfcb11 100644
--- a/chromium/extensions/common/permissions/api_permission.h
+++ b/chromium/extensions/common/permissions/api_permission.h
@@ -268,6 +268,7 @@ class APIPermission {
kPrinting = 224,
kCrashReportPrivate = 225,
kAutofillAssistantPrivate = 226,
+ kEnterpriseNetworkingAttributes = 227,
// Last entry: Add new entries above and ensure to update the
// "ExtensionPermission3" enum in tools/metrics/histograms/enums.xml
// (by running update_extension_permission.py).
diff --git a/chromium/extensions/common/permissions/base_set_operators.h b/chromium/extensions/common/permissions/base_set_operators.h
index 729b3f787a5..15e6e7e74ad 100644
--- a/chromium/extensions/common/permissions/base_set_operators.h
+++ b/chromium/extensions/common/permissions/base_set_operators.h
@@ -11,7 +11,7 @@
#include <map>
#include <memory>
-#include "base/logging.h"
+#include "base/check.h"
namespace extensions {
diff --git a/chromium/extensions/common/switches.cc b/chromium/extensions/common/switches.cc
index 0a3989a6bfe..836e74342a0 100644
--- a/chromium/extensions/common/switches.cc
+++ b/chromium/extensions/common/switches.cc
@@ -59,6 +59,13 @@ const char kLoadApps[] = "load-apps";
// Comma-separated list of paths to extensions to load at startup.
const char kLoadExtension[] = "load-extension";
+#if defined(OS_CHROMEOS)
+// Path to the unpacked test extension to load into the signin profile. The ID
+// extension loaded must match kTestSigninProfileExtensionId.
+const char kLoadSigninProfileTestExtension[] =
+ "load-signin-profile-test-extension";
+#endif
+
// Set the parameters for ExtensionURLLoaderThrottleBrowserTest.
const char kSetExtensionThrottleTestParams[] =
"set-extension-throttle-test-params";
diff --git a/chromium/extensions/common/switches.h b/chromium/extensions/common/switches.h
index 2b3b6af5a4b..982916613c1 100644
--- a/chromium/extensions/common/switches.h
+++ b/chromium/extensions/common/switches.h
@@ -24,6 +24,9 @@ extern const char kForceDevModeHighlighting[];
extern const char kForceEmptyCorbAllowlist[];
extern const char kLoadApps[];
extern const char kLoadExtension[];
+#if defined(OS_CHROMEOS)
+extern const char kLoadSigninProfileTestExtension[];
+#endif
extern const char kSetExtensionThrottleTestParams[];
extern const char kShowComponentExtensionOptions[];
extern const char kTraceAppSource[];