Skip to content

Commit

Permalink
Add Workman keyboard layout
Browse files Browse the repository at this point in the history
Adds the Workman keyboard layouts available in modern xkeyboard-config
packages to the Chromium OS builds.

BUG=None
TEST=unit_tests and browser_tests pass, manual testing on device works with new layouts

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

Cr-Commit-Position: refs/heads/master@{#360973}
  • Loading branch information
kruton authored and Commit bot committed Nov 21, 2015
1 parent 44d232c commit e92f7d6
Show file tree
Hide file tree
Showing 10 changed files with 182 additions and 82 deletions.
12 changes: 12 additions & 0 deletions chrome/app/chromeos_strings.grdp
Original file line number Diff line number Diff line change
Expand Up @@ -4851,6 +4851,12 @@ Battery full
<message name="IDS_STATUSBAR_LAYOUT_USA_INTERNATIONAL" desc="In the language menu button, this shows the input mode [US international keyboard].">
US international
</message>
<message name="IDS_STATUSBAR_LAYOUT_USA_WORKMAN" desc="In the language menu button, this shows the input mode [US Workman keyboard].">
US Workman
</message>
<message name="IDS_STATUSBAR_LAYOUT_USA_WORKMAN_INTERNATIONAL" desc="In the language menu button, this shows the input mode [US Workman international keyboard].">
US Workman international
</message>
<message name="IDS_STATUSBAR_LAYOUT_LITHUANIA" desc="In the language menu button, this shows the input mode [Lithuanian keyboard].">
Lithuanian
</message>
Expand Down Expand Up @@ -5155,6 +5161,12 @@ Battery full
<message name="IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL" desc="The input method name shows in system tray menu, this shows [US International keyboard].">
US International keyboard
</message>
<message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN" desc="The input method name shows in system tray menu, this shows [US Workman keyboard].">
US Workman keyboard
</message>
<message name="IDS_IME_NAME_KEYBOARD_US_WORKMAN_INTERNATIONAL" desc="The input method name shows in system tray menu, this shows [US Workman international keyboard].">
US Workman international keyboard
</message>
<message name="IDS_IME_NAME_KEYBOARD_US" desc="The input method name shows in system tray menu, this shows [US keyboard].">
US keyboard
</message>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,20 @@ class InputMethodManagerImplTest : public BrowserWithTestWindowTest {
ext_xkb_engine_colemak.layouts.push_back("us(colemak)");
ext_xkb.engines.push_back(ext_xkb_engine_colemak);

ComponentExtensionEngine ext_xkb_engine_workman;
ext_xkb_engine_workman.engine_id = "xkb:us:workman:eng";
ext_xkb_engine_workman.display_name = "xkb:us:workman:eng";
ext_xkb_engine_workman.language_codes.push_back("en-US");
ext_xkb_engine_workman.layouts.push_back("us(workman)");
ext_xkb.engines.push_back(ext_xkb_engine_workman);

ComponentExtensionEngine ext_xkb_engine_workman_intl;
ext_xkb_engine_workman_intl.engine_id = "xkb:us:workman-intl:eng";
ext_xkb_engine_workman_intl.display_name = "xkb:us:workman-intl:eng";
ext_xkb_engine_workman_intl.language_codes.push_back("en-US");
ext_xkb_engine_workman_intl.layouts.push_back("us(workman-intl)");
ext_xkb.engines.push_back(ext_xkb_engine_workman_intl);

ComponentExtensionEngine ext_xkb_engine_fr;
ext_xkb_engine_fr.engine_id = "xkb:fr::fra";
ext_xkb_engine_fr.display_name = "xkb:fr::fra";
Expand Down Expand Up @@ -376,7 +390,7 @@ TEST_F(InputMethodManagerImplTest, TestObserver) {
menu_manager_->AddObserver(&observer);
EXPECT_EQ(0, observer.input_method_changed_count_);
manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts);
EXPECT_EQ(6U, manager_->GetActiveIMEState()->GetActiveInputMethods()->size());
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetActiveInputMethods()->size());
EXPECT_EQ(1, observer.input_method_changed_count_);
// Menu change is triggered only if current input method was actually changed.
EXPECT_EQ(0, observer.input_method_menu_item_changed_count_);
Expand Down Expand Up @@ -424,13 +438,13 @@ TEST_F(InputMethodManagerImplTest, TestGetSupportedInputMethods) {
}

TEST_F(InputMethodManagerImplTest, TestEnableLayouts) {
// Currently 6 keyboard layouts are supported for en-US, and 1 for ja. See
// Currently 8 keyboard layouts are supported for en-US, and 1 for ja. See
// ibus_input_method.txt.
std::vector<std::string> keyboard_layouts;

InitComponentExtension();
manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts);
EXPECT_EQ(6U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());

// For http://crbug.com/19655#c11 - (5)
// The hardware keyboard layout "xkb:us::eng" is always active, hence 2U.
Expand Down Expand Up @@ -460,8 +474,8 @@ TEST_F(InputMethodManagerImplTest, TestEnableLayoutsNonUsHardwareKeyboard) {
"en-US",
manager_->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
EXPECT_EQ(
7U,
manager_->GetActiveIMEState()->GetNumActiveInputMethods()); // 6 + French
9U,
manager_->GetActiveIMEState()->GetNumActiveInputMethods()); // 8 + French
// The physical layout is Japanese.
manager_->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
"xkb:jp::jpn");
Expand Down Expand Up @@ -489,8 +503,8 @@ TEST_F(InputMethodManagerImplTest, TestEnableMultipleHardwareKeyboardLayout) {
manager_->GetActiveIMEState()->EnableLoginLayouts(
"en-US",
manager_->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
// 6 + French + Hungarian
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
// 8 + French + Hungarian
EXPECT_EQ(10U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
}

TEST_F(InputMethodManagerImplTest,
Expand Down Expand Up @@ -901,7 +915,7 @@ TEST_F(InputMethodManagerImplTest, TestNextInputMethod) {
keyboard_layouts.push_back(ImeIdFromEngineId("xkb:us::eng"));
// For http://crbug.com/19655#c11 - (1)
manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts);
EXPECT_EQ(6U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_EQ(ImeIdFromEngineId("xkb:us::eng"),
manager_->GetActiveIMEState()->GetCurrentInputMethod().id());
EXPECT_EQ("us", keyboard_->last_layout_);
Expand Down Expand Up @@ -932,6 +946,16 @@ TEST_F(InputMethodManagerImplTest, TestNextInputMethod) {
EXPECT_EQ("us(colemak)", keyboard_->last_layout_);
manager_->GetActiveIMEState()->SwitchToNextInputMethod();
EXPECT_TRUE(observer.last_show_message_);
EXPECT_EQ(ImeIdFromEngineId("xkb:us:workman:eng"),
manager_->GetActiveIMEState()->GetCurrentInputMethod().id());
EXPECT_EQ("us(workman)", keyboard_->last_layout_);
manager_->GetActiveIMEState()->SwitchToNextInputMethod();
EXPECT_TRUE(observer.last_show_message_);
EXPECT_EQ(ImeIdFromEngineId("xkb:us:workman-intl:eng"),
manager_->GetActiveIMEState()->GetCurrentInputMethod().id());
EXPECT_EQ("us(workman-intl)", keyboard_->last_layout_);
manager_->GetActiveIMEState()->SwitchToNextInputMethod();
EXPECT_TRUE(observer.last_show_message_);
EXPECT_EQ(ImeIdFromEngineId("xkb:us::eng"),
manager_->GetActiveIMEState()->GetCurrentInputMethod().id());
EXPECT_EQ("us", keyboard_->last_layout_);
Expand All @@ -947,7 +971,7 @@ TEST_F(InputMethodManagerImplTest, TestPreviousInputMethod) {
std::vector<std::string> keyboard_layouts;
keyboard_layouts.push_back(ImeIdFromEngineId("xkb:us::eng"));
manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts);
EXPECT_EQ(6U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_TRUE(manager_->GetActiveIMEState()->CanCycleInputMethod());
EXPECT_EQ(ImeIdFromEngineId("xkb:us::eng"),
manager_->GetActiveIMEState()->GetCurrentInputMethod().id());
Expand Down Expand Up @@ -1019,7 +1043,7 @@ TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithUsLayouts) {
std::vector<std::string> keyboard_layouts;
keyboard_layouts.push_back(ImeIdFromEngineId("xkb:us::eng"));
manager_->GetActiveIMEState()->EnableLoginLayouts("en-US", keyboard_layouts);
EXPECT_EQ(6U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
EXPECT_EQ(8U, manager_->GetActiveIMEState()->GetNumActiveInputMethods());

// Henkan, Muhenkan, ZenkakuHankaku should be ignored when no Japanese IMEs
// and keyboards are enabled.
Expand Down
5 changes: 5 additions & 0 deletions chrome/browser/chromeos/input_method/input_method_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ const struct EnglishToResouceId {
{"xkb:us:intl:eng", IDS_STATUSBAR_LAYOUT_USA_INTERNATIONAL},
{"xkb:us:intl:nld", IDS_STATUSBAR_LAYOUT_USA_INTERNATIONAL},
{"xkb:us:intl:por", IDS_STATUSBAR_LAYOUT_USA_INTERNATIONAL},
{"xkb:us:workman-intl:eng", IDS_STATUSBAR_LAYOUT_USA_WORKMAN_INTERNATIONAL},
{"xkb:us:workman:eng", IDS_STATUSBAR_LAYOUT_USA_WORKMAN},
};
const size_t kEnglishToResourceIdArraySize =
arraysize(kEnglishToResourceIdArray);
Expand Down Expand Up @@ -329,6 +331,9 @@ const struct InputMethodNameMap {
{"__MSG_KEYBOARD_US_EXTENDED__", IDS_IME_NAME_KEYBOARD_US_EXTENDED},
{"__MSG_KEYBOARD_US_INTERNATIONAL__",
IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL},
{"__MSG_KEYBOARD_US_WORKMAN_INTERNATIONAL__",
IDS_IME_NAME_KEYBOARD_US_WORKMAN_INTERNATIONAL},
{"__MSG_KEYBOARD_US_WORKMAN__", IDS_IME_NAME_KEYBOARD_US_WORKMAN},
{"__MSG_KEYBOARD_US__", IDS_IME_NAME_KEYBOARD_US},
{"__MSG_KEYBOARD_VIETNAMESE_TCVN__", IDS_IME_NAME_KEYBOARD_VIETNAMESE_TCVN},
{"__MSG_KEYBOARD_VIETNAMESE_TELEX__",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ void Append_en_US_InputMethods(std::vector<std::string>* out) {
out->push_back("xkb:us:dvorak:eng");
out->push_back("xkb:us:dvp:eng");
out->push_back("xkb:us:colemak:eng");
out->push_back("xkb:us:workman:eng");
out->push_back("xkb:us:workman-intl:eng");
chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(out);
}

Expand Down
109 changes: 49 additions & 60 deletions chrome/browser/chromeos/login/oobe_localization_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,66 +76,55 @@ struct LocalizationTestParams {
const char* expected_keyboard_layout;
const char* expected_keyboard_select_control;
} const oobe_localization_test_parameters[] = {
// ------------------ Non-Latin setup
// For a non-Latin keyboard layout like Russian, we expect to see the US
// keyboard.
{"ru", "xkb:ru::rus", "ru", kUSLayout, "xkb:us::eng"},
{"ru", "xkb:us::eng,xkb:ru::rus", "ru", kUSLayout, "xkb:us::eng"},

// IMEs do not load at OOBE, so we just expect to see the (Latin) Japanese
// keyboard.
{"ja", "xkb:jp::jpn", "ja", "xkb:jp::jpn", "xkb:jp::jpn,[xkb:us::eng]"},

// We don't use the Icelandic locale but the Icelandic keyboard layout
// should still be selected when specified as the default.
{"en-US",
"xkb:is::ice",
"en-US",
"xkb:is::ice",
"xkb:is::ice,[xkb:us::eng,xkb:us:intl:eng,xkb:us:altgr-intl:eng,"
"xkb:us:dvorak:eng,xkb:us:dvp:eng,xkb:us:colemak:eng]"},
// ------------------ Full Latin setup
// French Swiss keyboard.
{"fr",
"xkb:ch:fr:fra",
"fr",
"xkb:ch:fr:fra",
"xkb:ch:fr:fra,[xkb:fr::fra,xkb:be::fra,xkb:ca::fra,"
"xkb:ca:multix:fra,xkb:us::eng]"},

// German Swiss keyboard.
{"de",
"xkb:ch::ger",
"de",
"xkb:ch::ger",
"xkb:ch::ger,[xkb:de::ger,xkb:de:neo:ger,xkb:be::ger,xkb:us::eng]"},

// NetworkScreenMultipleLocales
{"es,en-US,nl",
"xkb:be::nld",
"es,en-US,nl",
"xkb:be::nld",
"xkb:be::nld,[xkb:es::spa,xkb:latam::spa,xkb:us::eng]"},

{"ru,de", "xkb:ru::rus", "ru,de", kUSLayout, "xkb:us::eng"},

// TODO(alemate/michaelpg): Figure out why these tests are failing
// and re-enable them. crbug.com/422702.
// ------------------ Regional Locales
// Syntetic example to test correct merging of different locales.
// {"fr-CH,it-CH,de-CH",
// "xkb:fr::fra,xkb:it::ita,xkb:de::ger",
// "fr-CH,it-CH,de-CH",
// "xkb:fr::fra",
// "xkb:fr::fra,xkb:it::ita,xkb:de::ger,[xkb:be::fra,xkb:ca::fra,"
// "xkb:ch:fr:fra,xkb:ca:multix:fra,xkb:us::eng]"},

// Another syntetic example. Check that british keyboard is available.
// {"en-AU",
// "xkb:us::eng",
// "en-AU",
// "xkb:us::eng",
// "xkb:us::eng,[xkb:gb:extd:eng,xkb:gb:dvorak:eng]"},
// ------------------ Non-Latin setup
// For a non-Latin keyboard layout like Russian, we expect to see the US
// keyboard.
{"ru", "xkb:ru::rus", "ru", kUSLayout, "xkb:us::eng"},
{"ru", "xkb:us::eng,xkb:ru::rus", "ru", kUSLayout, "xkb:us::eng"},

// IMEs do not load at OOBE, so we just expect to see the (Latin) Japanese
// keyboard.
{"ja", "xkb:jp::jpn", "ja", "xkb:jp::jpn", "xkb:jp::jpn,[xkb:us::eng]"},

// We don't use the Icelandic locale but the Icelandic keyboard layout
// should still be selected when specified as the default.
{"en-US", "xkb:is::ice", "en-US", "xkb:is::ice",
"xkb:is::ice,[xkb:us::eng,xkb:us:intl:eng,xkb:us:altgr-intl:eng,"
"xkb:us:dvorak:eng,xkb:us:dvp:eng,xkb:us:colemak:eng,"
"xkb:us:workman:eng,xkb:us:workman-intl:eng]"},
// ------------------ Full Latin setup
// French Swiss keyboard.
{"fr", "xkb:ch:fr:fra", "fr", "xkb:ch:fr:fra",
"xkb:ch:fr:fra,[xkb:fr::fra,xkb:be::fra,xkb:ca::fra,"
"xkb:ca:multix:fra,xkb:us::eng]"},

// German Swiss keyboard.
{"de", "xkb:ch::ger", "de", "xkb:ch::ger",
"xkb:ch::ger,[xkb:de::ger,xkb:de:neo:ger,xkb:be::ger,xkb:us::eng]"},

// NetworkScreenMultipleLocales
{"es,en-US,nl", "xkb:be::nld", "es,en-US,nl", "xkb:be::nld",
"xkb:be::nld,[xkb:es::spa,xkb:latam::spa,xkb:us::eng]"},

{"ru,de", "xkb:ru::rus", "ru,de", kUSLayout, "xkb:us::eng"},

// TODO(alemate/michaelpg): Figure out why these tests are failing
// and re-enable them. crbug.com/422702.
// ------------------ Regional Locales
// Syntetic example to test correct merging of different locales.
// {"fr-CH,it-CH,de-CH",
// "xkb:fr::fra,xkb:it::ita,xkb:de::ger",
// "fr-CH,it-CH,de-CH",
// "xkb:fr::fra",
// "xkb:fr::fra,xkb:it::ita,xkb:de::ger,[xkb:be::fra,xkb:ca::fra,"
// "xkb:ch:fr:fra,xkb:ca:multix:fra,xkb:us::eng]"},

// Another syntetic example. Check that british keyboard is available.
// {"en-AU",
// "xkb:us::eng",
// "en-AU",
// "xkb:us::eng",
// "xkb:us::eng,[xkb:gb:extd:eng,xkb:gb:dvorak:eng]"},
};

class OobeLocalizationTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,38 @@
"input_view": "inputview.html#id=us-colemak&language=en-US&passwordLayout=us-colemak&name=keyboard_us_colemak",
"options_page": "hmm_options.html?code=xkb:us:colemak:eng"
},
{
"name": "__MSG_keyboard_us_workman__",
"type": "ime",
"id": "xkb:us:workman:eng",
"indicator": "WM",
"description": "",
"language": [
"en",
"en-US"
],
"layouts": [
"us(workman)"
],
"input_view": "inputview.html#id=us-workman&language=en-US&passwordLayout=us-workman&name=keyboard_us_workman",
"options_page": "hmm_options.html?code=xkb:us:workman:eng"
},
{
"name": "__MSG_keyboard_us_workman_international__",
"type": "ime",
"id": "xkb:us:workman-intl:eng",
"indicator": "WMI",
"description": "",
"language": [
"en",
"en-US"
],
"layouts": [
"us(workman-intl)"
],
"input_view": "inputview.html#id=us-workman-intl&language=en-US&passwordLayout=us-workman-intl&name=keyboard_us_workman_international",
"options_page": "hmm_options.html?code=xkb:us:workman-intl:eng"
},
{
"name": "__MSG_keyboard_belgian__",
"type": "ime",
Expand Down
30 changes: 30 additions & 0 deletions chrome/browser/resources/chromeos/input_method/xkb_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,36 @@
],
"input_view": "inputview.html?id=us-colemak&language=en-US&passwordLayout=us-colemak&name=keyboard_us_colemak"
},
{
"name": "__MSG_keyboard_us_workman__",
"type": "ime",
"id": "xkb:us:workman:eng",
"indicator": "WM",
"description": "",
"language": [
"en",
"en-US"
],
"layouts": [
"us(workman)"
],
"input_view": "inputview.html?id=us-workman&language=en-US&passwordLayout=us-workman&name=keyboard_us_workman"
},
{
"name": "__MSG_keyboard_us_workman_international__",
"type": "ime",
"id": "xkb:us:workman-intl:eng",
"indicator": "WMI",
"description": "",
"language": [
"en",
"en-US"
],
"layouts": [
"us(workman-intl)"
],
"input_view": "inputview.html?id=us-workman-intl&language=en-US&passwordLayout=us-workman-intl&name=keyboard_us_workman_international"
},
{
"name": "__MSG_keyboard_belgian__",
"type": "ime",
Expand Down
22 changes: 12 additions & 10 deletions chromeos/ime/input_methods.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,18 @@
#

# U.S. English
xkb:us::eng us en,en-US,en-AU,en-NZ US login
xkb:us:intl:eng us(intl) en,en-US INTL login
xkb:us:altgr-intl:eng us(altgr-intl) en,en-US EXTD login
xkb:us:dvorak:eng us(dvorak) en,en-US DV login
xkb:us:colemak:eng us(colemak) en,en-US CO login
xkb:us:intl:nld us(intl) nl INTL login
xkb:us:intl:por us(intl) pt-BR INTL login
xkb:us::ind us id US login
xkb:us::fil us fil US login
xkb:us::msa us ms US login
xkb:us::eng us en,en-US,en-AU,en-NZ US login
xkb:us:intl:eng us(intl) en,en-US INTL login
xkb:us:altgr-intl:eng us(altgr-intl) en,en-US EXTD login
xkb:us:dvorak:eng us(dvorak) en,en-US DV login
xkb:us:colemak:eng us(colemak) en,en-US CO login
xkb:us:workman:eng us(workman) en,en-US WM login
xkb:us:workman-intl:eng us(workman-intl) en,en-US WMI login
xkb:us:intl:nld us(intl) nl INTL login
xkb:us:intl:por us(intl) pt-BR INTL login
xkb:us::ind us id US login
xkb:us::fil us fil US login
xkb:us::msa us ms US login

# U.S. English entiries have to be above the Dutch entry so that xkb:us:intl:eng
# will be selected as the default keyboard when the UI language is set to Dutch.
Expand Down
4 changes: 3 additions & 1 deletion tools/gen_keyboard_overlay_data/gen_keyboard_overlay_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,9 @@
'xkb:us:dvorak:eng': 'en_US_dvorak',
'xkb:us:intl:eng': 'en_US_intl',
'xkb:us:intl:nld': 'en_US_intl',
'xkb:us:intl:por': 'en_US_intl'
'xkb:us:intl:por': 'en_US_intl',
'xkb:us:workman:eng': 'en_US_workman',
'xkb:us:workman-intl:eng': 'en_US_workman_intl',
}

# The file was first generated in 2012 and we have a policy of not updating
Expand Down
Loading

0 comments on commit e92f7d6

Please sign in to comment.