15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/external_popup_menu.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/frame_messages.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/menu_item_builder.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/render_frame_impl.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebExternalPopupMenuClient.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalPopupMenu::ExternalPopupMenu( 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameImpl* render_frame, 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPopupMenuInfo& popup_menu_info, 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebExternalPopupMenuClient* popup_menu_client) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : render_frame_(render_frame), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_info_(popup_menu_info), 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) popup_menu_client_(popup_menu_client), 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) origin_scale_for_emulation_(0) { 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ExternalPopupMenu::SetOriginScaleAndOffsetForEmulation( 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float scale, const gfx::Point& offset) { 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) origin_scale_for_emulation_ = scale; 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) origin_offset_for_emulation_ = offset; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ExternalPopupMenu::show(const blink::WebRect& bounds) { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRect rect = bounds; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (origin_scale_for_emulation_) { 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) rect.x *= origin_scale_for_emulation_; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) rect.y *= origin_scale_for_emulation_; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rect.x += origin_offset_for_emulation_.x(); 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rect.y += origin_offset_for_emulation_.y(); 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameHostMsg_ShowPopup_Params popup_params; 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) popup_params.bounds = rect; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.item_height = popup_menu_info_.itemHeight; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.item_font_size = popup_menu_info_.itemFontSize; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.selected_item = popup_menu_info_.selectedIndex; 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < popup_menu_info_.items.size(); ++i) { 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch popup_params.popup_items.push_back( 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MenuItemBuilder::Build(popup_menu_info_.items[i])); 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.right_aligned = popup_menu_info_.rightAligned; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.allow_multiple_selection = 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_info_.allowMultipleSelection; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_frame_->Send( 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new FrameHostMsg_ShowPopup(render_frame_->GetRoutingID(), popup_params)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::close() { 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_frame_->Send( 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new FrameHostMsg_HidePopup(render_frame_->GetRoutingID())); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_frame_->DidHideExternalPopupMenu(); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |this| was deleted. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItem(int index) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!popup_menu_client_) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == -1) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didCancel(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didAcceptIndex(index); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItems(bool canceled, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int>& indices) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!popup_menu_client_) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (canceled) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didCancel(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didAcceptIndices(indices); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 87