Chromium Code Reviews| Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
| diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
| index 87a5e6a867cb8b3665c169fec2e46209b143a0bb..1d9dd9bfe8eb2746c58e8ad20acfdf0fcaa8869f 100644 |
| --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
| +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
| @@ -77,15 +77,13 @@ using extensions::UnloadedExtensionInfo; |
| namespace { |
| const char* offline_gmail_url = "https://mail.google.com/mail/mu/u"; |
| const char* gmail_url = "https://mail.google.com/mail/u"; |
| +const char* kGmailLaunchURL = "https://mail.google.com/mail/ca"; |
| // As defined in /chromeos/dbus/cryptohome_client.cc. |
| const char kUserIdHashSuffix[] = "-hash"; |
| // An extension prefix. |
| const char kCrxAppPrefix[] = "_crx_"; |
| -} |
| - |
| -namespace { |
| // ShelfModelObserver implementation that tracks what messages are invoked. |
| class TestShelfModelObserver : public ash::ShelfModelObserver { |
| @@ -314,7 +312,7 @@ class ChromeLauncherControllerTest : public BrowserWithTestWindowTest { |
| manifest_gmail.SetString(extensions::manifest_keys::kDescription, |
| "for testing pinned Gmail"); |
| manifest_gmail.SetString(extensions::manifest_keys::kLaunchWebURL, |
| - "https://mail.google.com/mail/ca"); |
| + kGmailLaunchURL); |
| ListValue* list = new ListValue(); |
| list->Append(Value::CreateStringValue("*://mail.google.com/mail/ca")); |
| manifest_gmail.Set(extensions::manifest_keys::kWebURLs, list); |
| @@ -721,16 +719,24 @@ class WebContentsDestroyedWatcher : public content::WebContentsObserver { |
| }; |
| // A V1 windowed application. |
| -class V1App { |
| +class V1App : public TestBrowserWindow { |
| public: |
| V1App(Profile* profile, const std::string& app_name) { |
| + // Create a window. |
| + native_window_.reset(new aura::Window(NULL)); |
| + native_window_->set_id(0); |
| + native_window_->SetType(aura::client::WINDOW_TYPE_POPUP); |
| + native_window_->Init(ui::LAYER_TEXTURED); |
| + native_window_->Show(); |
| + |
| Browser::CreateParams params = Browser::CreateParams::CreateForApp( |
| Browser::TYPE_POPUP, |
| kCrxAppPrefix + app_name, |
| gfx::Rect(), |
| profile, |
| chrome::HOST_DESKTOP_TYPE_ASH); |
| - browser_.reset(chrome::CreateBrowserWithTestWindowForParams(¶ms)); |
| + params.window = this; |
| + browser_.reset(new Browser(params)); |
| chrome::AddTabAt(browser_.get(), GURL(), 0, true); |
| } |
| @@ -741,10 +747,18 @@ class V1App { |
| Browser* browser() { return browser_.get(); } |
| + // TestBrowserWindow override: |
| + virtual gfx::NativeWindow GetNativeWindow() OVERRIDE { |
| + return native_window_.get(); |
| + } |
| + |
| private: |
| // The associated browser with this app. |
| scoped_ptr<Browser> browser_; |
| + // The native window we use. |
| + scoped_ptr<aura::Window> native_window_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(V1App); |
| }; |
| @@ -887,10 +901,22 @@ class MultiProfileMultiBrowserShelfLayoutChromeLauncherControllerTest |
| } |
| // Creates a running V1 application. |
| + // Note that with the use of the app_tab_helper as done below, this is only |
| + // usable with a single v1 application. |
| V1App* CreateRunningV1App(Profile* profile, |
| const std::string& app_name, |
| const std::string& url) { |
| V1App* v1_app = new V1App(profile, app_name); |
| + // Create a new app tab helper and assign it to the launcher so that this |
| + // app gets properly detected. |
| + // TODO(skuhne): Create a more intelligent app tab helper which is able to |
| + // detect all running apps properly. |
| + TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl; |
| + app_tab_helper->SetAppID( |
| + v1_app->browser()->tab_strip_model()->GetWebContentsAt(0), |
| + app_name); |
| + SetAppTabHelper(app_tab_helper); |
| + |
| NavigateAndCommitActiveTabWithTitle( |
| v1_app->browser(), GURL(url), ASCIIToUTF16("")); |
| return v1_app; |
| @@ -1508,6 +1534,84 @@ TEST_F(MultiProfileMultiBrowserShelfLayoutChromeLauncherControllerTest, |
| EXPECT_EQ(2, model_->item_count()); |
| } |
| +// Check edge case where a visiting V1 app gets closed (crbug.com/321374). |
| +TEST_F(MultiProfileMultiBrowserShelfLayoutChromeLauncherControllerTest, |
| + V1CloseOnVisitingDesktop) { |
| + // Create a browser item in the LauncherController. |
| + InitLauncherController(); |
| + |
| + chrome::MultiUserWindowManager* manager = |
| + chrome::MultiUserWindowManager::GetInstance(); |
| + |
| + // First test: Create an app when the user is not active. |
|
James Cook
2013/11/22 19:06:09
nit: Where does the second test begin? Or is this
Mr4D (OOO till 08-26)
2013/11/22 19:17:00
Changed the comment(s). Thanks!
|
| + std::string user2 = "user2"; |
| + TestingProfile* profile2 = CreateMultiUserProfile(user2); |
| + { |
| + // Create a "windowed gmail app". |
| + scoped_ptr<V1App> v1_app(CreateRunningV1App( |
| + profile(), |
| + extension_misc::kGmailAppId, |
| + kGmailLaunchURL)); |
| + // Trigger an update on the launcher item. |
|
James Cook
2013/11/22 19:06:09
Is this a leftover comment?
Mr4D (OOO till 08-26)
2013/11/22 19:17:00
In deed. Done
|
| + EXPECT_EQ(3, model_->item_count()); |
| + |
| + // Transfer the app to the other screen and switch users. |
| + manager->ShowWindowForUser(v1_app->browser()->window()->GetNativeWindow(), |
| + user2); |
| + EXPECT_EQ(3, model_->item_count()); |
| + SwitchActiveUser(profile2->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| + } |
| + // Switching back caused a crash in the past. |
| + SwitchActiveUser(profile()->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| + { |
| + // Create a "windowed gmail app". |
| + scoped_ptr<V1App> v1_app(CreateRunningV1App( |
| + profile(), |
| + extension_misc::kGmailAppId, |
| + kGmailLaunchURL)); |
| + EXPECT_EQ(3, model_->item_count()); |
| + } |
| + SwitchActiveUser(profile2->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| +} |
| + |
| +// Check edge cases with multi profile V1 apps in the shelf. |
| +TEST_F(MultiProfileMultiBrowserShelfLayoutChromeLauncherControllerTest, |
| + V1AppUpdateOnUserSwitchEdgecases2) { |
| + // Create a browser item in the LauncherController. |
| + InitLauncherController(); |
| + TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl; |
| + SetAppTabHelper(app_tab_helper); |
| + |
| + // First test: Create an app when the user is not active. |
| + std::string user2 = "user2"; |
| + TestingProfile* profile2 = CreateMultiUserProfile(user2); |
| + SwitchActiveUser(profile2->GetProfileName()); |
| + { |
| + // Create a "windowed gmail app". |
| + scoped_ptr<V1App> v1_app(CreateRunningV1App( |
| + profile(), extension_misc::kGmailAppId, gmail_url)); |
| + EXPECT_EQ(2, model_->item_count()); |
| + |
| + // However - switching to the user should show it. |
| + SwitchActiveUser(profile()->GetProfileName()); |
| + EXPECT_EQ(3, model_->item_count()); |
| + |
| + // Second test: Remove the app when the user is not active and see that it |
| + // works. |
| + SwitchActiveUser(profile2->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| + // Note: the closure ends and the browser will go away. |
|
James Cook
2013/11/22 19:06:09
nit: This might be a little clearer if you elimina
Mr4D (OOO till 08-26)
2013/11/22 19:17:00
Done.
|
| + } |
| + EXPECT_EQ(2, model_->item_count()); |
| + SwitchActiveUser(profile()->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| + SwitchActiveUser(profile2->GetProfileName()); |
| + EXPECT_EQ(2, model_->item_count()); |
| +} |
| + |
| // Check that activating an item which is on another user's desktop, will bring |
| // it back. |
| TEST_F(MultiProfileMultiBrowserShelfLayoutChromeLauncherControllerTest, |