[Chromium] Add didAcceptIndices to ExternalPopupMenuClient for Android
authorabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Sep 2011 21:51:01 +0000 (21:51 +0000)
committerabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Sep 2011 21:51:01 +0000 (21:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=67574

Reviewed by Darin Fisher.

In Android, external popup menus can admit multiple selection (e.g.,
for listboxes presented using external UI).

* public/WebExternalPopupMenuClient.h:
* src/ExternalPopupMenu.cpp:
(WebKit::ExternalPopupMenu::didAcceptIndices):
* src/ExternalPopupMenu.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@94600 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/WebExternalPopupMenuClient.h
Source/WebKit/chromium/src/ExternalPopupMenu.cpp
Source/WebKit/chromium/src/ExternalPopupMenu.h

index 0b28802..d5738bc 100644 (file)
@@ -1,3 +1,18 @@
+2011-09-06  Adam Barth  <abarth@webkit.org>
+
+        [Chromium] Add didAcceptIndices to ExternalPopupMenuClient for Android
+        https://bugs.webkit.org/show_bug.cgi?id=67574
+
+        Reviewed by Darin Fisher.
+
+        In Android, external popup menus can admit multiple selection (e.g.,
+        for listboxes presented using external UI).
+
+        * public/WebExternalPopupMenuClient.h:
+        * src/ExternalPopupMenu.cpp:
+        (WebKit::ExternalPopupMenu::didAcceptIndices):
+        * src/ExternalPopupMenu.h:
+
 2011-09-06  Aaron Colwell  <acolwell@chromium.org>
 
         Allow MediaSource API to be enabled at runtime.
index e01bc2d..19f0731 100644 (file)
@@ -31,6 +31,8 @@
 #ifndef WebExternalPopupMenuClient_h
 #define WebExternalPopupMenuClient_h
 
+#include "WebVector.h"
+
 namespace WebKit {
 
 class WebExternalPopupMenuClient {
@@ -44,6 +46,11 @@ public:
     // this has been called as it might not be valid anymore.
     virtual void didAcceptIndex(int index) = 0;
 
+    // Should be called when a set of indices have been selected.
+    // Note that it is not safe to access this WebExternalPopupClientMenu after
+    // this has been called as it might not be valid anymore.
+    virtual void didAcceptIndices(const WebVector<int>& indices) = 0;
+
     // Should be called when the popup menu was discarded (closed without a
     // selection.
     // Note that it is not safe to access this WebExternalPopupClientMenu after
index ab1a914..f5e8809 100644 (file)
@@ -115,6 +115,39 @@ void ExternalPopupMenu::didAcceptIndex(int index)
     m_webExternalPopupMenu = 0;
 }
 
+void ExternalPopupMenu::didAcceptIndices(const WebVector<int>& indices)
+{
+#if ENABLE(NO_LISTBOX_RENDERING)
+    if (!m_popupMenuClient) {
+        m_webExternalPopupMenu = 0;
+        return
+    }
+
+    // Calling methods on the PopupMenuClient might lead to this object being
+    // derefed. This ensures it does not get deleted while we are running this
+    // method.
+    RefPtr<ExternalPopupMenu> protect(this);
+    ListPopupMenuClient* listPopupMenuClient = static_cast<ListPopupMenuClient*>(m_popupMenuClient);
+
+    if (!indices.size())
+        listPopupMenuClient->valueChanged(-1, true);
+    else {
+        for (size_t i = 0; i < indices.size(); ++i)
+            listPopupMenuClient->listBoxSelectItem(indices[i], (i > 0), false, (i == indices.size() - 1));
+    }
+
+    // The call to valueChanged above might have lead to a call to
+    // disconnectClient, so we might not have a PopupMenuClient anymore.
+    if (m_popupMenuClient)
+        m_popupMenuClient->popupDidHide();
+
+    m_webExternalPopupMenu = 0;
+
+#else
+    ASSERT_NOT_REACHED();
+#endif
+}
+
 void ExternalPopupMenu::didCancel()
 {
     // See comment in didAcceptIndex on why we need this.
index 6963e8d..aefd35e 100644 (file)
@@ -64,6 +64,7 @@ private:
     // WebExternalPopupClient methods:
     virtual void didChangeSelection(int index);
     virtual void didAcceptIndex(int index);
+    virtual void didAcceptIndices(const WebVector<int>& indices);
     virtual void didCancel();
 
     // Fills |info| with the popup menu information contained in the