Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Side by Side Diff: chrome/renderer/render_widget.cc

Issue 6136005: Chromium support for window.webkitRequestAnimationFrame() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/render_widget.h" 5 #include "chrome/renderer/render_widget.h"
6 6
7 #include "app/surface/transport_dib.h" 7 #include "app/surface/transport_dib.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 is_hidden_(false), 69 is_hidden_(false),
70 needs_repainting_on_restore_(false), 70 needs_repainting_on_restore_(false),
71 has_focus_(false), 71 has_focus_(false),
72 handling_input_event_(false), 72 handling_input_event_(false),
73 closing_(false), 73 closing_(false),
74 input_method_is_active_(false), 74 input_method_is_active_(false),
75 text_input_type_(WebKit::WebTextInputTypeNone), 75 text_input_type_(WebKit::WebTextInputTypeNone),
76 popup_type_(popup_type), 76 popup_type_(popup_type),
77 pending_window_rect_count_(0), 77 pending_window_rect_count_(0),
78 suppress_next_char_events_(false), 78 suppress_next_char_events_(false),
79 is_accelerated_compositing_active_(false) { 79 is_accelerated_compositing_active_(false),
80 animation_update_pending_(false) {
80 RenderProcess::current()->AddRefProcess(); 81 RenderProcess::current()->AddRefProcess();
81 DCHECK(render_thread_); 82 DCHECK(render_thread_);
82 } 83 }
83 84
84 RenderWidget::~RenderWidget() { 85 RenderWidget::~RenderWidget() {
85 DCHECK(!webwidget_) << "Leaking our WebWidget!"; 86 DCHECK(!webwidget_) << "Leaking our WebWidget!";
86 if (current_paint_buf_) { 87 if (current_paint_buf_) {
87 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_); 88 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_);
88 current_paint_buf_ = NULL; 89 current_paint_buf_ = NULL;
89 } 90 }
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 canvas->drawIRect(irect, paint); 480 canvas->drawIRect(irect, paint);
480 } 481 }
481 482
482 void RenderWidget::CallDoDeferredUpdate() { 483 void RenderWidget::CallDoDeferredUpdate() {
483 DoDeferredUpdate(); 484 DoDeferredUpdate();
484 485
485 if (pending_input_event_ack_.get()) 486 if (pending_input_event_ack_.get())
486 Send(pending_input_event_ack_.release()); 487 Send(pending_input_event_ack_.release());
487 } 488 }
488 489
490 void RenderWidget::UpdateAnimationsIfNeeded() {
491 if (!is_hidden() && animation_update_pending_ && base::Time::Now() > animation _floor_time_) {
darin (slow to review) 2011/01/11 22:02:30 nit: wrap lines at 80 chars
492 animation_update_pending_ = false;
493 webwidget_->animate();
494 }
495 }
496
489 void RenderWidget::DoDeferredUpdate() { 497 void RenderWidget::DoDeferredUpdate() {
490 if (!webwidget_ || !paint_aggregator_.HasPendingUpdate() || 498 if (!webwidget_ || update_reply_pending())
491 update_reply_pending())
492 return; 499 return;
493 500
494 // Suppress updating when we are hidden. 501 // Suppress updating when we are hidden.
495 if (is_hidden_ || size_.IsEmpty()) { 502 if (is_hidden_ || size_.IsEmpty()) {
496 paint_aggregator_.ClearPendingUpdate(); 503 paint_aggregator_.ClearPendingUpdate();
497 needs_repainting_on_restore_ = true; 504 needs_repainting_on_restore_ = true;
498 return; 505 return;
499 } 506 }
500 507
508 if (base::Time::Now() > animation_floor_time_)
509 UpdateAnimationsIfNeeded();
darin (slow to review) 2011/01/11 22:02:30 nit: indent by 2
510
501 // Layout may generate more invalidation. It may also enable the 511 // Layout may generate more invalidation. It may also enable the
502 // GPU acceleration, so make sure to run layout before we send the 512 // GPU acceleration, so make sure to run layout before we send the
503 // GpuRenderingActivated message. 513 // GpuRenderingActivated message.
504 webwidget_->layout(); 514 webwidget_->layout();
505 515
516 // Suppress painting if nothing is dirty. This has to be done after updating
517 // animations running layout as these may generate further invalidations.
518 if (!paint_aggregator_.HasPendingUpdate())
519 return;
520
506 // OK, save the pending update to a local since painting may cause more 521 // OK, save the pending update to a local since painting may cause more
507 // invalidation. Some WebCore rendering objects only layout when painted. 522 // invalidation. Some WebCore rendering objects only layout when painted.
508 PaintAggregator::PendingUpdate update; 523 PaintAggregator::PendingUpdate update;
509 paint_aggregator_.PopPendingUpdate(&update); 524 paint_aggregator_.PopPendingUpdate(&update);
510 525
511 gfx::Rect scroll_damage = update.GetScrollDamage(); 526 gfx::Rect scroll_damage = update.GetScrollDamage();
512 gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage); 527 gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage);
513 528
514 // A plugin may be able to do an optimized paint. First check this, in which 529 // A plugin may be able to do an optimized paint. First check this, in which
515 // case we can skip all of the bitmap generation and regular paint code. 530 // case we can skip all of the bitmap generation and regular paint code.
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 void RenderWidget::scheduleComposite() { 689 void RenderWidget::scheduleComposite() {
675 // TODO(nduca): replace with something a little less hacky. The reason this 690 // TODO(nduca): replace with something a little less hacky. The reason this
676 // hack is still used is because the Invalidate-DoDeferredUpdate loop 691 // hack is still used is because the Invalidate-DoDeferredUpdate loop
677 // contains a lot of host-renderer synchronization logic that is still 692 // contains a lot of host-renderer synchronization logic that is still
678 // important for the accelerated compositing case. The option of simply 693 // important for the accelerated compositing case. The option of simply
679 // duplicating all that code is less desirable than "faking out" the 694 // duplicating all that code is less desirable than "faking out" the
680 // invalidation path using a magical damage rect. 695 // invalidation path using a magical damage rect.
681 didInvalidateRect(WebRect(0, 0, 1, 1)); 696 didInvalidateRect(WebRect(0, 0, 1, 1));
682 } 697 }
683 698
699 void RenderWidget::scheduleAnimation() {
700 if (!animation_update_pending_) {
701 animation_update_pending_ = true;
702 animation_floor_time_ = base::Time::Now() + base::TimeDelta::FromMillise conds(10);
darin (slow to review) 2011/01/11 22:02:30 nit: indentation and line length limit
703 MessageLoop::current()->PostDelayedTask(FROM_HERE, NewRunnableMethod(
704 this, &RenderWidget::UpdateAnimationsIfNeeded), 10);
705 }
706 }
707
684 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { 708 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) {
685 // TODO(darin): Eliminate this temporary. 709 // TODO(darin): Eliminate this temporary.
686 WebCursor cursor(cursor_info); 710 WebCursor cursor(cursor_info);
687 711
688 // Only send a SetCursor message if we need to make a change. 712 // Only send a SetCursor message if we need to make a change.
689 if (!current_cursor_.IsEqual(cursor)) { 713 if (!current_cursor_.IsEqual(cursor)) {
690 current_cursor_ = cursor; 714 current_cursor_ = cursor;
691 Send(new ViewHostMsg_SetCursor(routing_id_, cursor)); 715 Send(new ViewHostMsg_SetCursor(routing_id_, cursor));
692 } 716 }
693 } 717 }
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 1045
1022 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { 1046 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) {
1023 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); 1047 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin();
1024 i != plugin_window_moves_.end(); ++i) { 1048 i != plugin_window_moves_.end(); ++i) {
1025 if (i->window == window) { 1049 if (i->window == window) {
1026 plugin_window_moves_.erase(i); 1050 plugin_window_moves_.erase(i);
1027 break; 1051 break;
1028 } 1052 }
1029 } 1053 }
1030 } 1054 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698