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