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

Unified Diff: webkit/tools/test_shell/mac/test_webview_delegate.mm

Issue 92062: Clean up cocoa popup menu handling for test_shell (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 months 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 side-by-side diff with in-line comments
Download patch
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);
}
}

Powered by Google App Engine
This is Rietveld 408576698