| Index: chrome/browser/renderer_host/render_widget_host_view_win.cc
|
| diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc
|
| index 4620a4924beb2406dd0afbc8a437d3cfaff1fa50..81120f869a899dcead98c727cd0e0c6d7649ab6f 100644
|
| --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc
|
| +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc
|
| @@ -32,8 +32,10 @@
|
| #include "content/common/plugin_messages.h"
|
| #include "grit/webkit_resources.h"
|
| #include "skia/ext/skia_utils_win.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h"
|
| +#include "ui/base/ime/composition_text.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/l10n/l10n_util_win.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| @@ -94,97 +96,6 @@ BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg) {
|
| return TRUE;
|
| }
|
|
|
| -// Enumerates the installed keyboard layouts in this system and returns true
|
| -// if an RTL keyboard layout is installed.
|
| -// TODO(hbono): to be moved to "src/chrome/common/l10n_util.cc"?
|
| -static bool IsRTLKeyboardLayoutInstalled() {
|
| - static enum {
|
| - RTL_KEYBOARD_LAYOUT_NOT_INITIALIZED,
|
| - RTL_KEYBOARD_LAYOUT_INSTALLED,
|
| - RTL_KEYBOARD_LAYOUT_NOT_INSTALLED,
|
| - RTL_KEYBOARD_LAYOUT_ERROR,
|
| - } layout = RTL_KEYBOARD_LAYOUT_NOT_INITIALIZED;
|
| -
|
| - // Cache the result value.
|
| - if (layout != RTL_KEYBOARD_LAYOUT_NOT_INITIALIZED)
|
| - return layout == RTL_KEYBOARD_LAYOUT_INSTALLED;
|
| -
|
| - // Retrieve the number of layouts installed in this system.
|
| - int size = GetKeyboardLayoutList(0, NULL);
|
| - if (size <= 0) {
|
| - layout = RTL_KEYBOARD_LAYOUT_ERROR;
|
| - return false;
|
| - }
|
| -
|
| - // Retrieve the keyboard layouts in an array and check if there is an RTL
|
| - // layout in it.
|
| - scoped_array<HKL> layouts(new HKL[size]);
|
| - GetKeyboardLayoutList(size, layouts.get());
|
| - for (int i = 0; i < size; ++i) {
|
| - if (PRIMARYLANGID(layouts[i]) == LANG_ARABIC ||
|
| - PRIMARYLANGID(layouts[i]) == LANG_HEBREW ||
|
| - PRIMARYLANGID(layouts[i]) == LANG_PERSIAN) {
|
| - layout = RTL_KEYBOARD_LAYOUT_INSTALLED;
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - layout = RTL_KEYBOARD_LAYOUT_NOT_INSTALLED;
|
| - return false;
|
| -}
|
| -
|
| -// Returns the text direction according to the keyboard status.
|
| -// This function retrieves the status of all keys and returns the following
|
| -// values:
|
| -// * WEB_TEXT_DIRECTION_RTL
|
| -// If only a control key and a right-shift key are down.
|
| -// * WEB_TEXT_DIRECTION_LTR
|
| -// If only a control key and a left-shift key are down.
|
| -
|
| -static bool GetNewTextDirection(WebTextDirection* direction) {
|
| - uint8_t keystate[256];
|
| - if (!GetKeyboardState(&keystate[0]))
|
| - return false;
|
| -
|
| - // To check if a user is pressing only a control key and a right-shift key
|
| - // (or a left-shift key), we use the steps below:
|
| - // 1. Check if a user is pressing a control key and a right-shift key (or
|
| - // a left-shift key).
|
| - // 2. If the condition 1 is true, we should check if there are any other
|
| - // keys pressed at the same time.
|
| - // To ignore the keys checked in 1, we set their status to 0 before
|
| - // checking the key status.
|
| - const int kKeyDownMask = 0x80;
|
| - if ((keystate[VK_CONTROL] & kKeyDownMask) == 0)
|
| - return false;
|
| -
|
| - if (keystate[VK_RSHIFT] & kKeyDownMask) {
|
| - keystate[VK_RSHIFT] = 0;
|
| - *direction = WebKit::WebTextDirectionRightToLeft;
|
| - } else if (keystate[VK_LSHIFT] & kKeyDownMask) {
|
| - keystate[VK_LSHIFT] = 0;
|
| - *direction = WebKit::WebTextDirectionLeftToRight;
|
| - } else {
|
| - return false;
|
| - }
|
| -
|
| - // Scan the key status to find pressed keys. We should adandon changing the
|
| - // text direction when there are other pressed keys.
|
| - // This code is executed only when a user is pressing a control key and a
|
| - // right-shift key (or a left-shift key), i.e. we should ignore the status of
|
| - // the keys: VK_SHIFT, VK_CONTROL, VK_RCONTROL, and VK_LCONTROL.
|
| - // So, we reset their status to 0 and ignore them.
|
| - keystate[VK_SHIFT] = 0;
|
| - keystate[VK_CONTROL] = 0;
|
| - keystate[VK_RCONTROL] = 0;
|
| - keystate[VK_LCONTROL] = 0;
|
| - for (int i = 0; i <= VK_PACKET; ++i) {
|
| - if (keystate[i] & kKeyDownMask)
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| class NotifyPluginProcessHostTask : public Task {
|
| public:
|
| NotifyPluginProcessHostTask(HWND window, HWND parent)
|
| @@ -1196,8 +1107,8 @@ LRESULT RenderWidgetHostViewWin::OnImeSetContext(
|
| ime_input_.CreateImeWindow(m_hWnd);
|
|
|
| ime_input_.CleanupComposition(m_hWnd);
|
| - ime_input_.SetImeWindowStyle(m_hWnd, message, wparam, lparam, &handled);
|
| - return 0;
|
| + return ime_input_.SetImeWindowStyle(
|
| + m_hWnd, message, wparam, lparam, &handled);
|
| }
|
|
|
| LRESULT RenderWidgetHostViewWin::OnImeStartComposition(
|
| @@ -1223,11 +1134,17 @@ LRESULT RenderWidgetHostViewWin::OnImeComposition(
|
| // At first, update the position of the IME window.
|
| ime_input_.UpdateImeWindow(m_hWnd);
|
|
|
| + // ui::CompositionUnderline should be identical to
|
| + // WebKit::WebCompositionUnderline, so that we can do reinterpret_cast safely.
|
| + COMPILE_ASSERT(sizeof(ui::CompositionUnderline) ==
|
| + sizeof(WebKit::WebCompositionUnderline),
|
| + ui_CompositionUnderline__WebKit_WebCompositionUnderline_diff);
|
| +
|
| // Retrieve the result string and its attributes of the ongoing composition
|
| // and send it to a renderer process.
|
| - ImeComposition composition;
|
| - if (ime_input_.GetResult(m_hWnd, lparam, &composition)) {
|
| - render_widget_host_->ImeConfirmComposition(composition.ime_string);
|
| + ui::CompositionText composition;
|
| + if (ime_input_.GetResult(m_hWnd, lparam, &composition.text)) {
|
| + render_widget_host_->ImeConfirmComposition(composition.text);
|
| ime_input_.ResetComposition(m_hWnd);
|
| // Fall though and try reading the composition string.
|
| // Japanese IMEs send a message containing both GCS_RESULTSTR and
|
| @@ -1237,9 +1154,18 @@ LRESULT RenderWidgetHostViewWin::OnImeComposition(
|
| // Retrieve the composition string and its attributes of the ongoing
|
| // composition and send it to a renderer process.
|
| if (ime_input_.GetComposition(m_hWnd, lparam, &composition)) {
|
| + // TODO(suzhe): due to a bug of webkit, we can't use selection range with
|
| + // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788
|
| + composition.selection = ui::Range(composition.selection.end());
|
| +
|
| + // TODO(suzhe): convert both renderer_host and renderer to use
|
| + // ui::CompositionText.
|
| + const std::vector<WebKit::WebCompositionUnderline>& underlines =
|
| + reinterpret_cast<const std::vector<WebKit::WebCompositionUnderline>&>(
|
| + composition.underlines);
|
| render_widget_host_->ImeSetComposition(
|
| - composition.ime_string, composition.underlines,
|
| - composition.selection_start, composition.selection_end);
|
| + composition.text, underlines,
|
| + composition.selection.start(), composition.selection.end());
|
| }
|
| // We have to prevent WTL from calling ::DefWindowProc() because we do not
|
| // want for the IMM (Input Method Manager) to send WM_IME_CHAR messages.
|
| @@ -1355,12 +1281,16 @@ LRESULT RenderWidgetHostViewWin::OnKeyEvent(UINT message, WPARAM wparam,
|
| // Bug 9718: http://crbug.com/9718 To investigate IE and notepad, this
|
| // shortcut is enabled only on a PC having RTL keyboard layouts installed.
|
| // We should emulate them.
|
| - if (IsRTLKeyboardLayoutInstalled()) {
|
| + if (ui::ImeInput::IsRTLKeyboardLayoutInstalled()) {
|
| if (message == WM_KEYDOWN) {
|
| if (wparam == VK_SHIFT) {
|
| - WebTextDirection direction;
|
| - if (GetNewTextDirection(&direction))
|
| - render_widget_host_->UpdateTextDirection(direction);
|
| + base::i18n::TextDirection dir;
|
| + if (ui::ImeInput::IsCtrlShiftPressed(&dir)) {
|
| + render_widget_host_->UpdateTextDirection(
|
| + dir == base::i18n::RIGHT_TO_LEFT ?
|
| + WebKit::WebTextDirectionRightToLeft :
|
| + WebKit::WebTextDirectionLeftToRight);
|
| + }
|
| } else if (wparam != VK_CONTROL) {
|
| // Bug 9762: http://crbug.com/9762 A user pressed a key except shift
|
| // and control keys.
|
|
|