Title: [121400] trunk/Source/WebKit/blackberry
Revision
121400
Author
[email protected]
Date
2012-06-27 20:33:01 -0700 (Wed, 27 Jun 2012)

Log Message

[BlackBerry] Selection overlay can become visible after it has been hidden
https://bugs.webkit.org/show_bug.cgi?id=90105

Patch by Andrew Lo <[email protected]> on 2012-06-27
Reviewed by George Staikos.

When SelectionOverlay::hide is called from UI thread,
rather than setting the override opacity, dispatch to the
WebKit thread, which removes the overlay (normal case).

Internal PR164183.
Internally Reviewed by: Arvid Nilsson.

* Api/WebPage.cpp:
(BlackBerry::WebKit::WebPagePrivate::~WebPagePrivate):
(BlackBerry::WebKit::WebPage::selectionOverlay):
* Api/WebPage_p.h:
(WebPagePrivate):
* Api/WebSelectionOverlay.h:
* WebKitSupport/SelectionOverlay.cpp:
(BlackBerry::WebKit::SelectionOverlay::SelectionOverlay):
(BlackBerry::WebKit::SelectionOverlay::hide):
* WebKitSupport/SelectionOverlay.h:
(BlackBerry::WebKit::SelectionOverlay::create):
(SelectionOverlay):

Modified Paths

Diff

Modified: trunk/Source/WebKit/blackberry/Api/WebPage.cpp (121399 => 121400)


--- trunk/Source/WebKit/blackberry/Api/WebPage.cpp	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/Api/WebPage.cpp	2012-06-28 03:33:01 UTC (rev 121400)
@@ -456,6 +456,11 @@
     delete m_dumpRenderTree;
     m_dumpRenderTree = 0;
 #endif
+
+#if USE(ACCELERATED_COMPOSITING)
+    deleteGuardedObject(m_selectionOverlay);
+    m_selectionOverlay = 0;
+#endif
 }
 
 WebPage::~WebPage()
@@ -6478,7 +6483,7 @@
 
 WebSelectionOverlay* WebPage::selectionOverlay() const
 {
-    return d->m_selectionOverlay.get();
+    return d->m_selectionOverlay;
 }
 
 void WebPage::addOverlay(WebOverlay* overlay)

Modified: trunk/Source/WebKit/blackberry/Api/WebPage_p.h (121399 => 121400)


--- trunk/Source/WebKit/blackberry/Api/WebPage_p.h	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/Api/WebPage_p.h	2012-06-28 03:33:01 UTC (rev 121400)
@@ -447,7 +447,7 @@
     RefPtr<WebCore::Node> m_currentContextNode;
     WebSettings* m_webSettings;
     OwnPtr<WebTapHighlight> m_tapHighlight;
-    OwnPtr<WebSelectionOverlay> m_selectionOverlay;
+    WebSelectionOverlay* m_selectionOverlay;
 
 #if ENABLE(_javascript__DEBUGGER)
     OwnPtr<WebCore::_javascript_DebuggerBlackBerry> m_scriptDebugger;

Modified: trunk/Source/WebKit/blackberry/Api/WebSelectionOverlay.h (121399 => 121400)


--- trunk/Source/WebKit/blackberry/Api/WebSelectionOverlay.h	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/Api/WebSelectionOverlay.h	2012-06-28 03:33:01 UTC (rev 121400)
@@ -21,12 +21,13 @@
 
 #include "BlackBerryGlobal.h"
 
