diff options
author | jcivelli@google.com <jcivelli@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-26 17:54:08 +0000 |
---|---|---|
committer | jcivelli@google.com <jcivelli@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-26 17:54:08 +0000 |
commit | caf706f870d1d9d576277110ab1df022b2756203 (patch) | |
tree | 6a890ba2ebeb302c6cdff569d462288a9676d811 /chrome/renderer/external_popup_menu.cc | |
parent | 8e23c49777ff4b57fa17f9d5eba8ccd82784e010 (diff) | |
download | chromium_src-caf706f870d1d9d576277110ab1df022b2756203.zip chromium_src-caf706f870d1d9d576277110ab1df022b2756203.tar.gz chromium_src-caf706f870d1d9d576277110ab1df022b2756203.tar.bz2 |
Refactoring select popup on Mac.
The select popup on Mac was based on a hack: we would create an invisible RenderWidget and redirect mouse and keyboard events to it and we would display a native Cocoa menu. With this CL we do not use a RenderWidget anymore, we send the user selection to the RenderView which in turns communicates to WebKit that selection.
BUG=None
TEST=On Mac, ensures the select popup works as expected. Also test that for an extension with a browser action containing a select popup, the select popup does work. Also ensures autocomplete/autofill still works (especially popups).
Original review:
http://codereview.chromium.org/3795006/show
Review URL: http://codereview.chromium.org/4078003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63906 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/external_popup_menu.cc')
-rw-r--r-- | chrome/renderer/external_popup_menu.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/chrome/renderer/external_popup_menu.cc b/chrome/renderer/external_popup_menu.cc new file mode 100644 index 0000000..b840386 --- /dev/null +++ b/chrome/renderer/external_popup_menu.cc @@ -0,0 +1,47 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/renderer/external_popup_menu.h" + +#include "chrome/common/render_messages.h" +#include "chrome/common/render_messages_params.h" +#include "chrome/renderer/render_view.h" +#include "third_party/WebKit/WebKit/chromium/public/WebExternalPopupMenuClient.h" +#include "third_party/WebKit/WebKit/chromium/public/WebRect.h" + +ExternalPopupMenu::ExternalPopupMenu( + RenderView* render_view, + const WebKit::WebPopupMenuInfo& popup_menu_info, + WebKit::WebExternalPopupMenuClient* popup_menu_client) + : render_view_(render_view), + popup_menu_info_(popup_menu_info), + popup_menu_client_(popup_menu_client) { +} + +void ExternalPopupMenu::show(const WebKit::WebRect& bounds) { + ViewHostMsg_ShowPopup_Params popup_params; + popup_params.bounds = bounds; + popup_params.item_height = popup_menu_info_.itemHeight; + popup_params.item_font_size = popup_menu_info_.itemFontSize; + popup_params.selected_item = popup_menu_info_.selectedIndex; + for (size_t i = 0; i < popup_menu_info_.items.size(); ++i) + popup_params.popup_items.push_back(WebMenuItem(popup_menu_info_.items[i])); + popup_params.right_aligned = popup_menu_info_.rightAligned; + render_view_->Send( + new ViewHostMsg_ShowPopup(render_view_->routing_id(), popup_params)); +} + +void ExternalPopupMenu::close() { + popup_menu_client_ = NULL; + render_view_ = NULL; +} + +void ExternalPopupMenu::DidSelectItem(int index) { + if (!popup_menu_client_) + return; + if (index == -1) + popup_menu_client_->didCancel(); + else + popup_menu_client_->didAcceptIndex(index); +} |