// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.h"
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/input_method_library.h"
#include "chrome/browser/chromeos/input_method/input_method_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "chrome/common/jstemplate_builder.h"
#include "chrome/common/url_constants.h"
#include "content/browser/browser_thread.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "grit/browser_resources.h"
#include "grit/generated_resources.h"
#include "third_party/cros/chromeos_input_method.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
class KeyboardOverlayUIHTMLSource : public ChromeURLDataManager::DataSource {
public:
KeyboardOverlayUIHTMLSource();
// Called when the keyboard overlay has requested a resource underneath
// the path we registered.
virtual void StartDataRequest(const std::string& path,
bool is_incognito,
int request_id);
virtual std::string GetMimeType(const std::string&) const {
return "text/html";
}
private:
~KeyboardOverlayUIHTMLSource() {}
DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayUIHTMLSource);
};
// The handler for Javascript messages related to the "keyboardoverlay" view.
class KeyboardOverlayHandler
: public WebUIMessageHandler,
public base::SupportsWeakPtr<KeyboardOverlayHandler> {
public:
KeyboardOverlayHandler();
virtual ~KeyboardOverlayHandler();
// WebUIMessageHandler implementation.
virtual WebUIMessageHandler* Attach(WebUI* web_ui);
virtual void RegisterMessages();
private:
// Called when the page requires the keyboard overaly ID corresponding to the
// current input method or keyboard layout during initialization.
void GetKeyboardOverlayId(const ListValue* args);
DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayHandler);
};
////////////////////////////////////////////////////////////////////////////////
//
// KeyboardOverlayUIHTMLSource
//
////////////////////////////////////////////////////////////////////////////////
KeyboardOverlayUIHTMLSource::KeyboardOverlayUIHTMLSource()
: DataSource(chrome::kChromeUIKeyboardOverlayHost,
MessageLoop::current()) {
}
void KeyboardOverlayUIHTMLSource::StartDataRequest(const std::string& path,
bool is_incognito,
int request_id) {
DictionaryValue localized_strings;
localized_strings.SetString("keyboardOverlayTitle",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TITLE));
localized_strings.SetString("keyboardOverlayInstructions",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_INSTRUCTIONS));
localized_strings.SetString("keyboardOverlayInstructionsHide",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_INSTRUCTIONS_HIDE));
localized_strings.SetString("keyboardOverlayActivateLastTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_LAST_TAB));
localized_strings.SetString("keyboardOverlayActivateNextTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_NEXT_TAB));
localized_strings.SetString("keyboardOverlayActivatePreviousTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_PREVIOUS_TAB));
localized_strings.SetString("keyboardOverlayActivateTab1",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_1));
localized_strings.SetString("keyboardOverlayActivateTab2",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_2));
localized_strings.SetString("keyboardOverlayActivateTab3",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_3));
localized_strings.SetString("keyboardOverlayActivateTab4",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_4));
localized_strings.SetString("keyboardOverlayActivateTab5",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_5));
localized_strings.SetString("keyboardOverlayActivateTab6",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_6));
localized_strings.SetString("keyboardOverlayActivateTab7",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_7));
localized_strings.SetString("keyboardOverlayActivateTab8",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_8));
localized_strings.SetString("keyboardOverlayAddWwwAndComAndOpenAddress",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_ADD_WWW_AND_COM_AND_OPEN_ADDRESS));
localized_strings.SetString("keyboardOverlayBookmarkCurrentPage",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BOOKMARK_CURRENT_PAGE));
localized_strings.SetString("keyboardOverlayBookmarkAllTabs",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BOOKMARK_ALL_TABS));
localized_strings.SetString("keyboardOverlayClearBrowsingDataDialog",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_CLEAR_BROWSING_DATA_DIALOG));
localized_strings.SetString("keyboardOverlayCloseTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_TAB));
localized_strings.SetString("keyboardOverlayCloseWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_WINDOW));
localized_strings.SetString("keyboardOverlayDeleteWord",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DELETE_WORD));
localized_strings.SetString("keyboardOverlayDeveloperTools",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DEVELOPER_TOOLS));
localized_strings.SetString("keyboardOverlayFindAgain",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_AGAIN));
localized_strings.SetString("keyboardOverlayFindPrevious",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_PREVIOUS));
localized_strings.SetString("keyboardOverlayFindPrevious",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_PREVIOUS));
localized_strings.SetString("keyboardOverlayFindText",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_TEXT));
localized_strings.SetString("keyboardOverlayFocusAddressBar",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR));
localized_strings.SetString("keyboardOverlayFocusAddressBar",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR));
localized_strings.SetString("keyboardOverlayFocusAddressBarInSearchMode",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR_IN_SEARCH_MODE));
localized_strings.SetString("keyboardOverlayDomInspector",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DOM_INSPECTOR));
localized_strings.SetString("keyboardOverlayDownloads",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DOWNLOADS));
localized_strings.SetString("keyboardOverlayTaskManager",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TASK_MANAGER));
localized_strings.SetString("keyboardOverlayBack",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BACK));
localized_strings.SetString("keyboardOverlayForward",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FORWARD));
localized_strings.SetString("keyboardOverlayForward",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FORWARD));
localized_strings.SetString("keyboardOverlayHistory",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HISTORY));
localized_strings.SetString("keyboardOverlayNewTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_TAB));
localized_strings.SetString("keyboardOverlayOpenAddressInNewTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_OPEN_ADDRESS_IN_NEW_TAB));
localized_strings.SetString("keyboardOverlayNewIncognitoWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_INCOGNITO_WINDOW));
localized_strings.SetString("keyboardOverlayNewWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_WINDOW));
localized_strings.SetString("keyboardOverlayPasteAsPlainText",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PASTE_AS_PLAIN_TEXT));
localized_strings.SetString("keyboardOverlayPrint",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PRINT));
localized_strings.SetString("keyboardOverlayReloadCurrentPage",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RELOAD_CURRENT_PAGE));
localized_strings.SetString("keyboardOverlayReopenLastClosedTab",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_REOPEN_LAST_CLOSED_TAB));
localized_strings.SetString("keyboardOverlayResetZoom",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RESET_ZOOM));
localized_strings.SetString("keyboardOverlaySelectWordAtATime",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_WORD_AT_A_TIME));
localized_strings.SetString("keyboardOverlaySelectWordAtATime",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_WORD_AT_A_TIME));
localized_strings.SetString("keyboardOverlayToggleBookmarkBar",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TOGGLE_BOOKMARK_BAR));
localized_strings.SetString("keyboardOverlayViewSource",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_VIEW_SOURCE));
localized_strings.SetString("keyboardOverlayZoomIn",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ZOOM_IN));
localized_strings.SetString("keyboardOverlayZoomOut",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ZOOM_OUT));
localized_strings.SetString("keyboardOverlayResetZoom",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RESET_ZOOM));
localized_strings.SetString("keyboardOverlayFocusAddressBarInSearchMode",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR_IN_SEARCH_MODE));
localized_strings.SetString("keyboardOverlayFullScreen",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FULL_SCREEN));
localized_strings.SetString("keyboardOverlayTakeScreenshot",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TAKE_SCREENSHOT));
localized_strings.SetString("keyboardOverlayHome",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HOME));
localized_strings.SetString("keyboardOverlayEnd",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_END));
localized_strings.SetString("keyboardOverlayNextWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEXT_WINDOW));
localized_strings.SetString("keyboardOverlayContentBrowser",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CONTENT_BROWSER));
localized_strings.SetString("keyboardOverlayPageUp",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PAGE_UP));
localized_strings.SetString("keyboardOverlayPageDown",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PAGE_DOWN));
localized_strings.SetString("keyboardOverlayPreviousWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PREVIOUS_WINDOW));
localized_strings.SetString("keyboardOverlayUseExternalMonitor",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_USE_EXTERNAL_MONITOR));
localized_strings.SetString("keyboardOverlayReloadIgnoringCache",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RELOAD_IGNORING_CACHE));
localized_strings.SetString("keyboardOverlaySave",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SAVE));
localized_strings.SetString("keyboardOverlayScrollUpOnePage",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SCROLL_UP_ONE_PAGE));
localized_strings.SetString("keyboardOverlaySettings",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SETTINGS));
localized_strings.SetString("keyboardOverlaySignOut",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SIGN_OUT));
localized_strings.SetString("keyboardOverlayUndo",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_UNDO));
localized_strings.SetString("keyboardOverlayWordMove",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_WORD_MOVE));
localized_strings.SetString("keyboardOverlaySelectAll",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_ALL));
localized_strings.SetString("keyboardOverlaySelectPreviousInputMethod",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_SELECT_PREVIOUS_INPUT_METHOD));
localized_strings.SetString("keyboardOverlayCycleThroughInputMethods",
l10n_util::GetStringUTF16(
IDS_KEYBOARD_OVERLAY_CYCLE_THROUGH_INPUT_METHODS));
localized_strings.SetString("keyboardOverlayCloseWindow",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_WINDOW));
localized_strings.SetString("keyboardOverlayViewKeyboardOverlay",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_VIEW_KEYBOARD_OVERLAY));
localized_strings.SetString("keyboardOverlayCut",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CUT));
localized_strings.SetString("keyboardOverlayCopy",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_COPY));
localized_strings.SetString("keyboardOverlayPaste",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PASTE));
localized_strings.SetString("keyboardOverlayHelp",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HELP));
localized_strings.SetString("keyboardOverlayLockScreenOrPowerOff",
l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_LOCK_SCREEN_OR_POWER_OFF));
static const base::StringPiece keyboard_overlay_html(
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_KEYBOARD_OVERLAY_HTML));
const std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
keyboard_overlay_html, &localized_strings);
scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
html_bytes->data.resize(full_html.size());
std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
SendResponse(request_id, html_bytes);
}
////////////////////////////////////////////////////////////////////////////////
//
// KeyboardOverlayHandler
//
////////////////////////////////////////////////////////////////////////////////
KeyboardOverlayHandler::KeyboardOverlayHandler() {
}
KeyboardOverlayHandler::~KeyboardOverlayHandler() {
}
WebUIMessageHandler* KeyboardOverlayHandler::Attach(WebUI* web_ui) {
return WebUIMessageHandler::Attach(web_ui);
}
void KeyboardOverlayHandler::RegisterMessages() {
DCHECK(web_ui_);
web_ui_->RegisterMessageCallback("getKeyboardOverlayId",
NewCallback(this, &KeyboardOverlayHandler::GetKeyboardOverlayId));
}
void KeyboardOverlayHandler::GetKeyboardOverlayId(const ListValue* args) {
chromeos::InputMethodLibrary* library =
chromeos::CrosLibrary::Get()->GetInputMethodLibrary();
const chromeos::InputMethodDescriptor& descriptor =
library->current_input_method();
const std::string keyboard_overlay_id =
library->GetKeyboardOverlayId(descriptor.id);
StringValue param(keyboard_overlay_id);
web_ui_->CallJavascriptFunction("initKeyboardOverlayId", param);
}
////////////////////////////////////////////////////////////////////////////////
//
// KeyboardOverlayUI
//
////////////////////////////////////////////////////////////////////////////////
KeyboardOverlayUI::KeyboardOverlayUI(TabContents* contents)
: HtmlDialogUI(contents) {
KeyboardOverlayHandler* handler = new KeyboardOverlayHandler();
AddMessageHandler((handler)->Attach(this));
KeyboardOverlayUIHTMLSource* html_source = new KeyboardOverlayUIHTMLSource();
// Set up the chrome://keyboardoverlay/ source.
contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
}