| 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 "mojo/services/public/cpp/view_manager/view_manager.h" | 5 #include "mojo/services/public/cpp/view_manager/view_manager.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "mojo/application_manager/application_manager.h" | 10 #include "mojo/application_manager/application_manager.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 loaded_view_manager_(NULL), | 270 loaded_view_manager_(NULL), |
| 271 window_manager_(NULL), | 271 window_manager_(NULL), |
| 272 commit_count_(0) {} | 272 commit_count_(0) {} |
| 273 | 273 |
| 274 protected: | 274 protected: |
| 275 ViewManager* window_manager() { return window_manager_; } | 275 ViewManager* window_manager() { return window_manager_; } |
| 276 | 276 |
| 277 View* CreateViewInParent(View* parent) { | 277 View* CreateViewInParent(View* parent) { |
| 278 ViewManager* parent_manager = ViewPrivate(parent).view_manager(); | 278 ViewManager* parent_manager = ViewPrivate(parent).view_manager(); |
| 279 View* view = View::Create(parent_manager); | 279 View* view = View::Create(parent_manager); |
| 280 view->SetVisible(true); |
| 280 parent->AddChild(view); | 281 parent->AddChild(view); |
| 281 return view; | 282 return view; |
| 282 } | 283 } |
| 283 | 284 |
| 284 // Embeds another version of the test app @ view. | 285 // Embeds another version of the test app @ view. |
| 285 ViewManager* Embed(ViewManager* view_manager, View* view) { | 286 ViewManager* Embed(ViewManager* view_manager, View* view) { |
| 286 DCHECK_EQ(view_manager, ViewPrivate(view).view_manager()); | 287 DCHECK_EQ(view_manager, ViewPrivate(view).view_manager()); |
| 287 view->Embed(kEmbeddedApp1URL); | 288 view->Embed(kEmbeddedApp1URL); |
| 288 RunRunLoop(); | 289 RunRunLoop(); |
| 289 return GetLoadedViewManager(); | 290 return GetLoadedViewManager(); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); | 342 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); |
| 342 }; | 343 }; |
| 343 | 344 |
| 344 // TODO(sky): all of these tests are disabled as each test triggers running | 345 // TODO(sky): all of these tests are disabled as each test triggers running |
| 345 // ViewsInit, which tries to register the same set of paths with the | 346 // ViewsInit, which tries to register the same set of paths with the |
| 346 // PathService, triggering a DCHECK. | 347 // PathService, triggering a DCHECK. |
| 347 TEST_F(ViewManagerTest, DISABLED_SetUp) {} | 348 TEST_F(ViewManagerTest, DISABLED_SetUp) {} |
| 348 | 349 |
| 349 TEST_F(ViewManagerTest, DISABLED_Embed) { | 350 TEST_F(ViewManagerTest, DISABLED_Embed) { |
| 350 View* view = View::Create(window_manager()); | 351 View* view = View::Create(window_manager()); |
| 352 view->SetVisible(true); |
| 351 window_manager()->GetRoots().front()->AddChild(view); | 353 window_manager()->GetRoots().front()->AddChild(view); |
| 352 ViewManager* embedded = Embed(window_manager(), view); | 354 ViewManager* embedded = Embed(window_manager(), view); |
| 353 EXPECT_TRUE(NULL != embedded); | 355 EXPECT_TRUE(NULL != embedded); |
| 354 | 356 |
| 355 View* view_in_embedded = embedded->GetRoots().front(); | 357 View* view_in_embedded = embedded->GetRoots().front(); |
| 356 EXPECT_EQ(view->parent(), window_manager()->GetRoots().front()); | 358 EXPECT_EQ(view->parent(), window_manager()->GetRoots().front()); |
| 357 EXPECT_EQ(NULL, view_in_embedded->parent()); | 359 EXPECT_EQ(NULL, view_in_embedded->parent()); |
| 358 } | 360 } |
| 359 | 361 |
| 360 // Window manager has two views, N1 and N11. Embeds A at N1. A should not see | 362 // Window manager has two views, N1 and N11. Embeds A at N1. A should not see |
| 361 // N11. | 363 // N11. |
| 362 // TODO(sky): Update client lib to match server. | 364 // TODO(sky): Update client lib to match server. |
| 363 TEST_F(ViewManagerTest, DISABLED_EmbeddedDoesntSeeChild) { | 365 TEST_F(ViewManagerTest, DISABLED_EmbeddedDoesntSeeChild) { |
| 364 View* view = View::Create(window_manager()); | 366 View* view = View::Create(window_manager()); |
| 367 view->SetVisible(true); |
| 365 window_manager()->GetRoots().front()->AddChild(view); | 368 window_manager()->GetRoots().front()->AddChild(view); |
| 366 View* nested = View::Create(window_manager()); | 369 View* nested = View::Create(window_manager()); |
| 370 nested->SetVisible(true); |
| 367 view->AddChild(nested); | 371 view->AddChild(nested); |
| 368 | 372 |
| 369 ViewManager* embedded = Embed(window_manager(), view); | 373 ViewManager* embedded = Embed(window_manager(), view); |
| 370 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), | 374 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), |
| 371 nested->id()); | 375 nested->id()); |
| 372 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); | 376 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); |
| 373 EXPECT_TRUE(nested->parent() == NULL); | 377 EXPECT_TRUE(nested->parent() == NULL); |
| 374 } | 378 } |
| 375 | 379 |
| 376 // http://crbug.com/396300 | 380 // http://crbug.com/396300 |
| 377 TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupView) { | 381 TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupView) { |
| 378 View* view = View::Create(window_manager()); | 382 View* view = View::Create(window_manager()); |
| 383 view->SetVisible(true); |
| 379 window_manager()->GetRoots().front()->AddChild(view); | 384 window_manager()->GetRoots().front()->AddChild(view); |
| 380 ViewManager* embedded = Embed(window_manager(), view); | 385 ViewManager* embedded = Embed(window_manager(), view); |
| 381 | 386 |
| 382 Id view_id = view->id(); | 387 Id view_id = view->id(); |
| 383 | 388 |
| 384 UnloadApplication(GURL(kWindowManagerURL)); | 389 UnloadApplication(GURL(kWindowManagerURL)); |
| 385 | 390 |
| 386 std::set<Id> views; | 391 std::set<Id> views; |
| 387 views.insert(view_id); | 392 views.insert(view_id); |
| 388 WaitForDestruction(embedded, &views); | 393 WaitForDestruction(embedded, &views); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 399 // should be disconnected from any views. | 404 // should be disconnected from any views. |
| 400 // http://crbug.com/396300 | 405 // http://crbug.com/396300 |
| 401 // | 406 // |
| 402 // TODO(beng): The new test should validate the scenario as described above | 407 // TODO(beng): The new test should validate the scenario as described above |
| 403 // except that the second connection still has a valid tree. | 408 // except that the second connection still has a valid tree. |
| 404 | 409 |
| 405 // Verifies that bounds changes applied to a view hierarchy in one connection | 410 // Verifies that bounds changes applied to a view hierarchy in one connection |
| 406 // are reflected to another. | 411 // are reflected to another. |
| 407 TEST_F(ViewManagerTest, DISABLED_SetBounds) { | 412 TEST_F(ViewManagerTest, DISABLED_SetBounds) { |
| 408 View* view = View::Create(window_manager()); | 413 View* view = View::Create(window_manager()); |
| 414 view->SetVisible(true); |
| 409 window_manager()->GetRoots().front()->AddChild(view); | 415 window_manager()->GetRoots().front()->AddChild(view); |
| 410 ViewManager* embedded = Embed(window_manager(), view); | 416 ViewManager* embedded = Embed(window_manager(), view); |
| 411 | 417 |
| 412 View* view_in_embedded = embedded->GetViewById(view->id()); | 418 View* view_in_embedded = embedded->GetViewById(view->id()); |
| 413 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 419 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| 414 | 420 |
| 415 Rect rect; | 421 Rect rect; |
| 416 rect.width = rect.height = 100; | 422 rect.width = rect.height = 100; |
| 417 view->SetBounds(rect); | 423 view->SetBounds(rect); |
| 418 EXPECT_NE(view->bounds(), view_in_embedded->bounds()); | 424 EXPECT_NE(view->bounds(), view_in_embedded->bounds()); |
| 419 WaitForBoundsToChange(view_in_embedded); | 425 WaitForBoundsToChange(view_in_embedded); |
| 420 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 426 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| 421 } | 427 } |
| 422 | 428 |
| 423 // Verifies that bounds changes applied to a view owned by a different | 429 // Verifies that bounds changes applied to a view owned by a different |
| 424 // connection are refused. | 430 // connection are refused. |
| 425 TEST_F(ViewManagerTest, DISABLED_SetBoundsSecurity) { | 431 TEST_F(ViewManagerTest, DISABLED_SetBoundsSecurity) { |
| 426 View* view = View::Create(window_manager()); | 432 View* view = View::Create(window_manager()); |
| 433 view->SetVisible(true); |
| 427 window_manager()->GetRoots().front()->AddChild(view); | 434 window_manager()->GetRoots().front()->AddChild(view); |
| 428 ViewManager* embedded = Embed(window_manager(), view); | 435 ViewManager* embedded = Embed(window_manager(), view); |
| 429 | 436 |
| 430 View* view_in_embedded = embedded->GetViewById(view->id()); | 437 View* view_in_embedded = embedded->GetViewById(view->id()); |
| 431 Rect rect; | 438 Rect rect; |
| 432 rect.width = 800; | 439 rect.width = 800; |
| 433 rect.height = 600; | 440 rect.height = 600; |
| 434 view->SetBounds(rect); | 441 view->SetBounds(rect); |
| 435 WaitForBoundsToChange(view_in_embedded); | 442 WaitForBoundsToChange(view_in_embedded); |
| 436 | 443 |
| 437 rect.width = 1024; | 444 rect.width = 1024; |
| 438 rect.height = 768; | 445 rect.height = 768; |
| 439 view_in_embedded->SetBounds(rect); | 446 view_in_embedded->SetBounds(rect); |
| 440 // Bounds change should have been rejected. | 447 // Bounds change should have been rejected. |
| 441 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); | 448 EXPECT_EQ(view->bounds(), view_in_embedded->bounds()); |
| 442 } | 449 } |
| 443 | 450 |
| 444 // Verifies that a view can only be destroyed by the connection that created it. | 451 // Verifies that a view can only be destroyed by the connection that created it. |
| 445 TEST_F(ViewManagerTest, DISABLED_DestroySecurity) { | 452 TEST_F(ViewManagerTest, DISABLED_DestroySecurity) { |
| 446 View* view = View::Create(window_manager()); | 453 View* view = View::Create(window_manager()); |
| 454 view->SetVisible(true); |
| 447 window_manager()->GetRoots().front()->AddChild(view); | 455 window_manager()->GetRoots().front()->AddChild(view); |
| 448 ViewManager* embedded = Embed(window_manager(), view); | 456 ViewManager* embedded = Embed(window_manager(), view); |
| 449 | 457 |
| 450 View* view_in_embedded = embedded->GetViewById(view->id()); | 458 View* view_in_embedded = embedded->GetViewById(view->id()); |
| 451 | 459 |
| 452 ViewTracker tracker2(view_in_embedded); | 460 ViewTracker tracker2(view_in_embedded); |
| 453 view_in_embedded->Destroy(); | 461 view_in_embedded->Destroy(); |
| 454 // View should not have been destroyed. | 462 // View should not have been destroyed. |
| 455 EXPECT_TRUE(tracker2.is_valid()); | 463 EXPECT_TRUE(tracker2.is_valid()); |
| 456 | 464 |
| 457 ViewTracker tracker1(view); | 465 ViewTracker tracker1(view); |
| 458 view->Destroy(); | 466 view->Destroy(); |
| 459 EXPECT_FALSE(tracker1.is_valid()); | 467 EXPECT_FALSE(tracker1.is_valid()); |
| 460 } | 468 } |
| 461 | 469 |
| 462 TEST_F(ViewManagerTest, DISABLED_MultiRoots) { | 470 TEST_F(ViewManagerTest, DISABLED_MultiRoots) { |
| 463 View* view1 = View::Create(window_manager()); | 471 View* view1 = View::Create(window_manager()); |
| 472 view1->SetVisible(true); |
| 464 window_manager()->GetRoots().front()->AddChild(view1); | 473 window_manager()->GetRoots().front()->AddChild(view1); |
| 465 View* view2 = View::Create(window_manager()); | 474 View* view2 = View::Create(window_manager()); |
| 475 view2->SetVisible(true); |
| 466 window_manager()->GetRoots().front()->AddChild(view2); | 476 window_manager()->GetRoots().front()->AddChild(view2); |
| 467 ViewManager* embedded1 = Embed(window_manager(), view1); | 477 ViewManager* embedded1 = Embed(window_manager(), view1); |
| 468 ViewManager* embedded2 = Embed(window_manager(), view2); | 478 ViewManager* embedded2 = Embed(window_manager(), view2); |
| 469 EXPECT_EQ(embedded1, embedded2); | 479 EXPECT_EQ(embedded1, embedded2); |
| 470 } | 480 } |
| 471 | 481 |
| 472 TEST_F(ViewManagerTest, DISABLED_EmbeddingIdentity) { | 482 TEST_F(ViewManagerTest, DISABLED_EmbeddingIdentity) { |
| 473 View* view = View::Create(window_manager()); | 483 View* view = View::Create(window_manager()); |
| 484 view->SetVisible(true); |
| 474 window_manager()->GetRoots().front()->AddChild(view); | 485 window_manager()->GetRoots().front()->AddChild(view); |
| 475 ViewManager* embedded = Embed(window_manager(), view); | 486 ViewManager* embedded = Embed(window_manager(), view); |
| 476 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); | 487 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); |
| 477 } | 488 } |
| 478 | 489 |
| 479 TEST_F(ViewManagerTest, DISABLED_Reorder) { | 490 TEST_F(ViewManagerTest, DISABLED_Reorder) { |
| 480 View* view1 = View::Create(window_manager()); | 491 View* view1 = View::Create(window_manager()); |
| 492 view1->SetVisible(true); |
| 481 window_manager()->GetRoots().front()->AddChild(view1); | 493 window_manager()->GetRoots().front()->AddChild(view1); |
| 482 | 494 |
| 483 ViewManager* embedded = Embed(window_manager(), view1); | 495 ViewManager* embedded = Embed(window_manager(), view1); |
| 484 | 496 |
| 485 View* view11 = View::Create(embedded); | 497 View* view11 = View::Create(embedded); |
| 498 view11->SetVisible(true); |
| 486 embedded->GetRoots().front()->AddChild(view11); | 499 embedded->GetRoots().front()->AddChild(view11); |
| 487 View* view12 = View::Create(embedded); | 500 View* view12 = View::Create(embedded); |
| 501 view12->SetVisible(true); |
| 488 embedded->GetRoots().front()->AddChild(view12); | 502 embedded->GetRoots().front()->AddChild(view12); |
| 489 | 503 |
| 490 View* view1_in_wm = window_manager()->GetViewById(view1->id()); | 504 View* view1_in_wm = window_manager()->GetViewById(view1->id()); |
| 491 | 505 |
| 492 { | 506 { |
| 493 WaitForTreeSizeToMatch(view1, 2u); | 507 WaitForTreeSizeToMatch(view1, 2u); |
| 494 view11->MoveToFront(); | 508 view11->MoveToFront(); |
| 495 WaitForOrderChange(window_manager(), | 509 WaitForOrderChange(window_manager(), |
| 496 window_manager()->GetViewById(view11->id())); | 510 window_manager()->GetViewById(view11->id())); |
| 497 | 511 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 | 545 |
| 532 View* view_; | 546 View* view_; |
| 533 | 547 |
| 534 DISALLOW_COPY_AND_ASSIGN(VisibilityChangeObserver); | 548 DISALLOW_COPY_AND_ASSIGN(VisibilityChangeObserver); |
| 535 }; | 549 }; |
| 536 | 550 |
| 537 } // namespace | 551 } // namespace |
| 538 | 552 |
| 539 TEST_F(ViewManagerTest, DISABLED_Visible) { | 553 TEST_F(ViewManagerTest, DISABLED_Visible) { |
| 540 View* view1 = View::Create(window_manager()); | 554 View* view1 = View::Create(window_manager()); |
| 555 view1->SetVisible(true); |
| 541 window_manager()->GetRoots().front()->AddChild(view1); | 556 window_manager()->GetRoots().front()->AddChild(view1); |
| 542 | 557 |
| 543 // Embed another app and verify initial state. | 558 // Embed another app and verify initial state. |
| 544 ViewManager* embedded = Embed(window_manager(), view1); | 559 ViewManager* embedded = Embed(window_manager(), view1); |
| 545 ASSERT_EQ(1u, embedded->GetRoots().size()); | 560 ASSERT_EQ(1u, embedded->GetRoots().size()); |
| 546 View* embedded_root = embedded->GetRoots().front(); | 561 View* embedded_root = embedded->GetRoots().front(); |
| 547 EXPECT_TRUE(embedded_root->visible()); | 562 EXPECT_TRUE(embedded_root->visible()); |
| 548 EXPECT_TRUE(embedded_root->IsDrawn()); | 563 EXPECT_TRUE(embedded_root->IsDrawn()); |
| 549 | 564 |
| 550 // Change the visible state from the first connection and verify its mirrored | 565 // Change the visible state from the first connection and verify its mirrored |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 | 608 |
| 594 View* view_; | 609 View* view_; |
| 595 | 610 |
| 596 DISALLOW_COPY_AND_ASSIGN(DrawnChangeObserver); | 611 DISALLOW_COPY_AND_ASSIGN(DrawnChangeObserver); |
| 597 }; | 612 }; |
| 598 | 613 |
| 599 } // namespace | 614 } // namespace |
| 600 | 615 |
| 601 TEST_F(ViewManagerTest, DISABLED_Drawn) { | 616 TEST_F(ViewManagerTest, DISABLED_Drawn) { |
| 602 View* view1 = View::Create(window_manager()); | 617 View* view1 = View::Create(window_manager()); |
| 618 view1->SetVisible(true); |
| 603 window_manager()->GetRoots().front()->AddChild(view1); | 619 window_manager()->GetRoots().front()->AddChild(view1); |
| 604 | 620 |
| 605 // Embed another app and verify initial state. | 621 // Embed another app and verify initial state. |
| 606 ViewManager* embedded = Embed(window_manager(), view1); | 622 ViewManager* embedded = Embed(window_manager(), view1); |
| 607 ASSERT_EQ(1u, embedded->GetRoots().size()); | 623 ASSERT_EQ(1u, embedded->GetRoots().size()); |
| 608 View* embedded_root = embedded->GetRoots().front(); | 624 View* embedded_root = embedded->GetRoots().front(); |
| 609 EXPECT_TRUE(embedded_root->visible()); | 625 EXPECT_TRUE(embedded_root->visible()); |
| 610 EXPECT_TRUE(embedded_root->IsDrawn()); | 626 EXPECT_TRUE(embedded_root->IsDrawn()); |
| 611 | 627 |
| 612 // Change the visibility of the root, this should propagate a drawn state | 628 // Change the visibility of the root, this should propagate a drawn state |
| (...skipping 16 matching lines...) Expand all Loading... |
| 629 | 645 |
| 630 // TODO(beng): tests for focus: | 646 // TODO(beng): tests for focus: |
| 631 // - focus between two views known to a connection | 647 // - focus between two views known to a connection |
| 632 // - focus between views unknown to one of the connections. | 648 // - focus between views unknown to one of the connections. |
| 633 // - focus between views unknown to either connection. | 649 // - focus between views unknown to either connection. |
| 634 | 650 |
| 635 // TODO(sky): need test of root being destroyed with existing views. See | 651 // TODO(sky): need test of root being destroyed with existing views. See |
| 636 // 434555 for specific case. | 652 // 434555 for specific case. |
| 637 | 653 |
| 638 } // namespace mojo | 654 } // namespace mojo |
| OLD | NEW |