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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc

Issue 242733008: Prevent Control+two-finger-scroll from zooming the page. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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) 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 "content/browser/renderer_host/render_widget_host_view_aura.h" 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/memory/shared_memory.h" 8 #include "base/memory/shared_memory.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 } 141 }
142 142
143 private: 143 private:
144 gfx::Size size_; 144 gfx::Size size_;
145 base::Callback<void(bool)> callback_; 145 base::Callback<void(bool)> callback_;
146 }; 146 };
147 147
148 class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura { 148 class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura {
149 public: 149 public:
150 FakeRenderWidgetHostViewAura(RenderWidgetHost* widget) 150 FakeRenderWidgetHostViewAura(RenderWidgetHost* widget)
151 : RenderWidgetHostViewAura(widget), has_resize_lock_(false) {} 151 : RenderWidgetHostViewAura(widget),
152 has_resize_lock_(false) {}
152 153
153 virtual ~FakeRenderWidgetHostViewAura() {} 154 virtual ~FakeRenderWidgetHostViewAura() {}
154 155
156 const blink::WebInputEvent* last_input_event() const {
157 return last_input_event_.get();
158 }
159
160 scoped_ptr<cc::CopyOutputRequest> ReleaseLastCopyRequest() {
161 return last_copy_request_.Pass();
162 }
163
164 void RunOnCompositingDidCommit() {
165 OnCompositingDidCommit(window()->GetHost()->compositor());
166 }
167
155 virtual bool ShouldCreateResizeLock() OVERRIDE { 168 virtual bool ShouldCreateResizeLock() OVERRIDE {
156 gfx::Size desired_size = window()->bounds().size(); 169 gfx::Size desired_size = window()->bounds().size();
157 return desired_size != current_frame_size_in_dip(); 170 return desired_size != current_frame_size_in_dip();
158 } 171 }
159 172
160 virtual scoped_ptr<ResizeLock> CreateResizeLock(bool defer_compositor_lock) 173 virtual scoped_ptr<ResizeLock> CreateResizeLock(bool defer_compositor_lock)
161 OVERRIDE { 174 OVERRIDE {
162 gfx::Size desired_size = window()->bounds().size(); 175 gfx::Size desired_size = window()->bounds().size();
163 return scoped_ptr<ResizeLock>( 176 return scoped_ptr<ResizeLock>(
164 new FakeResizeLock(desired_size, defer_compositor_lock)); 177 new FakeResizeLock(desired_size, defer_compositor_lock));
165 } 178 }
166 179
167 virtual void RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) 180 virtual void RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request)
168 OVERRIDE { 181 OVERRIDE {
169 last_copy_request_ = request.Pass(); 182 last_copy_request_ = request.Pass();
170 if (last_copy_request_->has_texture_mailbox()) { 183 if (last_copy_request_->has_texture_mailbox()) {
171 // Give the resulting texture a size. 184 // Give the resulting texture a size.
172 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper(); 185 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
173 GLuint texture = gl_helper->ConsumeMailboxToTexture( 186 GLuint texture = gl_helper->ConsumeMailboxToTexture(
174 last_copy_request_->texture_mailbox().mailbox(), 187 last_copy_request_->texture_mailbox().mailbox(),
175 last_copy_request_->texture_mailbox().sync_point()); 188 last_copy_request_->texture_mailbox().sync_point());
176 gl_helper->ResizeTexture(texture, window()->bounds().size()); 189 gl_helper->ResizeTexture(texture, window()->bounds().size());
177 gl_helper->DeleteTexture(texture); 190 gl_helper->DeleteTexture(texture);
178 } 191 }
179 } 192 }
180 193
181 void RunOnCompositingDidCommit() { 194 virtual InputEventAckState FilterInputEvent(
182 OnCompositingDidCommit(window()->GetHost()->compositor()); 195 const blink::WebInputEvent& input_event) OVERRIDE {
Daniel Erat 2014/04/21 23:26:39 please let me know if there's a better way to capt
196 last_input_event_.reset(new blink::WebInputEvent(input_event));
197 return RenderWidgetHostViewAura::FilterInputEvent(input_event);
183 } 198 }
184 199
200 private:
185 // A lock that doesn't actually do anything to the compositor, and does not 201 // A lock that doesn't actually do anything to the compositor, and does not
186 // time out. 202 // time out.
187 class FakeResizeLock : public ResizeLock { 203 class FakeResizeLock : public ResizeLock {
188 public: 204 public:
189 FakeResizeLock(const gfx::Size new_size, bool defer_compositor_lock) 205 FakeResizeLock(const gfx::Size new_size, bool defer_compositor_lock)
190 : ResizeLock(new_size, defer_compositor_lock) {} 206 : ResizeLock(new_size, defer_compositor_lock) {}
191 }; 207 };
192 208
193 bool has_resize_lock_; 209 bool has_resize_lock_;
194 gfx::Size last_frame_size_; 210 gfx::Size last_frame_size_;
195 scoped_ptr<cc::CopyOutputRequest> last_copy_request_; 211 scoped_ptr<cc::CopyOutputRequest> last_copy_request_;
212 scoped_ptr<blink::WebInputEvent> last_input_event_;
213
214 DISALLOW_COPY_AND_ASSIGN(FakeRenderWidgetHostViewAura);
196 }; 215 };
197 216
198 class RenderWidgetHostViewAuraTest : public testing::Test { 217 class RenderWidgetHostViewAuraTest : public testing::Test {
199 public: 218 public:
200 RenderWidgetHostViewAuraTest() 219 RenderWidgetHostViewAuraTest()
201 : browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {} 220 : browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {}
202 221
203 void SetUpEnvironment() { 222 void SetUpEnvironment() {
204 ImageTransportFactory::InitializeForUnitTests( 223 ImageTransportFactory::InitializeForUnitTests(
205 scoped_ptr<ui::ContextFactory>(new ui::InProcessContextFactory)); 224 scoped_ptr<ui::ContextFactory>(new ui::InProcessContextFactory));
(...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 // scale on it. 1261 // scale on it.
1243 view_->OnSwapCompositorFrame( 1262 view_->OnSwapCompositorFrame(
1244 1, MakeDelegatedFrame(2.f, frame_size, gfx::Rect(frame_size))); 1263 1, MakeDelegatedFrame(2.f, frame_size, gfx::Rect(frame_size)));
1245 1264
1246 // When we get a new frame with the same frame size in physical pixels, but a 1265 // When we get a new frame with the same frame size in physical pixels, but a
1247 // different scale, we should generate a new frame provider, as the final 1266 // different scale, we should generate a new frame provider, as the final
1248 // result will need to be scaled differently to the screen. 1267 // result will need to be scaled differently to the screen.
1249 EXPECT_NE(frame_provider.get(), view_->frame_provider_.get()); 1268 EXPECT_NE(frame_provider.get(), view_->frame_provider_.get());
1250 } 1269 }
1251 1270
1271 TEST_F(RenderWidgetHostViewAuraTest, ClearControlOnScrollEvent) {
1272 view_->InitAsChild(NULL);
1273 view_->Show();
1274 ui::ScrollEvent event(ui::ET_SCROLL,
1275 gfx::Point(30, 30),
1276 ui::EventTimeForNow(),
1277 ui::EF_CONTROL_DOWN,
1278 0, 0, 0, 0,
1279 2 /* finger_count */);
1280
1281 // The Control modifier should be cleared in the forwarded event.
1282 view_->OnScrollEvent(&event);
1283 const blink::WebInputEvent* web_event = view_->last_input_event();
1284 ASSERT_TRUE(web_event);
1285 EXPECT_EQ(blink::WebInputEvent::MouseWheel, web_event->type);
1286 EXPECT_EQ(0, web_event->modifiers);
1287 }
1288
1289 TEST_F(RenderWidgetHostViewAuraTest,
1290 PreserveControlOnScrollEventWithOtherModifiers) {
1291 view_->InitAsChild(NULL);
1292 view_->Show();
1293 ui::ScrollEvent event(ui::ET_SCROLL,
1294 gfx::Point(30, 30),
1295 ui::EventTimeForNow(),
1296 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1297 0, 0, 0, 0,
1298 2 /* finger_count */);
1299
1300 // The Control modifier should be preserved since Alt was also down.
1301 view_->OnScrollEvent(&event);
1302 const blink::WebInputEvent* web_event = view_->last_input_event();
1303 ASSERT_TRUE(web_event);
1304 EXPECT_EQ(blink::WebInputEvent::MouseWheel, web_event->type);
1305 EXPECT_EQ(blink::WebInputEvent::ControlKey | blink::WebInputEvent::AltKey,
1306 web_event->modifiers);
1307 }
1308
1252 class RenderWidgetHostViewAuraCopyRequestTest 1309 class RenderWidgetHostViewAuraCopyRequestTest
1253 : public RenderWidgetHostViewAuraShutdownTest { 1310 : public RenderWidgetHostViewAuraShutdownTest {
1254 public: 1311 public:
1255 RenderWidgetHostViewAuraCopyRequestTest() 1312 RenderWidgetHostViewAuraCopyRequestTest()
1256 : callback_count_(0), result_(false) {} 1313 : callback_count_(0), result_(false) {}
1257 1314
1258 void CallbackMethod(const base::Closure& quit_closure, bool result) { 1315 void CallbackMethod(const base::Closure& quit_closure, bool result) {
1259 result_ = result; 1316 result_ = result;
1260 callback_count_++; 1317 callback_count_++;
1261 quit_closure.Run(); 1318 quit_closure.Run();
(...skipping 20 matching lines...) Expand all
1282 view_->SetSize(view_rect.size()); 1339 view_->SetSize(view_rect.size());
1283 view_->WasShown(); 1340 view_->WasShown();
1284 1341
1285 scoped_ptr<FakeFrameSubscriber> frame_subscriber(new FakeFrameSubscriber( 1342 scoped_ptr<FakeFrameSubscriber> frame_subscriber(new FakeFrameSubscriber(
1286 view_rect.size(), 1343 view_rect.size(),
1287 base::Bind(&RenderWidgetHostViewAuraCopyRequestTest::CallbackMethod, 1344 base::Bind(&RenderWidgetHostViewAuraCopyRequestTest::CallbackMethod,
1288 base::Unretained(this), 1345 base::Unretained(this),
1289 run_loop.QuitClosure()))); 1346 run_loop.QuitClosure())));
1290 1347
1291 EXPECT_EQ(0, callback_count_); 1348 EXPECT_EQ(0, callback_count_);
1292 EXPECT_FALSE(view_->last_copy_request_); 1349 request = view_->ReleaseLastCopyRequest();
1350 EXPECT_FALSE(request);
1293 1351
1294 view_->BeginFrameSubscription( 1352 view_->BeginFrameSubscription(
1295 frame_subscriber.PassAs<RenderWidgetHostViewFrameSubscriber>()); 1353 frame_subscriber.PassAs<RenderWidgetHostViewFrameSubscriber>());
1296 view_->OnSwapCompositorFrame( 1354 view_->OnSwapCompositorFrame(
1297 1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect))); 1355 1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect)));
1298 1356
1299 EXPECT_EQ(0, callback_count_); 1357 EXPECT_EQ(0, callback_count_);
1300 EXPECT_TRUE(view_->last_copy_request_); 1358 request = view_->ReleaseLastCopyRequest();
1301 EXPECT_TRUE(view_->last_copy_request_->has_texture_mailbox()); 1359 ASSERT_TRUE(request);
1302 request = view_->last_copy_request_.Pass(); 1360 EXPECT_TRUE(request->has_texture_mailbox());
1303 1361
1304 // There should be one subscriber texture in flight. 1362 // There should be one subscriber texture in flight.
1305 EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size()); 1363 EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size());
1306 1364
1307 // Send back the mailbox included in the request. There's no release callback 1365 // Send back the mailbox included in the request. There's no release callback
1308 // since the mailbox came from the RWHVA originally. 1366 // since the mailbox came from the RWHVA originally.
1309 request->SendTextureResult(view_rect.size(), 1367 request->SendTextureResult(view_rect.size(),
1310 request->texture_mailbox(), 1368 request->texture_mailbox(),
1311 scoped_ptr<cc::SingleReleaseCallback>()); 1369 scoped_ptr<cc::SingleReleaseCallback>());
1312 1370
1313 // This runs until the callback happens. 1371 // This runs until the callback happens.
1314 run_loop.Run(); 1372 run_loop.Run();
1315 1373
1316 // The callback should succeed. 1374 // The callback should succeed.
1317 EXPECT_EQ(0u, view_->active_frame_subscriber_textures_.size()); 1375 EXPECT_EQ(0u, view_->active_frame_subscriber_textures_.size());
1318 EXPECT_EQ(1, callback_count_); 1376 EXPECT_EQ(1, callback_count_);
1319 EXPECT_TRUE(result_); 1377 EXPECT_TRUE(result_);
1320 1378
1321 view_->OnSwapCompositorFrame( 1379 view_->OnSwapCompositorFrame(
1322 1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect))); 1380 1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect)));
1323 1381
1324 EXPECT_EQ(1, callback_count_); 1382 EXPECT_EQ(1, callback_count_);
1325 request = view_->last_copy_request_.Pass(); 1383 request = view_->ReleaseLastCopyRequest();
1326 1384
1327 // There should be one subscriber texture in flight again. 1385 // There should be one subscriber texture in flight again.
1328 EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size()); 1386 EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size());
1329 1387
1330 // Destroy the RenderWidgetHostViewAura and ImageTransportFactory. 1388 // Destroy the RenderWidgetHostViewAura and ImageTransportFactory.
1331 TearDownEnvironment(); 1389 TearDownEnvironment();
1332 1390
1333 // Send back the mailbox included in the request. There's no release callback 1391 // Send back the mailbox included in the request. There's no release callback
1334 // since the mailbox came from the RWHVA originally. 1392 // since the mailbox came from the RWHVA originally.
1335 request->SendTextureResult(view_rect.size(), 1393 request->SendTextureResult(view_rect.size(),
1336 request->texture_mailbox(), 1394 request->texture_mailbox(),
1337 scoped_ptr<cc::SingleReleaseCallback>()); 1395 scoped_ptr<cc::SingleReleaseCallback>());
1338 1396
1339 // Because the copy request callback may be holding state within it, that 1397 // Because the copy request callback may be holding state within it, that
1340 // state must handle the RWHVA and ImageTransportFactory going away before the 1398 // state must handle the RWHVA and ImageTransportFactory going away before the
1341 // callback is called. This test passes if it does not crash as a result of 1399 // callback is called. This test passes if it does not crash as a result of
1342 // these things being destroyed. 1400 // these things being destroyed.
1343 EXPECT_EQ(2, callback_count_); 1401 EXPECT_EQ(2, callback_count_);
1344 EXPECT_FALSE(result_); 1402 EXPECT_FALSE(result_);
1345 } 1403 }
1346 1404
1347 } // namespace content 1405 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698