| Index: ui/views/controls/menu/menu_controller.cc
|
| diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
|
| index 5364b83da55b3c6fe23fe56fc1c580795fee83be..58bca034606bd209e5bdbe210f5b936d10856afe 100644
|
| --- a/ui/views/controls/menu/menu_controller.cc
|
| +++ b/ui/views/controls/menu/menu_controller.cc
|
| @@ -253,7 +253,8 @@ struct MenuController::SelectByCharDetails {
|
| MenuController::State::State()
|
| : item(NULL),
|
| submenu_open(false),
|
| - anchor(views::MenuItemView::TOPLEFT) {}
|
| + anchor(views::MenuItemView::TOPLEFT),
|
| + context_menu(false) {}
|
|
|
| MenuController::State::~State() {}
|
|
|
| @@ -272,6 +273,7 @@ MenuItemView* MenuController::Run(Widget* parent,
|
| MenuItemView* root,
|
| const gfx::Rect& bounds,
|
| MenuItemView::AnchorPosition position,
|
| + bool context_menu,
|
| int* result_mouse_event_flags) {
|
| exit_type_ = EXIT_NONE;
|
| possible_drag_ = false;
|
| @@ -295,7 +297,7 @@ MenuItemView* MenuController::Run(Widget* parent,
|
| // Reset current state.
|
| pending_state_ = State();
|
| state_ = State();
|
| - UpdateInitialLocation(bounds, position);
|
| + UpdateInitialLocation(bounds, position, context_menu);
|
|
|
| owner_ = parent;
|
|
|
| @@ -1080,7 +1082,9 @@ MenuController::SendAcceleratorResultType
|
|
|
| void MenuController::UpdateInitialLocation(
|
| const gfx::Rect& bounds,
|
| - MenuItemView::AnchorPosition position) {
|
| + MenuItemView::AnchorPosition position,
|
| + bool context_menu) {
|
| + pending_state_.context_menu = context_menu;
|
| pending_state_.initial_bounds = bounds;
|
| if (bounds.height() > 1) {
|
| // Inset the bounds slightly, otherwise drag coordinates don't line up
|
| @@ -1181,10 +1185,9 @@ bool MenuController::ShowSiblingMenu(SubmenuView* source,
|
| // Subtract 1 from the height to make the popup flush with the button border.
|
| UpdateInitialLocation(gfx::Rect(screen_menu_loc.x(), screen_menu_loc.y(),
|
| button->width(), button->height() - 1),
|
| - anchor);
|
| + anchor, state_.context_menu);
|
| alt_menu->PrepareForRun(
|
| - has_mnemonics,
|
| - source->GetMenuItem()->GetRootMenuItem()->show_mnemonics_);
|
| + has_mnemonics, source->GetMenuItem()->GetRootMenuItem()->show_mnemonics_);
|
| alt_menu->controller_ = this;
|
| SetSelection(alt_menu, SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
|
| return true;
|
| @@ -1550,9 +1553,18 @@ gfx::Rect MenuController::CalculateMenuBounds(MenuItemView* item,
|
| if (!item->GetParentMenuItem()) {
|
| // First item, position relative to initial location.
|
| x = state_.initial_bounds.x();
|
| +
|
| + // Offsets for context menu prevent menu items being selected by
|
| + // simply opening the menu (bug 142992).
|
| + if (MenuConfig::instance().offset_context_menus && state_.context_menu)
|
| + x += 1;
|
| +
|
| y = state_.initial_bounds.bottom();
|
| - if (state_.anchor == MenuItemView::TOPRIGHT)
|
| + if (state_.anchor == MenuItemView::TOPRIGHT) {
|
| x = x + state_.initial_bounds.width() - pref.width();
|
| + if (MenuConfig::instance().offset_context_menus && state_.context_menu)
|
| + x -= 1;
|
| + }
|
|
|
| if (!state_.monitor_bounds.IsEmpty() &&
|
| y + pref.height() > state_.monitor_bounds.bottom()) {
|
| @@ -1623,6 +1635,13 @@ gfx::Rect MenuController::CalculateMenuBounds(MenuItemView* item,
|
| } else {
|
| item->set_actual_menu_position(MenuItemView::POSITION_BELOW_BOUNDS);
|
| }
|
| + if (state_.monitor_bounds.width() != 0 &&
|
| + MenuConfig::instance().offset_context_menus && state_.context_menu) {
|
| + if (x + pref.width() > state_.monitor_bounds.right())
|
| + x = state_.initial_bounds.x() - pref.width() - 1;
|
| + if (x < state_.monitor_bounds.x())
|
| + x = state_.monitor_bounds.x();
|
| + }
|
| } else {
|
| // Not the first menu; position it relative to the bounds of the menu
|
| // item.
|
|
|