Changeset 74285 in webkit
- Timestamp:
- Dec 17, 2010 1:08:36 PM (13 years ago)
- Location:
- trunk/WebKit2
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebKit2/ChangeLog
r74284 r74285 1 2010-12-17 Brian Weinstein <bweinstein@apple.com> 2 3 Reviewed by Anders Carlsson. 4 5 Text area does not update when you arrow through a <select> in WebKit2 6 https://bugs.webkit.org/show_bug.cgi?id=51269 7 <rdar://problem/8612853> 8 9 Patch by Sam Weinig. 10 11 Insteaed of keeping track of the selected index of a <select> just in the UI process, we 12 need to pass this information along to the web process so that the web process can draw 13 the correct text in the text field at the top of the select, when the selection changes (via 14 the arrows or other typing while the select is opened). 15 16 When the selected item in a popup changes, the UI process sends a message to the web process, telling 17 it about the new selected index. The web process gets this message, and then sets the text that 18 is visible in the select element. 19 20 * UIProcess/API/mac/PageClientImpl.h: CreatePopupMenuProxy now takes a WebPageProxy. 21 * UIProcess/API/mac/PageClientImpl.mm: 22 (WebKit::PageClientImpl::createPopupMenuProxy): Pass the WebPageProxy to create. 23 * UIProcess/API/qt/qwkpage.cpp: 24 (QWKPagePrivate::createPopupMenuProxy): 25 * UIProcess/API/qt/qwkpage_p.h: CreatePopupMenuProxy now takes a WebPageProxy. 26 * UIProcess/PageClient.h: CreatePopupMenuProxy now takes a WebPageProxy. 27 * UIProcess/WebPageProxy.cpp: 28 (WebKit::WebPageProxy::valueChangedForPopupMenu): Send that the selected index changed to the 29 web process.selected 30 (WebKit::WebPageProxy::setTextFromItemForPopupMenu): Send that we should update the text for the 31 active popup menu (with the index of the item to show). 32 (WebKit::WebPageProxy::showPopupMenu): Pass the WebPageProxy to createPopupMenuProxy. 33 * UIProcess/WebPageProxy.h: 34 * UIProcess/WebPopupMenuProxy.h: Add a client who has virtual functions for the state changing of the 35 popup menu. ShowPopupMenu doesn't take a new selected index anymore, that is handled by the client, 36 and calling down to the web process. 37 (WebKit::WebPopupMenuProxy::Client::~Client): 38 (WebKit::WebPopupMenuProxy::WebPopupMenuProxy): Initialize the client. 39 * UIProcess/mac/WebPopupMenuProxyMac.h: 40 (WebKit::WebPopupMenuProxyMac::create): Takes a WebPopupMenuProxy::Client, and passes it to the constructor. 41 * UIProcess/mac/WebPopupMenuProxyMac.mm: 42 (WebKit::WebPopupMenuProxyMac::WebPopupMenuProxyMac): Update what's initialized by the constructor. 43 (WebKit::WebPopupMenuProxyMac::showPopupMenu): Call through to the web process that the value changed. 44 * UIProcess/qt/WebPopupMenuProxyQt.cpp: 45 (WebKit::WebPopupMenuProxyQt::WebPopupMenuProxyQt): Update what's initialized by the constructor. 46 * UIProcess/win/WebPopupMenuProxyWin.cpp: 47 (WebKit::WebPopupMenuProxyWin::WebPopupMenuProxyWin): Ditto. 48 (WebKit::WebPopupMenuProxyWin::showPopupMenu): Call through to the web process that the value changed. 49 (WebKit::WebPopupMenuProxyWin::setFocusedIndex): Resolve a FIXME to set the text of the popup menu. 50 * UIProcess/win/WebPopupMenuProxyWin.h: 51 (WebKit::WebPopupMenuProxyWin::create): Take in a WebPopupMenuProxy::client, and pass it to the constructor. 52 * UIProcess/win/WebView.cpp: 53 (WebKit::WebView::createPopupMenuProxy): Pass the WebPageProxy to create. 54 * UIProcess/win/WebView.h: 55 * WebProcess/WebCoreSupport/WebPopupMenu.cpp: 56 (WebKit::WebPopupMenu::setTextForIndex): Call through to setTextFromItem to set the select text. 57 * WebProcess/WebCoreSupport/WebPopupMenu.h: 58 * WebProcess/WebPage/WebPage.cpp: Call through to setTextForIndex on the active popup menu. 59 (WebKit::WebPage::setTextForActivePopupMenu): 60 * WebProcess/WebPage/WebPage.h: 61 * WebProcess/WebPage/WebPage.messages.in: Add a new message. 62 1 63 2010-12-17 Anders Carlsson <andersca@apple.com> 2 64 -
trunk/WebKit2/UIProcess/API/mac/PageClientImpl.h
r74037 r74285 67 67 virtual void selectionChanged(bool, bool, bool, bool, uint64_t, uint64_t); 68 68 69 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy( );69 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*); 70 70 virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*); 71 71 -
trunk/WebKit2/UIProcess/API/mac/PageClientImpl.mm
r74037 r74285 248 248 } 249 249 250 PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy( )251 { 252 return WebPopupMenuProxyMac::create(m_wkView );250 PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy* page) 251 { 252 return WebPopupMenuProxyMac::create(m_wkView, page); 253 253 } 254 254 -
trunk/WebKit2/UIProcess/API/qt/qwkpage.cpp
r74139 r74285 137 137 } 138 138 139 PassRefPtr<WebPopupMenuProxy> QWKPagePrivate::createPopupMenuProxy( )139 PassRefPtr<WebPopupMenuProxy> QWKPagePrivate::createPopupMenuProxy(WebPageProxy*) 140 140 { 141 141 return WebPopupMenuProxyQt::create(); -
trunk/WebKit2/UIProcess/API/qt/qwkpage_p.h
r73986 r74285 63 63 virtual void didNotHandleKeyEvent(const WebKit::NativeWebKeyboardEvent&); 64 64 virtual void selectionChanged(bool, bool, bool, bool); 65 virtual PassRefPtr<WebKit::WebPopupMenuProxy> createPopupMenuProxy( );65 virtual PassRefPtr<WebKit::WebPopupMenuProxy> createPopupMenuProxy(WebKit::WebPageProxy*); 66 66 virtual PassRefPtr<WebKit::WebContextMenuProxy> createContextMenuProxy(WebKit::WebPageProxy*); 67 67 -
trunk/WebKit2/UIProcess/PageClient.h
r74164 r74285 83 83 virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&) = 0; 84 84 85 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy( ) = 0;85 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*) = 0; 86 86 virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*) = 0; 87 87 -
trunk/WebKit2/UIProcess/WebPageProxy.cpp
r74282 r74285 1449 1449 } 1450 1450 1451 void WebPageProxy::valueChangedForPopupMenu(WebPopupMenuProxy*, int32_t newSelectedIndex) 1452 { 1453 process()->send(Messages::WebPage::DidChangeSelectedIndexForActivePopupMenu(newSelectedIndex), m_pageID); 1454 } 1455 1456 void WebPageProxy::setTextFromItemForPopupMenu(WebPopupMenuProxy*, int32_t index) 1457 { 1458 process()->send(Messages::WebPage::SetTextForActivePopupMenu(index), m_pageID); 1459 } 1460 1451 1461 void WebPageProxy::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, int32_t selectedIndex, const PlatformPopupMenuData& data) 1452 1462 { … … 1454 1464 m_activePopupMenu->hidePopupMenu(); 1455 1465 else 1456 m_activePopupMenu = m_pageClient->createPopupMenuProxy(); 1457 1458 int32_t newSelectedIndex = 0; 1459 m_activePopupMenu->showPopupMenu(rect, items, data, selectedIndex, newSelectedIndex); 1460 1461 process()->send(Messages::WebPage::DidChangeSelectedIndexForActivePopupMenu(newSelectedIndex), m_pageID); 1466 m_activePopupMenu = m_pageClient->createPopupMenuProxy(this); 1467 1468 m_activePopupMenu->showPopupMenu(rect, items, data, selectedIndex); 1462 1469 m_activePopupMenu = 0; 1463 1470 } -
trunk/WebKit2/UIProcess/WebPageProxy.h
r74282 r74285 43 43 #include "WebLoaderClient.h" 44 44 #include "WebPolicyClient.h" 45 #include "WebPopupMenuProxy.h" 45 46 #include "WebUIClient.h" 46 47 #include <WebCore/EditAction.h> … … 101 102 typedef GenericCallback<WKStringRef, StringImpl*> ContentsAsStringCallback; 102 103 103 class WebPageProxy : public APIObject {104 class WebPageProxy : public APIObject, public WebPopupMenuProxy::Client { 104 105 public: 105 106 static const Type APIType = TypePage; … … 297 298 298 299 virtual Type type() const { return APIType; } 300 301 // WebPopupMenuProxy::Client 302 virtual void valueChangedForPopupMenu(WebPopupMenuProxy*, int32_t newSelectedIndex); 303 virtual void setTextFromItemForPopupMenu(WebPopupMenuProxy*, int32_t index); 299 304 300 305 // Implemented in generated WebPageProxyMessageReceiver.cpp -
trunk/WebKit2/UIProcess/WebPopupMenuProxy.h
r71640 r74285 41 41 42 42 class WebPopupMenuProxy : public RefCounted<WebPopupMenuProxy> { 43 public: 43 public: 44 class Client { 45 protected: 46 virtual ~Client() 47 { 48 } 49 50 public: 51 virtual void valueChangedForPopupMenu(WebPopupMenuProxy*, int32_t newSelectedIndex) = 0; 52 virtual void setTextFromItemForPopupMenu(WebPopupMenuProxy*, int32_t index) = 0; 53 }; 54 44 55 virtual ~WebPopupMenuProxy() 45 56 { 46 57 } 47 58 48 virtual void showPopupMenu(const WebCore::IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex , int32_t& newSelectedIndex) = 0;59 virtual void showPopupMenu(const WebCore::IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) = 0; 49 60 virtual void hidePopupMenu() = 0; 50 61 51 62 protected: 52 WebPopupMenuProxy() 63 WebPopupMenuProxy(Client* client) 64 : m_client(client) 53 65 { 54 66 } 67 68 Client* m_client; 55 69 }; 56 70 -
trunk/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.h
r71640 r74285 44 44 class WebPopupMenuProxyMac : public WebPopupMenuProxy { 45 45 public: 46 static PassRefPtr<WebPopupMenuProxyMac> create(WKView* webView )46 static PassRefPtr<WebPopupMenuProxyMac> create(WKView* webView, WebPopupMenuProxy::Client* client) 47 47 { 48 return adoptRef(new WebPopupMenuProxyMac(webView ));48 return adoptRef(new WebPopupMenuProxyMac(webView, client)); 49 49 } 50 50 ~WebPopupMenuProxyMac(); 51 51 52 virtual void showPopupMenu(const WebCore::IntRect&, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex , int32_t& newSelectedIndex);52 virtual void showPopupMenu(const WebCore::IntRect&, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex); 53 53 virtual void hidePopupMenu(); 54 54 55 55 private: 56 WebPopupMenuProxyMac(WKView* );56 WebPopupMenuProxyMac(WKView*, WebPopupMenuProxy::Client* client); 57 57 58 58 void populate(const Vector<WebPopupItem>&); -
trunk/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm
r71640 r74285 36 36 namespace WebKit { 37 37 38 WebPopupMenuProxyMac::WebPopupMenuProxyMac(WKView* webView) 39 : m_webView(webView) 38 WebPopupMenuProxyMac::WebPopupMenuProxyMac(WKView* webView, WebPopupMenuProxy::Client* client) 39 : WebPopupMenuProxy(client) 40 , m_webView(webView) 40 41 { 41 42 } … … 71 72 } 72 73 73 void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex , int32_t& newSelectedIndex)74 void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) 74 75 { 75 76 populate(items); … … 97 98 [dummyView.get() removeFromSuperview]; 98 99 99 newSelectedIndex = [m_popup.get() indexOfSelectedItem];100 m_client->valueChangedForPopupMenu(this, [m_popup.get() indexOfSelectedItem]); 100 101 } 101 102 -
trunk/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp
r71640 r74285 34 34 35 35 WebPopupMenuProxyQt::WebPopupMenuProxyQt() 36 : WebPopupMenuProxy(0) 36 37 { 37 38 } … … 41 42 } 42 43 43 void WebPopupMenuProxyQt::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex , int32_t& newSelectedIndex)44 void WebPopupMenuProxyQt::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) 44 45 { 45 46 } -
trunk/WebKit2/UIProcess/win/WebPopupMenuProxyWin.cpp
r73852 r74285 159 159 } 160 160 161 WebPopupMenuProxyWin::WebPopupMenuProxyWin(WebView* webView) 162 : m_webView(webView) 161 WebPopupMenuProxyWin::WebPopupMenuProxyWin(WebView* webView, WebPopupMenuProxy::Client* client) 162 : WebPopupMenuProxy(client) 163 , m_webView(webView) 163 164 , m_newSelectedIndex(0) 164 165 , m_popup(0) … … 187 188 } 188 189 189 void WebPopupMenuProxyWin::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData& data, int32_t selectedIndex , int32_t& newSelectedIndex)190 void WebPopupMenuProxyWin::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData& data, int32_t selectedIndex) 190 191 { 191 192 m_items = items; … … 323 324 ::ShowWindow(m_popup, SW_HIDE); 324 325 325 newSelectedIndex = m_newSelectedIndex;326 m_client->valueChangedForPopupMenu(this, m_newSelectedIndex); 326 327 } 327 328 … … 847 848 m_focusedIndex = i; 848 849 849 // FIXME: If we are not hotTracking, we need to send a message back to the WebProcess to 850 // call the popupMenuClient's setTextFromItem function of this index. This will update 851 // the currently displayed item at the top of the list. 850 if (!hotTracking) 851 m_client->setTextFromItemForPopupMenu(this, i); 852 852 853 853 if (!scrollToRevealSelection()) -
trunk/WebKit2/UIProcess/win/WebPopupMenuProxyWin.h
r71640 r74285 43 43 class WebPopupMenuProxyWin : public WebPopupMenuProxy, private WebCore::ScrollbarClient { 44 44 public: 45 static PassRefPtr<WebPopupMenuProxyWin> create(WebView* webView )45 static PassRefPtr<WebPopupMenuProxyWin> create(WebView* webView, WebPopupMenuProxy::Client* client) 46 46 { 47 return adoptRef(new WebPopupMenuProxyWin(webView ));47 return adoptRef(new WebPopupMenuProxyWin(webView, client)); 48 48 } 49 49 ~WebPopupMenuProxyWin(); 50 50 51 virtual void showPopupMenu(const WebCore::IntRect&, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex , int32_t& newSelectedIndex);51 virtual void showPopupMenu(const WebCore::IntRect&, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex); 52 52 virtual void hidePopupMenu(); 53 53 … … 55 55 56 56 private: 57 WebPopupMenuProxyWin(WebView* );57 WebPopupMenuProxyWin(WebView*, WebPopupMenuProxy::Client*); 58 58 59 59 WebCore::Scrollbar* scrollbar() const { return m_scrollbar.get(); } -
trunk/WebKit2/UIProcess/win/WebView.cpp
r74284 r74285 927 927 } 928 928 929 PassRefPtr<WebPopupMenuProxy> WebView::createPopupMenuProxy( )930 { 931 return WebPopupMenuProxyWin::create(this );929 PassRefPtr<WebPopupMenuProxy> WebView::createPopupMenuProxy(WebPageProxy* page) 930 { 931 return WebPopupMenuProxyWin::create(this, page); 932 932 } 933 933 -
trunk/WebKit2/UIProcess/win/WebView.h
r74164 r74285 119 119 virtual void selectionChanged(bool, bool, bool, bool); 120 120 virtual void compositionSelectionChanged(bool); 121 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy( );121 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*); 122 122 virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*); 123 123 virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut); -
trunk/WebKit2/WebProcess/WebCoreSupport/WebPopupMenu.cpp
r73852 r74285 64 64 } 65 65 66 void WebPopupMenu::setTextForIndex(int index) 67 { 68 if (!m_popupClient) 69 return; 70 71 m_popupClient->setTextFromItem(index); 72 } 73 66 74 Vector<WebPopupItem> WebPopupMenu::populateItems() 67 75 { -
trunk/WebKit2/WebProcess/WebCoreSupport/WebPopupMenu.h
r73852 r74285 46 46 void disconnectFromPage() { m_page = 0; } 47 47 void didChangeSelectedIndex(int newIndex); 48 void setTextForIndex(int newIndex); 48 49 49 50 virtual void show(const WebCore::IntRect&, WebCore::FrameView*, int index); -
trunk/WebKit2/WebProcess/WebPage/WebPage.cpp
r74275 r74285 1117 1117 } 1118 1118 1119 void WebPage::setTextForActivePopupMenu(int32_t index) 1120 { 1121 if (!m_activePopupMenu) 1122 return; 1123 1124 m_activePopupMenu->setTextForIndex(index); 1125 } 1126 1119 1127 void WebPage::didSelectItemFromActiveContextMenu(const WebContextMenuItemData& item) 1120 1128 { -
trunk/WebKit2/WebProcess/WebPage/WebPage.h
r74275 r74285 338 338 339 339 void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex); 340 void setTextForActivePopupMenu(int32_t index); 340 341 341 342 void didChooseFilesForOpenPanel(const Vector<String>&); -
trunk/WebKit2/WebProcess/WebPage/WebPage.messages.in
r74275 r74285 88 88 # Popup menu. 89 89 DidChangeSelectedIndexForActivePopupMenu(int32_t newIndex); 90 SetTextForActivePopupMenu(int32_t index); 90 91 91 92 # Context menu.
Note: See TracChangeset
for help on using the changeset viewer.