diff options
Diffstat (limited to 'chromium/extensions/common')
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[]; |