Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1857)

Unified Diff: apps/app_shim/app_shim_interactive_uitest_mac.mm

Issue 265163006: [Mac] Rebuild app shims when they fail to dyload Chrome Framework. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to latest http://crrev.com/316493002 Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/app/app_mode_loader_mac.mm » ('j') | chrome/app/app_mode_loader_mac.mm » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: apps/app_shim/app_shim_interactive_uitest_mac.mm
diff --git a/apps/app_shim/app_shim_interactive_uitest_mac.mm b/apps/app_shim/app_shim_interactive_uitest_mac.mm
index 1c4cc114ae83c5737464c4d9bd2d2eee8a32ff76..8233934722e99a2fc70c4781fc3a6ef9e51dbfc1 100644
--- a/apps/app_shim/app_shim_interactive_uitest_mac.mm
+++ b/apps/app_shim/app_shim_interactive_uitest_mac.mm
@@ -15,6 +15,7 @@
#include "base/files/file_path_watcher.h"
#include "base/mac/foundation_util.h"
#include "base/mac/launch_services_util.h"
+#include "base/mac/mac_util.h"
#include "base/mac/scoped_nsobject.h"
#include "base/path_service.h"
#include "base/process/launch.h"
@@ -297,4 +298,92 @@ IN_PROC_BROWSER_TEST_F(AppShimInteractiveTest, Launch) {
}
}
+#if defined(ARCH_CPU_64_BITS)
+
+// Tests that a 32 bit shim attempting to launch 64 bit Chrome will eventually
+// be rebuilt.
+IN_PROC_BROWSER_TEST_F(AppShimInteractiveTest, RebuildShim) {
+ // Get the 32 bit shim.
+ base::FilePath test_data_dir;
+ PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+ base::FilePath shim_path_32 =
+ test_data_dir.Append("app_shim").Append("app_shim_32_bit.app");
+ EXPECT_TRUE(base::PathExists(shim_path_32));
+
+ // Install test app.
+ const extensions::Extension* app = InstallPlatformApp("minimal");
+
+ // Use WebAppShortcutCreator to create a 64 bit shim.
+ web_app::WebAppShortcutCreator shortcut_creator(
+ web_app::GetWebAppDataDirectory(profile()->GetPath(), app->id(), GURL()),
+ web_app::ShortcutInfoForExtensionAndProfile(app, profile()),
+ extensions::FileHandlersInfo());
+ shortcut_creator.UpdateShortcuts();
+ base::FilePath shim_path = shortcut_creator.GetInternalShortcutPath();
+ NSMutableDictionary* plist_64 = [NSMutableDictionary
+ dictionaryWithContentsOfFile:base::mac::FilePathToNSString(
+ shim_path.Append("Contents").Append("Info.plist"))];
+
+ // Copy 32 bit shim to where it's expected to be.
+ // CopyDirectory doesn't seem to work when copying and renaming in one go.
+ ASSERT_TRUE(base::DeleteFile(shim_path, true));
+ ASSERT_TRUE(base::PathExists(shim_path.DirName()));
+ ASSERT_TRUE(base::CopyDirectory(shim_path_32, shim_path.DirName(), true));
+ ASSERT_TRUE(base::Move(shim_path.DirName().Append(shim_path_32.BaseName()),
+ shim_path));
+ ASSERT_TRUE(base::PathExists(
+ shim_path.Append("Contents").Append("MacOS").Append("app_mode_loader")));
+
+ // Fix up the plist so that it matches the installed test app.
+ NSString* plist_path = base::mac::FilePathToNSString(
+ shim_path.Append("Contents").Append("Info.plist"));
+ NSMutableDictionary* plist =
+ [NSMutableDictionary dictionaryWithContentsOfFile:plist_path];
+
+ NSArray* keys_to_copy = @[
+ base::mac::CFToNSCast(kCFBundleIdentifierKey),
+ base::mac::CFToNSCast(kCFBundleNameKey),
+ app_mode::kCrAppModeShortcutIDKey,
+ app_mode::kCrAppModeUserDataDirKey,
+ app_mode::kBrowserBundleIDKey
+ ];
+ for (NSString* key in keys_to_copy) {
+ [plist setObject:[plist_64 objectForKey:key]
+ forKey:key];
+ }
+ [plist writeToFile:plist_path
+ atomically:YES];
+
+ base::mac::RemoveQuarantineAttribute(shim_path);
+
+ // Launch the shim, it should start the app and ultimately connect over IPC.
+ // This actually happens in multiple launches of the shim:
+ // (1) The shim will fail and instead launch Chrome with --app-id so that the
+ // app starts.
+ // (2) Chrome launches the shim in response to an app starting, this time the
+ // shim launches Chrome with --app-shim-error, which causes Chrome to
+ // rebuild the shim.
+ // (3) After rebuilding, Chrome again launches the shim and expects it to
+ // behave normally.
+ ExtensionTestMessageListener launched_listener("Launched", false);
+ CommandLine shim_cmdline(CommandLine::NO_PROGRAM);
+ ASSERT_TRUE(base::mac::OpenApplicationWithPath(
+ shim_path, shim_cmdline, kLSLaunchDefaults, NULL));
+
+ // Wait for the app to start (1). At this point there is no shim host.
+ ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
+ EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
+
+ // Wait for the rebuilt shim to connect (3). This does not race with the app
+ // starting (1) because Chrome only launches the shim (2) after the app
+ // starts. Then Chrome must handle --app-shim-error on the UI thread before
+ // the shim is rebuilt.
+ WindowedAppShimLaunchObserver(app->id()).Wait();
+
+ EXPECT_TRUE(GetFirstAppWindow());
+ EXPECT_TRUE(HasAppShimHost(profile(), app->id()));
+}
+
+#endif // defined(ARCH_CPU_64_BITS)
+
} // namespace apps
« no previous file with comments | « no previous file | chrome/app/app_mode_loader_mac.mm » ('j') | chrome/app/app_mode_loader_mac.mm » ('J')

Powered by Google App Engine
This is Rietveld 408576698