| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "ExternalPopupMenu.h" | 32 #include "ExternalPopupMenu.h" |
| 33 | 33 |
| 34 #include "WebExternalPopupMenu.h" | 34 #include "WebExternalPopupMenu.h" |
| 35 #include "WebMenuItemInfo.h" | 35 #include "WebMenuItemInfo.h" |
| 36 #include "WebPopupMenuInfo.h" | 36 #include "WebPopupMenuInfo.h" |
| 37 #include "WebViewClient.h" | 37 #include "WebViewClient.h" |
| 38 #include "WebViewImpl.h" |
| 38 #include "core/frame/Frame.h" | 39 #include "core/frame/Frame.h" |
| 39 #include "core/frame/FrameView.h" | 40 #include "core/frame/FrameView.h" |
| 40 #include "platform/PopupMenuClient.h" | 41 #include "platform/PopupMenuClient.h" |
| 41 #include "platform/geometry/FloatQuad.h" | 42 #include "platform/geometry/FloatQuad.h" |
| 42 #include "platform/geometry/IntPoint.h" | 43 #include "platform/geometry/IntPoint.h" |
| 43 #include "platform/text/TextDirection.h" | 44 #include "platform/text/TextDirection.h" |
| 44 #include "public/platform/WebVector.h" | 45 #include "public/platform/WebVector.h" |
| 45 | 46 |
| 46 using namespace WebCore; | 47 using namespace WebCore; |
| 47 | 48 |
| 48 namespace blink { | 49 namespace blink { |
| 49 | 50 |
| 50 ExternalPopupMenu::ExternalPopupMenu(Frame& frame, PopupMenuClient* popupMenuCli
ent, WebViewClient* webViewClient) | 51 ExternalPopupMenu::ExternalPopupMenu(Frame& frame, PopupMenuClient* popupMenuCli
ent, WebViewImpl& webView) |
| 51 : m_popupMenuClient(popupMenuClient) | 52 : m_popupMenuClient(popupMenuClient) |
| 52 , m_frameView(frame.view()) | 53 , m_frameView(frame.view()) |
| 53 , m_webViewClient(webViewClient) | 54 , m_webView(webView) |
| 55 , m_dispatchEventTimer(this, &ExternalPopupMenu::dispatchEvent) |
| 54 , m_webExternalPopupMenu(0) | 56 , m_webExternalPopupMenu(0) |
| 55 { | 57 { |
| 56 } | 58 } |
| 57 | 59 |
| 58 ExternalPopupMenu::~ExternalPopupMenu() | 60 ExternalPopupMenu::~ExternalPopupMenu() |
| 59 { | 61 { |
| 60 } | 62 } |
| 61 | 63 |
| 62 void ExternalPopupMenu::show(const FloatQuad& controlPosition, const IntSize&, i
nt index) | 64 void ExternalPopupMenu::show(const FloatQuad& controlPosition, const IntSize&, i
nt index) |
| 63 { | 65 { |
| 64 IntRect rect(controlPosition.enclosingBoundingBox()); | 66 IntRect rect(controlPosition.enclosingBoundingBox()); |
| 65 // WebCore reuses the PopupMenu of a page. | 67 // WebCore reuses the PopupMenu of a page. |
| 66 // For simplicity, we do recreate the actual external popup everytime. | 68 // For simplicity, we do recreate the actual external popup everytime. |
| 67 hide(); | 69 hide(); |
| 68 | 70 |
| 69 WebPopupMenuInfo info; | 71 WebPopupMenuInfo info; |
| 70 getPopupMenuInfo(&info); | 72 getPopupMenuInfo(&info); |
| 71 if (info.items.isEmpty()) | 73 if (info.items.isEmpty()) |
| 72 return; | 74 return; |
| 73 m_webExternalPopupMenu = | 75 m_webExternalPopupMenu = m_webView.client()->createExternalPopupMenu(info, t
his); |
| 74 m_webViewClient->createExternalPopupMenu(info, this); | 76 if (m_webExternalPopupMenu) { |
| 75 if (m_webExternalPopupMenu) | |
| 76 m_webExternalPopupMenu->show(m_frameView->contentsToWindow(rect)); | 77 m_webExternalPopupMenu->show(m_frameView->contentsToWindow(rect)); |
| 77 else { | 78 #if OS(MACOSX) |
| 79 const WebInputEvent* currentEvent = WebViewImpl::currentInputEvent(); |
| 80 if (currentEvent && currentEvent->type == WebInputEvent::MouseDown) { |
| 81 m_syntheticEvent = adoptPtr(new WebMouseEvent); |
| 82 *m_syntheticEvent = *static_cast<const WebMouseEvent*>(currentEvent)
; |
| 83 m_syntheticEvent->type = WebInputEvent::MouseUp; |
| 84 m_dispatchEventTimer.startOneShot(0); |
| 85 // FIXME: show() is asynchronous. If preparing a popup is slow and |
| 86 // a user released the mouse button before showing the popup, |
| 87 // mouseup and click events are correctly dispatched. Dispatching |
| 88 // the synthetic mouseup event is redundant in this case. |
| 89 } |
| 90 #endif |
| 91 } else { |
| 78 // The client might refuse to create a popup (when there is already one
pending to be shown for example). | 92 // The client might refuse to create a popup (when there is already one
pending to be shown for example). |
| 79 didCancel(); | 93 didCancel(); |
| 80 } | 94 } |
| 81 } | 95 } |
| 82 | 96 |
| 97 void ExternalPopupMenu::dispatchEvent(Timer<ExternalPopupMenu>*) |
| 98 { |
| 99 m_webView.handleInputEvent(*m_syntheticEvent); |
| 100 m_syntheticEvent.clear(); |
| 101 } |
| 102 |
| 83 void ExternalPopupMenu::hide() | 103 void ExternalPopupMenu::hide() |
| 84 { | 104 { |
| 85 if (m_popupMenuClient) | 105 if (m_popupMenuClient) |
| 86 m_popupMenuClient->popupDidHide(); | 106 m_popupMenuClient->popupDidHide(); |
| 87 if (!m_webExternalPopupMenu) | 107 if (!m_webExternalPopupMenu) |
| 88 return; | 108 return; |
| 89 m_webExternalPopupMenu->close(); | 109 m_webExternalPopupMenu->close(); |
| 90 m_webExternalPopupMenu = 0; | 110 m_webExternalPopupMenu = 0; |
| 91 } | 111 } |
| 92 | 112 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 206 |
| 187 info->itemHeight = m_popupMenuClient->menuStyle().font().fontMetrics().heigh
t(); | 207 info->itemHeight = m_popupMenuClient->menuStyle().font().fontMetrics().heigh
t(); |
| 188 info->itemFontSize = static_cast<int>(m_popupMenuClient->menuStyle().font().
size()); | 208 info->itemFontSize = static_cast<int>(m_popupMenuClient->menuStyle().font().
size()); |
| 189 info->selectedIndex = m_popupMenuClient->selectedIndex(); | 209 info->selectedIndex = m_popupMenuClient->selectedIndex(); |
| 190 info->rightAligned = m_popupMenuClient->menuStyle().textDirection() == WebCo
re::RTL; | 210 info->rightAligned = m_popupMenuClient->menuStyle().textDirection() == WebCo
re::RTL; |
| 191 info->allowMultipleSelection = m_popupMenuClient->multiple(); | 211 info->allowMultipleSelection = m_popupMenuClient->multiple(); |
| 192 info->items.swap(items); | 212 info->items.swap(items); |
| 193 } | 213 } |
| 194 | 214 |
| 195 } | 215 } |
| OLD | NEW |