1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/base/ime/ash/extension_ime_util.h"
#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
#include "build/branding_buildflags.h"
namespace ash {
namespace {
const char kExtensionIMEPrefix[] = "_ext_ime_";
const int kExtensionIMEPrefixLength =
sizeof(kExtensionIMEPrefix) / sizeof(kExtensionIMEPrefix[0]) - 1;
const char kComponentExtensionIMEPrefix[] = "_comp_ime_";
const int kComponentExtensionIMEPrefixLength =
sizeof(kComponentExtensionIMEPrefix) /
sizeof(kComponentExtensionIMEPrefix[0]) -
1;
const char kArcIMEPrefix[] = "_arc_ime_";
const int kArcIMEPrefixLength =
sizeof(kArcIMEPrefix) / sizeof(kArcIMEPrefix[0]) - 1;
const int kExtensionIdLength = 32;
} // namespace
namespace extension_ime_util {
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
const char kXkbExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kM17nExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kHangulExtensionId[] = "bdgdidmhaijohebebipajioienkglgfo";
const char kMozcExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kT13nExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kChinesePinyinExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kChineseZhuyinExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
const char kChineseCangjieExtensionId[] = "jkghodnilhceideoidjikpgommlajknk";
#else
const char kXkbExtensionId[] = "fgoepimhcoialccpbmpnnblemnepkkao";
const char kM17nExtensionId[] = "jhffeifommiaekmbkkjlpmilogcfdohp";
const char kHangulExtensionId[] = "bdgdidmhaijohebebipajioienkglgfo";
const char kMozcExtensionId[] = "bbaiamgfapehflhememkfglaehiobjnk";
const char kT13nExtensionId[] = "gjaehgfemfahhmlgpdfknkhdnemmolop";
const char kChinesePinyinExtensionId[] = "cpgalbafkoofkjmaeonnfijgpfennjjn";
const char kChineseZhuyinExtensionId[] = "ekbifjdfhkmdeeajnolmgdlmkllopefi";
const char kChineseCangjieExtensionId[] = "aeebooiibjahgpgmhkeocbeekccfknbj";
#endif
const char kBrailleImeExtensionId[] = "jddehjeebkoimngcbdkaahpobgicbffp";
const char kBrailleImeExtensionPath[] = "chromeos/accessibility/braille_ime";
const char kBrailleImeEngineId[] =
"_comp_ime_jddehjeebkoimngcbdkaahpobgicbffpbraille";
const char kArcImeLanguage[] = "_arc_ime_language_";
std::string GetInputMethodID(const std::string& extension_id,
const std::string& engine_id) {
DCHECK(!extension_id.empty());
DCHECK(!engine_id.empty());
return kExtensionIMEPrefix + extension_id + engine_id;
}
std::string GetComponentInputMethodID(const std::string& extension_id,
const std::string& engine_id) {
DCHECK(!extension_id.empty());
DCHECK(!engine_id.empty());
return kComponentExtensionIMEPrefix + extension_id + engine_id;
}
std::string GetArcInputMethodID(const std::string& extension_id,
const std::string& engine_id) {
DCHECK(!extension_id.empty());
DCHECK(!engine_id.empty());
return kArcIMEPrefix + extension_id + engine_id;
}
std::string GetExtensionIDFromInputMethodID(
const std::string& input_method_id) {
if (IsExtensionIME(input_method_id)) {
return input_method_id.substr(kExtensionIMEPrefixLength,
kExtensionIdLength);
}
if (IsComponentExtensionIME(input_method_id)) {
return input_method_id.substr(kComponentExtensionIMEPrefixLength,
kExtensionIdLength);
}
if (IsArcIME(input_method_id)) {
return input_method_id.substr(kArcIMEPrefixLength, kExtensionIdLength);
}
return "";
}
std::string GetComponentIDByInputMethodID(const std::string& input_method_id) {
if (IsComponentExtensionIME(input_method_id)) {
return input_method_id.substr(kComponentExtensionIMEPrefixLength +
kExtensionIdLength);
}
if (IsExtensionIME(input_method_id)) {
return input_method_id.substr(kExtensionIMEPrefixLength +
kExtensionIdLength);
}
if (IsArcIME(input_method_id)) {
return input_method_id.substr(kArcIMEPrefixLength + kExtensionIdLength);
}
return input_method_id;
}
std::string GetInputMethodIDByEngineID(const std::string& engine_id) {
if (engine_id.starts_with(kComponentExtensionIMEPrefix) ||
engine_id.starts_with(kExtensionIMEPrefix) ||
engine_id.starts_with(kArcIMEPrefix)) {
return engine_id;
}
if (engine_id.starts_with("xkb:")) {
return GetComponentInputMethodID(kXkbExtensionId, engine_id);
}
if (engine_id.starts_with("vkd_")) {
return GetComponentInputMethodID(kM17nExtensionId, engine_id);
}
if (engine_id.starts_with("nacl_mozc_")) {
return GetComponentInputMethodID(kMozcExtensionId, engine_id);
}
if (engine_id.starts_with("hangul_")) {
return GetComponentInputMethodID(kHangulExtensionId, engine_id);
}
if (engine_id.starts_with("zh-") &&
engine_id.find("pinyin") != std::string::npos) {
return GetComponentInputMethodID(kChinesePinyinExtensionId, engine_id);
}
if (engine_id.starts_with("zh-") &&
engine_id.find("zhuyin") != std::string::npos) {
return GetComponentInputMethodID(kChineseZhuyinExtensionId, engine_id);
}
if (engine_id.starts_with("zh-") &&
engine_id.find("cangjie") != std::string::npos) {
return GetComponentInputMethodID(kChineseCangjieExtensionId, engine_id);
}
if (engine_id.find("-t-i0-") != std::string::npos) {
return GetComponentInputMethodID(kT13nExtensionId, engine_id);
}
return engine_id;
}
bool IsExtensionIME(const std::string& input_method_id) {
return input_method_id.starts_with(kExtensionIMEPrefix) &&
input_method_id.size() >
kExtensionIMEPrefixLength + kExtensionIdLength;
}
bool IsComponentExtensionIME(const std::string& input_method_id) {
return input_method_id.starts_with(kComponentExtensionIMEPrefix) &&
input_method_id.size() >
kComponentExtensionIMEPrefixLength + kExtensionIdLength;
}
bool IsArcIME(const std::string& input_method_id) {
return input_method_id.starts_with(kArcIMEPrefix) &&
input_method_id.size() > kArcIMEPrefixLength + kExtensionIdLength;
}
bool IsKeyboardLayoutExtension(const std::string& input_method_id) {
if (IsComponentExtensionIME(input_method_id)) {
return GetComponentIDByInputMethodID(input_method_id).starts_with("xkb:");
}
return false;
}
bool IsCros1pKorean(const std::string& input_method_id) {
// TODO(crbug.com/1162211): Input method IDs are tuples of extension type,
// extension ID, and extension-local input method ID. However, currently
// they're just concats of the three constituent pieces of info, hence StrCat
// here. Replace StrCat once they're no longer unstructured string concats.
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
return input_method_id == base::StrCat({kComponentExtensionIMEPrefix,
kXkbExtensionId, "ko-t-i0-und"});
#else
return false;
#endif
}
} // namespace extension_ime_util
} // namespace ash
|