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
32using chromeos::input_method::ModifierKey;
33using content::WebUIMessageHandler;
34using ui::WebDialogUI;
35
36namespace {
37
38const 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
46struct 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
58struct 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
240std::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
249content::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->SetUseJsonJSFormatV2();
269  source->AddResourcePath("keyboard_overlay.js", IDR_KEYBOARD_OVERLAY_JS);
270  source->SetDefaultResource(IDR_KEYBOARD_OVERLAY_HTML);
271  return source;
272}
273
274}  // namespace
275
276// The handler for Javascript messages related to the "keyboardoverlay" view.
277class KeyboardOverlayHandler
278    : public WebUIMessageHandler,
279      public base::SupportsWeakPtr<KeyboardOverlayHandler> {
280 public:
281  explicit KeyboardOverlayHandler(Profile* profile);
282  virtual ~KeyboardOverlayHandler();
283
284  // WebUIMessageHandler implementation.
285  virtual void RegisterMessages() OVERRIDE;
286
287 private:
288  // Called when the page requires the input method ID corresponding to the
289  // current input method or keyboard layout during initialization.
290  void GetInputMethodId(const base::ListValue* args);
291
292  // Called when the page requres the information of modifier key remapping
293  // during the initialization.
294  void GetLabelMap(const base::ListValue* args);
295
296  // Called when the learn more link is clicked.
297  void OpenLearnMorePage(const base::ListValue* args);
298
299  Profile* profile_;
300
301  DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayHandler);
302};
303
304////////////////////////////////////////////////////////////////////////////////
305//
306// KeyboardOverlayHandler
307//
308////////////////////////////////////////////////////////////////////////////////
309KeyboardOverlayHandler::KeyboardOverlayHandler(Profile* profile)
310    : profile_(profile) {
311}
312
313KeyboardOverlayHandler::~KeyboardOverlayHandler() {
314}
315
316void KeyboardOverlayHandler::RegisterMessages() {
317  web_ui()->RegisterMessageCallback("getInputMethodId",
318      base::Bind(&KeyboardOverlayHandler::GetInputMethodId,
319                 base::Unretained(this)));
320  web_ui()->RegisterMessageCallback("getLabelMap",
321      base::Bind(&KeyboardOverlayHandler::GetLabelMap,
322                 base::Unretained(this)));
323  web_ui()->RegisterMessageCallback("openLearnMorePage",
324      base::Bind(&KeyboardOverlayHandler::OpenLearnMorePage,
325                 base::Unretained(this)));
326}
327
328void KeyboardOverlayHandler::GetInputMethodId(const base::ListValue* args) {
329  chromeos::input_method::InputMethodManager* manager =
330      chromeos::input_method::InputMethodManager::Get();
331  const chromeos::input_method::InputMethodDescriptor& descriptor =
332      manager->GetActiveIMEState()->GetCurrentInputMethod();
333  base::StringValue param(descriptor.id());
334  web_ui()->CallJavascriptFunction("initKeyboardOverlayId", param);
335}
336
337void KeyboardOverlayHandler::GetLabelMap(const base::ListValue* args) {
338  DCHECK(profile_);
339  PrefService* pref_service = profile_->GetPrefs();
340  typedef std::map<ModifierKey, ModifierKey> ModifierMap;
341  ModifierMap modifier_map;
342  modifier_map[chromeos::input_method::kSearchKey] = static_cast<ModifierKey>(
343      pref_service->GetInteger(prefs::kLanguageRemapSearchKeyTo));
344  modifier_map[chromeos::input_method::kControlKey] = static_cast<ModifierKey>(
345      pref_service->GetInteger(prefs::kLanguageRemapControlKeyTo));
346  modifier_map[chromeos::input_method::kAltKey] = static_cast<ModifierKey>(
347      pref_service->GetInteger(prefs::kLanguageRemapAltKeyTo));
348  // TODO(mazda): Support prefs::kLanguageRemapCapsLockKeyTo once Caps Lock is
349  // added to the overlay UI.
350
351  base::DictionaryValue dict;
352  for (ModifierMap::const_iterator i = modifier_map.begin();
353       i != modifier_map.end(); ++i) {
354    dict.SetString(ModifierKeyToLabel(i->first), ModifierKeyToLabel(i->second));
355  }
356
357  web_ui()->CallJavascriptFunction("initIdentifierMap", dict);
358}
359
360void KeyboardOverlayHandler::OpenLearnMorePage(const base::ListValue* args) {
361  web_ui()->GetWebContents()->GetDelegate()->OpenURLFromTab(
362      web_ui()->GetWebContents(),
363      content::OpenURLParams(GURL(kLearnMoreURL),
364                             content::Referrer(),
365                             NEW_FOREGROUND_TAB,
366                             ui::PAGE_TRANSITION_LINK,
367                             false));
368}
369
370////////////////////////////////////////////////////////////////////////////////
371//
372// KeyboardOverlayUI
373//
374////////////////////////////////////////////////////////////////////////////////
375
376KeyboardOverlayUI::KeyboardOverlayUI(content::WebUI* web_ui)
377    : WebDialogUI(web_ui) {
378  Profile* profile = Profile::FromWebUI(web_ui);
379  KeyboardOverlayHandler* handler = new KeyboardOverlayHandler(profile);
380  web_ui->AddMessageHandler(handler);
381
382  // Set up the chrome://keyboardoverlay/ source.
383  content::WebUIDataSource::Add(profile, CreateKeyboardOverlayUIHTMLSource());
384}
385