Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / chromeos / keyboard_overlay_ui.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.h"
6
7 #include "ash/display/display_manager.h"
8 #include "ash/shell.h"
9 #include "base/bind.h"
10 #include "base/bind_helpers.h"
11 #include "base/command_line.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/prefs/pref_service.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "base/values.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/pref_names.h"
18 #include "chrome/common/url_constants.h"
19 #include "chrome/grit/chromium_strings.h"
20 #include "chrome/grit/generated_resources.h"
21 #include "chromeos/chromeos_switches.h"
22 #include "chromeos/ime/ime_keyboard.h"
23 #include "chromeos/ime/input_method_manager.h"
24 #include "content/public/browser/page_navigator.h"
25 #include "content/public/browser/web_contents.h"
26 #include "content/public/browser/web_contents_delegate.h"
27 #include "content/public/browser/web_ui.h"
28 #include "content/public/browser/web_ui_data_source.h"
29 #include "content/public/browser/web_ui_message_handler.h"
30 #include "grit/browser_resources.h"
31
32 using chromeos::input_method::ModifierKey;
33 using content::WebUIMessageHandler;
34 using ui::WebDialogUI;
35
36 namespace {
37
38 const char kLearnMoreURL[] =
39 #if defined(OFFICIAL_BUILD)
40     "chrome-extension://honijodknafkokifofgiaalefdiedpko/"
41     "main.html?answer=188743";
42 #else
43     "http://support.google.com/chromeos/bin/answer.py?answer=183101";
44 #endif
45
46 struct ModifierToLabel {
47   const ModifierKey modifier;
48   const char* label;
49 } kModifierToLabels[] = {
50   {chromeos::input_method::kSearchKey, "search"},
51   {chromeos::input_method::kControlKey, "ctrl"},
52   {chromeos::input_method::kAltKey, "alt"},
53   {chromeos::input_method::kVoidKey, "disabled"},
54   {chromeos::input_method::kCapsLockKey, "caps lock"},
55   {chromeos::input_method::kEscapeKey, "esc"},
56 };
57
58 struct I18nContentToMessage {
59   const char* i18n_content;
60   int message;
61 } kI18nContentToMessage[] = {
62   { "keyboardOverlayLearnMore", IDS_KEYBOARD_OVERLAY_LEARN_MORE },
63   { "keyboardOverlayTitle", IDS_KEYBOARD_OVERLAY_TITLE },
64   { "keyboardOverlayInstructions", IDS_KEYBOARD_OVERLAY_INSTRUCTIONS },
65   { "keyboardOverlayInstructionsHide", IDS_KEYBOARD_OVERLAY_INSTRUCTIONS_HIDE },
66   { "keyboardOverlayActivateLastShelfItem",
67     IDS_KEYBOARD_OVERLAY_ACTIVATE_LAST_SHELF_ITEM },
68   { "keyboardOverlayActivateLastTab", IDS_KEYBOARD_OVERLAY_ACTIVATE_LAST_TAB },
69   { "keyboardOverlayActivateShelfItem1",
70     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_1 },
71   { "keyboardOverlayActivateShelfItem2",
72     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_2 },
73   { "keyboardOverlayActivateShelfItem3",
74     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_3 },
75   { "keyboardOverlayActivateShelfItem4",
76     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_4 },
77   { "keyboardOverlayActivateShelfItem5",
78     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_5 },
79   { "keyboardOverlayActivateShelfItem6",
80     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_6 },
81   { "keyboardOverlayActivateShelfItem7",
82     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_7 },
83   { "keyboardOverlayActivateShelfItem8",
84     IDS_KEYBOARD_OVERLAY_ACTIVATE_SHELF_ITEM_8 },
85   { "keyboardOverlayActivateNextTab", IDS_KEYBOARD_OVERLAY_ACTIVATE_NEXT_TAB },
86   { "keyboardOverlayActivatePreviousTab",
87     IDS_KEYBOARD_OVERLAY_ACTIVATE_PREVIOUS_TAB },
88   { "keyboardOverlayActivateTab1", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_1 },
89   { "keyboardOverlayActivateTab2", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_2 },
90   { "keyboardOverlayActivateTab3", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_3 },
91   { "keyboardOverlayActivateTab4", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_4 },
92   { "keyboardOverlayActivateTab5", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_5 },
93   { "keyboardOverlayActivateTab6", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_6 },
94   { "keyboardOverlayActivateTab7", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_7 },
95   { "keyboardOverlayActivateTab8", IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_8 },
96   { "keyboardOverlayAddWwwAndComAndOpenAddress",
97     IDS_KEYBOARD_OVERLAY_ADD_WWW_AND_COM_AND_OPEN_ADDRESS },
98   { "keyboardOverlayBookmarkAllTabs", IDS_KEYBOARD_OVERLAY_BOOKMARK_ALL_TABS },
99   { "keyboardOverlayBookmarkCurrentPage",
100     IDS_KEYBOARD_OVERLAY_BOOKMARK_CURRENT_PAGE },
101   { "keyboardOverlayBookmarkManager", IDS_KEYBOARD_OVERLAY_BOOKMARK_MANAGER },
102   { "keyboardOverlayCenterWindow", IDS_KEYBOARD_OVERLAY_CENTER_WINDOW },
103   { "keyboardOverlayClearBrowsingDataDialog",
104     IDS_KEYBOARD_OVERLAY_CLEAR_BROWSING_DATA_DIALOG },
105   { "keyboardOverlayCloseTab", IDS_KEYBOARD_OVERLAY_CLOSE_TAB },
106   { "keyboardOverlayCloseWindow", IDS_KEYBOARD_OVERLAY_CLOSE_WINDOW },
107   { "keyboardOverlayCopy", IDS_KEYBOARD_OVERLAY_COPY },
108   { "keyboardOverlayCut", IDS_KEYBOARD_OVERLAY_CUT },
109   { "keyboardOverlayCycleThroughInputMethods",
110     IDS_KEYBOARD_OVERLAY_CYCLE_THROUGH_INPUT_METHODS },
111   { "keyboardOverlayDecreaseKeyBrightness",
112     IDS_KEYBOARD_OVERLAY_DECREASE_KEY_BRIGHTNESS },
113   { "keyboardOverlayDelete", IDS_KEYBOARD_OVERLAY_DELETE },
114   { "keyboardOverlayDeleteWord", IDS_KEYBOARD_OVERLAY_DELETE_WORD },
115   { "keyboardOverlayDeveloperTools", IDS_KEYBOARD_OVERLAY_DEVELOPER_TOOLS },
116   { "keyboardOverlayDockWindowLeft", IDS_KEYBOARD_OVERLAY_DOCK_WINDOW_LEFT },
117   { "keyboardOverlayDockWindowRight", IDS_KEYBOARD_OVERLAY_DOCK_WINDOW_RIGHT },
118   { "keyboardOverlayDomInspector", IDS_KEYBOARD_OVERLAY_DOM_INSPECTOR },
119   { "keyboardOverlayDownloads", IDS_KEYBOARD_OVERLAY_DOWNLOADS },
120   { "keyboardOverlayEnd", IDS_KEYBOARD_OVERLAY_END },
121   { "keyboardOverlayF1", IDS_KEYBOARD_OVERLAY_F1 },
122   { "keyboardOverlayF10", IDS_KEYBOARD_OVERLAY_F10 },
123   { "keyboardOverlayF11", IDS_KEYBOARD_OVERLAY_F11 },
124   { "keyboardOverlayF12", IDS_KEYBOARD_OVERLAY_F12 },
125   { "keyboardOverlayF2", IDS_KEYBOARD_OVERLAY_F2 },
126   { "keyboardOverlayF3", IDS_KEYBOARD_OVERLAY_F3 },
127   { "keyboardOverlayF4", IDS_KEYBOARD_OVERLAY_F4 },
128   { "keyboardOverlayF5", IDS_KEYBOARD_OVERLAY_F5 },
129   { "keyboardOverlayF6", IDS_KEYBOARD_OVERLAY_F6 },
130   { "keyboardOverlayF7", IDS_KEYBOARD_OVERLAY_F7 },
131   { "keyboardOverlayF8", IDS_KEYBOARD_OVERLAY_F8 },
132   { "keyboardOverlayF9", IDS_KEYBOARD_OVERLAY_F9 },
133   { "keyboardOverlayFindPreviousText",
134     IDS_KEYBOARD_OVERLAY_FIND_PREVIOUS_TEXT },
135   { "keyboardOverlayFindText", IDS_KEYBOARD_OVERLAY_FIND_TEXT },
136   { "keyboardOverlayFindTextAgain", IDS_KEYBOARD_OVERLAY_FIND_TEXT_AGAIN },
137   { "keyboardOverlayFocusAddressBar", IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR },
138   { "keyboardOverlayFocusAddressBarInSearchMode",
139     IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR_IN_SEARCH_MODE },
140   { "keyboardOverlayFocusBookmarks", IDS_KEYBOARD_OVERLAY_FOCUS_BOOKMARKS },
141   { "keyboardOverlayFocusShelf", IDS_KEYBOARD_OVERLAY_FOCUS_SHELF },
142   { "keyboardOverlayFocusNextPane", IDS_KEYBOARD_OVERLAY_FOCUS_NEXT_PANE },
143   { "keyboardOverlayFocusPreviousPane",
144     IDS_KEYBOARD_OVERLAY_FOCUS_PREVIOUS_PANE },
145   { "keyboardOverlayFocusToolbar", IDS_KEYBOARD_OVERLAY_FOCUS_TOOLBAR },
146   { "keyboardOverlayGoBack", IDS_KEYBOARD_OVERLAY_GO_BACK },
147   { "keyboardOverlayGoForward", IDS_KEYBOARD_OVERLAY_GO_FORWARD },
148   { "keyboardOverlayHelp", IDS_KEYBOARD_OVERLAY_HELP },
149   { "keyboardOverlayHistory", IDS_KEYBOARD_OVERLAY_HISTORY },
150   { "keyboardOverlayHome", IDS_KEYBOARD_OVERLAY_HOME },
151   { "keyboardOverlayIncreaseKeyBrightness",
152     IDS_KEYBOARD_OVERLAY_INCREASE_KEY_BRIGHTNESS },
153   { "keyboardOverlayInputUnicodeCharacters",
154     IDS_KEYBOARD_OVERLAY_INPUT_UNICODE_CHARACTERS },
155   { "keyboardOverlayInsert", IDS_KEYBOARD_OVERLAY_INSERT },
156   { "keyboardOverlayJavascriptConsole",
157     IDS_KEYBOARD_OVERLAY_JAVASCRIPT_CONSOLE },
158   { "keyboardOverlayLockScreen", IDS_KEYBOARD_OVERLAY_LOCK_SCREEN },
159   { "keyboardOverlayLockScreenOrPowerOff",
160     IDS_KEYBOARD_OVERLAY_LOCK_SCREEN_OR_POWER_OFF },
161   { "keyboardOverlayMagnifierDecreaseZoom",
162     IDS_KEYBOARD_OVERLAY_MAGNIFIER_DECREASE_ZOOM },
163   { "keyboardOverlayMagnifierIncreaseZoom",
164     IDS_KEYBOARD_OVERLAY_MAGNIFIER_INCREASE_ZOOM },
165   { "keyboardOverlayMaximizeWindow", IDS_KEYBOARD_OVERLAY_MAXIMIZE_WINDOW },
166   { "keyboardOverlayMinimizeWindow", IDS_KEYBOARD_OVERLAY_MINIMIZE_WINDOW },
167   { "keyboardOverlayMirrorMonitors", IDS_KEYBOARD_OVERLAY_MIRROR_MONITORS },
168   { "keyboardOverlayNewIncognitoWindow",
169     IDS_KEYBOARD_OVERLAY_NEW_INCOGNITO_WINDOW },
170   { "keyboardOverlayNewTab", IDS_KEYBOARD_OVERLAY_NEW_TAB },
171   { "keyboardOverlayNewTerminal", IDS_KEYBOARD_OVERLAY_NEW_TERMINAL },
172   { "keyboardOverlayNewWindow", IDS_KEYBOARD_OVERLAY_NEW_WINDOW },
173   { "keyboardOverlayNextUser", IDS_KEYBOARD_OVERLAY_NEXT_USER },
174   { "keyboardOverlayNextWindow", IDS_KEYBOARD_OVERLAY_NEXT_WINDOW },
175   { "keyboardOverlayNextWord", IDS_KEYBOARD_OVERLAY_NEXT_WORD },
176   { "keyboardOverlayOpen", IDS_KEYBOARD_OVERLAY_OPEN },
177   { "keyboardOverlayOpenAddressInNewTab",
178     IDS_KEYBOARD_OVERLAY_OPEN_ADDRESS_IN_NEW_TAB },
179   { "keyboardOverlayOpenFileManager", IDS_KEYBOARD_OVERLAY_OPEN_FILE_MANAGER },
180   { "keyboardOverlayOpenGoogleCloudPrint",
181     IDS_KEYBOARD_OVERLAY_OPEN_GOOGLE_CLOUD_PRINT },
182   { "keyboardOverlayPageDown", IDS_KEYBOARD_OVERLAY_PAGE_DOWN },
183   { "keyboardOverlayPageUp", IDS_KEYBOARD_OVERLAY_PAGE_UP },
184   { "keyboardOverlayPaste", IDS_KEYBOARD_OVERLAY_PASTE },
185   { "keyboardOverlayPasteAsPlainText",
186     IDS_KEYBOARD_OVERLAY_PASTE_AS_PLAIN_TEXT },
187   { "keyboardOverlayPreviousUser", IDS_KEYBOARD_OVERLAY_PREVIOUS_USER },
188   { "keyboardOverlayPreviousWindow", IDS_KEYBOARD_OVERLAY_PREVIOUS_WINDOW },
189   { "keyboardOverlayPreviousWord", IDS_KEYBOARD_OVERLAY_PREVIOUS_WORD },
190   { "keyboardOverlayPrint", IDS_KEYBOARD_OVERLAY_PRINT },
191   { "keyboardOverlayReloadCurrentPage",
192     IDS_KEYBOARD_OVERLAY_RELOAD_CURRENT_PAGE },
193   { "keyboardOverlayReloadIgnoringCache",
194     IDS_KEYBOARD_OVERLAY_RELOAD_IGNORING_CACHE },
195   { "keyboardOverlayReopenLastClosedTab",
196     IDS_KEYBOARD_OVERLAY_REOPEN_LAST_CLOSED_TAB },
197   { "keyboardOverlayReportIssue", IDS_KEYBOARD_OVERLAY_REPORT_ISSUE },
198   { "keyboardOverlayResetScreenZoom", IDS_KEYBOARD_OVERLAY_RESET_SCREEN_ZOOM },
199   { "keyboardOverlayResetZoom", IDS_KEYBOARD_OVERLAY_RESET_ZOOM },
200   { "keyboardOverlayRotateScreen", IDS_KEYBOARD_OVERLAY_ROTATE_SCREEN },
201   { "keyboardOverlaySave", IDS_KEYBOARD_OVERLAY_SAVE },
202   { "keyboardOverlayScreenshotRegion",
203     IDS_KEYBOARD_OVERLAY_SCREENSHOT_REGION },
204   { "keyboardOverlayScrollUpOnePage",
205     IDS_KEYBOARD_OVERLAY_SCROLL_UP_ONE_PAGE },
206   { "keyboardOverlaySelectAll", IDS_KEYBOARD_OVERLAY_SELECT_ALL },
207   { "keyboardOverlaySelectPreviousInputMethod",
208     IDS_KEYBOARD_OVERLAY_SELECT_PREVIOUS_INPUT_METHOD },
209   { "keyboardOverlaySelectWordAtATime",
210     IDS_KEYBOARD_OVERLAY_SELECT_WORD_AT_A_TIME },
211   { "keyboardOverlayShowMessageCenter",
212     IDS_KEYBOARD_OVERLAY_SHOW_MESSAGE_CENTER },
213   { "keyboardOverlayShowStatusMenu", IDS_KEYBOARD_OVERLAY_SHOW_STATUS_MENU },
214   { "keyboardOverlayShowWrenchMenu", IDS_KEYBOARD_OVERLAY_SHOW_WRENCH_MENU },
215   { "keyboardOverlaySignOut", IDS_KEYBOARD_OVERLAY_SIGN_OUT },
216   { "keyboardOverlaySwapPrimaryMonitor",
217     IDS_KEYBOARD_OVERLAY_SWAP_PRIMARY_MONITOR },
218   { "keyboardOverlayTakeScreenshot", IDS_KEYBOARD_OVERLAY_TAKE_SCREENSHOT },
219   { "keyboardOverlayTaskManager", IDS_KEYBOARD_OVERLAY_TASK_MANAGER },
220   { "keyboardOverlayToggleBookmarkBar",
221     IDS_KEYBOARD_OVERLAY_TOGGLE_BOOKMARK_BAR },
222   { "keyboardOverlayToggleCapsLock", IDS_KEYBOARD_OVERLAY_TOGGLE_CAPS_LOCK },
223   { "keyboardOverlayToggleChromevoxSpokenFeedback",
224     IDS_KEYBOARD_OVERLAY_TOGGLE_CHROMEVOX_SPOKEN_FEEDBACK },
225   { "keyboardOverlayToggleProjectionTouchHud",
226     IDS_KEYBOARD_OVERLAY_TOGGLE_PROJECTION_TOUCH_HUD },
227   { "keyboardOverlayToggleSpeechInput",
228     IDS_KEYBOARD_OVERLAY_TOGGLE_SPEECH_INPUT },
229   { "keyboardOverlayUndo", IDS_KEYBOARD_OVERLAY_UNDO },
230   { "keyboardOverlayViewKeyboardOverlay",
231     IDS_KEYBOARD_OVERLAY_VIEW_KEYBOARD_OVERLAY },
232   { "keyboardOverlayViewSource", IDS_KEYBOARD_OVERLAY_VIEW_SOURCE },
233   { "keyboardOverlayWordMove", IDS_KEYBOARD_OVERLAY_WORD_MOVE },
234   { "keyboardOverlayZoomIn", IDS_KEYBOARD_OVERLAY_ZOOM_IN },
235   { "keyboardOverlayZoomOut", IDS_KEYBOARD_OVERLAY_ZOOM_OUT },
236   { "keyboardOverlayZoomScreenIn", IDS_KEYBOARD_OVERLAY_ZOOM_SCREEN_IN },
237   { "keyboardOverlayZoomScreenOut", IDS_KEYBOARD_OVERLAY_ZOOM_SCREEN_OUT },
238 };
239
240 std::string ModifierKeyToLabel(ModifierKey modifier) {
241   for (size_t i = 0; i < arraysize(kModifierToLabels); ++i) {
242     if (modifier == kModifierToLabels[i].modifier) {
243       return kModifierToLabels[i].label;
244     }
245   }
246   return "";
247 }
248
249 content::WebUIDataSource* CreateKeyboardOverlayUIHTMLSource() {
250   content::WebUIDataSource* source =
251       content::WebUIDataSource::Create(chrome::kChromeUIKeyboardOverlayHost);
252
253   for (size_t i = 0; i < arraysize(kI18nContentToMessage); ++i) {
254     source->AddLocalizedString(kI18nContentToMessage[i].i18n_content,
255                                kI18nContentToMessage[i].message);
256   }
257
258   source->AddString("keyboardOverlayLearnMoreURL",
259                     base::UTF8ToUTF16(kLearnMoreURL));
260   source->AddBoolean("keyboardOverlayHasChromeOSDiamondKey",
261                      CommandLine::ForCurrentProcess()->HasSwitch(
262                          chromeos::switches::kHasChromeOSDiamondKey));
263   ash::Shell* shell = ash::Shell::GetInstance();
264   ash::DisplayManager* display_manager = shell->display_manager();
265   source->AddBoolean("keyboardOverlayIsDisplayUIScalingEnabled",
266                      display_manager->IsDisplayUIScalingEnabled());
267   source->SetJsonPath("strings.js");
268   source->AddResourcePath("keyboard_overlay.js", IDR_KEYBOARD_OVERLAY_JS);
269   source->SetDefaultResource(IDR_KEYBOARD_OVERLAY_HTML);
270   return source;
271 }
272
273 }  // namespace
274
275 // The handler for Javascript messages related to the "keyboardoverlay" view.
276 class KeyboardOverlayHandler
277     : public WebUIMessageHandler,
278       public base::SupportsWeakPtr<KeyboardOverlayHandler> {
279  public:
280   explicit KeyboardOverlayHandler(Profile* profile);
281   virtual ~KeyboardOverlayHandler();
282
283   // WebUIMessageHandler implementation.
284   virtual void RegisterMessages() override;
285
286  private:
287   // Called when the page requires the input method ID corresponding to the
288   // current input method or keyboard layout during initialization.
289   void GetInputMethodId(const base::ListValue* args);
290
291   // Called when the page requres the information of modifier key remapping
292   // during the initialization.
293   void GetLabelMap(const base::ListValue* args);
294
295   // Called when the learn more link is clicked.
296   void OpenLearnMorePage(const base::ListValue* args);
297
298   Profile* profile_;
299
300   DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayHandler);
301 };
302
303 ////////////////////////////////////////////////////////////////////////////////
304 //
305 // KeyboardOverlayHandler
306 //
307 ////////////////////////////////////////////////////////////////////////////////
308 KeyboardOverlayHandler::KeyboardOverlayHandler(Profile* profile)
309     : profile_(profile) {
310 }
311
312 KeyboardOverlayHandler::~KeyboardOverlayHandler() {
313 }
314
315 void KeyboardOverlayHandler::RegisterMessages() {
316   web_ui()->RegisterMessageCallback("getInputMethodId",
317       base::Bind(&KeyboardOverlayHandler::GetInputMethodId,
318                  base::Unretained(this)));
319   web_ui()->RegisterMessageCallback("getLabelMap",
320       base::Bind(&KeyboardOverlayHandler::GetLabelMap,
321                  base::Unretained(this)));
322   web_ui()->RegisterMessageCallback("openLearnMorePage",
323       base::Bind(&KeyboardOverlayHandler::OpenLearnMorePage,
324                  base::Unretained(this)));
325 }
326
327 void KeyboardOverlayHandler::GetInputMethodId(const base::ListValue* args) {
328   chromeos::input_method::InputMethodManager* manager =
329       chromeos::input_method::InputMethodManager::Get();
330   const chromeos::input_method::InputMethodDescriptor& descriptor =
331       manager->GetActiveIMEState()->GetCurrentInputMethod();
332   base::StringValue param(descriptor.id());
333   web_ui()->CallJavascriptFunction("initKeyboardOverlayId", param);
334 }
335
336 void KeyboardOverlayHandler::GetLabelMap(const base::ListValue* args) {
337   DCHECK(profile_);
338   PrefService* pref_service = profile_->GetPrefs();
339   typedef std::map<ModifierKey, ModifierKey> ModifierMap;
340   ModifierMap modifier_map;
341   modifier_map[chromeos::input_method::kSearchKey] = static_cast<ModifierKey>(
342       pref_service->GetInteger(prefs::kLanguageRemapSearchKeyTo));
343   modifier_map[chromeos::input_method::kControlKey] = static_cast<ModifierKey>(
344       pref_service->GetInteger(prefs::kLanguageRemapControlKeyTo));
345   modifier_map[chromeos::input_method::kAltKey] = static_cast<ModifierKey>(
346       pref_service->GetInteger(prefs::kLanguageRemapAltKeyTo));
347   // TODO(mazda): Support prefs::kLanguageRemapCapsLockKeyTo once Caps Lock is
348   // added to the overlay UI.
349
350   base::DictionaryValue dict;
351   for (ModifierMap::const_iterator i = modifier_map.begin();
352        i != modifier_map.end(); ++i) {
353     dict.SetString(ModifierKeyToLabel(i->first), ModifierKeyToLabel(i->second));
354   }
355
356   web_ui()->CallJavascriptFunction("initIdentifierMap", dict);
357 }
358
359 void KeyboardOverlayHandler::OpenLearnMorePage(const base::ListValue* args) {
360   web_ui()->GetWebContents()->GetDelegate()->OpenURLFromTab(
361       web_ui()->GetWebContents(),
362       content::OpenURLParams(GURL(kLearnMoreURL),
363                              content::Referrer(),
364                              NEW_FOREGROUND_TAB,
365                              ui::PAGE_TRANSITION_LINK,
366                              false));
367 }
368
369 ////////////////////////////////////////////////////////////////////////////////
370 //
371 // KeyboardOverlayUI
372 //
373 ////////////////////////////////////////////////////////////////////////////////
374
375 KeyboardOverlayUI::KeyboardOverlayUI(content::WebUI* web_ui)
376     : WebDialogUI(web_ui) {
377   Profile* profile = Profile::FromWebUI(web_ui);
378   KeyboardOverlayHandler* handler = new KeyboardOverlayHandler(profile);
379   web_ui->AddMessageHandler(handler);
380
381   // Set up the chrome://keyboardoverlay/ source.
382   content::WebUIDataSource::Add(profile, CreateKeyboardOverlayUIHTMLSource());
383 }