1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h" 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_manager.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_delegate.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_impl.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/service_provider_impl.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/interfaces/application/service_provider.mojom.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/view_manager/types.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/shell/shell_test_helper.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kTestServiceURL[] = "mojo:test_url"; 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void EmptyResultCallback(bool result) {} 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Callback from Embed(). |result| is the result of the Embed() call and 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// |run_loop| the nested RunLoop. 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ResultCallback(bool* result_cache, base::RunLoop* run_loop, bool result) { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *result_cache = result; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop->Quit(); 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Responsible for establishing the initial ViewManagerService connection. 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Blocks until result is determined. 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool InitEmbed(ViewManagerInitService* view_manager_init, 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& url) { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool result = false; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceProviderPtr sp; 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) BindToProxy(new ServiceProviderImpl, &sp); 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view_manager_init->Embed(url, sp.Pass(), 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&ResultCallback, &result, &run_loop)); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestWindowManagerClient : public WindowManagerClient { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef base::Callback<void(Id, Id)> 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoNodeCallback; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit TestWindowManagerClient(base::RunLoop* run_loop) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : run_loop_(run_loop) {} 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~TestWindowManagerClient() {} 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_focus_changed_callback(const TwoNodeCallback& callback) { 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) focus_changed_callback_ = callback; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_active_window_changed_callback(const TwoNodeCallback& callback) { 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) active_window_changed_callback_ = callback; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Overridden from WindowManagerClient: 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnWindowManagerReady() MOJO_OVERRIDE { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop_->Quit(); 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnCaptureChanged( 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id old_capture_node_id, 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id new_capture_node_id) MOJO_OVERRIDE { 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnFocusChanged( 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id old_focused_node_id, 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id new_focused_node_id) MOJO_OVERRIDE { 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!focus_changed_callback_.is_null()) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) focus_changed_callback_.Run(old_focused_node_id, new_focused_node_id); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnActiveWindowChanged( 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id old_active_window, 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id new_active_window) MOJO_OVERRIDE { 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!active_window_changed_callback_.is_null()) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) active_window_changed_callback_.Run(old_active_window, new_active_window); 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop* run_loop_; 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoNodeCallback focus_changed_callback_; 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoNodeCallback active_window_changed_callback_; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TestWindowManagerClient); 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TestApplicationLoader : public ApplicationLoader, 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public ApplicationDelegate, 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public ViewManagerDelegate { 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) typedef base::Callback<void(View*)> RootAddedCallback; 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) explicit TestApplicationLoader(const RootAddedCallback& root_added_callback) 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : root_added_callback_(root_added_callback) {} 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~TestApplicationLoader() {} 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Overridden from ApplicationLoader: 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void Load(ApplicationManager* application_manager, 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url, 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<LoadCallbacks> callbacks) MOJO_OVERRIDE { 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication(); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!shell_handle.is_valid()) 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ApplicationImpl> app( 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ApplicationImpl(this, shell_handle.Pass())); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) apps_.push_back(app.release()); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnApplicationError(ApplicationManager* application_manager, 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url) MOJO_OVERRIDE {} 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Overridden from ApplicationDelegate: 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_manager_client_factory_.reset( 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ViewManagerClientFactory(app->shell(), this)); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool ConfigureIncomingConnection( 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ApplicationConnection* connection) MOJO_OVERRIDE { 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->AddService(view_manager_client_factory_.get()); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Overridden from ViewManagerDelegate: 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnEmbed( 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewManager* view_manager, 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* root, 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceProviderImpl* exported_services, 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceProvider> imported_services) MOJO_OVERRIDE { 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) root_added_callback_.Run(root); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnViewManagerDisconnected( 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ViewManager* view_manager) MOJO_OVERRIDE { 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RootAddedCallback root_added_callback_; 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScopedVector<ApplicationImpl> apps_; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_; 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestApplicationLoader); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WindowManagerApiTest : public testing::Test { 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WindowManagerApiTest() {} 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~WindowManagerApiTest() {} 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected: 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef std::pair<Id, Id> TwoIds; 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id WaitForEmbed() { 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id id; 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop run_loop; 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) root_added_callback_ = base::Bind(&WindowManagerApiTest::OnEmbed, 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), &id, &run_loop); 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.Run(); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return id; 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoIds WaitForFocusChange() { 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoIds old_and_new; 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop run_loop; 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_client()->set_focus_changed_callback( 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&WindowManagerApiTest::OnFocusChanged, 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), &old_and_new, &run_loop)); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.Run(); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return old_and_new; 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoIds WaitForActiveWindowChange() { 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoIds old_and_new; 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop run_loop; 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_client()->set_active_window_changed_callback( 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&WindowManagerApiTest::OnActiveWindowChanged, 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), &old_and_new, &run_loop)); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.Run(); 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return old_and_new; 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id OpenWindow() { 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return OpenWindowWithURL(kTestServiceURL); 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id OpenWindowWithURL(const std::string& url) { 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitEmbed(view_manager_init_.get(), url); 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return WaitForEmbed(); 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestWindowManagerClient* window_manager_client() { 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return window_manager_client_.get(); 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WindowManagerServicePtr window_manager_; 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Overridden from testing::Test: 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUp() MOJO_OVERRIDE { 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_helper_.Init(); 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_helper_.SetLoaderForURL( 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ApplicationLoader>(new TestApplicationLoader(base::Bind( 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &WindowManagerApiTest::OnRootAdded, base::Unretained(this)))), 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL(kTestServiceURL)); 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_helper_.application_manager()->ConnectToService( 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL("mojo:mojo_view_manager"), &view_manager_init_); 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(InitEmbed(view_manager_init_.get(), 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "mojo:mojo_core_window_manager")); 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConnectToWindowManager(); 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void TearDown() MOJO_OVERRIDE {} 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ConnectToWindowManager() { 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_helper_.application_manager()->ConnectToService( 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GURL("mojo:mojo_core_window_manager"), &window_manager_); 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop connect_loop; 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_client_.reset(new TestWindowManagerClient(&connect_loop)); 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_.set_client(window_manager_client()); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch connect_loop.Run(); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void OnRootAdded(View* root) { 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!root_added_callback_.is_null()) 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) root_added_callback_.Run(root); 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnEmbed(Id* root_id, 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop* loop, 2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* root) { 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *root_id = root->id(); 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) loop->Quit(); 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnFocusChanged(TwoIds* old_and_new, 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop* run_loop, 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id old_focused_node_id, 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id new_focused_node_id) { 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(old_and_new); 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) old_and_new->first = old_focused_node_id; 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) old_and_new->second = new_focused_node_id; 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop->Quit(); 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnActiveWindowChanged(TwoIds* old_and_new, 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop* run_loop, 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id old_focused_node_id, 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Id new_focused_node_id) { 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(old_and_new); 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) old_and_new->first = old_focused_node_id; 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) old_and_new->second = new_focused_node_id; 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop->Quit(); 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shell::ShellTestHelper test_helper_; 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ViewManagerInitServicePtr view_manager_init_; 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestWindowManagerClient> window_manager_client_; 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestApplicationLoader::RootAddedCallback root_added_callback_; 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest); 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(WindowManagerApiTest, FocusAndActivateWindow) { 2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id first_window = OpenWindow(); 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_->FocusWindow(first_window, 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&EmptyResultCallback)); 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TwoIds ids = WaitForFocusChange(); 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(ids.first == 0); 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ids.second, first_window); 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id second_window = OpenWindow(); 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_->ActivateWindow(second_window, 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&EmptyResultCallback)); 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ids = WaitForActiveWindowChange(); 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ids.first, first_window); 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ids.second, second_window); 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace mojo 288