| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/scheduler/renderer/render_widget_signals.h" | |
| 6 | |
| 7 #include "base/macros.h" | |
| 8 #include "components/scheduler/renderer/render_widget_scheduling_state.h" | |
| 9 #include "testing/gmock/include/gmock/gmock.h" | |
| 10 #include "testing/gtest/include/gtest/gtest.h" | |
| 11 | |
| 12 using testing::AnyNumber; | |
| 13 using testing::Mock; | |
| 14 using testing::_; | |
| 15 | |
| 16 namespace scheduler { | |
| 17 | |
| 18 namespace { | |
| 19 class MockObserver : public RenderWidgetSignals::Observer { | |
| 20 public: | |
| 21 MockObserver() {} | |
| 22 virtual ~MockObserver() {} | |
| 23 | |
| 24 MOCK_METHOD1(SetAllRenderWidgetsHidden, void(bool hidden)); | |
| 25 MOCK_METHOD1(SetHasVisibleRenderWidgetWithTouchHandler, | |
| 26 void(bool has_visible_render_widget_with_touch_handler)); | |
| 27 | |
| 28 private: | |
| 29 DISALLOW_COPY_AND_ASSIGN(MockObserver); | |
| 30 }; | |
| 31 } | |
| 32 | |
| 33 class RenderWidgetSignalsTest : public testing::Test { | |
| 34 public: | |
| 35 RenderWidgetSignalsTest() {} | |
| 36 ~RenderWidgetSignalsTest() override {} | |
| 37 | |
| 38 void SetUp() override { | |
| 39 mock_observer_.reset(new MockObserver()); | |
| 40 render_widget_signals_.reset(new RenderWidgetSignals(mock_observer_.get())); | |
| 41 } | |
| 42 | |
| 43 void IgnoreWidgetCreationCallbacks() { | |
| 44 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(false)) | |
| 45 .Times(AnyNumber()); | |
| 46 } | |
| 47 | |
| 48 void IgnoreWidgetDestructionCallbacks() { | |
| 49 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)) | |
| 50 .Times(AnyNumber()); | |
| 51 } | |
| 52 | |
| 53 std::unique_ptr<MockObserver> mock_observer_; | |
| 54 std::unique_ptr<RenderWidgetSignals> render_widget_signals_; | |
| 55 }; | |
| 56 | |
| 57 TEST_F(RenderWidgetSignalsTest, RenderWidgetSchedulingStateLifeCycle) { | |
| 58 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(false)).Times(1); | |
| 59 std::unique_ptr<RenderWidgetSchedulingState> widget1_state = | |
| 60 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 61 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 62 | |
| 63 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 64 } | |
| 65 | |
| 66 TEST_F(RenderWidgetSignalsTest, RenderWidget_Hidden) { | |
| 67 IgnoreWidgetCreationCallbacks(); | |
| 68 std::unique_ptr<RenderWidgetSchedulingState> widget1_state = | |
| 69 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 70 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 71 | |
| 72 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 73 widget1_state->SetHidden(true); | |
| 74 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 75 | |
| 76 IgnoreWidgetDestructionCallbacks(); | |
| 77 } | |
| 78 | |
| 79 TEST_F(RenderWidgetSignalsTest, RenderWidget_HiddenThreeTimesShownOnce) { | |
| 80 IgnoreWidgetCreationCallbacks(); | |
| 81 std::unique_ptr<RenderWidgetSchedulingState> widget1_state = | |
| 82 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 83 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 84 | |
| 85 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 86 widget1_state->SetHidden(true); | |
| 87 widget1_state->SetHidden(true); | |
| 88 widget1_state->SetHidden(true); | |
| 89 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 90 | |
| 91 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(false)).Times(1); | |
| 92 widget1_state->SetHidden(false); | |
| 93 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 94 | |
| 95 IgnoreWidgetDestructionCallbacks(); | |
| 96 } | |
| 97 | |
| 98 TEST_F(RenderWidgetSignalsTest, MultipleRenderWidgetsBecomeHiddenThenVisible) { | |
| 99 IgnoreWidgetCreationCallbacks(); | |
| 100 std::unique_ptr<RenderWidgetSchedulingState> widget1_state = | |
| 101 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 102 std::unique_ptr<RenderWidgetSchedulingState> widget2_state = | |
| 103 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 104 std::unique_ptr<RenderWidgetSchedulingState> widget3_state = | |
| 105 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 106 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 107 | |
| 108 // Widgets are initially assumed to be visible so start hiding them, we should | |
| 109 // not get any calls to SetAllRenderWidgetsHidden till the last one is hidden. | |
| 110 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(_)).Times(0); | |
| 111 widget1_state->SetHidden(true); | |
| 112 widget2_state->SetHidden(true); | |
| 113 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 114 | |
| 115 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 116 widget3_state->SetHidden(true); | |
| 117 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 118 | |
| 119 // We should get a call back once the first widget is unhidden and no more | |
| 120 // after that. | |
| 121 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(false)).Times(1); | |
| 122 widget1_state->SetHidden(false); | |
| 123 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 124 | |
| 125 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(_)).Times(0); | |
| 126 widget2_state->SetHidden(false); | |
| 127 widget3_state->SetHidden(false); | |
| 128 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 129 | |
| 130 IgnoreWidgetDestructionCallbacks(); | |
| 131 } | |
| 132 | |
| 133 TEST_F(RenderWidgetSignalsTest, TouchHandlerAddedAndRemoved_VisibleWidget) { | |
| 134 IgnoreWidgetCreationCallbacks(); | |
| 135 | |
| 136 std::unique_ptr<RenderWidgetSchedulingState> widget_state = | |
| 137 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 138 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 139 | |
| 140 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(true)) | |
| 141 .Times(1); | |
| 142 widget_state->SetHasTouchHandler(true); | |
| 143 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 144 | |
| 145 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(false)) | |
| 146 .Times(1); | |
| 147 widget_state->SetHasTouchHandler(false); | |
| 148 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 149 | |
| 150 IgnoreWidgetDestructionCallbacks(); | |
| 151 } | |
| 152 | |
| 153 TEST_F(RenderWidgetSignalsTest, | |
| 154 TouchHandlerAddedThriceAndRemovedOnce_VisibleWidget) { | |
| 155 IgnoreWidgetCreationCallbacks(); | |
| 156 | |
| 157 std::unique_ptr<RenderWidgetSchedulingState> widget_state = | |
| 158 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 159 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 160 | |
| 161 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(true)) | |
| 162 .Times(1); | |
| 163 widget_state->SetHasTouchHandler(true); | |
| 164 widget_state->SetHasTouchHandler(true); | |
| 165 widget_state->SetHasTouchHandler(true); | |
| 166 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 167 | |
| 168 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(false)) | |
| 169 .Times(1); | |
| 170 widget_state->SetHasTouchHandler(false); | |
| 171 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 172 | |
| 173 IgnoreWidgetDestructionCallbacks(); | |
| 174 } | |
| 175 | |
| 176 TEST_F(RenderWidgetSignalsTest, TouchHandlerAddedAndRemoved_HiddenWidget) { | |
| 177 IgnoreWidgetCreationCallbacks(); | |
| 178 | |
| 179 std::unique_ptr<RenderWidgetSchedulingState> widget_state = | |
| 180 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 181 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 182 widget_state->SetHidden(true); | |
| 183 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 184 | |
| 185 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(_)) | |
| 186 .Times(0); | |
| 187 widget_state->SetHasTouchHandler(true); | |
| 188 widget_state->SetHasTouchHandler(false); | |
| 189 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 190 | |
| 191 IgnoreWidgetDestructionCallbacks(); | |
| 192 } | |
| 193 | |
| 194 TEST_F(RenderWidgetSignalsTest, | |
| 195 MultipleTouchHandlerAddedAndRemoved_VisibleWidgets) { | |
| 196 IgnoreWidgetCreationCallbacks(); | |
| 197 | |
| 198 std::unique_ptr<RenderWidgetSchedulingState> widget1_state = | |
| 199 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 200 std::unique_ptr<RenderWidgetSchedulingState> widget2_state = | |
| 201 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 202 std::unique_ptr<RenderWidgetSchedulingState> widget3_state = | |
| 203 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 204 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 205 | |
| 206 // We should only get a callback for the first widget with a touch handler. | |
| 207 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(true)) | |
| 208 .Times(1); | |
| 209 widget1_state->SetHasTouchHandler(true); | |
| 210 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 211 | |
| 212 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(_)) | |
| 213 .Times(0); | |
| 214 widget2_state->SetHasTouchHandler(true); | |
| 215 widget3_state->SetHasTouchHandler(true); | |
| 216 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 217 | |
| 218 // We should only get a callback when the last touch handler is removed. | |
| 219 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(_)) | |
| 220 .Times(0); | |
| 221 widget1_state->SetHasTouchHandler(false); | |
| 222 widget2_state->SetHasTouchHandler(false); | |
| 223 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 224 | |
| 225 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(false)) | |
| 226 .Times(1); | |
| 227 widget3_state->SetHasTouchHandler(false); | |
| 228 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 229 | |
| 230 IgnoreWidgetDestructionCallbacks(); | |
| 231 } | |
| 232 | |
| 233 TEST_F(RenderWidgetSignalsTest, | |
| 234 TouchHandlerAddedThenWigetDeleted_VisibleWidget) { | |
| 235 IgnoreWidgetCreationCallbacks(); | |
| 236 | |
| 237 std::unique_ptr<RenderWidgetSchedulingState> widget_state = | |
| 238 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 239 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 240 | |
| 241 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(true)) | |
| 242 .Times(1); | |
| 243 widget_state->SetHasTouchHandler(true); | |
| 244 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 245 | |
| 246 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(false)) | |
| 247 .Times(1); | |
| 248 IgnoreWidgetDestructionCallbacks(); | |
| 249 } | |
| 250 | |
| 251 TEST_F(RenderWidgetSignalsTest, | |
| 252 TouchHandlerAddedThenWigetDeleted_HiddenWidget) { | |
| 253 IgnoreWidgetCreationCallbacks(); | |
| 254 | |
| 255 std::unique_ptr<RenderWidgetSchedulingState> widget_state = | |
| 256 render_widget_signals_->NewRenderWidgetSchedulingState(); | |
| 257 EXPECT_CALL(*mock_observer_, SetAllRenderWidgetsHidden(true)).Times(1); | |
| 258 widget_state->SetHidden(true); | |
| 259 Mock::VerifyAndClearExpectations(mock_observer_.get()); | |
| 260 | |
| 261 EXPECT_CALL(*mock_observer_, SetHasVisibleRenderWidgetWithTouchHandler(_)) | |
| 262 .Times(0); | |
| 263 IgnoreWidgetDestructionCallbacks(); | |
| 264 } | |
| 265 | |
| 266 } // namespace scheduler | |
| OLD | NEW |