ContainerNode::setActive should not sleep for 100ms on platforms that do not implemen...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 5 Mar 2013 19:56:51 +0000 (19:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 5 Mar 2013 19:56:51 +0000 (19:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=87054

Patch by James Robinson <jamesr@chromium.org> on 2013-03-05
Reviewed by Darin Adler.

Source/WebCore:

Adds a new ChromeClient function to query if the platform supports the immediate parameter
to the invalidation APIs and guards the synchronous repaint logic in ContainerNode::setActive()
with it.

* dom/ContainerNode.cpp:
(WebCore::ContainerNode::setActive):
* page/ChromeClient.h:
(WebCore::ChromeClient::supportsImmediateInvalidation):

Source/WebKit/mac:

The Mac WebKit1 port supports immediate invalidations.

* WebCoreSupport/WebChromeClient.h:
(WebChromeClient):
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::supportsImmediateInvalidation):

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

Source/WebCore/ChangeLog
Source/WebCore/dom/ContainerNode.cpp
Source/WebCore/page/ChromeClient.h
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/WebCoreSupport/WebChromeClient.h
Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm

index ec5e63d..241a718 100644 (file)
@@ -1,3 +1,19 @@
+2013-03-05  James Robinson  <jamesr@chromium.org>
+
+        ContainerNode::setActive should not sleep for 100ms on platforms that do not implement synchronous repaint(true) semantics
+        https://bugs.webkit.org/show_bug.cgi?id=87054
+
+        Reviewed by Darin Adler.
+
+        Adds a new ChromeClient function to query if the platform supports the immediate parameter
+        to the invalidation APIs and guards the synchronous repaint logic in ContainerNode::setActive()
+        with it.
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::setActive):
+        * page/ChromeClient.h:
+        (WebCore::ChromeClient::supportsImmediateInvalidation):
+
 2013-03-05  Anders Carlsson  <andersca@apple.com>
 
         Simplify storage event dispatch somewhat
index 6e6e7bb..b229881 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "AXObjectCache.h"
 #include "ChildListMutationScope.h"
+#include "Chrome.h"
+#include "ChromeClient.h"
 #include "ContainerNodeAlgorithms.h"
 #if ENABLE(DELETION_UI)
 #include "DeleteButtonController.h"
@@ -1012,6 +1014,13 @@ void ContainerNode::setActive(bool down, bool pause)
             if (renderer()->theme()->stateChanged(renderer(), PressedState))
                 reactsToPress = true;
         }
+
+        // The rest of this function implements a feature that only works if the
+        // platform supports immediate invalidations on the ChromeClient, so bail if
+        // that isn't supported.
+        if (!document()->page()->chrome()->client()->supportsImmediateInvalidation())
+            return;
+
         if (reactsToPress && pause) {
             // The delay here is subtle.  It relies on an assumption, namely that the amount of time it takes
             // to repaint the "down" state of the control is about the same time as it would take to repaint the
index f1ecde8..c78c72b 100644 (file)
@@ -154,9 +154,10 @@ public:
     virtual IntRect windowResizerRect() const = 0;
 
     // Methods used by HostWindow.
-    virtual void invalidateRootView(const IntRect&, bool) = 0;
-    virtual void invalidateContentsAndRootView(const IntRect&, bool) = 0;
-    virtual void invalidateContentsForSlowScroll(const IntRect&, bool) = 0;
+    virtual bool supportsImmediateInvalidation() { return false; }
+    virtual void invalidateRootView(const IntRect&, bool immediate) = 0;
+    virtual void invalidateContentsAndRootView(const IntRect&, bool immediate) = 0;
+    virtual void invalidateContentsForSlowScroll(const IntRect&, bool immediate) = 0;
     virtual void scroll(const IntSize&, const IntRect&, const IntRect&) = 0;
 #if USE(TILED_BACKING_STORE)
     virtual void delegatedScrollRequested(const IntPoint&) = 0;
index 0ad34e4..d3eb588 100644 (file)
@@ -1,3 +1,17 @@
+2013-03-05  James Robinson  <jamesr@chromium.org>
+
+        ContainerNode::setActive should not sleep for 100ms on platforms that do not implement synchronous repaint(true) semantics
+        https://bugs.webkit.org/show_bug.cgi?id=87054
+
+        Reviewed by Darin Adler.
+
+        The Mac WebKit1 port supports immediate invalidations.
+
+        * WebCoreSupport/WebChromeClient.h:
+        (WebChromeClient):
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::supportsImmediateInvalidation):
+
 2013-03-05  David Kilzer  <ddkilzer@apple.com>
 
         BUILD FIX (r144698): Only enable SPEECH_SYNTHESIS for Mac
index 140f704..c2e29f9 100644 (file)
@@ -88,6 +88,7 @@ public:
 
     virtual WebCore::IntRect windowResizerRect() const OVERRIDE;
 
+    virtual bool supportsImmediateInvalidation() OVERRIDE;
     virtual void invalidateRootView(const WebCore::IntRect&, bool) OVERRIDE;
     virtual void invalidateContentsAndRootView(const WebCore::IntRect&, bool) OVERRIDE;
     virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&, bool) OVERRIDE;
index a3095e6..03f4c1f 100644 (file)
@@ -498,6 +498,11 @@ IntRect WebChromeClient::windowResizerRect() const
     return enclosingIntRect([[m_webView window] _growBoxRect]);
 }
 
+bool WebChromeClient::supportsImmediateInvalidation()
+{
+    return true;
+}
+
 void WebChromeClient::invalidateRootView(const IntRect&, bool immediate)
 {
     if (immediate) {