Index: webkit/tools/test_shell/mac/test_webview_delegate.mm |
=================================================================== |
--- webkit/tools/test_shell/mac/test_webview_delegate.mm (revision 14450) |
+++ webkit/tools/test_shell/mac/test_webview_delegate.mm (working copy) |
@@ -12,70 +12,11 @@ |
#include "webkit/glue/webview.h" |
#include "webkit/glue/plugins/plugin_list.h" |
#include "webkit/glue/plugins/webplugin_delegate_impl.h" |
+#include "webkit/glue/webmenurunner_mac.h" |
#include "webkit/tools/test_shell/test_shell.h" |
using WebKit::WebRect; |
-// MenuDelegate ---------------------------------------------------------------- |
-// A class for determining whether an item was selected from an HTML select |
-// control, or if the menu was dismissed without making a selection. If a menu |
-// item is selected, MenuDelegate is informed and sets a flag which can be |
-// queried after the menu has finished running. |
- |
-@interface MenuDelegate : NSObject { |
- @private |
- NSMenu* menu_; // Non-owning |
- BOOL menuItemWasChosen_; |
-} |
-- (id)initWithItems:(const std::vector<WebMenuItem>&)items |
- forMenu:(NSMenu*)menu; |
-- (void)addItem:(const WebMenuItem&)item; |
-- (BOOL)menuItemWasChosen; |
-- (void)menuItemSelected:(id)sender; |
-@end |
- |
-@implementation MenuDelegate |
- |
-- (id)initWithItems:(const std::vector<WebMenuItem>&)items |
- forMenu:(NSMenu*)menu { |
- if ((self = [super init])) { |
- menu_ = menu; |
- menuItemWasChosen_ = NO; |
- for (int i = 0; i < static_cast<int>(items.size()); ++i) |
- [self addItem:items[i]]; |
- } |
- return self; |
-} |
- |
-- (void)addItem:(const WebMenuItem&)item { |
- if (item.type == WebMenuItem::SEPARATOR) { |
- [menu_ addItem:[NSMenuItem separatorItem]]; |
- return; |
- } |
- |
- NSString* title = base::SysUTF16ToNSString(item.label); |
- NSMenuItem* menu_item = [menu_ addItemWithTitle:title |
- action:@selector(menuItemSelected:) |
- keyEquivalent:@""]; |
- [menu_item setEnabled:(item.enabled && item.type != WebMenuItem::GROUP)]; |
- [menu_item setTarget:self]; |
-} |
- |
-// Reflects the result of the user's interaction with the popup menu. If NO, the |
-// menu was dismissed without the user choosing an item, which can happen if the |
-// user clicked outside the menu region or hit the escape key. If YES, the user |
-// selected an item from the menu. |
-- (BOOL)menuItemWasChosen { |
- return menuItemWasChosen_; |
-} |
- |
-- (void)menuItemSelected:(id)sender { |
- menuItemWasChosen_ = YES; |
-} |
- |
-@end // MenuDelegate |
- |
- |
// WebViewDelegate ----------------------------------------------------------- |
TestWebViewDelegate::~TestWebViewDelegate() { |
@@ -130,82 +71,38 @@ |
int item_height, |
int selected_index, |
const std::vector<WebMenuItem>& items) { |
- // Populate the menu. |
- NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; |
- [menu setAutoenablesItems:NO]; |
- MenuDelegate* menu_delegate = |
- [[[MenuDelegate alloc] initWithItems:items forMenu:menu] autorelease]; |
- |
- // Set up the button cell, converting to NSView coordinates. The menu is |
- // positioned such that the currently selected menu item appears over the |
- // popup button, which is the expected Mac popup menu behavior. |
- NSPopUpButtonCell* button = [[NSPopUpButtonCell alloc] initTextCell:@"" |
- pullsDown:NO]; |
- [button autorelease]; |
- [button setMenu:menu]; |
- [button selectItemAtIndex:selected_index]; |
+ // Set up the menu position. |
NSView* web_view = shell_->webViewWnd(); |
NSRect view_rect = [web_view bounds]; |
int y_offset = bounds.y + bounds.height; |
NSRect position = NSMakeRect(bounds.x, view_rect.size.height - y_offset, |
bounds.width, bounds.height); |
- // Display the menu, and set a flag to determine if something was chosen. If |
- // nothing was chosen (i.e., the user dismissed the popup by the "ESC" key or |
- // clicking outside popup's region), send a dismiss message to WebKit. |
- [button performClickWithFrame:position inView:shell_->webViewWnd()]; |
+ // Display the menu. |
+ WebMenuRunner* menu_runner = |
pink (ping after 24hrs)
2009/04/27 14:14:59
can you use a scoped_nsobject here?
|
+ [[[WebMenuRunner alloc] initWithItems:items] autorelease]; |
+ [menu_runner runMenuInView:shell_->webViewWnd() |
+ withBounds:position |
+ initialIndex:selected_index]; |
+ |
// Get the selected item and forward to WebKit. WebKit expects an input event |
// (mouse down, keyboard activity) for this, so we calculate the proper |
// position based on the selected index and provided bounds. |
WebWidgetHost* popup = shell_->popupHost(); |
- NSEvent* event = nil; |
- double event_time = (double)(AbsoluteToDuration(UpTime())) / 1000.0; |
int window_num = [shell_->mainWnd() windowNumber]; |
- if ([menu_delegate menuItemWasChosen]) { |
+ NSEvent* event = CreateEventForMenuAction([menu_runner menuItemWasChosen], |
+ window_num, item_height, |
+ [menu_runner indexOfSelectedItem], |
+ position, view_rect); |
+ if ([menu_runner menuItemWasChosen]) { |
// Construct a mouse up event to simulate the selection of an appropriate |
// menu item. |
- NSPoint click_pos; |
- click_pos.x = position.size.width / 2; |
- |
- // This is going to be hard to calculate since the button is painted by |
- // WebKit, the menu by Cocoa, and we have to translate the selected_item |
- // index to a coordinate that WebKit's PopupMenu expects which uses a |
- // different font *and* expects to draw the menu below the button like we do |
- // on Windows. |
- // The WebKit popup menu thinks it will draw just below the button, so |
- // create the click at the offset based on the selected item's index and |
- // account for the different coordinate system used by NSView. |
- int item_offset = [button indexOfSelectedItem] * item_height + |
- item_height / 2; |
- click_pos.y = view_rect.size.height - item_offset; |
- event = [NSEvent mouseEventWithType:NSLeftMouseUp |
- location:click_pos |
- modifierFlags:0 |
- timestamp:event_time |
- windowNumber:window_num |
- context:nil |
- eventNumber:0 |
- clickCount:1 |
- pressure:1.0]; |
popup->MouseEvent(event); |
} else { |
// Fake an ESC key event (keyCode = 0x1B, from webinputevent_mac.mm) and |
// forward that to WebKit. |
- NSPoint key_pos; |
- key_pos.x = 0; |
- key_pos.y = 0; |
- event = [NSEvent keyEventWithType:NSKeyUp |
- location:key_pos |
- modifierFlags:0 |
- timestamp:event_time |
- windowNumber:window_num |
- context:nil |
- characters:@"" |
- charactersIgnoringModifiers:@"" |
- isARepeat:NO |
- keyCode:0x1B]; |
popup->KeyEvent(event); |
} |
} |