| Index: webkit/plugins/npapi/webplugin_delegate_impl_win.cc
|
| ===================================================================
|
| --- webkit/plugins/npapi/webplugin_delegate_impl_win.cc (revision 87397)
|
| +++ webkit/plugins/npapi/webplugin_delegate_impl_win.cc (working copy)
|
| @@ -32,11 +32,13 @@
|
| #include "webkit/plugins/npapi/plugin_list.h"
|
| #include "webkit/plugins/npapi/plugin_stream_url.h"
|
| #include "webkit/plugins/npapi/webplugin.h"
|
| +#include "webkit/plugins/npapi/webplugin_ime_win.h"
|
|
|
| using WebKit::WebCursorInfo;
|
| using WebKit::WebKeyboardEvent;
|
| using WebKit::WebInputEvent;
|
| using WebKit::WebMouseEvent;
|
| +using WebKit::WebCompositionEvent;
|
|
|
| namespace webkit {
|
| namespace npapi {
|
| @@ -86,6 +88,10 @@
|
| base::LazyInstance<app::win::IATPatchFunction> g_iat_patch_reg_enum_key_ex_w(
|
| base::LINKER_INITIALIZED);
|
|
|
| +// Helper object for patching the GetProcAddress API.
|
| +base::LazyInstance<app::win::IATPatchFunction> g_iat_patch_get_proc_address(
|
| + base::LINKER_INITIALIZED);
|
| +
|
| // http://crbug.com/16114
|
| // Enforces providing a valid device context in NPWindow, so that NPP_SetWindow
|
| // is never called with NPNWindoTypeDrawable and NPWindow set to NULL.
|
| @@ -298,6 +304,7 @@
|
| quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR;
|
| quirks_ |= PLUGIN_QUIRK_ALWAYS_NOTIFY_SUCCESS;
|
| quirks_ |= PLUGIN_QUIRK_HANDLE_MOUSE_CAPTURE;
|
| + quirks_ |= PLUGIN_QUIRK_EMULATE_IME;
|
| } else if (filename == kAcrobatReaderPlugin) {
|
| // Check for the version number above or equal 9.
|
| int major_version = GetPluginMajorVersion(plugin_info);
|
| @@ -434,6 +441,17 @@
|
| WebPluginDelegateImpl::RegEnumKeyExWPatch);
|
| }
|
|
|
| + // Flash retrieves the pointers to IMM32 functions with GetProcAddress() calls
|
| + // and use them to retrieve IME data. We add a patch to this function so we
|
| + // can dispatch these IMM32 calls to the WebPluginIMEWin class, which emulates
|
| + // IMM32 functions for Flash.
|
| + if (!g_iat_patch_get_proc_address.Pointer()->is_patched() &&
|
| + (quirks_ & PLUGIN_QUIRK_EMULATE_IME)) {
|
| + g_iat_patch_get_proc_address.Pointer()->Patch(
|
| + GetPluginPath().value().c_str(), "kernel32.dll", "GetProcAddress",
|
| + GetProcAddressPatch);
|
| + }
|
| +
|
| return true;
|
| }
|
|
|
| @@ -1171,6 +1189,9 @@
|
| }
|
| return NPEventFromWebKeyboardEvent(
|
| *static_cast<const WebKeyboardEvent*>(&event), np_event);
|
| + case WebInputEvent::RawCompositionSet:
|
| + case WebInputEvent::RawCompositionConfirm:
|
| + return WebPluginIMEWin::NPEventFromWebCompositionEvent(&event, np_event);
|
| default:
|
| return false;
|
| }
|
| @@ -1185,6 +1206,15 @@
|
| return false;
|
| }
|
|
|
| + // Send an IME event to our IME emulator to update its status. (We create an
|
| + // IME emulator when we receive the first IME event because not all plug-ins
|
| + // need the emulator.)
|
| + if (WebInputEvent::isCompositionEventType(event.type)) {
|
| + if (!plugin_ime_.get())
|
| + plugin_ime_.reset(new WebPluginIMEWin);
|
| + plugin_ime_->Update(&event);
|
| + }
|
| +
|
| HWND last_focus_window = NULL;
|
|
|
| if (ShouldTrackEventForModalLoops(&np_event)) {
|
| @@ -1225,7 +1255,19 @@
|
| popups_enabled = true;
|
| }
|
|
|
| - bool ret = instance()->NPP_HandleEvent(&np_event) != 0;
|
| + // Send the input event to the plug-in. When the input event is an IME event,
|
| + // we call WebPluginIMEWin::SendEvent() to send all window messages stored in
|
| + // the IME emulator to the plug-in. (This function internally uses a mutex to
|
| + // prevent two or more plug-ins from accessing an IME emulator though its hook
|
| + // functions at once.) On the other hand, we send non-IME events directly to
|
| + // the plug-in because the IME emulator allows accessing its data only while
|
| + // it sends IME mesages.
|
| + bool ret = true;
|
| + if (WebInputEvent::isCompositionEventType(event.type) && plugin_ime_.get()) {
|
| + ret = plugin_ime_->SendEvents(instance());
|
| + } else {
|
| + ret = instance()->NPP_HandleEvent(&np_event) != 0;
|
| + }
|
|
|
| if (popups_enabled) {
|
| instance()->PopPopupsEnabledState();
|
| @@ -1372,6 +1414,22 @@
|
| return rv;
|
| }
|
|
|
| +bool WebPluginDelegateImpl::GetIMEStatus(int* input_type,
|
| + gfx::Rect* caret_rect) {
|
| + if (!plugin_ime_.get())
|
| + return false;
|
| + return plugin_ime_->GetStatus(input_type, caret_rect);
|
| +}
|
| +
|
| +// static
|
| +FARPROC WINAPI WebPluginDelegateImpl::GetProcAddressPatch(HMODULE module,
|
| + LPCSTR name) {
|
| + FARPROC imm_function = WebPluginIMEWin::GetProcAddress(name);
|
| + if (imm_function)
|
| + return imm_function;
|
| + return ::GetProcAddress(module, name);
|
| +}
|
| +
|
| void WebPluginDelegateImpl::HandleCaptureForMessage(HWND window,
|
| UINT message) {
|
| if (!WebPluginDelegateImpl::IsPluginDelegateWindow(window))
|
|
|