Short-cicruit all Content Shell window resizes.
When running layout tests, we were still listening to ViewMsg_Resize
messages and reacting to them, which caused occasional confusion and
flakiness. For example, a host would send a message to resize to
initial size, but the test would have already resized to some
other size.
This change does two things:
1) Make sure we don't listen to messages from host that change size
(other than fullscreen and device scale factor changes -- those
need to be tackled separately)
2) Introduce RenderWidget::ResizingModeSelector class that will
eventually dynamically turn short-circuiting on and off, depending
on the test.
BUG=309760
TEST=fast/images/image-zoom-to-25.html
R=jam, jochen, tony
Review URL: https://codereview.chromium.org/33773002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230215 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index c9eb7c8..218556ab 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -308,6 +308,30 @@
params->y *= scale_;
}
+// RenderWidget::ResizingModeSelector ------------------------------------------
+
+class RenderWidget::ResizingModeSelector {
+ public:
+ static bool ShouldAbortOnResize(RenderWidget* widget,
+ const ViewMsg_Resize_Params& params);
+ static bool IsLegacyMode();
+};
+
+bool RenderWidget::ResizingModeSelector::ShouldAbortOnResize(
+ RenderWidget* widget,
+ const ViewMsg_Resize_Params& params) {
+ return RenderThreadImpl::current() &&
+ RenderThreadImpl::current()->layout_test_mode() &&
+ params.is_fullscreen == widget->is_fullscreen_ &&
+ params.screen_info.deviceScaleFactor ==
+ widget->screen_info_.deviceScaleFactor;
+}
+
+bool RenderWidget::ResizingModeSelector::IsLegacyMode() {
+ return RenderThreadImpl::current() && // Will be NULL during unit tests.
+ RenderThreadImpl::current()->layout_test_mode();
+}
+
// RenderWidget ---------------------------------------------------------------
RenderWidget::RenderWidget(WebKit::WebPopupType popup_type,
@@ -627,8 +651,7 @@
const gfx::Rect& resizer_rect,
bool is_fullscreen,
ResizeAck resize_ack) {
- if (!RenderThreadImpl::current() || // Will be NULL during unit tests.
- !RenderThreadImpl::current()->layout_test_mode()) {
+ if (!ResizingModeSelector::IsLegacyMode()) {
// A resize ack shouldn't be requested if we have not ACK'd the previous
// one.
DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack());
@@ -667,14 +690,12 @@
// send an ACK if we are resized to a non-empty rect.
webwidget_->resize(new_size);
- if (!RenderThreadImpl::current() || // Will be NULL during unit tests.
- !RenderThreadImpl::current()->layout_test_mode()) {
+ if (!ResizingModeSelector::IsLegacyMode()) {
// Resize should have caused an invalidation of the entire view.
DCHECK(new_size.IsEmpty() || is_accelerated_compositing_active_ ||
paint_aggregator_.HasPendingUpdate());
}
- } else if (!RenderThreadImpl::current() || // Will be NULL during unit tests.
- !RenderThreadImpl::current()->layout_test_mode()) {
+ } else if (!ResizingModeSelector::IsLegacyMode()) {
resize_ack = NO_RESIZE_ACK;
}
@@ -726,6 +747,9 @@
}
void RenderWidget::OnResize(const ViewMsg_Resize_Params& params) {
+ if (ResizingModeSelector::ShouldAbortOnResize(this, params))
+ return;
+
if (screen_metrics_emulator_) {
screen_metrics_emulator_->OnResizeMessage(params);
return;
@@ -1714,7 +1738,7 @@
// with invalid damage rects.
paint_aggregator_.ClearPendingUpdate();
- if (RenderThreadImpl::current()->layout_test_mode()) {
+ if (ResizingModeSelector::IsLegacyMode()) {
WebRect new_pos(rootWindowRect().x,
rootWindowRect().y,
new_size.width,
@@ -1725,7 +1749,7 @@
AutoResizeCompositor();
- if (!RenderThreadImpl::current()->layout_test_mode())
+ if (!ResizingModeSelector::IsLegacyMode())
need_update_rect_for_auto_resize_ = true;
}
}
@@ -1977,7 +2001,7 @@
(pos.y - popup_view_origin_for_emulation_.y()) * scale;
}
- if (!RenderThreadImpl::current()->layout_test_mode()) {
+ if (!ResizingModeSelector::IsLegacyMode()) {
if (did_show_) {
Send(new ViewHostMsg_RequestMove(routing_id_, pos));
SetPendingWindowRect(pos);