| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "components/mus/public/cpp/tests/view_manager_test_base.h" | 8 #include "components/mus/public/cpp/tests/mandoline_ui_services_test_base.h" |
| 9 #include "components/mus/public/cpp/util.h" | 9 #include "components/mus/public/cpp/util.h" |
| 10 #include "components/mus/public/cpp/view_observer.h" | 10 #include "components/mus/public/cpp/view_observer.h" |
| 11 #include "components/mus/public/cpp/view_tree_connection.h" | 11 #include "components/mus/public/cpp/view_tree_connection.h" |
| 12 #include "components/mus/public/cpp/view_tree_delegate.h" | 12 #include "components/mus/public/cpp/view_tree_delegate.h" |
| 13 #include "mojo/application/public/cpp/application_connection.h" | 13 #include "mojo/application/public/cpp/application_connection.h" |
| 14 #include "mojo/application/public/cpp/application_impl.h" | 14 #include "mojo/application/public/cpp/application_impl.h" |
| 15 #include "mojo/application/public/cpp/application_test_base.h" | 15 #include "mojo/application/public/cpp/application_test_base.h" |
| 16 #include "ui/mojo/geometry/geometry_util.h" | 16 #include "ui/mojo/geometry/geometry_util.h" |
| 17 | 17 |
| 18 namespace mojo { | 18 namespace mus { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 class BoundsChangeObserver : public ViewObserver { | 22 class BoundsChangeObserver : public ViewObserver { |
| 23 public: | 23 public: |
| 24 explicit BoundsChangeObserver(View* view) : view_(view) { | 24 explicit BoundsChangeObserver(View* view) : view_(view) { |
| 25 view_->AddObserver(this); | 25 view_->AddObserver(this); |
| 26 } | 26 } |
| 27 ~BoundsChangeObserver() override { view_->RemoveObserver(this); } | 27 ~BoundsChangeObserver() override { view_->RemoveObserver(this); } |
| 28 | 28 |
| 29 private: | 29 private: |
| 30 // Overridden from ViewObserver: | 30 // Overridden from ViewObserver: |
| 31 void OnViewBoundsChanged(View* view, | 31 void OnViewBoundsChanged(View* view, |
| 32 const Rect& old_bounds, | 32 const mojo::Rect& old_bounds, |
| 33 const Rect& new_bounds) override { | 33 const mojo::Rect& new_bounds) override { |
| 34 DCHECK_EQ(view, view_); | 34 DCHECK_EQ(view, view_); |
| 35 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 35 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 36 } | 36 } |
| 37 | 37 |
| 38 View* view_; | 38 View* view_; |
| 39 | 39 |
| 40 MOJO_DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); | 40 MOJO_DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 // Wait until the bounds of the supplied view change; returns false on timeout. | 43 // Wait until the bounds of the supplied view change; returns false on timeout. |
| 44 bool WaitForBoundsToChange(View* view) { | 44 bool WaitForBoundsToChange(View* view) { |
| 45 BoundsChangeObserver observer(view); | 45 BoundsChangeObserver observer(view); |
| 46 return ViewManagerTestBase::DoRunLoopWithTimeout(); | 46 return MandolineUIServicesTestBase::DoRunLoopWithTimeout(); |
| 47 } | 47 } |
| 48 | 48 |
| 49 // Spins a run loop until the tree beginning at |root| has |tree_size| views | 49 // Spins a run loop until the tree beginning at |root| has |tree_size| views |
| 50 // (including |root|). | 50 // (including |root|). |
| 51 class TreeSizeMatchesObserver : public ViewObserver { | 51 class TreeSizeMatchesObserver : public ViewObserver { |
| 52 public: | 52 public: |
| 53 TreeSizeMatchesObserver(View* tree, size_t tree_size) | 53 TreeSizeMatchesObserver(View* tree, size_t tree_size) |
| 54 : tree_(tree), tree_size_(tree_size) { | 54 : tree_(tree), tree_size_(tree_size) { |
| 55 tree_->AddObserver(this); | 55 tree_->AddObserver(this); |
| 56 } | 56 } |
| 57 ~TreeSizeMatchesObserver() override { tree_->RemoveObserver(this); } | 57 ~TreeSizeMatchesObserver() override { tree_->RemoveObserver(this); } |
| 58 | 58 |
| 59 bool IsTreeCorrectSize() { return CountViews(tree_) == tree_size_; } | 59 bool IsTreeCorrectSize() { return CountViews(tree_) == tree_size_; } |
| 60 | 60 |
| 61 private: | 61 private: |
| 62 // Overridden from ViewObserver: | 62 // Overridden from ViewObserver: |
| 63 void OnTreeChanged(const TreeChangeParams& params) override { | 63 void OnTreeChanged(const TreeChangeParams& params) override { |
| 64 if (IsTreeCorrectSize()) | 64 if (IsTreeCorrectSize()) |
| 65 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 65 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 66 } | 66 } |
| 67 | 67 |
| 68 size_t CountViews(const View* view) const { | 68 size_t CountViews(const View* view) const { |
| 69 size_t count = 1; | 69 size_t count = 1; |
| 70 View::Children::const_iterator it = view->children().begin(); | 70 View::Children::const_iterator it = view->children().begin(); |
| 71 for (; it != view->children().end(); ++it) | 71 for (; it != view->children().end(); ++it) |
| 72 count += CountViews(*it); | 72 count += CountViews(*it); |
| 73 return count; | 73 return count; |
| 74 } | 74 } |
| 75 | 75 |
| 76 View* tree_; | 76 View* tree_; |
| 77 size_t tree_size_; | 77 size_t tree_size_; |
| 78 | 78 |
| 79 MOJO_DISALLOW_COPY_AND_ASSIGN(TreeSizeMatchesObserver); | 79 MOJO_DISALLOW_COPY_AND_ASSIGN(TreeSizeMatchesObserver); |
| 80 }; | 80 }; |
| 81 | 81 |
| 82 // Wait until |view| has |tree_size| descendants; returns false on timeout. The | 82 // Wait until |view| has |tree_size| descendants; returns false on timeout. The |
| 83 // count includes |view|. For example, if you want to wait for |view| to have | 83 // count includes |view|. For example, if you want to wait for |view| to have |
| 84 // a single child, use a |tree_size| of 2. | 84 // a single child, use a |tree_size| of 2. |
| 85 bool WaitForTreeSizeToMatch(View* view, size_t tree_size) { | 85 bool WaitForTreeSizeToMatch(View* view, size_t tree_size) { |
| 86 TreeSizeMatchesObserver observer(view, tree_size); | 86 TreeSizeMatchesObserver observer(view, tree_size); |
| 87 return observer.IsTreeCorrectSize() || | 87 return observer.IsTreeCorrectSize() || |
| 88 ViewManagerTestBase::DoRunLoopWithTimeout(); | 88 MandolineUIServicesTestBase::DoRunLoopWithTimeout(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 class OrderChangeObserver : public ViewObserver { | 91 class OrderChangeObserver : public ViewObserver { |
| 92 public: | 92 public: |
| 93 OrderChangeObserver(View* view) : view_(view) { view_->AddObserver(this); } | 93 OrderChangeObserver(View* view) : view_(view) { view_->AddObserver(this); } |
| 94 ~OrderChangeObserver() override { view_->RemoveObserver(this); } | 94 ~OrderChangeObserver() override { view_->RemoveObserver(this); } |
| 95 | 95 |
| 96 private: | 96 private: |
| 97 // Overridden from ViewObserver: | 97 // Overridden from ViewObserver: |
| 98 void OnViewReordered(View* view, | 98 void OnViewReordered(View* view, |
| 99 View* relative_view, | 99 View* relative_view, |
| 100 OrderDirection direction) override { | 100 mojo::OrderDirection direction) override { |
| 101 DCHECK_EQ(view, view_); | 101 DCHECK_EQ(view, view_); |
| 102 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 102 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 103 } | 103 } |
| 104 | 104 |
| 105 View* view_; | 105 View* view_; |
| 106 | 106 |
| 107 MOJO_DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); | 107 MOJO_DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 // Wait until |view|'s tree size matches |tree_size|; returns false on timeout. | 110 // Wait until |view|'s tree size matches |tree_size|; returns false on timeout. |
| 111 bool WaitForOrderChange(ViewTreeConnection* connection, View* view) { | 111 bool WaitForOrderChange(ViewTreeConnection* connection, View* view) { |
| 112 OrderChangeObserver observer(view); | 112 OrderChangeObserver observer(view); |
| 113 return ViewManagerTestBase::DoRunLoopWithTimeout(); | 113 return MandolineUIServicesTestBase::DoRunLoopWithTimeout(); |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Tracks a view's destruction. Query is_valid() for current state. | 116 // Tracks a view's destruction. Query is_valid() for current state. |
| 117 class ViewTracker : public ViewObserver { | 117 class ViewTracker : public ViewObserver { |
| 118 public: | 118 public: |
| 119 explicit ViewTracker(View* view) : view_(view) { view_->AddObserver(this); } | 119 explicit ViewTracker(View* view) : view_(view) { view_->AddObserver(this); } |
| 120 ~ViewTracker() override { | 120 ~ViewTracker() override { |
| 121 if (view_) | 121 if (view_) |
| 122 view_->RemoveObserver(this); | 122 view_->RemoveObserver(this); |
| 123 } | 123 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 149 | 149 |
| 150 // The id supplied to the callback from OnEmbed(). Depending upon the | 150 // The id supplied to the callback from OnEmbed(). Depending upon the |
| 151 // access policy this may or may not match the connection id of | 151 // access policy this may or may not match the connection id of |
| 152 // |connection|. | 152 // |connection|. |
| 153 ConnectionSpecificId connection_id; | 153 ConnectionSpecificId connection_id; |
| 154 }; | 154 }; |
| 155 | 155 |
| 156 // These tests model synchronization of two peer connections to the view manager | 156 // These tests model synchronization of two peer connections to the view manager |
| 157 // service, that are given access to some root view. | 157 // service, that are given access to some root view. |
| 158 | 158 |
| 159 class ViewManagerTest : public ViewManagerTestBase { | 159 class ViewManagerTest : public MandolineUIServicesTestBase { |
| 160 public: | 160 public: |
| 161 ViewManagerTest() {} | 161 ViewManagerTest() {} |
| 162 | 162 |
| 163 // Embeds another version of the test app @ view. This runs a run loop until | 163 // Embeds another version of the test app @ view. This runs a run loop until |
| 164 // a response is received, or a timeout. On success the new ViewManager is | 164 // a response is received, or a timeout. On success the new ViewManager is |
| 165 // returned. | 165 // returned. |
| 166 EmbedResult Embed(View* view) { | 166 EmbedResult Embed(View* view) { |
| 167 DCHECK(!embed_details_); | 167 DCHECK(!embed_details_); |
| 168 embed_details_.reset(new EmbedDetails); | 168 embed_details_.reset(new EmbedDetails); |
| 169 view->Embed(ConnectToApplicationAndGetViewManagerClient(), | 169 view->Embed(ConnectToApplicationAndGetViewManagerClient(), |
| 170 base::Bind(&ViewManagerTest::EmbedCallbackImpl, | 170 base::Bind(&ViewManagerTest::EmbedCallbackImpl, |
| 171 base::Unretained(this))); | 171 base::Unretained(this))); |
| 172 embed_details_->waiting = true; | 172 embed_details_->waiting = true; |
| 173 if (!ViewManagerTestBase::DoRunLoopWithTimeout()) | 173 if (!MandolineUIServicesTestBase::DoRunLoopWithTimeout()) |
| 174 return EmbedResult(); | 174 return EmbedResult(); |
| 175 const EmbedResult result(embed_details_->connection, | 175 const EmbedResult result(embed_details_->connection, |
| 176 embed_details_->connection_id); | 176 embed_details_->connection_id); |
| 177 embed_details_.reset(); | 177 embed_details_.reset(); |
| 178 return result; | 178 return result; |
| 179 } | 179 } |
| 180 | 180 |
| 181 // Establishes a connection to this application and asks for a | 181 // Establishes a connection to this application and asks for a |
| 182 // ViewTreeClient. | 182 // ViewTreeClient. |
| 183 mojo::ViewTreeClientPtr ConnectToApplicationAndGetViewManagerClient() { | 183 mojo::ViewTreeClientPtr ConnectToApplicationAndGetViewManagerClient() { |
| 184 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 184 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
| 185 request->url = mojo::String::From(application_impl()->url()); | 185 request->url = mojo::String::From(application_impl()->url()); |
| 186 scoped_ptr<ApplicationConnection> connection = | 186 scoped_ptr<mojo::ApplicationConnection> connection = |
| 187 application_impl()->ConnectToApplication(request.Pass()); | 187 application_impl()->ConnectToApplication(request.Pass()); |
| 188 mojo::ViewTreeClientPtr client; | 188 mojo::ViewTreeClientPtr client; |
| 189 connection->ConnectToService(&client); | 189 connection->ConnectToService(&client); |
| 190 return client.Pass(); | 190 return client.Pass(); |
| 191 } | 191 } |
| 192 | 192 |
| 193 // ViewManagerTestBase: | 193 // MandolineUIServicesTestBase: |
| 194 void OnEmbed(View* root) override { | 194 void OnEmbed(View* root) override { |
| 195 if (!embed_details_) { | 195 if (!embed_details_) { |
| 196 ViewManagerTestBase::OnEmbed(root); | 196 MandolineUIServicesTestBase::OnEmbed(root); |
| 197 return; | 197 return; |
| 198 } | 198 } |
| 199 | 199 |
| 200 embed_details_->connection = root->connection(); | 200 embed_details_->connection = root->connection(); |
| 201 if (embed_details_->callback_run) | 201 if (embed_details_->callback_run) |
| 202 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 202 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 203 } | 203 } |
| 204 | 204 |
| 205 private: | 205 private: |
| 206 // Used to track the state of a call to view->Embed(). | 206 // Used to track the state of a call to view->Embed(). |
| 207 struct EmbedDetails { | 207 struct EmbedDetails { |
| 208 EmbedDetails() | 208 EmbedDetails() |
| 209 : callback_run(false), | 209 : callback_run(false), |
| 210 result(false), | 210 result(false), |
| 211 waiting(false), | 211 waiting(false), |
| 212 connection_id(0), | 212 connection_id(0), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 227 // The ViewTreeConnection that resulted from the Embed(). null if |result| | 227 // The ViewTreeConnection that resulted from the Embed(). null if |result| |
| 228 // is false. | 228 // is false. |
| 229 ViewTreeConnection* connection; | 229 ViewTreeConnection* connection; |
| 230 }; | 230 }; |
| 231 | 231 |
| 232 void EmbedCallbackImpl(bool result, ConnectionSpecificId connection_id) { | 232 void EmbedCallbackImpl(bool result, ConnectionSpecificId connection_id) { |
| 233 embed_details_->callback_run = true; | 233 embed_details_->callback_run = true; |
| 234 embed_details_->result = result; | 234 embed_details_->result = result; |
| 235 embed_details_->connection_id = connection_id; | 235 embed_details_->connection_id = connection_id; |
| 236 if (embed_details_->waiting && (!result || embed_details_->connection)) | 236 if (embed_details_->waiting && (!result || embed_details_->connection)) |
| 237 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 237 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 238 } | 238 } |
| 239 | 239 |
| 240 scoped_ptr<EmbedDetails> embed_details_; | 240 scoped_ptr<EmbedDetails> embed_details_; |
| 241 | 241 |
| 242 MOJO_DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); | 242 MOJO_DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); |
| 243 }; | 243 }; |
| 244 | 244 |
| 245 TEST_F(ViewManagerTest, RootView) { | 245 TEST_F(ViewManagerTest, RootView) { |
| 246 ASSERT_NE(nullptr, window_manager()); | 246 ASSERT_NE(nullptr, window_manager()); |
| 247 EXPECT_NE(nullptr, window_manager()->GetRoot()); | 247 EXPECT_NE(nullptr, window_manager()->GetRoot()); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 TEST_F(ViewManagerTest, SetBounds) { | 299 TEST_F(ViewManagerTest, SetBounds) { |
| 300 View* view = window_manager()->CreateView(); | 300 View* view = window_manager()->CreateView(); |
| 301 view->SetVisible(true); | 301 view->SetVisible(true); |
| 302 window_manager()->GetRoot()->AddChild(view); | 302 window_manager()->GetRoot()->AddChild(view); |
| 303 ViewTreeConnection* embedded = Embed(view).connection; | 303 ViewTreeConnection* embedded = Embed(view).connection; |
| 304 ASSERT_NE(nullptr, embedded); | 304 ASSERT_NE(nullptr, embedded); |
| 305 | 305 |
| 306 View* view_in_embedded = embedded->GetViewById(view->id()); | 306 View* view_in_embedded = embedded->GetViewById(view->id()); |
| 307 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 307 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| 308 | 308 |
| 309 Rect rect; | 309 mojo::Rect rect; |
| 310 rect.width = rect.height = 100; | 310 rect.width = rect.height = 100; |
| 311 view->SetBounds(rect); | 311 view->SetBounds(rect); |
| 312 ASSERT_TRUE(WaitForBoundsToChange(view_in_embedded)); | 312 ASSERT_TRUE(WaitForBoundsToChange(view_in_embedded)); |
| 313 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 313 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| 314 } | 314 } |
| 315 | 315 |
| 316 // Verifies that bounds changes applied to a view owned by a different | 316 // Verifies that bounds changes applied to a view owned by a different |
| 317 // connection are refused. | 317 // connection are refused. |
| 318 TEST_F(ViewManagerTest, SetBoundsSecurity) { | 318 TEST_F(ViewManagerTest, SetBoundsSecurity) { |
| 319 View* view = window_manager()->CreateView(); | 319 View* view = window_manager()->CreateView(); |
| 320 view->SetVisible(true); | 320 view->SetVisible(true); |
| 321 window_manager()->GetRoot()->AddChild(view); | 321 window_manager()->GetRoot()->AddChild(view); |
| 322 ViewTreeConnection* embedded = Embed(view).connection; | 322 ViewTreeConnection* embedded = Embed(view).connection; |
| 323 ASSERT_NE(nullptr, embedded); | 323 ASSERT_NE(nullptr, embedded); |
| 324 | 324 |
| 325 View* view_in_embedded = embedded->GetViewById(view->id()); | 325 View* view_in_embedded = embedded->GetViewById(view->id()); |
| 326 Rect rect; | 326 mojo::Rect rect; |
| 327 rect.width = 800; | 327 rect.width = 800; |
| 328 rect.height = 600; | 328 rect.height = 600; |
| 329 view->SetBounds(rect); | 329 view->SetBounds(rect); |
| 330 ASSERT_TRUE(WaitForBoundsToChange(view_in_embedded)); | 330 ASSERT_TRUE(WaitForBoundsToChange(view_in_embedded)); |
| 331 | 331 |
| 332 rect.width = 1024; | 332 rect.width = 1024; |
| 333 rect.height = 768; | 333 rect.height = 768; |
| 334 view_in_embedded->SetBounds(rect); | 334 view_in_embedded->SetBounds(rect); |
| 335 // Bounds change should have been rejected. | 335 // Bounds change should have been rejected. |
| 336 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 336 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 public: | 418 public: |
| 419 explicit VisibilityChangeObserver(View* view) : view_(view) { | 419 explicit VisibilityChangeObserver(View* view) : view_(view) { |
| 420 view_->AddObserver(this); | 420 view_->AddObserver(this); |
| 421 } | 421 } |
| 422 ~VisibilityChangeObserver() override { view_->RemoveObserver(this); } | 422 ~VisibilityChangeObserver() override { view_->RemoveObserver(this); } |
| 423 | 423 |
| 424 private: | 424 private: |
| 425 // Overridden from ViewObserver: | 425 // Overridden from ViewObserver: |
| 426 void OnViewVisibilityChanged(View* view) override { | 426 void OnViewVisibilityChanged(View* view) override { |
| 427 EXPECT_EQ(view, view_); | 427 EXPECT_EQ(view, view_); |
| 428 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 428 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 429 } | 429 } |
| 430 | 430 |
| 431 View* view_; | 431 View* view_; |
| 432 | 432 |
| 433 MOJO_DISALLOW_COPY_AND_ASSIGN(VisibilityChangeObserver); | 433 MOJO_DISALLOW_COPY_AND_ASSIGN(VisibilityChangeObserver); |
| 434 }; | 434 }; |
| 435 | 435 |
| 436 } // namespace | 436 } // namespace |
| 437 | 437 |
| 438 TEST_F(ViewManagerTest, Visible) { | 438 TEST_F(ViewManagerTest, Visible) { |
| 439 View* view1 = window_manager()->CreateView(); | 439 View* view1 = window_manager()->CreateView(); |
| 440 view1->SetVisible(true); | 440 view1->SetVisible(true); |
| 441 window_manager()->GetRoot()->AddChild(view1); | 441 window_manager()->GetRoot()->AddChild(view1); |
| 442 | 442 |
| 443 // Embed another app and verify initial state. | 443 // Embed another app and verify initial state. |
| 444 ViewTreeConnection* embedded = Embed(view1).connection; | 444 ViewTreeConnection* embedded = Embed(view1).connection; |
| 445 ASSERT_NE(nullptr, embedded); | 445 ASSERT_NE(nullptr, embedded); |
| 446 ASSERT_NE(nullptr, embedded->GetRoot()); | 446 ASSERT_NE(nullptr, embedded->GetRoot()); |
| 447 View* embedded_root = embedded->GetRoot(); | 447 View* embedded_root = embedded->GetRoot(); |
| 448 EXPECT_TRUE(embedded_root->visible()); | 448 EXPECT_TRUE(embedded_root->visible()); |
| 449 EXPECT_TRUE(embedded_root->IsDrawn()); | 449 EXPECT_TRUE(embedded_root->IsDrawn()); |
| 450 | 450 |
| 451 // Change the visible state from the first connection and verify its mirrored | 451 // Change the visible state from the first connection and verify its mirrored |
| 452 // correctly to the embedded app. | 452 // correctly to the embedded app. |
| 453 { | 453 { |
| 454 VisibilityChangeObserver observer(embedded_root); | 454 VisibilityChangeObserver observer(embedded_root); |
| 455 view1->SetVisible(false); | 455 view1->SetVisible(false); |
| 456 ASSERT_TRUE(ViewManagerTestBase::DoRunLoopWithTimeout()); | 456 ASSERT_TRUE(MandolineUIServicesTestBase::DoRunLoopWithTimeout()); |
| 457 } | 457 } |
| 458 | 458 |
| 459 EXPECT_FALSE(view1->visible()); | 459 EXPECT_FALSE(view1->visible()); |
| 460 EXPECT_FALSE(view1->IsDrawn()); | 460 EXPECT_FALSE(view1->IsDrawn()); |
| 461 | 461 |
| 462 EXPECT_FALSE(embedded_root->visible()); | 462 EXPECT_FALSE(embedded_root->visible()); |
| 463 EXPECT_FALSE(embedded_root->IsDrawn()); | 463 EXPECT_FALSE(embedded_root->IsDrawn()); |
| 464 | 464 |
| 465 // Make the node visible again. | 465 // Make the node visible again. |
| 466 { | 466 { |
| 467 VisibilityChangeObserver observer(embedded_root); | 467 VisibilityChangeObserver observer(embedded_root); |
| 468 view1->SetVisible(true); | 468 view1->SetVisible(true); |
| 469 ASSERT_TRUE(ViewManagerTestBase::DoRunLoopWithTimeout()); | 469 ASSERT_TRUE(MandolineUIServicesTestBase::DoRunLoopWithTimeout()); |
| 470 } | 470 } |
| 471 | 471 |
| 472 EXPECT_TRUE(view1->visible()); | 472 EXPECT_TRUE(view1->visible()); |
| 473 EXPECT_TRUE(view1->IsDrawn()); | 473 EXPECT_TRUE(view1->IsDrawn()); |
| 474 | 474 |
| 475 EXPECT_TRUE(embedded_root->visible()); | 475 EXPECT_TRUE(embedded_root->visible()); |
| 476 EXPECT_TRUE(embedded_root->IsDrawn()); | 476 EXPECT_TRUE(embedded_root->IsDrawn()); |
| 477 } | 477 } |
| 478 | 478 |
| 479 namespace { | 479 namespace { |
| 480 | 480 |
| 481 class DrawnChangeObserver : public ViewObserver { | 481 class DrawnChangeObserver : public ViewObserver { |
| 482 public: | 482 public: |
| 483 explicit DrawnChangeObserver(View* view) : view_(view) { | 483 explicit DrawnChangeObserver(View* view) : view_(view) { |
| 484 view_->AddObserver(this); | 484 view_->AddObserver(this); |
| 485 } | 485 } |
| 486 ~DrawnChangeObserver() override { view_->RemoveObserver(this); } | 486 ~DrawnChangeObserver() override { view_->RemoveObserver(this); } |
| 487 | 487 |
| 488 private: | 488 private: |
| 489 // Overridden from ViewObserver: | 489 // Overridden from ViewObserver: |
| 490 void OnViewDrawnChanged(View* view) override { | 490 void OnViewDrawnChanged(View* view) override { |
| 491 EXPECT_EQ(view, view_); | 491 EXPECT_EQ(view, view_); |
| 492 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 492 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 493 } | 493 } |
| 494 | 494 |
| 495 View* view_; | 495 View* view_; |
| 496 | 496 |
| 497 MOJO_DISALLOW_COPY_AND_ASSIGN(DrawnChangeObserver); | 497 MOJO_DISALLOW_COPY_AND_ASSIGN(DrawnChangeObserver); |
| 498 }; | 498 }; |
| 499 | 499 |
| 500 } // namespace | 500 } // namespace |
| 501 | 501 |
| 502 TEST_F(ViewManagerTest, Drawn) { | 502 TEST_F(ViewManagerTest, Drawn) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 | 544 |
| 545 View* last_lost_focus() { return last_lost_focus_; } | 545 View* last_lost_focus() { return last_lost_focus_; } |
| 546 | 546 |
| 547 private: | 547 private: |
| 548 // Overridden from ViewObserver. | 548 // Overridden from ViewObserver. |
| 549 void OnViewFocusChanged(View* gained_focus, View* lost_focus) override { | 549 void OnViewFocusChanged(View* gained_focus, View* lost_focus) override { |
| 550 EXPECT_TRUE(!gained_focus || gained_focus->HasFocus()); | 550 EXPECT_TRUE(!gained_focus || gained_focus->HasFocus()); |
| 551 EXPECT_FALSE(lost_focus && lost_focus->HasFocus()); | 551 EXPECT_FALSE(lost_focus && lost_focus->HasFocus()); |
| 552 last_gained_focus_ = gained_focus; | 552 last_gained_focus_ = gained_focus; |
| 553 last_lost_focus_ = lost_focus; | 553 last_lost_focus_ = lost_focus; |
| 554 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 554 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 555 } | 555 } |
| 556 | 556 |
| 557 View* view_; | 557 View* view_; |
| 558 View* last_gained_focus_; | 558 View* last_gained_focus_; |
| 559 View* last_lost_focus_; | 559 View* last_lost_focus_; |
| 560 | 560 |
| 561 MOJO_DISALLOW_COPY_AND_ASSIGN(FocusChangeObserver); | 561 MOJO_DISALLOW_COPY_AND_ASSIGN(FocusChangeObserver); |
| 562 }; | 562 }; |
| 563 | 563 |
| 564 } // namespace | 564 } // namespace |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 ASSERT_NE(nullptr, observer.last_lost_focus()); | 603 ASSERT_NE(nullptr, observer.last_lost_focus()); |
| 604 EXPECT_EQ(view11->id(), observer.last_lost_focus()->id()); | 604 EXPECT_EQ(view11->id(), observer.last_lost_focus()->id()); |
| 605 EXPECT_EQ(embedded->GetRoot()->id(), observer.last_gained_focus()->id()); | 605 EXPECT_EQ(embedded->GetRoot()->id(), observer.last_gained_focus()->id()); |
| 606 } | 606 } |
| 607 } | 607 } |
| 608 | 608 |
| 609 namespace { | 609 namespace { |
| 610 | 610 |
| 611 class DestroyedChangedObserver : public ViewObserver { | 611 class DestroyedChangedObserver : public ViewObserver { |
| 612 public: | 612 public: |
| 613 DestroyedChangedObserver(ViewManagerTestBase* test, | 613 DestroyedChangedObserver(MandolineUIServicesTestBase* test, |
| 614 View* view, | 614 View* view, |
| 615 bool* got_destroy) | 615 bool* got_destroy) |
| 616 : test_(test), view_(view), got_destroy_(got_destroy) { | 616 : test_(test), view_(view), got_destroy_(got_destroy) { |
| 617 view_->AddObserver(this); | 617 view_->AddObserver(this); |
| 618 } | 618 } |
| 619 ~DestroyedChangedObserver() override { | 619 ~DestroyedChangedObserver() override { |
| 620 if (view_) | 620 if (view_) |
| 621 view_->RemoveObserver(this); | 621 view_->RemoveObserver(this); |
| 622 } | 622 } |
| 623 | 623 |
| 624 private: | 624 private: |
| 625 // Overridden from ViewObserver: | 625 // Overridden from ViewObserver: |
| 626 void OnViewDestroyed(View* view) override { | 626 void OnViewDestroyed(View* view) override { |
| 627 EXPECT_EQ(view, view_); | 627 EXPECT_EQ(view, view_); |
| 628 view_->RemoveObserver(this); | 628 view_->RemoveObserver(this); |
| 629 *got_destroy_ = true; | 629 *got_destroy_ = true; |
| 630 view_ = nullptr; | 630 view_ = nullptr; |
| 631 | 631 |
| 632 // We should always get OnViewDestroyed() before OnConnectionLost(). | 632 // We should always get OnViewDestroyed() before OnConnectionLost(). |
| 633 EXPECT_FALSE(test_->view_tree_connection_destroyed()); | 633 EXPECT_FALSE(test_->view_tree_connection_destroyed()); |
| 634 } | 634 } |
| 635 | 635 |
| 636 ViewManagerTestBase* test_; | 636 MandolineUIServicesTestBase* test_; |
| 637 View* view_; | 637 View* view_; |
| 638 bool* got_destroy_; | 638 bool* got_destroy_; |
| 639 | 639 |
| 640 MOJO_DISALLOW_COPY_AND_ASSIGN(DestroyedChangedObserver); | 640 MOJO_DISALLOW_COPY_AND_ASSIGN(DestroyedChangedObserver); |
| 641 }; | 641 }; |
| 642 | 642 |
| 643 } // namespace | 643 } // namespace |
| 644 | 644 |
| 645 // Verifies deleting a ViewManager sends the right notifications. | 645 // Verifies deleting a ViewManager sends the right notifications. |
| 646 TEST_F(ViewManagerTest, DeleteViewManager) { | 646 TEST_F(ViewManagerTest, DeleteViewManager) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 // Run the message loop so the Embed() call above completes. Without this | 713 // Run the message loop so the Embed() call above completes. Without this |
| 714 // we may end up reconnecting to the test and rerunning the test, which is | 714 // we may end up reconnecting to the test and rerunning the test, which is |
| 715 // problematic since the other services don't shut down. | 715 // problematic since the other services don't shut down. |
| 716 ASSERT_TRUE(DoRunLoopWithTimeout()); | 716 ASSERT_TRUE(DoRunLoopWithTimeout()); |
| 717 } | 717 } |
| 718 | 718 |
| 719 namespace { | 719 namespace { |
| 720 | 720 |
| 721 class DestroyObserver : public ViewObserver { | 721 class DestroyObserver : public ViewObserver { |
| 722 public: | 722 public: |
| 723 DestroyObserver(ViewManagerTestBase* test, | 723 DestroyObserver(MandolineUIServicesTestBase* test, |
| 724 ViewTreeConnection* connection, | 724 ViewTreeConnection* connection, |
| 725 bool* got_destroy) | 725 bool* got_destroy) |
| 726 : test_(test), got_destroy_(got_destroy) { | 726 : test_(test), got_destroy_(got_destroy) { |
| 727 connection->GetRoot()->AddObserver(this); | 727 connection->GetRoot()->AddObserver(this); |
| 728 } | 728 } |
| 729 ~DestroyObserver() override {} | 729 ~DestroyObserver() override {} |
| 730 | 730 |
| 731 private: | 731 private: |
| 732 // Overridden from ViewObserver: | 732 // Overridden from ViewObserver: |
| 733 void OnViewDestroyed(View* view) override { | 733 void OnViewDestroyed(View* view) override { |
| 734 *got_destroy_ = true; | 734 *got_destroy_ = true; |
| 735 view->RemoveObserver(this); | 735 view->RemoveObserver(this); |
| 736 | 736 |
| 737 // We should always get OnViewDestroyed() before OnViewManagerDestroyed(). | 737 // We should always get OnViewDestroyed() before OnViewManagerDestroyed(). |
| 738 EXPECT_FALSE(test_->view_tree_connection_destroyed()); | 738 EXPECT_FALSE(test_->view_tree_connection_destroyed()); |
| 739 | 739 |
| 740 EXPECT_TRUE(ViewManagerTestBase::QuitRunLoop()); | 740 EXPECT_TRUE(MandolineUIServicesTestBase::QuitRunLoop()); |
| 741 } | 741 } |
| 742 | 742 |
| 743 ViewManagerTestBase* test_; | 743 MandolineUIServicesTestBase* test_; |
| 744 bool* got_destroy_; | 744 bool* got_destroy_; |
| 745 | 745 |
| 746 MOJO_DISALLOW_COPY_AND_ASSIGN(DestroyObserver); | 746 MOJO_DISALLOW_COPY_AND_ASSIGN(DestroyObserver); |
| 747 }; | 747 }; |
| 748 | 748 |
| 749 } // namespace | 749 } // namespace |
| 750 | 750 |
| 751 // Verifies deleting a View that is the root of another connection notifies | 751 // Verifies deleting a View that is the root of another connection notifies |
| 752 // observers in the right order (OnViewDestroyed() before | 752 // observers in the right order (OnViewDestroyed() before |
| 753 // OnViewManagerDestroyed()). | 753 // OnViewManagerDestroyed()). |
| (...skipping 11 matching lines...) Expand all Loading... |
| 765 EXPECT_TRUE(DoRunLoopWithTimeout()); | 765 EXPECT_TRUE(DoRunLoopWithTimeout()); |
| 766 EXPECT_TRUE(got_destroy); | 766 EXPECT_TRUE(got_destroy); |
| 767 } | 767 } |
| 768 | 768 |
| 769 // Verifies an embed root sees views created beneath it from another | 769 // Verifies an embed root sees views created beneath it from another |
| 770 // connection. | 770 // connection. |
| 771 TEST_F(ViewManagerTest, EmbedRootSeesHierarchyChanged) { | 771 TEST_F(ViewManagerTest, EmbedRootSeesHierarchyChanged) { |
| 772 View* embed_view = window_manager()->CreateView(); | 772 View* embed_view = window_manager()->CreateView(); |
| 773 window_manager()->GetRoot()->AddChild(embed_view); | 773 window_manager()->GetRoot()->AddChild(embed_view); |
| 774 | 774 |
| 775 embed_view->SetAccessPolicy(ViewTree::ACCESS_POLICY_EMBED_ROOT); | 775 embed_view->SetAccessPolicy(mojo::ViewTree::ACCESS_POLICY_EMBED_ROOT); |
| 776 ViewTreeConnection* vm2 = Embed(embed_view).connection; | 776 ViewTreeConnection* vm2 = Embed(embed_view).connection; |
| 777 View* vm2_v1 = vm2->CreateView(); | 777 View* vm2_v1 = vm2->CreateView(); |
| 778 vm2->GetRoot()->AddChild(vm2_v1); | 778 vm2->GetRoot()->AddChild(vm2_v1); |
| 779 | 779 |
| 780 ViewTreeConnection* vm3 = Embed(vm2_v1).connection; | 780 ViewTreeConnection* vm3 = Embed(vm2_v1).connection; |
| 781 View* vm3_v1 = vm3->CreateView(); | 781 View* vm3_v1 = vm3->CreateView(); |
| 782 vm3->GetRoot()->AddChild(vm3_v1); | 782 vm3->GetRoot()->AddChild(vm3_v1); |
| 783 | 783 |
| 784 // As |vm2| is an embed root it should get notified about |vm3_v1|. | 784 // As |vm2| is an embed root it should get notified about |vm3_v1|. |
| 785 ASSERT_TRUE(WaitForTreeSizeToMatch(vm2_v1, 2)); | 785 ASSERT_TRUE(WaitForTreeSizeToMatch(vm2_v1, 2)); |
| 786 } | 786 } |
| 787 | 787 |
| 788 TEST_F(ViewManagerTest, EmbedFromEmbedRoot) { | 788 TEST_F(ViewManagerTest, EmbedFromEmbedRoot) { |
| 789 View* embed_view = window_manager()->CreateView(); | 789 View* embed_view = window_manager()->CreateView(); |
| 790 window_manager()->GetRoot()->AddChild(embed_view); | 790 window_manager()->GetRoot()->AddChild(embed_view); |
| 791 | 791 |
| 792 // Give the connection embedded at |embed_view| embed root powers. | 792 // Give the connection embedded at |embed_view| embed root powers. |
| 793 embed_view->SetAccessPolicy(ViewTree::ACCESS_POLICY_EMBED_ROOT); | 793 embed_view->SetAccessPolicy(mojo::ViewTree::ACCESS_POLICY_EMBED_ROOT); |
| 794 const EmbedResult result1 = Embed(embed_view); | 794 const EmbedResult result1 = Embed(embed_view); |
| 795 ViewTreeConnection* vm2 = result1.connection; | 795 ViewTreeConnection* vm2 = result1.connection; |
| 796 EXPECT_EQ(result1.connection_id, vm2->GetConnectionId()); | 796 EXPECT_EQ(result1.connection_id, vm2->GetConnectionId()); |
| 797 View* vm2_v1 = vm2->CreateView(); | 797 View* vm2_v1 = vm2->CreateView(); |
| 798 vm2->GetRoot()->AddChild(vm2_v1); | 798 vm2->GetRoot()->AddChild(vm2_v1); |
| 799 | 799 |
| 800 const EmbedResult result2 = Embed(vm2_v1); | 800 const EmbedResult result2 = Embed(vm2_v1); |
| 801 ViewTreeConnection* vm3 = result2.connection; | 801 ViewTreeConnection* vm3 = result2.connection; |
| 802 EXPECT_EQ(result2.connection_id, vm3->GetConnectionId()); | 802 EXPECT_EQ(result2.connection_id, vm3->GetConnectionId()); |
| 803 View* vm3_v1 = vm3->CreateView(); | 803 View* vm3_v1 = vm3->CreateView(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 814 | 814 |
| 815 // Embed() from vm2 in vm3_v1. This is allowed as vm2 is an embed root, and | 815 // Embed() from vm2 in vm3_v1. This is allowed as vm2 is an embed root, and |
| 816 // further the callback should see the connection id. | 816 // further the callback should see the connection id. |
| 817 ASSERT_EQ(1u, vm2_v1->children().size()); | 817 ASSERT_EQ(1u, vm2_v1->children().size()); |
| 818 View* vm3_v1_in_vm2 = vm2_v1->children()[0]; | 818 View* vm3_v1_in_vm2 = vm2_v1->children()[0]; |
| 819 const EmbedResult result4 = Embed(vm3_v1_in_vm2); | 819 const EmbedResult result4 = Embed(vm3_v1_in_vm2); |
| 820 ASSERT_TRUE(result4.connection); | 820 ASSERT_TRUE(result4.connection); |
| 821 EXPECT_EQ(result4.connection_id, result4.connection->GetConnectionId()); | 821 EXPECT_EQ(result4.connection_id, result4.connection->GetConnectionId()); |
| 822 } | 822 } |
| 823 | 823 |
| 824 } // namespace mojo | 824 } // namespace mus |
| OLD | NEW |