| 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 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "apps/app_lifetime_monitor_factory.h" | 8 #include "apps/app_lifetime_monitor_factory.h" |
| 9 #include "apps/switches.h" | 9 #include "apps/switches.h" |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "chrome/browser/ui/browser_list.h" | 28 #include "chrome/browser/ui/browser_list.h" |
| 29 #include "chrome/browser/ui/browser_window.h" | 29 #include "chrome/browser/ui/browser_window.h" |
| 30 #include "chrome/browser/web_applications/web_app_mac.h" | 30 #include "chrome/browser/web_applications/web_app_mac.h" |
| 31 #include "chrome/common/chrome_paths.h" | 31 #include "chrome/common/chrome_paths.h" |
| 32 #include "chrome/common/chrome_switches.h" | 32 #include "chrome/common/chrome_switches.h" |
| 33 #include "chrome/common/mac/app_mode_common.h" | 33 #include "chrome/common/mac/app_mode_common.h" |
| 34 #include "content/public/test/test_utils.h" | 34 #include "content/public/test/test_utils.h" |
| 35 #include "extensions/browser/app_window/native_app_window.h" | 35 #include "extensions/browser/app_window/native_app_window.h" |
| 36 #include "extensions/browser/extension_prefs.h" | 36 #include "extensions/browser/extension_prefs.h" |
| 37 #include "extensions/test/extension_test_message_listener.h" | 37 #include "extensions/test/extension_test_message_listener.h" |
| 38 #import "ui/base/test/windowed_nsnotification_observer.h" |
| 38 #import "ui/events/test/cocoa_test_event_utils.h" | 39 #import "ui/events/test/cocoa_test_event_utils.h" |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| 41 | 42 |
| 42 // General end-to-end test for app shims. | 43 // General end-to-end test for app shims. |
| 43 class AppShimInteractiveTest : public extensions::PlatformAppBrowserTest { | 44 class AppShimInteractiveTest : public extensions::PlatformAppBrowserTest { |
| 44 protected: | 45 protected: |
| 45 AppShimInteractiveTest() | 46 AppShimInteractiveTest() |
| 46 : auto_reset_(&g_app_shims_allow_update_and_launch_in_tests, true) {} | 47 : auto_reset_(&g_app_shims_allow_update_and_launch_in_tests, true) {} |
| 47 | 48 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 const extensions::Extension* extension = | 295 const extensions::Extension* extension = |
| 295 apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser); | 296 apps::ExtensionAppShimHandler::MaybeGetAppForBrowser(browser); |
| 296 if (extension && extension->is_hosted_app()) | 297 if (extension && extension->is_hosted_app()) |
| 297 return browser; | 298 return browser; |
| 298 } | 299 } |
| 299 return nullptr; | 300 return nullptr; |
| 300 } | 301 } |
| 301 | 302 |
| 302 } // namespace | 303 } // namespace |
| 303 | 304 |
| 304 // Watches for NSNotifications from the shared workspace. | |
| 305 @interface WindowedNSNotificationObserver : NSObject { | |
| 306 @private | |
| 307 base::scoped_nsobject<NSString> bundleId_; | |
| 308 BOOL notificationReceived_; | |
| 309 scoped_ptr<base::RunLoop> runLoop_; | |
| 310 } | |
| 311 | |
| 312 - (id)initForNotification:(NSString*)name | |
| 313 andBundleId:(NSString*)bundleId; | |
| 314 - (void)observe:(NSNotification*)notification; | |
| 315 - (void)wait; | |
| 316 @end | |
| 317 | |
| 318 @implementation WindowedNSNotificationObserver | |
| 319 | |
| 320 - (id)initForNotification:(NSString*)name | |
| 321 andBundleId:(NSString*)bundleId { | |
| 322 if (self = [super init]) { | |
| 323 bundleId_.reset([[bundleId copy] retain]); | |
| 324 [[[NSWorkspace sharedWorkspace] notificationCenter] | |
| 325 addObserver:self | |
| 326 selector:@selector(observe:) | |
| 327 name:name | |
| 328 object:nil]; | |
| 329 } | |
| 330 return self; | |
| 331 } | |
| 332 | |
| 333 - (void)observe:(NSNotification*)notification { | |
| 334 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 335 | |
| 336 NSRunningApplication* application = | |
| 337 [[notification userInfo] objectForKey:NSWorkspaceApplicationKey]; | |
| 338 if (![[application bundleIdentifier] isEqualToString:bundleId_]) | |
| 339 return; | |
| 340 | |
| 341 [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; | |
| 342 notificationReceived_ = YES; | |
| 343 if (runLoop_.get()) | |
| 344 runLoop_->Quit(); | |
| 345 } | |
| 346 | |
| 347 - (void)wait { | |
| 348 if (notificationReceived_) | |
| 349 return; | |
| 350 | |
| 351 runLoop_.reset(new base::RunLoop); | |
| 352 runLoop_->Run(); | |
| 353 } | |
| 354 | |
| 355 @end | |
| 356 | |
| 357 namespace apps { | 305 namespace apps { |
| 358 | 306 |
| 359 // Shims require static libraries http://crbug.com/386024. | 307 // Shims require static libraries http://crbug.com/386024. |
| 360 #if defined(COMPONENT_BUILD) | 308 #if defined(COMPONENT_BUILD) |
| 361 #define MAYBE_Launch DISABLED_Launch | 309 #define MAYBE_Launch DISABLED_Launch |
| 362 #define MAYBE_HostedAppLaunch DISABLED_HostedAppLaunch | 310 #define MAYBE_HostedAppLaunch DISABLED_HostedAppLaunch |
| 363 #define MAYBE_ShowWindow DISABLED_ShowWindow | 311 #define MAYBE_ShowWindow DISABLED_ShowWindow |
| 364 #define MAYBE_RebuildShim DISABLED_RebuildShim | 312 #define MAYBE_RebuildShim DISABLED_RebuildShim |
| 365 #else | 313 #else |
| 366 #define MAYBE_Launch Launch | 314 #define MAYBE_Launch Launch |
| (...skipping 13 matching lines...) Expand all Loading... |
| 380 NSString* bundle_id = GetBundleID(shim_path); | 328 NSString* bundle_id = GetBundleID(shim_path); |
| 381 | 329 |
| 382 // Explicitly set the launch type to open in a new window. | 330 // Explicitly set the launch type to open in a new window. |
| 383 extensions::SetLaunchType(profile(), app->id(), | 331 extensions::SetLaunchType(profile(), app->id(), |
| 384 extensions::LAUNCH_TYPE_WINDOW); | 332 extensions::LAUNCH_TYPE_WINDOW); |
| 385 | 333 |
| 386 // Case 1: Launch the hosted app, it should start the shim. | 334 // Case 1: Launch the hosted app, it should start the shim. |
| 387 { | 335 { |
| 388 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer; | 336 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer; |
| 389 ns_observer.reset([[WindowedNSNotificationObserver alloc] | 337 ns_observer.reset([[WindowedNSNotificationObserver alloc] |
| 390 initForNotification:NSWorkspaceDidLaunchApplicationNotification | 338 initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification |
| 391 andBundleId:bundle_id]); | 339 bundleId:bundle_id]); |
| 392 WindowedAppShimLaunchObserver observer(app->id()); | 340 WindowedAppShimLaunchObserver observer(app->id()); |
| 393 LaunchHostedApp(app); | 341 LaunchHostedApp(app); |
| 394 [ns_observer wait]; | 342 [ns_observer wait]; |
| 395 observer.Wait(); | 343 observer.Wait(); |
| 396 | 344 |
| 397 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 345 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 398 EXPECT_TRUE(GetFirstHostedAppWindow()); | 346 EXPECT_TRUE(GetFirstHostedAppWindow()); |
| 399 | 347 |
| 400 NSArray* running_shim = [NSRunningApplication | 348 NSArray* running_shim = [NSRunningApplication |
| 401 runningApplicationsWithBundleIdentifier:bundle_id]; | 349 runningApplicationsWithBundleIdentifier:bundle_id]; |
| 402 ASSERT_EQ(1u, [running_shim count]); | 350 ASSERT_EQ(1u, [running_shim count]); |
| 403 | 351 |
| 404 ns_observer.reset([[WindowedNSNotificationObserver alloc] | 352 ns_observer.reset([[WindowedNSNotificationObserver alloc] |
| 405 initForNotification:NSWorkspaceDidTerminateApplicationNotification | 353 initForWorkspaceNotification: |
| 406 andBundleId:bundle_id]); | 354 NSWorkspaceDidTerminateApplicationNotification |
| 355 bundleId:bundle_id]); |
| 407 [base::mac::ObjCCastStrict<NSRunningApplication>( | 356 [base::mac::ObjCCastStrict<NSRunningApplication>( |
| 408 [running_shim objectAtIndex:0]) terminate]; | 357 [running_shim objectAtIndex:0]) terminate]; |
| 409 [ns_observer wait]; | 358 [ns_observer wait]; |
| 410 | 359 |
| 411 EXPECT_FALSE(GetFirstHostedAppWindow()); | 360 EXPECT_FALSE(GetFirstHostedAppWindow()); |
| 412 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 361 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 413 } | 362 } |
| 414 | 363 |
| 415 // Case 2: Launch the shim, it should start the hosted app. | 364 // Case 2: Launch the shim, it should start the hosted app. |
| 416 { | 365 { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 EXPECT_FALSE(base::PathExists(shim_path)); | 400 EXPECT_FALSE(base::PathExists(shim_path)); |
| 452 | 401 |
| 453 UpdateAppAndAwaitShimCreation(profile(), app, shim_path); | 402 UpdateAppAndAwaitShimCreation(profile(), app, shim_path); |
| 454 ASSERT_TRUE(base::PathExists(shim_path)); | 403 ASSERT_TRUE(base::PathExists(shim_path)); |
| 455 NSString* bundle_id = GetBundleID(shim_path); | 404 NSString* bundle_id = GetBundleID(shim_path); |
| 456 | 405 |
| 457 // Case 1: Launch the app, it should start the shim. | 406 // Case 1: Launch the app, it should start the shim. |
| 458 { | 407 { |
| 459 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer; | 408 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer; |
| 460 ns_observer.reset([[WindowedNSNotificationObserver alloc] | 409 ns_observer.reset([[WindowedNSNotificationObserver alloc] |
| 461 initForNotification:NSWorkspaceDidLaunchApplicationNotification | 410 initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification |
| 462 andBundleId:bundle_id]); | 411 bundleId:bundle_id]); |
| 463 WindowedAppShimLaunchObserver observer(app->id()); | 412 WindowedAppShimLaunchObserver observer(app->id()); |
| 464 LaunchPlatformApp(app); | 413 LaunchPlatformApp(app); |
| 465 [ns_observer wait]; | 414 [ns_observer wait]; |
| 466 observer.Wait(); | 415 observer.Wait(); |
| 467 | 416 |
| 468 EXPECT_TRUE(GetFirstAppWindow()); | 417 EXPECT_TRUE(GetFirstAppWindow()); |
| 469 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 418 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 470 | 419 |
| 471 // Quitting the shim will eventually cause it to quit. It actually | 420 // Quitting the shim will eventually cause it to quit. It actually |
| 472 // intercepts the -terminate, sends an AppShimHostMsg_QuitApp to Chrome, | 421 // intercepts the -terminate, sends an AppShimHostMsg_QuitApp to Chrome, |
| 473 // and returns NSTerminateLater. Chrome responds by closing all windows of | 422 // and returns NSTerminateLater. Chrome responds by closing all windows of |
| 474 // the app. Once all windows are closed, Chrome closes the IPC channel, | 423 // the app. Once all windows are closed, Chrome closes the IPC channel, |
| 475 // which causes the shim to actually terminate. | 424 // which causes the shim to actually terminate. |
| 476 NSArray* running_shim = [NSRunningApplication | 425 NSArray* running_shim = [NSRunningApplication |
| 477 runningApplicationsWithBundleIdentifier:bundle_id]; | 426 runningApplicationsWithBundleIdentifier:bundle_id]; |
| 478 ASSERT_EQ(1u, [running_shim count]); | 427 ASSERT_EQ(1u, [running_shim count]); |
| 479 | 428 |
| 480 ns_observer.reset([[WindowedNSNotificationObserver alloc] | 429 ns_observer.reset([[WindowedNSNotificationObserver alloc] |
| 481 initForNotification:NSWorkspaceDidTerminateApplicationNotification | 430 initForWorkspaceNotification: |
| 482 andBundleId:bundle_id]); | 431 NSWorkspaceDidTerminateApplicationNotification |
| 432 bundleId:bundle_id]); |
| 483 [base::mac::ObjCCastStrict<NSRunningApplication>( | 433 [base::mac::ObjCCastStrict<NSRunningApplication>( |
| 484 [running_shim objectAtIndex:0]) terminate]; | 434 [running_shim objectAtIndex:0]) terminate]; |
| 485 [ns_observer wait]; | 435 [ns_observer wait]; |
| 486 | 436 |
| 487 EXPECT_FALSE(GetFirstAppWindow()); | 437 EXPECT_FALSE(GetFirstAppWindow()); |
| 488 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 438 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 489 } | 439 } |
| 490 | 440 |
| 491 // Case 2: Launch the shim, it should start the app. | 441 // Case 2: Launch the shim, it should start the app. |
| 492 { | 442 { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 EXPECT_TRUE(launched_listener.WaitUntilSatisfied()); | 489 EXPECT_TRUE(launched_listener.WaitUntilSatisfied()); |
| 540 } | 490 } |
| 541 extensions::AppWindow* window_1 = GetFirstAppWindow(); | 491 extensions::AppWindow* window_1 = GetFirstAppWindow(); |
| 542 ASSERT_TRUE(window_1); | 492 ASSERT_TRUE(window_1); |
| 543 EXPECT_TRUE(window_1->is_hidden()); | 493 EXPECT_TRUE(window_1->is_hidden()); |
| 544 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 494 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 545 EXPECT_EQ(0, lifetime_observer.activated_count()); | 495 EXPECT_EQ(0, lifetime_observer.activated_count()); |
| 546 | 496 |
| 547 // Showing the window causes the shim to launch. | 497 // Showing the window causes the shim to launch. |
| 548 { | 498 { |
| 549 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( | 499 base::scoped_nsobject<WindowedNSNotificationObserver> |
| 550 [[WindowedNSNotificationObserver alloc] | 500 ns_observer([[WindowedNSNotificationObserver alloc] |
| 551 initForNotification:NSWorkspaceDidLaunchApplicationNotification | 501 initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification |
| 552 andBundleId:bundle_id]); | 502 bundleId:bundle_id]); |
| 553 WindowedAppShimLaunchObserver observer(app->id()); | 503 WindowedAppShimLaunchObserver observer(app->id()); |
| 554 window_1->Show(extensions::AppWindow::SHOW_INACTIVE); | 504 window_1->Show(extensions::AppWindow::SHOW_INACTIVE); |
| 555 [ns_observer wait]; | 505 [ns_observer wait]; |
| 556 observer.Wait(); | 506 observer.Wait(); |
| 557 EXPECT_EQ(1, lifetime_observer.activated_count()); | 507 EXPECT_EQ(1, lifetime_observer.activated_count()); |
| 558 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 508 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 559 } | 509 } |
| 560 | 510 |
| 561 // Hiding the window causes the shim to quit. | 511 // Hiding the window causes the shim to quit. |
| 562 { | 512 { |
| 563 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( | 513 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( |
| 564 [[WindowedNSNotificationObserver alloc] | 514 [[WindowedNSNotificationObserver alloc] |
| 565 initForNotification:NSWorkspaceDidTerminateApplicationNotification | 515 initForWorkspaceNotification: |
| 566 andBundleId:bundle_id]); | 516 NSWorkspaceDidTerminateApplicationNotification |
| 517 bundleId:bundle_id]); |
| 567 window_1->Hide(); | 518 window_1->Hide(); |
| 568 [ns_observer wait]; | 519 [ns_observer wait]; |
| 569 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 520 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 570 } | 521 } |
| 571 | 522 |
| 572 // Launch a second window. It should not launch the shim. | 523 // Launch a second window. It should not launch the shim. |
| 573 { | 524 { |
| 574 ExtensionTestMessageListener launched_listener("Launched", false); | 525 ExtensionTestMessageListener launched_listener("Launched", false); |
| 575 LaunchPlatformApp(app); | 526 LaunchPlatformApp(app); |
| 576 EXPECT_TRUE(launched_listener.WaitUntilSatisfied()); | 527 EXPECT_TRUE(launched_listener.WaitUntilSatisfied()); |
| 577 } | 528 } |
| 578 const extensions::AppWindowRegistry::AppWindowList& app_windows = | 529 const extensions::AppWindowRegistry::AppWindowList& app_windows = |
| 579 extensions::AppWindowRegistry::Get(profile())->app_windows(); | 530 extensions::AppWindowRegistry::Get(profile())->app_windows(); |
| 580 EXPECT_EQ(2u, app_windows.size()); | 531 EXPECT_EQ(2u, app_windows.size()); |
| 581 extensions::AppWindow* window_2 = app_windows.front(); | 532 extensions::AppWindow* window_2 = app_windows.front(); |
| 582 EXPECT_NE(window_1, window_2); | 533 EXPECT_NE(window_1, window_2); |
| 583 ASSERT_TRUE(window_2); | 534 ASSERT_TRUE(window_2); |
| 584 EXPECT_TRUE(window_2->is_hidden()); | 535 EXPECT_TRUE(window_2->is_hidden()); |
| 585 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 536 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 586 EXPECT_EQ(1, lifetime_observer.activated_count()); | 537 EXPECT_EQ(1, lifetime_observer.activated_count()); |
| 587 | 538 |
| 588 // Showing one of the windows should launch the shim. | 539 // Showing one of the windows should launch the shim. |
| 589 { | 540 { |
| 590 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( | 541 base::scoped_nsobject<WindowedNSNotificationObserver> |
| 591 [[WindowedNSNotificationObserver alloc] | 542 ns_observer([[WindowedNSNotificationObserver alloc] |
| 592 initForNotification:NSWorkspaceDidLaunchApplicationNotification | 543 initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification |
| 593 andBundleId:bundle_id]); | 544 bundleId:bundle_id]); |
| 594 WindowedAppShimLaunchObserver observer(app->id()); | 545 WindowedAppShimLaunchObserver observer(app->id()); |
| 595 window_1->Show(extensions::AppWindow::SHOW_INACTIVE); | 546 window_1->Show(extensions::AppWindow::SHOW_INACTIVE); |
| 596 [ns_observer wait]; | 547 [ns_observer wait]; |
| 597 observer.Wait(); | 548 observer.Wait(); |
| 598 EXPECT_EQ(2, lifetime_observer.activated_count()); | 549 EXPECT_EQ(2, lifetime_observer.activated_count()); |
| 599 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 550 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 600 EXPECT_TRUE(window_2->is_hidden()); | 551 EXPECT_TRUE(window_2->is_hidden()); |
| 601 } | 552 } |
| 602 | 553 |
| 603 // Showing the other window does nothing. | 554 // Showing the other window does nothing. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 618 window_1->Hide(); | 569 window_1->Hide(); |
| 619 EXPECT_EQ(0, deactivate_observer.deactivated_count()); | 570 EXPECT_EQ(0, deactivate_observer.deactivated_count()); |
| 620 } | 571 } |
| 621 | 572 |
| 622 // Hiding other window causes the shim to quit. | 573 // Hiding other window causes the shim to quit. |
| 623 { | 574 { |
| 624 AppLifetimeMonitorObserver deactivate_observer(profile()); | 575 AppLifetimeMonitorObserver deactivate_observer(profile()); |
| 625 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 576 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 626 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( | 577 base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer( |
| 627 [[WindowedNSNotificationObserver alloc] | 578 [[WindowedNSNotificationObserver alloc] |
| 628 initForNotification:NSWorkspaceDidTerminateApplicationNotification | 579 initForWorkspaceNotification: |
| 629 andBundleId:bundle_id]); | 580 NSWorkspaceDidTerminateApplicationNotification |
| 581 bundleId:bundle_id]); |
| 630 window_2->Hide(); | 582 window_2->Hide(); |
| 631 [ns_observer wait]; | 583 [ns_observer wait]; |
| 632 EXPECT_EQ(1, deactivate_observer.deactivated_count()); | 584 EXPECT_EQ(1, deactivate_observer.deactivated_count()); |
| 633 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); | 585 EXPECT_FALSE(HasAppShimHost(profile(), app->id())); |
| 634 } | 586 } |
| 635 } | 587 } |
| 636 | 588 |
| 637 #if defined(ARCH_CPU_64_BITS) | 589 #if defined(ARCH_CPU_64_BITS) |
| 638 | 590 |
| 639 // Tests that a 32 bit shim attempting to launch 64 bit Chrome will eventually | 591 // Tests that a 32 bit shim attempting to launch 64 bit Chrome will eventually |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 // the shim is rebuilt. | 669 // the shim is rebuilt. |
| 718 WindowedAppShimLaunchObserver(app->id()).Wait(); | 670 WindowedAppShimLaunchObserver(app->id()).Wait(); |
| 719 | 671 |
| 720 EXPECT_TRUE(GetFirstAppWindow()); | 672 EXPECT_TRUE(GetFirstAppWindow()); |
| 721 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); | 673 EXPECT_TRUE(HasAppShimHost(profile(), app->id())); |
| 722 } | 674 } |
| 723 | 675 |
| 724 #endif // defined(ARCH_CPU_64_BITS) | 676 #endif // defined(ARCH_CPU_64_BITS) |
| 725 | 677 |
| 726 } // namespace apps | 678 } // namespace apps |
| OLD | NEW |