diff options
author | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 22:03:23 +0000 |
---|---|---|
committer | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 22:03:23 +0000 |
commit | f503ca49cee496e2cba5ff25c3a49cb0b4359857 (patch) | |
tree | 686d49c292c784024aaad24c81b695c886d7e757 /chrome/renderer | |
parent | db6694cda0aefd436c201de9c0145a52327748b7 (diff) | |
download | chromium_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.h | 6 | ||||
-rw-r--r-- | chrome/renderer/render_widget.cc | 5 |
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 |