| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "config.h" | 5 #include "config.h" |
| 6 #include "webkit/glue/webplugin_impl.h" | 6 #include "webkit/glue/webplugin_impl.h" |
| 7 | 7 |
| 8 #include "Cursor.h" | 8 #include "Cursor.h" |
| 9 #include "Document.h" | 9 #include "Document.h" |
| 10 #include "DocumentLoader.h" | 10 #include "DocumentLoader.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "HTMLFormElement.h" | 23 #include "HTMLFormElement.h" |
| 24 #include "HTMLNames.h" | 24 #include "HTMLNames.h" |
| 25 #include "HTMLPlugInElement.h" | 25 #include "HTMLPlugInElement.h" |
| 26 #include "IntRect.h" | 26 #include "IntRect.h" |
| 27 #include "KURL.h" | 27 #include "KURL.h" |
| 28 #include "KeyboardEvent.h" | 28 #include "KeyboardEvent.h" |
| 29 #include "MouseEvent.h" | 29 #include "MouseEvent.h" |
| 30 #include "Page.h" | 30 #include "Page.h" |
| 31 #include "PlatformContextSkia.h" | 31 #include "PlatformContextSkia.h" |
| 32 #include "PlatformMouseEvent.h" | 32 #include "PlatformMouseEvent.h" |
| 33 #include "PlatformKeyboardEvent.h" |
| 33 #include "PlatformString.h" | 34 #include "PlatformString.h" |
| 35 #include "PlatformWidget.h" |
| 34 #include "RenderBox.h" | 36 #include "RenderBox.h" |
| 35 #include "ResourceHandle.h" | 37 #include "ResourceHandle.h" |
| 36 #include "ResourceHandleClient.h" | 38 #include "ResourceHandleClient.h" |
| 37 #include "ResourceResponse.h" | 39 #include "ResourceResponse.h" |
| 38 #include "ScriptController.h" | 40 #include "ScriptController.h" |
| 39 #include "ScriptValue.h" | 41 #include "ScriptValue.h" |
| 40 #include "ScrollView.h" | 42 #include "ScrollView.h" |
| 41 #include "Widget.h" | 43 #include "Widget.h" |
| 42 | 44 |
| 43 #undef LOG | 45 #undef LOG |
| 44 #include "base/gfx/rect.h" | 46 #include "base/gfx/rect.h" |
| 45 #include "base/logging.h" | 47 #include "base/logging.h" |
| 46 #include "base/message_loop.h" | 48 #include "base/message_loop.h" |
| 47 #include "base/string_util.h" | 49 #include "base/string_util.h" |
| 48 #include "base/sys_string_conversions.h" | 50 #include "base/sys_string_conversions.h" |
| 49 #include "net/base/escape.h" | 51 #include "net/base/escape.h" |
| 52 #include "webkit/api/public/WebInputEvent.h" |
| 50 #include "webkit/api/public/WebKit.h" | 53 #include "webkit/api/public/WebKit.h" |
| 51 #include "webkit/api/public/WebKitClient.h" | 54 #include "webkit/api/public/WebKitClient.h" |
| 52 #include "webkit/api/public/WebString.h" | 55 #include "webkit/api/public/WebString.h" |
| 53 #include "webkit/api/public/WebURL.h" | 56 #include "webkit/api/public/WebURL.h" |
| 54 #include "webkit/glue/chrome_client_impl.h" | 57 #include "webkit/glue/chrome_client_impl.h" |
| 58 #include "webkit/glue/event_conversion.h" |
| 55 #include "webkit/glue/glue_util.h" | 59 #include "webkit/glue/glue_util.h" |
| 56 #include "webkit/glue/multipart_response_delegate.h" | 60 #include "webkit/glue/multipart_response_delegate.h" |
| 57 #include "webkit/glue/webcursor.h" | 61 #include "webkit/glue/webcursor.h" |
| 58 #include "webkit/glue/webkit_glue.h" | 62 #include "webkit/glue/webkit_glue.h" |
| 59 #include "webkit/glue/plugins/plugin_host.h" | 63 #include "webkit/glue/plugins/plugin_host.h" |
| 60 #include "webkit/glue/plugins/plugin_instance.h" | 64 #include "webkit/glue/plugins/plugin_instance.h" |
| 61 #include "webkit/glue/stacking_order_iterator.h" | 65 #include "webkit/glue/stacking_order_iterator.h" |
| 62 #include "webkit/glue/webview_impl.h" | 66 #include "webkit/glue/webview_impl.h" |
| 63 #include "googleurl/src/gurl.h" | 67 #include "googleurl/src/gurl.h" |
| 64 | 68 |
| 69 using WebKit::WebKeyboardEvent; |
| 70 using WebKit::WebInputEvent; |
| 71 using WebKit::WebMouseEvent; |
| 72 |
| 65 // This class handles individual multipart responses. It is instantiated when | 73 // This class handles individual multipart responses. It is instantiated when |
| 66 // we receive HTTP status code 206 in the HTTP response. This indicates | 74 // we receive HTTP status code 206 in the HTTP response. This indicates |
| 67 // that the response could have multiple parts each separated by a boundary | 75 // that the response could have multiple parts each separated by a boundary |
| 68 // specified in the response header. | 76 // specified in the response header. |
| 69 class MultiPartResponseClient : public WebCore::ResourceHandleClient { | 77 class MultiPartResponseClient : public WebCore::ResourceHandleClient { |
| 70 public: | 78 public: |
| 71 MultiPartResponseClient(WebPluginResourceClient* resource_client) | 79 MultiPartResponseClient(WebPluginResourceClient* resource_client) |
| 72 : resource_client_(resource_client) { | 80 : resource_client_(resource_client) { |
| 73 Clear(); | 81 Clear(); |
| 74 } | 82 } |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 // http://devedge-temp.mozilla.org/library/manuals/2002/plugin/1.0/structur
es5.html#1000000 | 769 // http://devedge-temp.mozilla.org/library/manuals/2002/plugin/1.0/structur
es5.html#1000000 |
| 762 // Don't take the documentation as truth, however. I've found | 770 // Don't take the documentation as truth, however. I've found |
| 763 // many cases where mozilla behaves differently than the spec. | 771 // many cases where mozilla behaves differently than the spec. |
| 764 if (event->isMouseEvent()) | 772 if (event->isMouseEvent()) |
| 765 handleMouseEvent(static_cast<WebCore::MouseEvent*>(event)); | 773 handleMouseEvent(static_cast<WebCore::MouseEvent*>(event)); |
| 766 else if (event->isKeyboardEvent()) | 774 else if (event->isKeyboardEvent()) |
| 767 handleKeyboardEvent(static_cast<WebCore::KeyboardEvent*>(event)); | 775 handleKeyboardEvent(static_cast<WebCore::KeyboardEvent*>(event)); |
| 768 } | 776 } |
| 769 | 777 |
| 770 void WebPluginImpl::handleMouseEvent(WebCore::MouseEvent* event) { | 778 void WebPluginImpl::handleMouseEvent(WebCore::MouseEvent* event) { |
| 771 #if defined(OS_WIN) | |
| 772 DCHECK(parent()->isFrameView()); | 779 DCHECK(parent()->isFrameView()); |
| 773 // We cache the parent FrameView here as the plugin widget could be deleted | 780 // We cache the parent FrameView here as the plugin widget could be deleted |
| 774 // in the call to HandleEvent. See http://b/issue?id=1362948 | 781 // in the call to HandleEvent. See http://b/issue?id=1362948 |
| 775 WebCore::FrameView* parent_view = static_cast<WebCore::FrameView*>(parent()); | 782 WebCore::FrameView* parent_view = static_cast<WebCore::FrameView*>(parent()); |
| 776 | 783 |
| 777 WebCore::IntPoint p = | 784 WebMouseEvent web_event; |
| 778 parent_view->contentsToWindow(WebCore::IntPoint(event->pageX(), | 785 if (!ToWebMouseEvent(*parent_view, *event, &web_event)) |
| 779 event->pageY())); | 786 return; |
| 780 NPEvent np_event; | |
| 781 np_event.lParam = static_cast<uint32>(MAKELPARAM(p.x(), p.y())); | |
| 782 np_event.wParam = 0; | |
| 783 | 787 |
| 784 if (event->ctrlKey()) | 788 if (event->type() == WebCore::eventNames().mousedownEvent) { |
| 785 np_event.wParam |= MK_CONTROL; | |
| 786 if (event->shiftKey()) | |
| 787 np_event.wParam |= MK_SHIFT; | |
| 788 | |
| 789 if ((event->type() == WebCore::eventNames().mousemoveEvent) || | |
| 790 (event->type() == WebCore::eventNames().mouseoutEvent) || | |
| 791 (event->type() == WebCore::eventNames().mouseoverEvent)) { | |
| 792 np_event.event = WM_MOUSEMOVE; | |
| 793 if (event->buttonDown()) { | |
| 794 switch (event->button()) { | |
| 795 case WebCore::LeftButton: | |
| 796 np_event.wParam |= MK_LBUTTON; | |
| 797 break; | |
| 798 case WebCore::MiddleButton: | |
| 799 np_event.wParam |= MK_MBUTTON; | |
| 800 break; | |
| 801 case WebCore::RightButton: | |
| 802 np_event.wParam |= MK_RBUTTON; | |
| 803 break; | |
| 804 } | |
| 805 } | |
| 806 } else if (event->type() == WebCore::eventNames().mousedownEvent) { | |
| 807 // Ensure that the frame containing the plugin has focus. | 789 // Ensure that the frame containing the plugin has focus. |
| 808 WebCore::Frame* containing_frame = webframe_->frame(); | 790 WebCore::Frame* containing_frame = webframe_->frame(); |
| 809 if (WebCore::Page* current_page = containing_frame->page()) { | 791 if (WebCore::Page* current_page = containing_frame->page()) { |
| 810 current_page->focusController()->setFocusedFrame(containing_frame); | 792 current_page->focusController()->setFocusedFrame(containing_frame); |
| 811 } | 793 } |
| 812 // Give focus to our containing HTMLPluginElement. | 794 // Give focus to our containing HTMLPluginElement. |
| 813 containing_frame->document()->setFocusedNode(element_); | 795 containing_frame->document()->setFocusedNode(element_); |
| 814 | |
| 815 // Ideally we'd translate to WM_xBUTTONDBLCLK here if the click count were | |
| 816 // a multiple of 2. But there seems to be no way to get at the click count | |
| 817 // or the original Windows message from the WebCore::Event. | |
| 818 switch (event->button()) { | |
| 819 case WebCore::LeftButton: | |
| 820 np_event.event = WM_LBUTTONDOWN; | |
| 821 np_event.wParam |= MK_LBUTTON; | |
| 822 break; | |
| 823 case WebCore::MiddleButton: | |
| 824 np_event.event = WM_MBUTTONDOWN; | |
| 825 np_event.wParam |= MK_MBUTTON; | |
| 826 break; | |
| 827 case WebCore::RightButton: | |
| 828 np_event.event = WM_RBUTTONDOWN; | |
| 829 np_event.wParam |= MK_RBUTTON; | |
| 830 break; | |
| 831 } | |
| 832 } else if (event->type() == WebCore::eventNames().mouseupEvent) { | |
| 833 switch (event->button()) { | |
| 834 case WebCore::LeftButton: | |
| 835 np_event.event = WM_LBUTTONUP; | |
| 836 break; | |
| 837 case WebCore::MiddleButton: | |
| 838 np_event.event = WM_MBUTTONUP; | |
| 839 break; | |
| 840 case WebCore::RightButton: | |
| 841 np_event.event = WM_RBUTTONUP; | |
| 842 break; | |
| 843 } | |
| 844 } else { | |
| 845 // Skip all other mouse events. | |
| 846 return; | |
| 847 } | 796 } |
| 848 | 797 |
| 849 // TODO(pkasting): http://b/1119691 This conditional seems exactly backwards, | 798 // TODO(pkasting): http://b/1119691 This conditional seems exactly backwards, |
| 850 // but it matches Safari's code, and if I reverse it, giving focus to a | 799 // but it matches Safari's code, and if I reverse it, giving focus to a |
| 851 // transparent (windowless) plugin fails. | 800 // transparent (windowless) plugin fails. |
| 852 WebCursor cursor; | 801 WebCursor cursor; |
| 853 if (!delegate_->HandleEvent(&np_event, &cursor)) | 802 if (!delegate_->HandleInputEvent(web_event, &cursor)) |
| 854 event->setDefaultHandled(); | 803 event->setDefaultHandled(); |
| 855 | 804 |
| 856 WebCore::Page* page = parent_view->frame()->page(); | 805 WebCore::Page* page = parent_view->frame()->page(); |
| 857 if (!page) | 806 if (!page) |
| 858 return; | 807 return; |
| 859 | 808 |
| 860 ChromeClientImpl* chrome_client = | 809 ChromeClientImpl* chrome_client = |
| 861 static_cast<ChromeClientImpl*>(page->chrome()->client()); | 810 static_cast<ChromeClientImpl*>(page->chrome()->client()); |
| 862 | 811 |
| 863 // A windowless plugin can change the cursor in response to the WM_MOUSEMOVE | 812 // A windowless plugin can change the cursor in response to the WM_MOUSEMOVE |
| 864 // event. We need to reflect the changed cursor in the frame view as the | 813 // event. We need to reflect the changed cursor in the frame view as the |
| 865 // mouse is moved in the boundaries of the windowless plugin. | 814 // mouse is moved in the boundaries of the windowless plugin. |
| 866 chrome_client->SetCursorForPlugin(cursor); | 815 chrome_client->SetCursorForPlugin(cursor); |
| 867 | |
| 868 #else | |
| 869 NOTIMPLEMENTED(); | |
| 870 #endif | |
| 871 } | 816 } |
| 872 | 817 |
| 873 void WebPluginImpl::handleKeyboardEvent(WebCore::KeyboardEvent* event) { | 818 void WebPluginImpl::handleKeyboardEvent(WebCore::KeyboardEvent* event) { |
| 874 #if defined(OS_WIN) | 819 WebKeyboardEvent web_event; |
| 875 NPEvent np_event; | 820 if (!ToWebKeyboardEvent(*event, &web_event)) |
| 876 np_event.wParam = event->keyCode(); | |
| 877 | |
| 878 if (event->type() == WebCore::eventNames().keydownEvent) { | |
| 879 np_event.event = WM_KEYDOWN; | |
| 880 np_event.lParam = 0; | |
| 881 } else if (event->type() == WebCore::eventNames().keyupEvent) { | |
| 882 np_event.event = WM_KEYUP; | |
| 883 np_event.lParam = 0x8000; | |
| 884 } else { | |
| 885 // Skip all other keyboard events. | |
| 886 return; | 821 return; |
| 887 } | |
| 888 | |
| 889 // TODO(pkasting): http://b/1119691 See above. | 822 // TODO(pkasting): http://b/1119691 See above. |
| 890 WebCursor current_web_cursor; | 823 WebCursor current_web_cursor; |
| 891 if (!delegate_->HandleEvent(&np_event, ¤t_web_cursor)) | 824 if (!delegate_->HandleInputEvent(web_event, ¤t_web_cursor)) |
| 892 event->setDefaultHandled(); | 825 event->setDefaultHandled(); |
| 893 #else | |
| 894 NOTIMPLEMENTED(); | |
| 895 #endif | |
| 896 } | 826 } |
| 897 | 827 |
| 898 NPObject* WebPluginImpl::GetPluginScriptableObject() { | 828 NPObject* WebPluginImpl::GetPluginScriptableObject() { |
| 899 return delegate_->GetPluginScriptableObject(); | 829 return delegate_->GetPluginScriptableObject(); |
| 900 } | 830 } |
| 901 | 831 |
| 902 WebPluginResourceClient* WebPluginImpl::GetClientFromHandle( | 832 WebPluginResourceClient* WebPluginImpl::GetClientFromHandle( |
| 903 WebCore::ResourceHandle* handle) { | 833 WebCore::ResourceHandle* handle) { |
| 904 for (size_t i = 0; i < clients_.size(); ++i) { | 834 for (size_t i = 0; i < clients_.size(); ++i) { |
| 905 if (clients_[i].handle.get() == handle) | 835 if (clients_[i].handle.get() == handle) |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 client_index = clients_.erase(client_index); | 1344 client_index = clients_.erase(client_index); |
| 1415 if (resource_client) | 1345 if (resource_client) |
| 1416 resource_client->DidFail(); | 1346 resource_client->DidFail(); |
| 1417 } | 1347 } |
| 1418 | 1348 |
| 1419 // This needs to be called now and not in the destructor since the | 1349 // This needs to be called now and not in the destructor since the |
| 1420 // webframe_ might not be valid anymore. | 1350 // webframe_ might not be valid anymore. |
| 1421 webframe_->set_plugin_delegate(NULL); | 1351 webframe_->set_plugin_delegate(NULL); |
| 1422 webframe_ = NULL; | 1352 webframe_ = NULL; |
| 1423 } | 1353 } |
| OLD | NEW |