15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/render_view_test.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/mouse_lock_dispatcher.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockLockTarget : public MouseLockDispatcher::LockTarget {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MOCK_METHOD1(OnLockMouseACK, void(bool));
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MOCK_METHOD0(OnMouseLockLost, void());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MOCK_METHOD1(HandleMouseLockedInputEvent,
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                bool(const blink::WebMouseEvent&));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseLockDispatcher is a RenderViewObserver, and we test it by creating a
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fixture containing a RenderViewImpl view() and interacting to that interface.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MouseLockDispatcherTest : public RenderViewTest {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewTest::SetUp();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    route_id_ = view()->GetRoutingID();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_ = new MockLockTarget();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alternate_target_ = new MockLockTarget();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewTest::TearDown();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete target_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete alternate_target_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseLockDispatcher* dispatcher() { return view()->mouse_lock_dispatcher(); }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockLockTarget* target_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockLockTarget* alternate_target_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test simple use of RenderViewImpl interface to WebKit for pointer lock.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, BasicWebWidget) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start unlocked.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(view()->isPointerLocked());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(view()->requestPointerLock());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(view()->isPointerLocked());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->requestPointerUnlock();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_MouseLockLost(route_id_));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(view()->isPointerLocked());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt a lock, and have it fail.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(view()->requestPointerLock());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, false));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(view()->isPointerLocked());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test simple use of MouseLockDispatcher with a mock LockTarget.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, BasicMockLockTarget) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(false));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start unlocked.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(NULL));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->IsMouseLockedTo(target_));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Receive mouse event.
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->UnlockMouse(target_);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_MouseLockLost(route_id_));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt a lock, and have it fail.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, false));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test deleting a target while it is in use by MouseLockDispatcher.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, DeleteAndUnlock) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_)).Times(0);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost()).Times(0);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->IsMouseLockedTo(target_));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock, with a deleted target.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't receive mouse events or lock lost.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->OnLockTargetDestroyed(target_);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete target_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_ = NULL;
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_MouseLockLost(route_id_));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test deleting a target that is pending a lock request response.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, DeleteWithPendingLockSuccess) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true)).Times(0);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost()).Times(0);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock request.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before receiving response delete the target.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->OnLockTargetDestroyed(target_);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete target_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_ = NULL;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock response.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test deleting a target that is pending a lock request failure response.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, DeleteWithPendingLockFail) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true)).Times(0);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost()).Times(0);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock request.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Before receiving response delete the target.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->OnLockTargetDestroyed(target_);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete target_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_ = NULL;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock response.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, false));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test not receiving mouse events when a target is not locked.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, MouseEventsNotReceived) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_)).Times(0);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_)).Times(0);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Don't) receive mouse event.
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->IsMouseLockedTo(target_));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Receive mouse event.
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->UnlockMouse(target_);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_MouseLockLost(route_id_));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Don't) receive mouse event.
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test multiple targets
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MouseLockDispatcherTest, MultipleTargets) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::InSequence expect_calls_in_sequence;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnLockMouseACK(true));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, HandleMouseLockedInputEvent(_));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*alternate_target_, HandleMouseLockedInputEvent(_)).Times(0);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost()).Times(0);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*alternate_target_, OnMouseLockLost()).Times(0);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*target_, OnMouseLockLost());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock request for target.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->LockMouse(target_));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fail attempt to lock alternate.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(alternate_target_));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->LockMouse(alternate_target_));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock completion for target.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_LockMouse_ACK(route_id_, true));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->IsMouseLockedTo(target_));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fail attempt to lock alternate.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(alternate_target_));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->LockMouse(alternate_target_));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Receive mouse event to only one target.
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher()->WillHandleMouseEvent(blink::WebMouseEvent());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock alternate target has no effect.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher()->UnlockMouse(alternate_target_);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dispatcher()->IsMouseLockedTo(target_));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(alternate_target_));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Though the call to UnlockMouse should not unlock any target, we will
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cause an unlock (as if e.g. user escaped mouse lock) and verify the
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // correct target is unlocked.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view()->OnMessageReceived(ViewMsg_MouseLockLost(route_id_));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dispatcher()->IsMouseLockedTo(target_));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
234