Modified: trunk/Source/WebKit/blackberry/ChangeLog (119879 => 119880)
--- trunk/Source/WebKit/blackberry/ChangeLog 2012-06-09 00:07:36 UTC (rev 119879)
+++ trunk/Source/WebKit/blackberry/ChangeLog 2012-06-09 00:12:16 UTC (rev 119880)
@@ -1,3 +1,26 @@
+2012-06-08 Crystal Zhang <haizh...@rim.com>
+
+ [BlackBerry] Fix crash on PagePopupChromeClient
+ https://bugs.webkit.org/show_bug.cgi?id=88675
+
+ Reviewed by Antonio Gomes.
+
+ PR 163672.
+
+ Actually it's the bug inside InputHandler, should delete the old popup and create a new one,
+ because update() is problematic. Also no need to save pointer in InputHandler.
+
+ * WebCoreSupport/ChromeClientBlackBerry.cpp:
+ (WebCore::ChromeClientBlackBerry::openPagePopup):
+ (WebCore::ChromeClientBlackBerry::closePagePopup):
+ * WebKitSupport/InputHandler.cpp:
+ (BlackBerry::WebKit::InputHandler::InputHandler):
+ (BlackBerry::WebKit::InputHandler::~InputHandler):
+ (BlackBerry::WebKit::InputHandler::openSelectPopup):
+ * WebKitSupport/InputHandler.h:
+ (WebCore):
+ (InputHandler):
+
2012-06-08 Eli Fidler <efid...@rim.com>
[BlackBerry] Default font settings are getting deleted
Modified: trunk/Source/WebKit/blackberry/WebCoreSupport/ChromeClientBlackBerry.cpp (119879 => 119880)
--- trunk/Source/WebKit/blackberry/WebCoreSupport/ChromeClientBlackBerry.cpp 2012-06-09 00:07:36 UTC (rev 119879)
+++ trunk/Source/WebKit/blackberry/WebCoreSupport/ChromeClientBlackBerry.cpp 2012-06-09 00:12:16 UTC (rev 119880)
@@ -301,27 +301,21 @@
PagePopup* ChromeClientBlackBerry::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView)
{
- PagePopupBlackBerry* webPopup;
+ closePagePopup(0);
- if (!hasOpenedPopup()) {
- webPopup = new PagePopupBlackBerry(m_webPagePrivate, client,
- rootViewToScreen(originBoundsInRootView));
- m_webPagePrivate->m_webPage->popupOpened(webPopup);
- } else
- webPopup = m_webPagePrivate->m_webPage->popup();
-
+ PagePopupBlackBerry* webPopup = new PagePopupBlackBerry(m_webPagePrivate, client, rootViewToScreen(originBoundsInRootView));
+ m_webPagePrivate->m_webPage->popupOpened(webPopup);
webPopup->sendCreatePopupWebViewRequest();
return webPopup;
}
-void ChromeClientBlackBerry::closePagePopup(PagePopup* popup)
+void ChromeClientBlackBerry::closePagePopup(PagePopup*)
{
- if (!popup)
- return;
-
- PagePopupBlackBerry* webPopup = m_webPagePrivate->m_webPage->popup();
- webPopup->closePopup();
- m_webPagePrivate->m_webPage->popupClosed();
+ if (hasOpenedPopup()) {
+ PagePopupBlackBerry* webPopup = m_webPagePrivate->m_webPage->popup();
+ webPopup->closePopup();
+ m_webPagePrivate->m_webPage->popupClosed();
+ }
}
void ChromeClientBlackBerry::setToolbarsVisible(bool)
Modified: trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp (119879 => 119880)
--- trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp 2012-06-09 00:07:36 UTC (rev 119879)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp 2012-06-09 00:12:16 UTC (rev 119880)
@@ -120,13 +120,12 @@
, m_composingTextEnd(0)
, m_pendingKeyboardVisibilityChange(NoChange)
, m_delayKeyboardVisibilityChange(false)
- , m_selectClient(0)
{
}
InputHandler::~InputHandler()
{
- delete m_selectClient;
+ m_webPage->m_page->chrome()->client()->closePagePopup(0);
}
static BlackBerryInputType convertInputType(const HTMLInputElement* inputElement)
@@ -1142,16 +1141,17 @@
ScopeArray<WebString> labels;
labels.reset(new WebString[size]);
- if (!size) {
- if (!m_selectClient)
- m_selectClient = new SelectPopupClient(multiple, size, labels, 0, 0, 0, m_webPage, select);
- else
- m_selectClient->update(multiple, size, labels, enableds, itemTypes, selecteds, m_webPage, select);
- } else {
- bool* enableds = new bool[size];
- int* itemTypes = new int[size];
- bool* selecteds = new bool[size];
+ // Check if popup already exists, close it if does.
+ m_webPage->m_page->chrome()->client()->closePagePopup(0);
+ bool* enableds = 0;
+ int* itemTypes = 0;
+ bool* selecteds = 0;
+
+ if (size) {
+ enableds = new bool[size];
+ itemTypes = new int[size];
+ selecteds = new bool[size];
for (int i = 0; i < size; i++) {
if (listItems[i]->hasTagName(HTMLNames::optionTag)) {
HTMLOptionElement* option = static_cast<HTMLOptionElement*>(listItems[i]);
@@ -1171,15 +1171,11 @@
itemTypes[i] = TypeSeparator;
}
}
-
- if (!m_selectClient)
- m_selectClient = new SelectPopupClient(multiple, size, labels, enableds, itemTypes, selecteds, m_webPage, select);
- else
- m_selectClient->update(multiple, size, labels, enableds, itemTypes, selecteds, m_webPage, select);
}
+ SelectPopupClient* selectClient = new SelectPopupClient(multiple, size, labels, enableds, itemTypes, selecteds, m_webPage, select);
WebCore::IntRect elementRectInRootView = select->document()->view()->contentsToRootView(select->getRect());
- m_webPage->m_page->chrome()->client()->openPagePopup(m_selectClient, elementRectInRootView);
+ m_webPage->m_page->chrome()->client()->openPagePopup(selectClient, elementRectInRootView);
return true;
}
Modified: trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.h (119879 => 119880)
--- trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.h 2012-06-09 00:07:36 UTC (rev 119879)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/InputHandler.h 2012-06-09 00:12:16 UTC (rev 119880)
@@ -37,7 +37,6 @@
class HTMLSelectElement;
class IntRect;
class Node;
-class SelectPopupClient;
}
namespace BlackBerry {
@@ -193,8 +192,6 @@
PendingKeyboardStateChange m_pendingKeyboardVisibilityChange;
bool m_delayKeyboardVisibilityChange;
-
- WebCore::SelectPopupClient* m_selectClient;
};
}