1// Copyright (c) 2011 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 "base/callback.h"
8#include "base/memory/weak_ptr.h"
9#include "base/values.h"
10#include "chrome/browser/chromeos/cros/cros_library.h"
11#include "chrome/browser/chromeos/cros/input_method_library.h"
12#include "chrome/browser/chromeos/input_method/input_method_util.h"
13#include "chrome/browser/profiles/profile.h"
14#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
15#include "chrome/common/jstemplate_builder.h"
16#include "chrome/common/url_constants.h"
17#include "content/browser/browser_thread.h"
18#include "content/browser/tab_contents/tab_contents.h"
19#include "grit/browser_resources.h"
20#include "grit/generated_resources.h"
21#include "third_party/cros/chromeos_input_method.h"
22#include "ui/base/l10n/l10n_util.h"
23#include "ui/base/resource/resource_bundle.h"
24
25
26class KeyboardOverlayUIHTMLSource : public ChromeURLDataManager::DataSource {
27 public:
28  KeyboardOverlayUIHTMLSource();
29
30  // Called when the keyboard overlay has requested a resource underneath
31  // the path we registered.
32  virtual void StartDataRequest(const std::string& path,
33                                bool is_incognito,
34                                int request_id);
35  virtual std::string GetMimeType(const std::string&) const {
36    return "text/html";
37  }
38
39 private:
40  ~KeyboardOverlayUIHTMLSource() {}
41
42  DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayUIHTMLSource);
43};
44
45
46// The handler for Javascript messages related to the "keyboardoverlay" view.
47class KeyboardOverlayHandler
48    : public WebUIMessageHandler,
49      public base::SupportsWeakPtr<KeyboardOverlayHandler> {
50 public:
51  KeyboardOverlayHandler();
52  virtual ~KeyboardOverlayHandler();
53
54  // WebUIMessageHandler implementation.
55  virtual WebUIMessageHandler* Attach(WebUI* web_ui);
56  virtual void RegisterMessages();
57
58 private:
59  // Called when the page requires the keyboard overaly ID corresponding to the
60  // current input method or keyboard layout during initialization.
61  void GetKeyboardOverlayId(const ListValue* args);
62
63  DISALLOW_COPY_AND_ASSIGN(KeyboardOverlayHandler);
64};
65
66////////////////////////////////////////////////////////////////////////////////
67//
68// KeyboardOverlayUIHTMLSource
69//
70////////////////////////////////////////////////////////////////////////////////
71
72KeyboardOverlayUIHTMLSource::KeyboardOverlayUIHTMLSource()
73    : DataSource(chrome::kChromeUIKeyboardOverlayHost,
74                 MessageLoop::current()) {
75}
76
77void KeyboardOverlayUIHTMLSource::StartDataRequest(const std::string& path,
78                                                   bool is_incognito,
79                                                   int request_id) {
80  DictionaryValue localized_strings;
81  localized_strings.SetString("keyboardOverlayTitle",
82      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TITLE));
83  localized_strings.SetString("keyboardOverlayInstructions",
84      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_INSTRUCTIONS));
85  localized_strings.SetString("keyboardOverlayInstructionsHide",
86      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_INSTRUCTIONS_HIDE));
87  localized_strings.SetString("keyboardOverlayActivateLastTab",
88      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_LAST_TAB));
89  localized_strings.SetString("keyboardOverlayActivateNextTab",
90      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_NEXT_TAB));
91  localized_strings.SetString("keyboardOverlayActivatePreviousTab",
92      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_PREVIOUS_TAB));
93  localized_strings.SetString("keyboardOverlayActivateTab1",
94      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_1));
95  localized_strings.SetString("keyboardOverlayActivateTab2",
96      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_2));
97  localized_strings.SetString("keyboardOverlayActivateTab3",
98      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_3));
99  localized_strings.SetString("keyboardOverlayActivateTab4",
100      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_4));
101  localized_strings.SetString("keyboardOverlayActivateTab5",
102      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_5));
103  localized_strings.SetString("keyboardOverlayActivateTab6",
104      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_6));
105  localized_strings.SetString("keyboardOverlayActivateTab7",
106      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_7));
107  localized_strings.SetString("keyboardOverlayActivateTab8",
108      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ACTIVATE_TAB_8));
109  localized_strings.SetString("keyboardOverlayAddWwwAndComAndOpenAddress",
110      l10n_util::GetStringUTF16(
111          IDS_KEYBOARD_OVERLAY_ADD_WWW_AND_COM_AND_OPEN_ADDRESS));
112  localized_strings.SetString("keyboardOverlayBookmarkCurrentPage",
113      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BOOKMARK_CURRENT_PAGE));
114  localized_strings.SetString("keyboardOverlayBookmarkAllTabs",
115      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BOOKMARK_ALL_TABS));
116  localized_strings.SetString("keyboardOverlayClearBrowsingDataDialog",
117      l10n_util::GetStringUTF16(
118          IDS_KEYBOARD_OVERLAY_CLEAR_BROWSING_DATA_DIALOG));
119  localized_strings.SetString("keyboardOverlayCloseTab",
120      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_TAB));
121  localized_strings.SetString("keyboardOverlayCloseWindow",
122      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_WINDOW));
123  localized_strings.SetString("keyboardOverlayDeleteWord",
124      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DELETE_WORD));
125  localized_strings.SetString("keyboardOverlayDeveloperTools",
126      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DEVELOPER_TOOLS));
127  localized_strings.SetString("keyboardOverlayFindAgain",
128      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_AGAIN));
129  localized_strings.SetString("keyboardOverlayFindPrevious",
130      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_PREVIOUS));
131  localized_strings.SetString("keyboardOverlayFindPrevious",
132      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_PREVIOUS));
133  localized_strings.SetString("keyboardOverlayFindText",
134      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FIND_TEXT));
135  localized_strings.SetString("keyboardOverlayFocusAddressBar",
136      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR));
137  localized_strings.SetString("keyboardOverlayFocusAddressBar",
138      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR));
139  localized_strings.SetString("keyboardOverlayFocusAddressBarInSearchMode",
140      l10n_util::GetStringUTF16(
141          IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR_IN_SEARCH_MODE));
142  localized_strings.SetString("keyboardOverlayDomInspector",
143      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DOM_INSPECTOR));
144  localized_strings.SetString("keyboardOverlayDownloads",
145      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_DOWNLOADS));
146  localized_strings.SetString("keyboardOverlayTaskManager",
147      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TASK_MANAGER));
148  localized_strings.SetString("keyboardOverlayBack",
149      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_BACK));
150  localized_strings.SetString("keyboardOverlayForward",
151      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FORWARD));
152  localized_strings.SetString("keyboardOverlayForward",
153      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FORWARD));
154  localized_strings.SetString("keyboardOverlayHistory",
155      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HISTORY));
156  localized_strings.SetString("keyboardOverlayNewTab",
157      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_TAB));
158  localized_strings.SetString("keyboardOverlayOpenAddressInNewTab",
159      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_OPEN_ADDRESS_IN_NEW_TAB));
160  localized_strings.SetString("keyboardOverlayNewIncognitoWindow",
161      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_INCOGNITO_WINDOW));
162  localized_strings.SetString("keyboardOverlayNewWindow",
163      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEW_WINDOW));
164  localized_strings.SetString("keyboardOverlayPasteAsPlainText",
165      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PASTE_AS_PLAIN_TEXT));
166  localized_strings.SetString("keyboardOverlayPrint",
167      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PRINT));
168  localized_strings.SetString("keyboardOverlayReloadCurrentPage",
169      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RELOAD_CURRENT_PAGE));
170  localized_strings.SetString("keyboardOverlayReopenLastClosedTab",
171      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_REOPEN_LAST_CLOSED_TAB));
172  localized_strings.SetString("keyboardOverlayResetZoom",
173      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RESET_ZOOM));
174  localized_strings.SetString("keyboardOverlaySelectWordAtATime",
175      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_WORD_AT_A_TIME));
176  localized_strings.SetString("keyboardOverlaySelectWordAtATime",
177      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_WORD_AT_A_TIME));
178  localized_strings.SetString("keyboardOverlayToggleBookmarkBar",
179      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TOGGLE_BOOKMARK_BAR));
180  localized_strings.SetString("keyboardOverlayViewSource",
181      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_VIEW_SOURCE));
182  localized_strings.SetString("keyboardOverlayZoomIn",
183      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ZOOM_IN));
184  localized_strings.SetString("keyboardOverlayZoomOut",
185      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_ZOOM_OUT));
186  localized_strings.SetString("keyboardOverlayResetZoom",
187      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RESET_ZOOM));
188  localized_strings.SetString("keyboardOverlayFocusAddressBarInSearchMode",
189      l10n_util::GetStringUTF16(
190          IDS_KEYBOARD_OVERLAY_FOCUS_ADDRESS_BAR_IN_SEARCH_MODE));
191  localized_strings.SetString("keyboardOverlayFullScreen",
192      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_FULL_SCREEN));
193  localized_strings.SetString("keyboardOverlayTakeScreenshot",
194      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TAKE_SCREENSHOT));
195  localized_strings.SetString("keyboardOverlayHome",
196      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HOME));
197  localized_strings.SetString("keyboardOverlayEnd",
198      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_END));
199  localized_strings.SetString("keyboardOverlayNextWindow",
200      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_NEXT_WINDOW));
201  localized_strings.SetString("keyboardOverlayContentBrowser",
202      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CONTENT_BROWSER));
203  localized_strings.SetString("keyboardOverlayPageUp",
204      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PAGE_UP));
205  localized_strings.SetString("keyboardOverlayPageDown",
206      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PAGE_DOWN));
207  localized_strings.SetString("keyboardOverlayPreviousWindow",
208      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PREVIOUS_WINDOW));
209  localized_strings.SetString("keyboardOverlayUseExternalMonitor",
210      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_USE_EXTERNAL_MONITOR));
211  localized_strings.SetString("keyboardOverlayReloadIgnoringCache",
212      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_RELOAD_IGNORING_CACHE));
213  localized_strings.SetString("keyboardOverlaySave",
214      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SAVE));
215  localized_strings.SetString("keyboardOverlayScrollUpOnePage",
216      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SCROLL_UP_ONE_PAGE));
217  localized_strings.SetString("keyboardOverlaySettings",
218      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SETTINGS));
219  localized_strings.SetString("keyboardOverlaySignOut",
220      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SIGN_OUT));
221  localized_strings.SetString("keyboardOverlayUndo",
222      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_UNDO));
223  localized_strings.SetString("keyboardOverlayWordMove",
224      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_WORD_MOVE));
225  localized_strings.SetString("keyboardOverlaySelectAll",
226      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_SELECT_ALL));
227  localized_strings.SetString("keyboardOverlaySelectPreviousInputMethod",
228      l10n_util::GetStringUTF16(
229          IDS_KEYBOARD_OVERLAY_SELECT_PREVIOUS_INPUT_METHOD));
230  localized_strings.SetString("keyboardOverlayCycleThroughInputMethods",
231      l10n_util::GetStringUTF16(
232          IDS_KEYBOARD_OVERLAY_CYCLE_THROUGH_INPUT_METHODS));
233  localized_strings.SetString("keyboardOverlayCloseWindow",
234      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CLOSE_WINDOW));
235  localized_strings.SetString("keyboardOverlayViewKeyboardOverlay",
236      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_VIEW_KEYBOARD_OVERLAY));
237  localized_strings.SetString("keyboardOverlayCut",
238      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_CUT));
239  localized_strings.SetString("keyboardOverlayCopy",
240      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_COPY));
241  localized_strings.SetString("keyboardOverlayPaste",
242      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_PASTE));
243  localized_strings.SetString("keyboardOverlayHelp",
244      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_HELP));
245  localized_strings.SetString("keyboardOverlayLockScreenOrPowerOff",
246      l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_LOCK_SCREEN_OR_POWER_OFF));
247
248  static const base::StringPiece keyboard_overlay_html(
249      ResourceBundle::GetSharedInstance().GetRawDataResource(
250          IDR_KEYBOARD_OVERLAY_HTML));
251  const std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
252      keyboard_overlay_html, &localized_strings);
253
254  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
255  html_bytes->data.resize(full_html.size());
256  std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
257
258  SendResponse(request_id, html_bytes);
259}
260
261////////////////////////////////////////////////////////////////////////////////
262//
263// KeyboardOverlayHandler
264//
265////////////////////////////////////////////////////////////////////////////////
266KeyboardOverlayHandler::KeyboardOverlayHandler() {
267}
268
269KeyboardOverlayHandler::~KeyboardOverlayHandler() {
270}
271
272WebUIMessageHandler* KeyboardOverlayHandler::Attach(WebUI* web_ui) {
273  return WebUIMessageHandler::Attach(web_ui);
274}
275
276void KeyboardOverlayHandler::RegisterMessages() {
277  DCHECK(web_ui_);
278  web_ui_->RegisterMessageCallback("getKeyboardOverlayId",
279      NewCallback(this, &KeyboardOverlayHandler::GetKeyboardOverlayId));
280}
281
282void KeyboardOverlayHandler::GetKeyboardOverlayId(const ListValue* args) {
283  chromeos::InputMethodLibrary* library =
284      chromeos::CrosLibrary::Get()->GetInputMethodLibrary();
285  const chromeos::InputMethodDescriptor& descriptor =
286      library->current_input_method();
287  const std::string keyboard_overlay_id =
288      library->GetKeyboardOverlayId(descriptor.id);
289  StringValue param(keyboard_overlay_id);
290  web_ui_->CallJavascriptFunction("initKeyboardOverlayId", param);
291}
292
293////////////////////////////////////////////////////////////////////////////////
294//
295// KeyboardOverlayUI
296//
297////////////////////////////////////////////////////////////////////////////////
298
299KeyboardOverlayUI::KeyboardOverlayUI(TabContents* contents)
300    : HtmlDialogUI(contents) {
301  KeyboardOverlayHandler* handler = new KeyboardOverlayHandler();
302  AddMessageHandler((handler)->Attach(this));
303  KeyboardOverlayUIHTMLSource* html_source = new KeyboardOverlayUIHTMLSource();
304
305  // Set up the chrome://keyboardoverlay/ source.
306  contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
307}
308