summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 22:03:23 +0000
committerjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 22:03:23 +0000
commitf503ca49cee496e2cba5ff25c3a49cb0b4359857 (patch)
tree686d49c292c784024aaad24c81b695c886d7e757 /chrome/renderer
parentdb6694cda0aefd436c201de9c0145a52327748b7 (diff)
downloadchromium_src-f503ca49cee496e2cba5ff25c3a49cb0b4359857.zip
chromium_src-f503ca49cee496e2cba5ff25c3a49cb0b4359857.tar.gz
chromium_src-f503ca49cee496e2cba5ff25c3a49cb0b4359857.tar.bz2
Merge 75078 - Pump the WebCore Timer queue before running animation callbacks
This works around a bug in the Mac UI message pump (72007) that can lead to starvation of delayed tasks. To avoid starving WebCore timers indefinitely when using requestAnimationFrame, this patch explicitly pumps the WebCore Timer queue one each animate() call. BUG=71735 TEST=open the WebGL aquarium demo (http://webglsamples.googlecode.com/hg/aquarium/aquarium.html) and click on the * next to "Change View". The animation should always happen without multi-second delays. Review URL: http://codereview.chromium.org/6524030 TBR=jamesr@chromium.org Review URL: http://codereview.chromium.org/6531009 git-svn-id: svn://svn.chromium.org/chrome/branches/648/src@75187 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/render_thread.h6
-rw-r--r--chrome/renderer/render_widget.cc5
2 files changed, 11 insertions, 0 deletions
diff --git a/chrome/renderer/render_thread.h b/chrome/renderer/render_thread.h
index f01fbc6..de293d0 100644
--- a/chrome/renderer/render_thread.h
+++ b/chrome/renderer/render_thread.h
@@ -261,6 +261,12 @@ class RenderThread : public RenderThreadBase,
const GURL& url,
int extension_group);
+ // Hack for http://crbug.com/71735.
+ // TODO(jamesr): remove once http://crbug.com/72007 is fixed.
+ RendererWebKitClientImpl* GetWebKitClientImpl() const {
+ return webkit_client_.get();
+ }
+
private:
virtual bool OnControlMessageReceived(const IPC::Message& msg);
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc
index 3be5c8a..a0a32c9 100644
--- a/chrome/renderer/render_widget.cc
+++ b/chrome/renderer/render_widget.cc
@@ -18,6 +18,7 @@
#include "chrome/renderer/render_thread.h"
#include "gfx/point.h"
#include "gfx/size.h"
+#include "chrome/renderer/renderer_webkitclient_impl.h"
#include "ipc/ipc_sync_message.h"
#include "skia/ext/platform_canvas.h"
#include "third_party/skia/include/core/SkShader.h"
@@ -499,6 +500,10 @@ void RenderWidget::AnimateIfNeeded() {
this, &RenderWidget::AnimationCallback), 16);
animation_task_posted_ = true;
animation_update_pending_ = false;
+ // Explicitly pump the WebCore Timer queue to avoid starvation on OS X.
+ // See crbug.com/71735.
+ // TODO(jamesr) Remove this call once crbug.com/72007 is fixed.
+ RenderThread::current()->GetWebKitClientImpl()->DoTimeout();
webwidget_->animate();
} else if (!animation_task_posted_) {
// This code uses base::Time::Now() to calculate the floor and next fire