+#include <BlackBerryPlatformGuardedPointer.h>
 #include <BlackBerryPlatformIntRectRegion.h>
 
 namespace BlackBerry {
 namespace WebKit {
 
-class BLACKBERRY_EXPORT WebSelectionOverlay {
+class BLACKBERRY_EXPORT WebSelectionOverlay : public BlackBerry::Platform::GuardedPointerBase {
 public:
     virtual ~WebSelectionOverlay() { }
 

Modified: trunk/Source/WebKit/blackberry/ChangeLog (121399 => 121400)


--- trunk/Source/WebKit/blackberry/ChangeLog	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/ChangeLog	2012-06-28 03:33:01 UTC (rev 121400)
@@ -1,3 +1,30 @@
+2012-06-27  Andrew Lo  <[email protected]>
+
+        [BlackBerry] Selection overlay can become visible after it has been hidden
+        https://bugs.webkit.org/show_bug.cgi?id=90105
+
+        Reviewed by George Staikos.
+
+        When SelectionOverlay::hide is called from UI thread,
+        rather than setting the override opacity, dispatch to the
+        WebKit thread, which removes the overlay (normal case).
+
+        Internal PR164183.
+        Internally Reviewed by: Arvid Nilsson.
+
+        * Api/WebPage.cpp:
+        (BlackBerry::WebKit::WebPagePrivate::~WebPagePrivate):
+        (BlackBerry::WebKit::WebPage::selectionOverlay):
+        * Api/WebPage_p.h:
+        (WebPagePrivate):
+        * Api/WebSelectionOverlay.h:
+        * WebKitSupport/SelectionOverlay.cpp:
+        (BlackBerry::WebKit::SelectionOverlay::SelectionOverlay):
+        (BlackBerry::WebKit::SelectionOverlay::hide):
+        * WebKitSupport/SelectionOverlay.h:
+        (BlackBerry::WebKit::SelectionOverlay::create):
+        (SelectionOverlay):
+
 2012-06-25  Mark Hahnenberg  <[email protected]>
 
         JSLock should be per-JSGlobalData

Modified: trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp (121399 => 121400)


--- trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp	2012-06-28 03:33:01 UTC (rev 121400)
@@ -23,6 +23,7 @@
 #include "SelectionOverlay.h"
 
 #include "GraphicsContext.h"
+#include "LayerMessage.h"
 #include "Path.h"
 #include "PlatformContextSkia.h"
 #include "RenderTheme.h"
@@ -37,6 +38,7 @@
 
 SelectionOverlay::SelectionOverlay(WebPagePrivate* page)
     : m_page(page)
+    , m_hideDispatched(false)
 {
 }
 
@@ -69,15 +71,27 @@
 
 void SelectionOverlay::hide()
 {
+    // Track a dispatched message, we don't want to flood the webkit thread.
+    // There can be as many as one more message enqued as needed but never less.
+    if (isWebKitThread())
+        m_hideDispatched = false;
+    else if (m_hideDispatched) {
+        // Early return if there is message already pending on the webkit thread.
+        return;
+    }
+    if (!isWebKitThread()) {
+        m_hideDispatched = true;
+        // Normally, this method is called on the WebKit thread, but it can also be
+        // called from the compositing thread.
+        dispatchWebKitMessage(BlackBerry::Platform::createMethodCallMessage(&SelectionOverlay::hide, this));
+        return;
+    }
+    ASSERT(BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread());
+
     if (!m_overlay)
         return;
 
-    // Normally, this method is called on the WebKit thread, but it can also be
-    // called from the compositing thread.
-    if (BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread())
-        m_page->m_webPage->removeOverlay(m_overlay.get());
-    else if (BlackBerry::Platform::userInterfaceThreadMessageClient()->isCurrentThread())
-        m_overlay->override()->setOpacity(0);
+    m_page->m_webPage->removeOverlay(m_overlay.get());
 }
 
 void SelectionOverlay::notifySyncRequired(const GraphicsLayer*)

Modified: trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.h (121399 => 121400)


--- trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.h	2012-06-28 03:22:40 UTC (rev 121399)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.h	2012-06-28 03:33:01 UTC (rev 121400)
@@ -30,7 +30,6 @@
 
 #include <BlackBerryPlatformIntRectRegion.h>
 #include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
 
 namespace BlackBerry {
 namespace WebKit {
@@ -39,9 +38,9 @@
 
 class SelectionOverlay : public WebSelectionOverlay, public WebCore::GraphicsLayerClient {
 public:
-    static PassOwnPtr<SelectionOverlay> create(WebPagePrivate* page)
+    static SelectionOverlay* create(WebPagePrivate* page)
     {
-        return adoptPtr(new SelectionOverlay(page));
+        return new SelectionOverlay(page);
     }
 
     virtual ~SelectionOverlay();
@@ -64,6 +63,7 @@
     WebPagePrivate* m_page;
     OwnPtr<WebOverlay> m_overlay;
     BlackBerry::Platform::IntRectRegion m_region;
+    bool m_hideDispatched;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to