[BlackBerry] Some callback of Select onchange doesn't work
authorcharles.wei@torchmobile.com.cn <charles.wei@torchmobile.com.cn@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Aug 2012 15:09:08 +0000 (15:09 +0000)
committercharles.wei@torchmobile.com.cn <charles.wei@torchmobile.com.cn@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Aug 2012 15:09:08 +0000 (15:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=93944

Reviewed by George Staikos.

The Selection element is implemented with PagePopup, an HTML-based WebView with
some Javascripts to make the UI of the select and option lists; The selection
change is initiated from the javascript code in the Select Webview, and back to
the native code of SelectPopupClient, which now in turn dispatches
FormControlChangeEvent to the select element directly, and that causes the
javascript callback been invoked in the same cycle as the javascript in the
Popup View, and causes some Javascript Context problem.

The solution is to send the FormControlChangeEvent asynchronously by a timer,
when the JavaScript in the Popup view finishes execution, we then send the
FormControlChangeEvent to the select element in the content page, that avoids
the concurrent Javascript context issue.

* WebCoreSupport/SelectPopupClient.cpp:
(WebCore::SelectPopupClient::SelectPopupClient):
(WebCore::SelectPopupClient::setValueAndClosePopup):
(WebCore):
(WebCore::SelectPopupClient::notifySelectionChange):
* WebCoreSupport/SelectPopupClient.h:
(SelectPopupClient):

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

Source/WebKit/blackberry/ChangeLog
Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.cpp
Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.h

index 702c482..7f9ab3d 100644 (file)
@@ -1,3 +1,31 @@
+2012-08-14  Charles Wei  <charles.wei@torchmobile.com.cn>
+
+        [BlackBerry] Some callback of Select onchange doesn't work
+        https://bugs.webkit.org/show_bug.cgi?id=93944
+
+        Reviewed by George Staikos.
+
+        The Selection element is implemented with PagePopup, an HTML-based WebView with
+        some Javascripts to make the UI of the select and option lists; The selection
+        change is initiated from the javascript code in the Select Webview, and back to
+        the native code of SelectPopupClient, which now in turn dispatches
+        FormControlChangeEvent to the select element directly, and that causes the
+        javascript callback been invoked in the same cycle as the javascript in the
+        Popup View, and causes some Javascript Context problem.
+
+        The solution is to send the FormControlChangeEvent asynchronously by a timer, 
+        when the JavaScript in the Popup view finishes execution, we then send the
+        FormControlChangeEvent to the select element in the content page, that avoids
+        the concurrent Javascript context issue.
+
+        * WebCoreSupport/SelectPopupClient.cpp:
+        (WebCore::SelectPopupClient::SelectPopupClient):
+        (WebCore::SelectPopupClient::setValueAndClosePopup):
+        (WebCore):
+        (WebCore::SelectPopupClient::notifySelectionChange):
+        * WebCoreSupport/SelectPopupClient.h:
+        (SelectPopupClient):
+
 2012-08-14  Arvid Nilsson  <anilsson@rim.com>
 
         [BlackBerry] Get rid of glCopyTexImage2D in Canvas and WebGL code paths
index ab362c4..2c87997 100644 (file)
@@ -44,6 +44,7 @@ SelectPopupClient::SelectPopupClient(bool multiple, int size, const ScopeArray<B
     , m_size(size)
     , m_webPage(webPage)
     , m_element(element)
+    , m_notifyChangeTimer(this, &SelectPopupClient::notifySelectionChange)
 {
     generateHTML(multiple, size, labels, enableds, itemType, selecteds);
 }
@@ -173,10 +174,10 @@ void SelectPopupClient::setValueAndClosePopup(int, const String& stringValue)
     }
     // Force repaint because we do not send mouse events to the select element
     // and the element doesn't automatically repaint itself.
-    m_element->dispatchFormControlChangeEvent();
     if (m_element->renderer())
         m_element->renderer()->repaint();
-    closePopup();
+
+    m_notifyChangeTimer.startOneShot(0);
 }
 
 void SelectPopupClient::didClosePopup()
@@ -192,5 +193,13 @@ void SelectPopupClient::writeDocument(DocumentWriter& writer)
     writer.addData(m_source.utf8().data(), m_source.utf8().length());
     writer.end();
 }
+
+void SelectPopupClient::notifySelectionChange(WebCore::Timer<SelectPopupClient>*)
+{
+    if (m_element)
+        m_element->dispatchFormControlChangeEvent();
+    closePopup();
+}
+
 }
 
index fc2f446..17cc776 100644 (file)
@@ -22,6 +22,7 @@
 #include "IntSize.h"
 #include "PagePopupClient.h"
 #include "ScopePointer.h"
+#include "Timer.h"
 #include "WTFString.h"
 #include "WebString.h"
 
@@ -44,6 +45,7 @@ public:
     void update(bool multiple, int size, const ScopeArray<BlackBerry::WebKit::WebString>& labels, bool* enableds, const int* itemType, bool* selecteds, BlackBerry::WebKit::WebPagePrivate*, HTMLSelectElement*);
 
     void generateHTML(bool multiple, int size, const ScopeArray<BlackBerry::WebKit::WebString>& labels, bool* enableds, const int* itemType, bool* selecteds);
+    void notifySelectionChange(WebCore::Timer<SelectPopupClient> *);
 
     void writeDocument(DocumentWriter&);
     virtual IntSize contentSize();
@@ -57,6 +59,7 @@ public:
     String m_source;
     BlackBerry::WebKit::WebPagePrivate* m_webPage;
     HTMLSelectElement* m_element;
+    WebCore::Timer<SelectPopupClient> m_notifyChangeTimer;
 };
 } // namespace WebCore
 #endif