Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: webkit/plugins/ppapi/ppapi_plugin_instance.cc

Issue 8413021: Add functions to generate input events to PPB_Testing_Dev. These make (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 #include "skia/ext/vector_platform_device_emf_win.h" 93 #include "skia/ext/vector_platform_device_emf_win.h"
94 #include "ui/gfx/codec/jpeg_codec.h" 94 #include "ui/gfx/codec/jpeg_codec.h"
95 #include "ui/gfx/gdi_util.h" 95 #include "ui/gfx/gdi_util.h"
96 #endif 96 #endif
97 97
98 #if defined(OS_MACOSX) && defined(USE_SKIA) 98 #if defined(OS_MACOSX) && defined(USE_SKIA)
99 #include "skia/ext/skia_utils_mac.h" 99 #include "skia/ext/skia_utils_mac.h"
100 #endif 100 #endif
101 101
102 using base::StringPrintf; 102 using base::StringPrintf;
103 using ppapi::InputEventData;
103 using ppapi::InputEventImpl; 104 using ppapi::InputEventImpl;
104 using ppapi::PpapiGlobals; 105 using ppapi::PpapiGlobals;
105 using ppapi::StringVar; 106 using ppapi::StringVar;
106 using ppapi::thunk::EnterResourceNoLock; 107 using ppapi::thunk::EnterResourceNoLock;
107 using ppapi::thunk::PPB_Buffer_API; 108 using ppapi::thunk::PPB_Buffer_API;
108 using ppapi::thunk::PPB_Graphics2D_API; 109 using ppapi::thunk::PPB_Graphics2D_API;
109 using ppapi::thunk::PPB_Graphics3D_API; 110 using ppapi::thunk::PPB_Graphics3D_API;
110 using ppapi::thunk::PPB_ImageData_API; 111 using ppapi::thunk::PPB_ImageData_API;
111 using ppapi::thunk::PPB_Instance_FunctionAPI; 112 using ppapi::thunk::PPB_Instance_FunctionAPI;
112 using ppapi::thunk::PPB_Surface3D_API; 113 using ppapi::thunk::PPB_Surface3D_API;
113 using ppapi::Var; 114 using ppapi::Var;
114 using WebKit::WebBindings; 115 using WebKit::WebBindings;
115 using WebKit::WebCanvas; 116 using WebKit::WebCanvas;
116 using WebKit::WebConsoleMessage; 117 using WebKit::WebConsoleMessage;
117 using WebKit::WebCursorInfo; 118 using WebKit::WebCursorInfo;
118 using WebKit::WebDocument; 119 using WebKit::WebDocument;
119 using WebKit::WebFrame; 120 using WebKit::WebFrame;
120 using WebKit::WebElement; 121 using WebKit::WebElement;
121 using WebKit::WebInputEvent; 122 using WebKit::WebInputEvent;
123 using WebKit::WebKeyboardEvent;
124 using WebKit::WebMouseWheelEvent;
122 using WebKit::WebPluginContainer; 125 using WebKit::WebPluginContainer;
126 using WebKit::WebPoint;
123 using WebKit::WebString; 127 using WebKit::WebString;
128 using WebKit::WebUChar;
124 using WebKit::WebURLRequest; 129 using WebKit::WebURLRequest;
125 using WebKit::WebView; 130 using WebKit::WebView;
126 131
127 namespace webkit { 132 namespace webkit {
128 namespace ppapi { 133 namespace ppapi {
129 134
130 #if defined(OS_WIN) 135 #if defined(OS_WIN)
131 // Exported by pdf.dll 136 // Exported by pdf.dll
132 typedef bool (*RenderPDFPageToDCProc)( 137 typedef bool (*RenderPDFPageToDCProc)(
133 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, 138 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc,
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 WebKit::WebSecurityOrigin* security_origin) { 249 WebKit::WebSecurityOrigin* security_origin) {
245 PluginInstance* instance = HostGlobals::Get()->GetInstance(instance_id); 250 PluginInstance* instance = HostGlobals::Get()->GetInstance(instance_id);
246 if (!instance) 251 if (!instance)
247 return false; 252 return false;
248 253
249 WebElement plugin_element = instance->container()->element(); 254 WebElement plugin_element = instance->container()->element();
250 *security_origin = plugin_element.document().securityOrigin(); 255 *security_origin = plugin_element.document().securityOrigin();
251 return true; 256 return true;
252 } 257 }
253 258
259 #if !defined(OS_WIN)
260 #define VK_RETURN 0x0D
261
262 #define VK_PRIOR 0x21
263 #define VK_NEXT 0x22
264 #define VK_END 0x23
265 #define VK_HOME 0x24
266 #define VK_LEFT 0x25
267 #define VK_UP 0x26
268 #define VK_RIGHT 0x27
269 #define VK_DOWN 0x28
270 #define VK_SNAPSHOT 0x2C
271 #define VK_INSERT 0x2D
272 #define VK_DELETE 0x2E
273
274 #define VK_APPS 0x5D
275
276 #define VK_F1 0x70
277 #endif
278
279 // Convert a character string to a Windows virtual key code. Adapted from
280 // src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. This
281 // is used by SimulateInputEvent to convert keyboard events.
282 void GetKeyCode(const std::string& char_text,
dmichael (off chromium) 2011/11/17 19:27:57 Can you put all this stuff somewhere else, like ev
bbudge 2011/11/17 21:58:24 Done.
283 WebUChar& code,
284 WebUChar& text,
285 bool& needs_shift_modifier,
286 bool& generate_char) {
287 code = 0;
288 text = 0;
289 needs_shift_modifier = false;
290 generate_char = false;
291 if ("\n" == char_text) {
292 text = code = VK_RETURN;
293 generate_char = true;
294 } else if ("rightArrow" == char_text) {
295 code = VK_RIGHT;
296 } else if ("downArrow" == char_text) {
297 code = VK_DOWN;
298 } else if ("leftArrow" == char_text) {
299 code = VK_LEFT;
300 } else if ("upArrow" == char_text) {
301 code = VK_UP;
302 } else if ("insert" == char_text) {
303 code = VK_INSERT;
304 } else if ("delete" == char_text) {
305 code = VK_DELETE;
306 } else if ("pageUp" == char_text) {
307 code = VK_PRIOR;
308 } else if ("pageDown" == char_text) {
309 code = VK_NEXT;
310 } else if ("home" == char_text) {
311 code = VK_HOME;
312 } else if ("end" == char_text) {
313 code = VK_END;
314 } else if ("printScreen" == char_text) {
315 code = VK_SNAPSHOT;
316 } else if ("menu" == char_text) {
317 code = VK_APPS;
318 } else {
319 // Compare the input string with the function-key names defined by the
320 // DOM spec (i.e. "F1",...,"F24").
321 for (int i = 1; i <= 24; ++i) {
322 std::string functionKeyName = base::StringPrintf("F%d", i);
323 if (functionKeyName == char_text) {
324 code = VK_F1 + (i - 1);
325 break;
326 }
327 }
328 if (!code) {
329 WebString web_char_text =
330 WebString::fromUTF8(char_text.data(), char_text.size());
331 DCHECK_EQ(web_char_text.length(), 1U);
332 text = code = web_char_text.data()[0];
333 needs_shift_modifier =
334 (code & 0xFF) >= 'A' && (code & 0xFF) <= 'Z';
335 if ((code & 0xFF) >= 'a' && (code & 0xFF) <= 'z')
336 code -= 'a' - 'A';
337 generate_char = true;
338 }
339 }
340 }
341
254 } // namespace 342 } // namespace
255 343
256 // static 344 // static
257 PluginInstance* PluginInstance::Create1_0(PluginDelegate* delegate, 345 PluginInstance* PluginInstance::Create1_0(PluginDelegate* delegate,
258 PluginModule* module, 346 PluginModule* module,
259 const void* ppp_instance_if_1_0) { 347 const void* ppp_instance_if_1_0) {
260 const PPP_Instance_1_0* instance = 348 const PPP_Instance_1_0* instance =
261 static_cast<const PPP_Instance_1_0*>(ppp_instance_if_1_0); 349 static_cast<const PPP_Instance_1_0*>(ppp_instance_if_1_0);
262 return new PluginInstance( 350 return new PluginInstance(
263 delegate, 351 delegate,
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 } 1680 }
1593 1681
1594 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, result); 1682 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, result);
1595 } 1683 }
1596 1684
1597 void PluginInstance::OnMouseLockLost() { 1685 void PluginInstance::OnMouseLockLost() {
1598 if (LoadMouseLockInterface()) 1686 if (LoadMouseLockInterface())
1599 plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); 1687 plugin_mouse_lock_interface_->MouseLockLost(pp_instance());
1600 } 1688 }
1601 1689
1690 void PluginInstance::SimulateInputEvent(const InputEventData& input_event) {
1691 WebView* web_view = container()->element().document().frame()->view();
1692 if (!web_view) {
1693 NOTREACHED();
1694 return;
1695 }
1696
1697 scoped_ptr<WebInputEvent> web_input_event(CreateWebInputEvent(input_event));
1698 switch (input_event.event_type) {
1699 case PP_INPUTEVENT_TYPE_MOUSEDOWN:
1700 case PP_INPUTEVENT_TYPE_MOUSEUP:
1701 case PP_INPUTEVENT_TYPE_MOUSEMOVE:
1702 case PP_INPUTEVENT_TYPE_MOUSEENTER:
1703 case PP_INPUTEVENT_TYPE_MOUSELEAVE:
1704 web_view->handleInputEvent(*web_input_event);
1705 break;
1706
1707 case PP_INPUTEVENT_TYPE_WHEEL: {
1708 // Mouse wheel events need a position inside the plugin area in order to
1709 // be routed back to the plugin. Choose the midpoint of the plugin
1710 // instance's area on screen.
1711 WebMouseWheelEvent* web_mouse_wheel_event =
1712 static_cast<WebMouseWheelEvent*>(web_input_event.get());
1713 web_mouse_wheel_event->x = position().x() + position().width() / 2;
1714 web_mouse_wheel_event->y = position().y() + position().height() / 2;
1715 web_view->handleInputEvent(*web_mouse_wheel_event);
1716 break;
1717 }
1718
1719 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
1720 case PP_INPUTEVENT_TYPE_KEYDOWN:
1721 case PP_INPUTEVENT_TYPE_KEYUP: {
1722 WebKeyboardEvent* web_keyboard_event =
1723 static_cast<WebKeyboardEvent*>(web_input_event.get());
1724 // Windows key down events should always be "raw" to avoid an ASSERT.
1725 #if defined(OS_WIN)
1726 if (web_keyboard_event->type == WebInputEvent::KeyDown)
1727 web_keyboard_event->type = WebInputEvent::RawKeyDown;
1728 #endif
1729 web_view->handleInputEvent(*web_keyboard_event);
1730 break;
1731 }
1732
1733 case PP_INPUTEVENT_TYPE_CHAR: {
1734 WebKeyboardEvent* web_char_event =
1735 static_cast<WebKeyboardEvent*>(web_input_event.get());
1736
1737 WebUChar code, text;
1738 bool needs_shift_modifier, generate_char;
1739 GetKeyCode(input_event.character_text,
1740 code,
1741 text,
1742 needs_shift_modifier,
1743 generate_char);
1744
1745 // We synthesize key down and key up events in all cases.
1746 WebKeyboardEvent key_down_event, key_up_event;
1747 key_down_event.type = WebInputEvent::RawKeyDown;
1748 key_down_event.windowsKeyCode = code;
1749 key_down_event.nativeKeyCode = code;
1750 if (needs_shift_modifier)
1751 key_down_event.modifiers |= WebInputEvent::ShiftKey;
1752
1753 // If a char event is needed, set the text fields.
1754 if (generate_char) {
1755 key_down_event.text[0] = text;
1756 key_down_event.unmodifiedText[0] = text;
1757 }
1758 // Convert the key code to a string identifier.
1759 key_down_event.setKeyIdentifierFromWindowsKeyCode();
1760
1761 key_up_event = *web_char_event = key_down_event;
1762
1763 web_view->handleInputEvent(key_down_event);
1764
1765 if (generate_char) {
1766 web_char_event->type = WebInputEvent::Char;
1767 web_char_event->keyIdentifier[0] = '\0';
1768 web_view->handleInputEvent(*web_char_event);
1769 }
1770
1771 key_up_event.type = WebInputEvent::KeyUp;
1772 web_view->handleInputEvent(key_up_event);
1773 break;
1774 }
1775
1776 default:
1777 break;
1778 }
1779 }
1780
1602 PPB_Instance_FunctionAPI* PluginInstance::AsPPB_Instance_FunctionAPI() { 1781 PPB_Instance_FunctionAPI* PluginInstance::AsPPB_Instance_FunctionAPI() {
1603 return this; 1782 return this;
1604 } 1783 }
1605 1784
1606 PP_Bool PluginInstance::BindGraphics(PP_Instance instance, 1785 PP_Bool PluginInstance::BindGraphics(PP_Instance instance,
1607 PP_Resource device) { 1786 PP_Resource device) {
1608 if (bound_graphics_.get()) { 1787 if (bound_graphics_.get()) {
1609 if (GetBoundGraphics2D()) { 1788 if (GetBoundGraphics2D()) {
1610 GetBoundGraphics2D()->BindToInstance(NULL); 1789 GetBoundGraphics2D()->BindToInstance(NULL);
1611 } else if (GetBoundGraphics3D()) { 1790 } else if (GetBoundGraphics3D()) {
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
2037 screen_size_for_fullscreen_ = gfx::Size(); 2216 screen_size_for_fullscreen_ = gfx::Size();
2038 WebElement element = container_->element(); 2217 WebElement element = container_->element();
2039 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2218 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2040 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2219 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2041 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2220 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2042 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2221 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2043 } 2222 }
2044 2223
2045 } // namespace ppapi 2224 } // namespace ppapi
2046 } // namespace webkit 2225 } // namespace webkit
OLDNEW
« webkit/plugins/ppapi/plugin_module.cc ('K') | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698