| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/shared_memory.h" | 7 #include "base/shared_memory.h" |
| 8 #include "base/timer/timer.h" | 8 #include "base/timer/timer.h" |
| 9 #include "content/browser/browser_thread_impl.h" | 9 #include "content/browser/browser_thread_impl.h" |
| 10 #include "content/browser/renderer_host/backing_store.h" | 10 #include "content/browser/renderer_host/backing_store.h" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 RenderProcessHost* process, | 112 RenderProcessHost* process, |
| 113 int routing_id) | 113 int routing_id) |
| 114 : RenderWidgetHostImpl(delegate, process, routing_id), | 114 : RenderWidgetHostImpl(delegate, process, routing_id), |
| 115 unresponsive_timer_fired_(false) { | 115 unresponsive_timer_fired_(false) { |
| 116 } | 116 } |
| 117 | 117 |
| 118 // Allow poking at a few private members. | 118 // Allow poking at a few private members. |
| 119 using RenderWidgetHostImpl::OnPaintAtSizeAck; | 119 using RenderWidgetHostImpl::OnPaintAtSizeAck; |
| 120 using RenderWidgetHostImpl::OnUpdateRect; | 120 using RenderWidgetHostImpl::OnUpdateRect; |
| 121 using RenderWidgetHostImpl::RendererExited; | 121 using RenderWidgetHostImpl::RendererExited; |
| 122 using RenderWidgetHostImpl::in_flight_size_; | 122 using RenderWidgetHostImpl::last_requested_size_; |
| 123 using RenderWidgetHostImpl::is_hidden_; | 123 using RenderWidgetHostImpl::is_hidden_; |
| 124 using RenderWidgetHostImpl::resize_ack_pending_; | 124 using RenderWidgetHostImpl::resize_ack_pending_; |
| 125 using RenderWidgetHostImpl::gesture_event_filter_; | 125 using RenderWidgetHostImpl::gesture_event_filter_; |
| 126 using RenderWidgetHostImpl::touch_event_queue_; | 126 using RenderWidgetHostImpl::touch_event_queue_; |
| 127 using RenderWidgetHostImpl::overscroll_controller_; | 127 using RenderWidgetHostImpl::overscroll_controller_; |
| 128 | 128 |
| 129 bool unresponsive_timer_fired() const { | 129 bool unresponsive_timer_fired() const { |
| 130 return unresponsive_timer_fired_; | 130 return unresponsive_timer_fired_; |
| 131 } | 131 } |
| 132 | 132 |
| (...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 } // namespace | 893 } // namespace |
| 894 | 894 |
| 895 // ----------------------------------------------------------------------------- | 895 // ----------------------------------------------------------------------------- |
| 896 | 896 |
| 897 TEST_F(RenderWidgetHostTest, Resize) { | 897 TEST_F(RenderWidgetHostTest, Resize) { |
| 898 // The initial bounds is the empty rect, so setting it to the same thing | 898 // The initial bounds is the empty rect, so setting it to the same thing |
| 899 // should do nothing. | 899 // should do nothing. |
| 900 view_->set_bounds(gfx::Rect()); | 900 view_->set_bounds(gfx::Rect()); |
| 901 host_->WasResized(); | 901 host_->WasResized(); |
| 902 EXPECT_FALSE(host_->resize_ack_pending_); | 902 EXPECT_FALSE(host_->resize_ack_pending_); |
| 903 EXPECT_EQ(gfx::Size(), host_->in_flight_size_); | 903 EXPECT_EQ(gfx::Size(), host_->last_requested_size_); |
| 904 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 904 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 905 | 905 |
| 906 // Setting the bounds to a "real" rect should send out the notification, | 906 // Setting the bounds to a "real" rect should send out the notification. |
| 907 // but should not expect ack for empty physical backing size. | 907 // but should not expect ack for empty physical backing size. |
| 908 gfx::Rect original_size(0, 0, 100, 100); | 908 gfx::Rect original_size(0, 0, 100, 100); |
| 909 process_->sink().ClearMessages(); | 909 process_->sink().ClearMessages(); |
| 910 view_->set_bounds(original_size); | 910 view_->set_bounds(original_size); |
| 911 view_->SetMockPhysicalBackingSize(gfx::Size()); | 911 view_->SetMockPhysicalBackingSize(gfx::Size()); |
| 912 host_->WasResized(); | 912 host_->WasResized(); |
| 913 EXPECT_FALSE(host_->resize_ack_pending_); | 913 EXPECT_FALSE(host_->resize_ack_pending_); |
| 914 EXPECT_EQ(original_size.size(), host_->in_flight_size_); | 914 EXPECT_EQ(original_size.size(), host_->last_requested_size_); |
| 915 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 915 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 916 | 916 |
| 917 // Setting the bounds to a "real" rect should send out the notification. | 917 // Setting the bounds to a "real" rect should send out the notification. |
| 918 // but should not expect ack for only physical backing size change. |
| 918 process_->sink().ClearMessages(); | 919 process_->sink().ClearMessages(); |
| 919 view_->ClearMockPhysicalBackingSize(); | 920 view_->ClearMockPhysicalBackingSize(); |
| 920 host_->WasResized(); | 921 host_->WasResized(); |
| 921 EXPECT_TRUE(host_->resize_ack_pending_); | 922 EXPECT_FALSE(host_->resize_ack_pending_); |
| 922 EXPECT_EQ(original_size.size(), host_->in_flight_size_); | 923 EXPECT_EQ(original_size.size(), host_->last_requested_size_); |
| 923 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 924 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 924 | 925 |
| 925 // Send out a update that's not a resize ack. This should not clean the | 926 // Send out a update that's not a resize ack after setting resize ack pending |
| 926 // resize ack pending flag. | 927 // flag. This should not clean the resize ack pending flag. |
| 928 process_->sink().ClearMessages(); |
| 929 gfx::Rect second_size(0, 0, 110, 110); |
| 930 EXPECT_FALSE(host_->resize_ack_pending_); |
| 931 view_->set_bounds(second_size); |
| 932 host_->WasResized(); |
| 933 EXPECT_TRUE(host_->resize_ack_pending_); |
| 927 ViewHostMsg_UpdateRect_Params params; | 934 ViewHostMsg_UpdateRect_Params params; |
| 928 process_->InitUpdateRectParams(¶ms); | 935 process_->InitUpdateRectParams(¶ms); |
| 929 host_->OnUpdateRect(params); | 936 host_->OnUpdateRect(params); |
| 930 EXPECT_TRUE(host_->resize_ack_pending_); | 937 EXPECT_TRUE(host_->resize_ack_pending_); |
| 931 EXPECT_EQ(original_size.size(), host_->in_flight_size_); | 938 EXPECT_EQ(second_size.size(), host_->last_requested_size_); |
| 932 | 939 |
| 933 // Sending out a new notification should NOT send out a new IPC message since | 940 // Sending out a new notification should NOT send out a new IPC message since |
| 934 // a resize ACK is pending. | 941 // a resize ACK is pending. |
| 935 gfx::Rect second_size(0, 0, 90, 90); | 942 gfx::Rect third_size(0, 0, 120, 120); |
| 936 process_->sink().ClearMessages(); | 943 process_->sink().ClearMessages(); |
| 937 view_->set_bounds(second_size); | 944 view_->set_bounds(third_size); |
| 938 host_->WasResized(); | 945 host_->WasResized(); |
| 939 EXPECT_TRUE(host_->resize_ack_pending_); | 946 EXPECT_TRUE(host_->resize_ack_pending_); |
| 940 EXPECT_EQ(original_size.size(), host_->in_flight_size_); | 947 EXPECT_EQ(second_size.size(), host_->last_requested_size_); |
| 941 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 948 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 942 | 949 |
| 943 // Send a update that's a resize ack, but for the original_size we sent. Since | 950 // Send a update that's a resize ack, but for the original_size we sent. Since |
| 944 // this isn't the second_size, the message handler should immediately send | 951 // this isn't the second_size, the message handler should immediately send |
| 945 // a new resize message for the new size to the renderer. | 952 // a new resize message for the new size to the renderer. |
| 946 process_->sink().ClearMessages(); | 953 process_->sink().ClearMessages(); |
| 947 params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; | 954 params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; |
| 948 params.view_size = original_size.size(); | 955 params.view_size = original_size.size(); |
| 949 host_->OnUpdateRect(params); | 956 host_->OnUpdateRect(params); |
| 950 EXPECT_TRUE(host_->resize_ack_pending_); | 957 EXPECT_TRUE(host_->resize_ack_pending_); |
| 951 EXPECT_EQ(second_size.size(), host_->in_flight_size_); | 958 EXPECT_EQ(third_size.size(), host_->last_requested_size_); |
| 952 ASSERT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 959 ASSERT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 953 | 960 |
| 954 // Send the resize ack for the latest size. | 961 // Send the resize ack for the latest size. |
| 955 process_->sink().ClearMessages(); | 962 process_->sink().ClearMessages(); |
| 956 params.view_size = second_size.size(); | 963 params.view_size = third_size.size(); |
| 957 host_->OnUpdateRect(params); | 964 host_->OnUpdateRect(params); |
| 958 EXPECT_FALSE(host_->resize_ack_pending_); | 965 EXPECT_FALSE(host_->resize_ack_pending_); |
| 959 EXPECT_EQ(gfx::Size(), host_->in_flight_size_); | 966 EXPECT_EQ(third_size.size(), host_->last_requested_size_); |
| 960 ASSERT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID)); | 967 ASSERT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID)); |
| 961 | 968 |
| 962 // Now clearing the bounds should send out a notification but we shouldn't | 969 // Now clearing the bounds should send out a notification but we shouldn't |
| 963 // expect a resize ack (since the renderer won't ack empty sizes). The message | 970 // expect a resize ack (since the renderer won't ack empty sizes). The message |
| 964 // should contain the new size (0x0) and not the previous one that we skipped | 971 // should contain the new size (0x0) and not the previous one that we skipped |
| 965 process_->sink().ClearMessages(); | 972 process_->sink().ClearMessages(); |
| 966 view_->set_bounds(gfx::Rect()); | 973 view_->set_bounds(gfx::Rect()); |
| 967 host_->WasResized(); | 974 host_->WasResized(); |
| 968 EXPECT_FALSE(host_->resize_ack_pending_); | 975 EXPECT_FALSE(host_->resize_ack_pending_); |
| 969 EXPECT_EQ(gfx::Size(), host_->in_flight_size_); | 976 EXPECT_EQ(gfx::Size(), host_->last_requested_size_); |
| 970 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 977 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 971 | 978 |
| 972 // Send a rect that has no area but has either width or height set. | 979 // Send a rect that has no area but has either width or height set. |
| 973 process_->sink().ClearMessages(); | 980 process_->sink().ClearMessages(); |
| 974 view_->set_bounds(gfx::Rect(0, 0, 0, 30)); | 981 view_->set_bounds(gfx::Rect(0, 0, 0, 30)); |
| 975 host_->WasResized(); | 982 host_->WasResized(); |
| 976 EXPECT_FALSE(host_->resize_ack_pending_); | 983 EXPECT_FALSE(host_->resize_ack_pending_); |
| 977 EXPECT_EQ(gfx::Size(0, 30), host_->in_flight_size_); | 984 EXPECT_EQ(gfx::Size(0, 30), host_->last_requested_size_); |
| 978 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 985 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 979 | 986 |
| 980 // Set the same size again. It should not be sent again. | 987 // Set the same size again. It should not be sent again. |
| 981 process_->sink().ClearMessages(); | 988 process_->sink().ClearMessages(); |
| 982 host_->WasResized(); | 989 host_->WasResized(); |
| 983 EXPECT_FALSE(host_->resize_ack_pending_); | 990 EXPECT_FALSE(host_->resize_ack_pending_); |
| 984 EXPECT_EQ(gfx::Size(0, 30), host_->in_flight_size_); | 991 EXPECT_EQ(gfx::Size(0, 30), host_->last_requested_size_); |
| 985 EXPECT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID)); | 992 EXPECT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID)); |
| 986 | 993 |
| 987 // A different size should be sent again, however. | 994 // A different size should be sent again, however. |
| 988 view_->set_bounds(gfx::Rect(0, 0, 0, 31)); | 995 view_->set_bounds(gfx::Rect(0, 0, 0, 31)); |
| 989 host_->WasResized(); | 996 host_->WasResized(); |
| 990 EXPECT_FALSE(host_->resize_ack_pending_); | 997 EXPECT_FALSE(host_->resize_ack_pending_); |
| 991 EXPECT_EQ(gfx::Size(0, 31), host_->in_flight_size_); | 998 EXPECT_EQ(gfx::Size(0, 31), host_->last_requested_size_); |
| 992 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 999 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 993 } | 1000 } |
| 994 | 1001 |
| 995 // Test for crbug.com/25097. If a renderer crashes between a resize and the | 1002 // Test for crbug.com/25097. If a renderer crashes between a resize and the |
| 996 // corresponding update message, we must be sure to clear the resize ack logic. | 1003 // corresponding update message, we must be sure to clear the resize ack logic. |
| 997 TEST_F(RenderWidgetHostTest, ResizeThenCrash) { | 1004 TEST_F(RenderWidgetHostTest, ResizeThenCrash) { |
| 998 // Setting the bounds to a "real" rect should send out the notification. | 1005 // Setting the bounds to a "real" rect should send out the notification. |
| 999 gfx::Rect original_size(0, 0, 100, 100); | 1006 gfx::Rect original_size(0, 0, 100, 100); |
| 1000 view_->set_bounds(original_size); | 1007 view_->set_bounds(original_size); |
| 1001 host_->WasResized(); | 1008 host_->WasResized(); |
| 1002 EXPECT_TRUE(host_->resize_ack_pending_); | 1009 EXPECT_TRUE(host_->resize_ack_pending_); |
| 1003 EXPECT_EQ(original_size.size(), host_->in_flight_size_); | 1010 EXPECT_EQ(original_size.size(), host_->last_requested_size_); |
| 1004 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); | 1011 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); |
| 1005 | 1012 |
| 1006 // Simulate a renderer crash before the update message. Ensure all the | 1013 // Simulate a renderer crash before the update message. Ensure all the |
| 1007 // resize ack logic is cleared. Must clear the view first so it doesn't get | 1014 // resize ack logic is cleared. Must clear the view first so it doesn't get |
| 1008 // deleted. | 1015 // deleted. |
| 1009 host_->SetView(NULL); | 1016 host_->SetView(NULL); |
| 1010 host_->RendererExited(base::TERMINATION_STATUS_PROCESS_CRASHED, -1); | 1017 host_->RendererExited(base::TERMINATION_STATUS_PROCESS_CRASHED, -1); |
| 1011 EXPECT_FALSE(host_->resize_ack_pending_); | 1018 EXPECT_FALSE(host_->resize_ack_pending_); |
| 1012 EXPECT_EQ(gfx::Size(), host_->in_flight_size_); | 1019 EXPECT_EQ(gfx::Size(), host_->last_requested_size_); |
| 1013 | 1020 |
| 1014 // Reset the view so we can exit the test cleanly. | 1021 // Reset the view so we can exit the test cleanly. |
| 1015 host_->SetView(view_.get()); | 1022 host_->SetView(view_.get()); |
| 1016 } | 1023 } |
| 1017 | 1024 |
| 1018 // Tests setting custom background | 1025 // Tests setting custom background |
| 1019 TEST_F(RenderWidgetHostTest, Background) { | 1026 TEST_F(RenderWidgetHostTest, Background) { |
| 1020 #if !defined(OS_MACOSX) | 1027 #if !defined(OS_MACOSX) |
| 1021 scoped_ptr<RenderWidgetHostView> view( | 1028 scoped_ptr<RenderWidgetHostView> view( |
| 1022 RenderWidgetHostView::CreateViewForWidget(host_.get())); | 1029 RenderWidgetHostView::CreateViewForWidget(host_.get())); |
| (...skipping 3206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4229 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode()); | 4236 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode()); |
| 4230 | 4237 |
| 4231 SimulateGestureEvent(WebInputEvent::GestureScrollEnd, | 4238 SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
| 4232 WebGestureEvent::Touchscreen); | 4239 WebGestureEvent::Touchscreen); |
| 4233 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); | 4240 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
| 4234 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode()); | 4241 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode()); |
| 4235 process_->sink().ClearMessages(); | 4242 process_->sink().ClearMessages(); |
| 4236 } | 4243 } |
| 4237 | 4244 |
| 4238 } // namespace content | 4245 } // namespace content |
| OLD | NEW |