OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // This file contains the definition for EventSendingController. | 5 // This file contains the definition for EventSendingController. |
6 // | 6 // |
7 // Some notes about drag and drop handling: | 7 // Some notes about drag and drop handling: |
8 // Windows drag and drop goes through a system call to DoDragDrop. At that | 8 // Windows drag and drop goes through a system call to DoDragDrop. At that |
9 // point, program control is given to Windows which then periodically makes | 9 // point, program control is given to Windows which then periodically makes |
10 // callbacks into the webview. This won't work for layout tests, so instead, | 10 // callbacks into the webview. This won't work for layout tests, so instead, |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "base/time.h" | 28 #include "base/time.h" |
29 #include "base/string_number_conversions.h" | 29 #include "base/string_number_conversions.h" |
30 #include "base/string_util.h" | 30 #include "base/string_util.h" |
31 #include "base/utf_string_conversions.h" | 31 #include "base/utf_string_conversions.h" |
32 #include "third_party/WebKit/WebKit/chromium/public/WebDragData.h" | 32 #include "third_party/WebKit/WebKit/chromium/public/WebDragData.h" |
33 #include "third_party/WebKit/WebKit/chromium/public/WebDragOperation.h" | 33 #include "third_party/WebKit/WebKit/chromium/public/WebDragOperation.h" |
34 #include "third_party/WebKit/WebKit/chromium/public/WebPoint.h" | 34 #include "third_party/WebKit/WebKit/chromium/public/WebPoint.h" |
35 #include "third_party/WebKit/WebKit/chromium/public/WebString.h" | 35 #include "third_party/WebKit/WebKit/chromium/public/WebString.h" |
36 #include "third_party/WebKit/WebKit/chromium/public/WebTouchPoint.h" | 36 #include "third_party/WebKit/WebKit/chromium/public/WebTouchPoint.h" |
37 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" | 37 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" |
| 38 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h" |
38 #include "webkit/glue/webkit_glue.h" | 39 #include "webkit/glue/webkit_glue.h" |
39 #include "webkit/tools/test_shell/test_shell.h" | 40 #include "webkit/tools/test_shell/test_shell.h" |
40 #include "webkit/tools/test_shell/test_webview_delegate.h" | 41 #include "webkit/tools/test_shell/test_webview_delegate.h" |
41 | 42 |
42 #if defined(OS_WIN) | 43 #if defined(OS_WIN) |
43 #include "third_party/WebKit/WebKit/chromium/public/win/WebInputEventFactory.h" | 44 #include "third_party/WebKit/WebKit/chromium/public/win/WebInputEventFactory.h" |
44 using WebKit::WebInputEventFactory; | 45 using WebKit::WebInputEventFactory; |
45 #endif | 46 #endif |
46 | 47 |
47 // TODO(mpcomplete): layout before each event? | 48 // TODO(mpcomplete): layout before each event? |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 break; | 764 break; |
764 } | 765 } |
765 default: | 766 default: |
766 NOTREACHED(); | 767 NOTREACHED(); |
767 } | 768 } |
768 } | 769 } |
769 | 770 |
770 replaying_saved_events = false; | 771 replaying_saved_events = false; |
771 } | 772 } |
772 | 773 |
| 774 // Because actual context menu is implemented by the browser side, |
| 775 // this function does only what LayoutTests are expecting: |
| 776 // - Many test checks the count of items. So returning non-zero value |
| 777 // makes sense. |
| 778 // - Some test compares the count before and after some action. So |
| 779 // changing the count based on flags also makes sense. This function |
| 780 // is doing such for some flags. |
| 781 // - Some test even checks actual string content. So providing it |
| 782 // would be also helpful. |
| 783 static std::vector<WebString> |
| 784 MakeMenuItemStringsFor(const WebKit::WebContextMenuData* context_menu, |
| 785 MockSpellCheck* spellcheck) { |
| 786 // These constants are based on Safari's context menu because tests |
| 787 // are made for it. |
| 788 static const char* kNonEditableMenuStrings[] = { |
| 789 "Back", "Reload Page", "Open in Dashbaord", "<separator>", |
| 790 "View Source", "Save Page As", "Print Page", "Inspect Element", |
| 791 0 }; |
| 792 static const char* kEditableMenuStrings[] = { |
| 793 "Cut", "Copy", "<separator>", "Paste", "Spelling and Grammar", |
| 794 "Substitutions, Transformations", "Font", "Speech", |
| 795 "Paragraph Direction", "<separator>", 0 }; |
| 796 |
| 797 // This is possible because mouse events are cancelleable. |
| 798 if (!context_menu) |
| 799 return std::vector<WebString>(); |
| 800 |
| 801 std::vector<WebString> strings; |
| 802 |
| 803 if (context_menu->isEditable) { |
| 804 for (const char** item = kEditableMenuStrings; *item; ++item) |
| 805 strings.push_back(WebString::fromUTF8(*item)); |
| 806 std::vector<string16> suggestions; |
| 807 spellcheck->FillSuggestions(context_menu->misspelledWord, &suggestions); |
| 808 for (size_t i = 0; i < suggestions.size(); ++i) |
| 809 strings.push_back(WebString(suggestions[i])); |
| 810 } else { |
| 811 for (const char** item = kNonEditableMenuStrings; *item; ++item) |
| 812 strings.push_back(WebString::fromUTF8(*item)); |
| 813 } |
| 814 |
| 815 return strings; |
| 816 } |
| 817 |
773 void EventSendingController::contextClick( | 818 void EventSendingController::contextClick( |
774 const CppArgumentList& args, CppVariant* result) { | 819 const CppArgumentList& args, CppVariant* result) { |
775 result->SetNull(); | 820 result->SetNull(); |
776 | 821 |
777 webview()->layout(); | 822 webview()->layout(); |
778 | 823 |
| 824 // Clears last context menu data because we need to know if the |
| 825 // context menu be requested after following mouse events. |
| 826 shell_->delegate()->ClearContextMenuData(); |
| 827 |
779 UpdateClickCountForButton(WebMouseEvent::ButtonRight); | 828 UpdateClickCountForButton(WebMouseEvent::ButtonRight); |
780 | 829 |
781 // Generate right mouse down and up. | 830 // Generate right mouse down and up. |
782 | 831 |
783 WebMouseEvent event; | 832 WebMouseEvent event; |
784 pressed_button_ = WebMouseEvent::ButtonRight; | 833 pressed_button_ = WebMouseEvent::ButtonRight; |
785 InitMouseEvent(WebInputEvent::MouseDown, WebMouseEvent::ButtonRight, | 834 InitMouseEvent(WebInputEvent::MouseDown, WebMouseEvent::ButtonRight, |
786 last_mouse_pos_, &event); | 835 last_mouse_pos_, &event); |
787 webview()->handleInputEvent(event); | 836 webview()->handleInputEvent(event); |
788 | 837 |
789 InitMouseEvent(WebInputEvent::MouseUp, WebMouseEvent::ButtonRight, | 838 InitMouseEvent(WebInputEvent::MouseUp, WebMouseEvent::ButtonRight, |
790 last_mouse_pos_, &event); | 839 last_mouse_pos_, &event); |
791 webview()->handleInputEvent(event); | 840 webview()->handleInputEvent(event); |
792 | 841 |
793 pressed_button_ = WebMouseEvent::ButtonNone; | 842 pressed_button_ = WebMouseEvent::ButtonNone; |
| 843 |
| 844 result->Set(WebKit::WebBindings::makeStringArray( |
| 845 MakeMenuItemStringsFor( |
| 846 shell_->delegate()->last_context_menu_data(), |
| 847 shell_->delegate()->mock_spellcheck()))); |
| 848 |
794 } | 849 } |
795 | 850 |
796 void EventSendingController::scheduleAsynchronousClick( | 851 void EventSendingController::scheduleAsynchronousClick( |
797 const CppArgumentList& args, CppVariant* result) { | 852 const CppArgumentList& args, CppVariant* result) { |
798 result->SetNull(); | 853 result->SetNull(); |
799 | 854 |
800 MessageLoop::current()->PostTask(FROM_HERE, | 855 MessageLoop::current()->PostTask(FROM_HERE, |
801 method_factory_.NewRunnableMethod(&EventSendingController::mouseDown, | 856 method_factory_.NewRunnableMethod(&EventSendingController::mouseDown, |
802 args, static_cast<CppVariant*>(NULL))); | 857 args, static_cast<CppVariant*>(NULL))); |
803 MessageLoop::current()->PostTask(FROM_HERE, | 858 MessageLoop::current()->PostTask(FROM_HERE, |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 | 1072 |
1018 void EventSendingController::fireKeyboardEventsToElement( | 1073 void EventSendingController::fireKeyboardEventsToElement( |
1019 const CppArgumentList& args, CppVariant* result) { | 1074 const CppArgumentList& args, CppVariant* result) { |
1020 result->SetNull(); | 1075 result->SetNull(); |
1021 } | 1076 } |
1022 | 1077 |
1023 void EventSendingController::clearKillRing( | 1078 void EventSendingController::clearKillRing( |
1024 const CppArgumentList& args, CppVariant* result) { | 1079 const CppArgumentList& args, CppVariant* result) { |
1025 result->SetNull(); | 1080 result->SetNull(); |
1026 } | 1081 } |
OLD | NEW |