Commit 28ba7f5f authored by dtseng's avatar dtseng Committed by Commit bot

Begin whitelisting specific extensions for global key registration.

Adds whitelist to commands API to relax restrictions on:
- global accelerator keys
- maximum number of commands
- override previously taken accelerators

This cl also involved fixing the use of the search key while using the global commands listener. The 'command' modifier was being dropped while making its way to the renderer and back.

BUG=404768
TEST=With a sample extension binding
"Search+Shift+L" and
"global": true

press and verify callback when
focus is inside of web content
focus is on the status tray

Review URL: https://codereview.chromium.org/399783002

Cr-Commit-Position: refs/heads/master@{#291628}
parent c2761c32
...@@ -565,6 +565,10 @@ bool CommandService::CanAutoAssign(const Command &command, ...@@ -565,6 +565,10 @@ bool CommandService::CanAutoAssign(const Command &command,
command.command_name() == manifest_values::kPageActionCommandEvent) command.command_name() == manifest_values::kPageActionCommandEvent)
return false; // Browser and page actions are not global in nature. return false; // Browser and page actions are not global in nature.
if (extension->permissions_data()->HasAPIPermission(
APIPermission::kCommandsAccessibility))
return true;
// Global shortcuts are restricted to (Ctrl|Command)+Shift+[0-9]. // Global shortcuts are restricted to (Ctrl|Command)+Shift+[0-9].
#if defined OS_MACOSX #if defined OS_MACOSX
if (!command.accelerator().IsCmdDown()) if (!command.accelerator().IsCmdDown())
......
...@@ -256,6 +256,14 @@ ...@@ -256,6 +256,14 @@
"extension_types": ["extension", "legacy_packaged_app", "platform_app"], "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
"location": "component" "location": "component"
}, },
"commands.accessibility": {
"channel": "stable",
"extension_types": ["extension", "legacy_packaged_app", "platform_app"],
"whitelist": [
"2FCBCE08B34CCA1728A85F1EFBD9A34DD2558B2E", // http://crbug.com/404768
"75C7F4B720314B6CB1B5817CD86089DB95CD2461" // http://crbug.com/404768
]
},
"contentSettings": { "contentSettings": {
"channel": "stable", "channel": "stable",
"extension_types": ["extension", "legacy_packaged_app"] "extension_types": ["extension", "legacy_packaged_app"]
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "chrome/common/extensions/command.h" #include "chrome/common/extensions/command.h"
#include "extensions/common/error_utils.h" #include "extensions/common/error_utils.h"
#include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/permissions_parser.h"
namespace extensions { namespace extensions {
...@@ -97,7 +98,9 @@ bool CommandsHandler::Parse(Extension* extension, base::string16* error) { ...@@ -97,7 +98,9 @@ bool CommandsHandler::Parse(Extension* extension, base::string16* error) {
if (!Command::IsMediaKey(binding->accelerator())) if (!Command::IsMediaKey(binding->accelerator()))
++keybindings_found; ++keybindings_found;
if (keybindings_found > kMaxCommandsWithKeybindingPerExtension) { if (keybindings_found > kMaxCommandsWithKeybindingPerExtension &&
!PermissionsParser::HasAPIPermission(
extension, APIPermission::kCommandsAccessibility)) {
*error = ErrorUtils::FormatErrorMessageUTF16( *error = ErrorUtils::FormatErrorMessageUTF16(
manifest_errors::kInvalidKeyBindingTooMany, manifest_errors::kInvalidKeyBindingTooMany,
base::IntToString(kMaxCommandsWithKeybindingPerExtension)); base::IntToString(kMaxCommandsWithKeybindingPerExtension));
......
...@@ -184,6 +184,8 @@ std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions() ...@@ -184,6 +184,8 @@ std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions()
{APIPermission::kCast, "cast", APIPermissionInfo::kFlagCannotBeOptional}, {APIPermission::kCast, "cast", APIPermissionInfo::kFlagCannotBeOptional},
{APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate", {APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate",
APIPermissionInfo::kFlagCannotBeOptional}, APIPermissionInfo::kFlagCannotBeOptional},
{APIPermission::kCommandsAccessibility, "commands.accessibility",
APIPermissionInfo::kFlagCannotBeOptional},
{APIPermission::kCommandLinePrivate, "commandLinePrivate", {APIPermission::kCommandLinePrivate, "commandLinePrivate",
APIPermissionInfo::kFlagCannotBeOptional}, APIPermissionInfo::kFlagCannotBeOptional},
{APIPermission::kDeveloperPrivate, "developerPrivate", {APIPermission::kDeveloperPrivate, "developerPrivate",
......
...@@ -644,6 +644,7 @@ TEST(PermissionsTest, PermissionMessages) { ...@@ -644,6 +644,7 @@ TEST(PermissionsTest, PermissionMessages) {
skip.insert(APIPermission::kAudio); skip.insert(APIPermission::kAudio);
skip.insert(APIPermission::kBrowsingData); skip.insert(APIPermission::kBrowsingData);
skip.insert(APIPermission::kCastStreaming); skip.insert(APIPermission::kCastStreaming);
skip.insert(APIPermission::kCommandsAccessibility);
skip.insert(APIPermission::kContextMenus); skip.insert(APIPermission::kContextMenus);
skip.insert(APIPermission::kCopresence); skip.insert(APIPermission::kCopresence);
skip.insert(APIPermission::kCopresencePrivate); skip.insert(APIPermission::kCopresencePrivate);
......
...@@ -17,7 +17,7 @@ int GetModifiersFromNativeWebKeyboardEvent( ...@@ -17,7 +17,7 @@ int GetModifiersFromNativeWebKeyboardEvent(
modifiers |= ui::EF_CONTROL_DOWN; modifiers |= ui::EF_CONTROL_DOWN;
if (event.modifiers & NativeWebKeyboardEvent::AltKey) if (event.modifiers & NativeWebKeyboardEvent::AltKey)
modifiers |= ui::EF_ALT_DOWN; modifiers |= ui::EF_ALT_DOWN;
#if defined(OS_MACOSX) #if defined(OS_MACOSX) || defined(OS_CHROMEOS)
if (event.modifiers & NativeWebKeyboardEvent::MetaKey) if (event.modifiers & NativeWebKeyboardEvent::MetaKey)
modifiers |= ui::EF_COMMAND_DOWN; modifiers |= ui::EF_COMMAND_DOWN;
#endif #endif
......
...@@ -61,6 +61,7 @@ class APIPermission { ...@@ -61,6 +61,7 @@ class APIPermission {
kClipboardWrite, kClipboardWrite,
kCloudPrintPrivate, kCloudPrintPrivate,
kCommandLinePrivate, kCommandLinePrivate,
kCommandsAccessibility,
kContentSettings, kContentSettings,
kContextMenus, kContextMenus,
kCookie, kCookie,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment