From b0820375b172cd51bc3272941687a24350be4085 Mon Sep 17 00:00:00 2001 From: "zork@chromium.org" Date: Fri, 3 Jun 2011 07:05:27 +0000 Subject: Add input_components loading to the manifest BUG=chromium-os:16090 TEST=None Review URL: http://codereview.chromium.org/7066046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87758 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/common/extensions/extension.cc | 136 ++++++++++++++++++++++++ chrome/common/extensions/extension.h | 29 +++++ chrome/common/extensions/extension_constants.cc | 25 +++++ chrome/common/extensions/extension_constants.h | 17 +++ 4 files changed, 207 insertions(+) (limited to 'chrome/common') diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc index 803a4e4..4ee1033 100644 --- a/chrome/common/extensions/extension.cc +++ b/chrome/common/extensions/extension.cc @@ -351,6 +351,9 @@ const int Extension::kValidWebExtentSchemes = const int Extension::kValidHostPermissionSchemes = UserScript::kValidUserScriptSchemes | URLPattern::SCHEME_CHROMEUI; +Extension::InputComponentInfo::InputComponentInfo() {} +Extension::InputComponentInfo::~InputComponentInfo() {} + // // PermissionMessage // @@ -2422,6 +2425,139 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, } } + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableExperimentalExtensionApis) && + source.HasKey(keys::kInputComponents)) { + ListValue* list_value = NULL; + if (!source.GetList(keys::kInputComponents, &list_value)) { + *error = errors::kInvalidInputComponents; + return false; + } + + for (size_t i = 0; i < list_value->GetSize(); ++i) { + DictionaryValue* module_value = NULL; + std::string name_str; + InputComponentType type; + std::string id_str; + std::string description_str; + std::string language_str; + std::set layouts; + std::string shortcut_keycode_str; + bool shortcut_alt = false; + bool shortcut_ctrl = false; + bool shortcut_shift = false; + + if (!list_value->GetDictionary(i, &module_value)) { + *error = errors::kInvalidInputComponents; + return false; + } + + // Get input_components[i].name. + if (!module_value->GetString(keys::kName, &name_str)) { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentName, base::IntToString(i)); + return false; + } + + // Get input_components[i].type. + std::string type_str; + if (module_value->GetString(keys::kType, &type_str)) { + if (type_str == "ime") { + type = INPUT_COMPONENT_TYPE_IME; + } else if (type_str == "virtual_keyboard") { + type = INPUT_COMPONENT_TYPE_VIRTUAL_KEYBOARD; + } else { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentType, base::IntToString(i)); + return false; + } + } else { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentType, base::IntToString(i)); + return false; + } + + // Get input_components[i].id. + if (!module_value->GetString(keys::kId, &id_str)) { + id_str = ""; + } + + // Get input_components[i].description. + if (!module_value->GetString(keys::kDescription, &description_str)) { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentDescription, base::IntToString(i)); + return false; + } + + // Get input_components[i].language. + if (!module_value->GetString(keys::kLanguage, &language_str)) { + language_str = ""; + } + + // Get input_components[i].layouts. + ListValue* layouts_value = NULL; + if (!source.GetList(keys::kLayouts, &layouts_value)) { + *error = errors::kInvalidInputComponentLayouts; + return false; + } + + for (size_t j = 0; j < layouts_value->GetSize(); ++j) { + std::string layout_name_str; + if (!layouts_value->GetString(j, &layout_name_str)) { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentLayoutName, base::IntToString(i), + base::IntToString(j)); + return false; + } + layouts.insert(layout_name_str); + } + + if (source.HasKey(keys::kShortcutKey)) { + DictionaryValue* shortcut_value = NULL; + if (!module_value->GetDictionary(keys::kShortcutKey, &shortcut_value)) { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentShortcutKey, base::IntToString(i)); + return false; + } + + // Get input_components[i].shortcut_keycode. + if (!shortcut_value->GetString(keys::kKeycode, &shortcut_keycode_str)) { + *error = ExtensionErrorUtils::FormatErrorMessage( + errors::kInvalidInputComponentShortcutKeycode, + base::IntToString(i)); + return false; + } + + // Get input_components[i].shortcut_alt. + if (!shortcut_value->GetBoolean(keys::kAltKey, &shortcut_alt)) { + shortcut_alt = false; + } + + // Get input_components[i].shortcut_ctrl. + if (!shortcut_value->GetBoolean(keys::kCtrlKey, &shortcut_ctrl)) { + shortcut_ctrl = false; + } + + // Get input_components[i].shortcut_shift. + if (!shortcut_value->GetBoolean(keys::kShiftKey, &shortcut_shift)) { + shortcut_shift = false; + } + } + + input_components_.push_back(InputComponentInfo()); + input_components_.back().name = name_str; + input_components_.back().type = type; + input_components_.back().id = id_str; + input_components_.back().description = description_str; + input_components_.back().language = language_str; + input_components_.back().layouts.insert(layouts.begin(), layouts.end()); + input_components_.back().shortcut_keycode = shortcut_keycode_str; + input_components_.back().shortcut_alt = shortcut_alt; + input_components_.back().shortcut_ctrl = shortcut_ctrl; + input_components_.back().shortcut_shift = shortcut_shift; + } + } + if (source.HasKey(keys::kOmnibox)) { if (!source.GetString(keys::kOmniboxKeyword, &omnibox_keyword_) || omnibox_keyword_.empty()) { diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h index 58a57d8..7ed8c8c 100644 --- a/chrome/common/extensions/extension.h +++ b/chrome/common/extensions/extension.h @@ -112,6 +112,29 @@ class Extension : public base::RefCountedThreadSafe { std::string mime_type; }; + enum InputComponentType { + INPUT_COMPONENT_TYPE_IME = 0, + INPUT_COMPONENT_TYPE_VIRTUAL_KEYBOARD, + INPUT_COMPONENT_TYPE_COUNT + }; + + struct InputComponentInfo { + // Define out of line constructor/destructor to please Clang. + InputComponentInfo(); + ~InputComponentInfo(); + + std::string name; + InputComponentType type; + std::string id; + std::string description; + std::string language; + std::set layouts; + std::string shortcut_keycode; + bool shortcut_alt; + bool shortcut_ctrl; + bool shortcut_shift; + }; + struct TtsVoice { std::string voice_name; std::string locale; @@ -599,6 +622,9 @@ class Extension : public base::RefCountedThreadSafe { const std::vector& nacl_modules() const { return nacl_modules_; } + const std::vector& input_components() const { + return input_components_; + } const GURL& background_url() const { return background_url_; } const GURL& options_url() const { return options_url_; } const GURL& devtools_url() const { return devtools_url_; } @@ -844,6 +870,9 @@ class Extension : public base::RefCountedThreadSafe { // Optional list of NaCl modules and associated properties. std::vector nacl_modules_; + // Optional list of input components and associated properties. + std::vector input_components_; + // Optional URL to a master page of which a single instance should be always // loaded in the background. GURL background_url_; diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc index b478bad..ab59539 100644 --- a/chrome/common/extensions/extension_constants.cc +++ b/chrome/common/extensions/extension_constants.cc @@ -7,6 +7,7 @@ namespace extension_manifest_keys { const char* kAllFrames = "all_frames"; +const char* kAltKey = "altKey"; const char* kApp = "app"; const char* kBackground = "background_page"; const char* kBrowserAction = "browser_action"; @@ -15,6 +16,7 @@ const char* kContentScripts = "content_scripts"; const char* kContentSecurityPolicy = "content_security_policy"; const char* kConvertedFromUserScript = "converted_from_user_script"; const char* kCss = "css"; +const char* kCtrlKey = "ctrlKey"; const char* kCurrentLocale = "current_locale"; const char* kDefaultLocale = "default_locale"; const char* kDescription = "description"; @@ -25,16 +27,21 @@ const char* kFileFilters = "file_filters"; const char* kFileBrowserHandlers = "file_browser_handlers"; const char* kHomepageURL = "homepage_url"; const char* kIcons = "icons"; +const char* kId = "id"; const char* kIncognito = "incognito"; const char* kIncludeGlobs = "include_globs"; +const char* kInputComponents = "input_components"; const char* kIsolation = "app.isolation"; const char* kJs = "js"; +const char* kKeycode = "keyCode"; +const char* kLanguage = "language"; const char* kLaunch = "app.launch"; const char* kLaunchContainer = "app.launch.container"; const char* kLaunchHeight = "app.launch.height"; const char* kLaunchLocalPath = "app.launch.local_path"; const char* kLaunchWebURL = "app.launch.web_url"; const char* kLaunchWidth = "app.launch.width"; +const char* kLayouts = "layouts"; const char* kMatches = "matches"; const char* kMinimumChromeVersion = "minimum_chrome_version"; const char* kName = "name"; @@ -60,6 +67,8 @@ const char* kPluginsPath = "path"; const char* kPluginsPublic = "public"; const char* kPublicKey = "key"; const char* kRunAt = "run_at"; +const char* kShiftKey = "shiftKey"; +const char* kShortcutKey = "shortcutKey"; const char* kSidebar = "sidebar"; const char* kSidebarDefaultIcon = "default_icon"; const char* kSidebarDefaultPage = "default_page"; @@ -185,6 +194,22 @@ const char* kInvalidIcons = "Invalid value for 'icons'."; const char* kInvalidIncognitoBehavior = "Invalid value for 'incognito'."; +const char* kInvalidInputComponents = + "Invalid value for 'input_components'"; +const char* kInvalidInputComponentDescription = + "Invalid value for 'input_conponents[*].description"; +const char* kInvalidInputComponentLayoutName = + "Invalid value for 'input_conponents[*].layouts[*]"; +const char* kInvalidInputComponentLayouts = + "Invalid value for 'input_conponents[*].layouts"; +const char* kInvalidInputComponentName = + "Invalid value for 'input_conponents[*].name"; +const char* kInvalidInputComponentShortcutKey = + "Invalid value for 'input_conponents[*].shortcutKey"; +const char* kInvalidInputComponentShortcutKeycode = + "Invalid value for 'input_conponents[*].shortcutKey.keyCode"; +const char* kInvalidInputComponentType = + "Invalid value for 'input_conponents[*].type"; const char* kInvalidIsolation = "Invalid value for 'app.isolation'."; const char* kInvalidIsolationValue = diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h index 62cb519..b104d5b 100644 --- a/chrome/common/extensions/extension_constants.h +++ b/chrome/common/extensions/extension_constants.h @@ -11,6 +11,7 @@ // Keys used in JSON representation of extensions. namespace extension_manifest_keys { extern const char* kAllFrames; + extern const char* kAltKey; extern const char* kApp; extern const char* kBackground; extern const char* kBrowserAction; @@ -20,6 +21,7 @@ namespace extension_manifest_keys { extern const char* kContentSecurityPolicy; extern const char* kConvertedFromUserScript; extern const char* kCss; + extern const char* kCtrlKey; extern const char* kCurrentLocale; extern const char* kDefaultLocale; extern const char* kDescription; @@ -30,16 +32,21 @@ namespace extension_manifest_keys { extern const char* kFileBrowserHandlers; extern const char* kHomepageURL; extern const char* kIcons; + extern const char* kId; extern const char* kIncognito; extern const char* kIncludeGlobs; + extern const char* kInputComponents; extern const char* kIsolation; extern const char* kJs; + extern const char* kKeycode; + extern const char* kLanguage; extern const char* kLaunch; extern const char* kLaunchContainer; extern const char* kLaunchHeight; extern const char* kLaunchLocalPath; extern const char* kLaunchWebURL; extern const char* kLaunchWidth; + extern const char* kLayouts; extern const char* kMatches; extern const char* kMinimumChromeVersion; extern const char* kNaClModules; @@ -65,6 +72,8 @@ namespace extension_manifest_keys { extern const char* kPluginsPublic; extern const char* kPublicKey; extern const char* kRunAt; + extern const char* kShiftKey; + extern const char* kShortcutKey; extern const char* kSidebar; extern const char* kSidebarDefaultIcon; extern const char* kSidebarDefaultPage; @@ -147,6 +156,14 @@ namespace extension_manifest_errors { extern const char* kInvalidIconPath; extern const char* kInvalidIcons; extern const char* kInvalidIncognitoBehavior; + extern const char* kInvalidInputComponents; + extern const char* kInvalidInputComponentDescription; + extern const char* kInvalidInputComponentLayoutName; + extern const char* kInvalidInputComponentLayouts; + extern const char* kInvalidInputComponentName; + extern const char* kInvalidInputComponentShortcutKey; + extern const char* kInvalidInputComponentShortcutKeycode; + extern const char* kInvalidInputComponentType; extern const char* kInvalidIsolation; extern const char* kInvalidIsolationValue; extern const char* kInvalidJs; -- cgit v1.1