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 67077868e4a0ead5e5f0d9f6e41d35d34df6a924..92001d4dbb9bbf52a12e27d395a871256b7a3740 100644 |
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc |
@@ -177,6 +177,54 @@ class TestAppTabHelperImpl : public ChromeLauncherController::AppTabHelper { |
DISALLOW_COPY_AND_ASSIGN(TestAppTabHelperImpl); |
}; |
+// Test implementation of a V2 app launcher item controller. |
+class TestV2AppLauncherItemController : public LauncherItemController { |
+ public: |
+ TestV2AppLauncherItemController(const std::string& app_id, |
+ ChromeLauncherController* controller) |
+ : LauncherItemController(LauncherItemController::TYPE_APP, |
+ app_id, |
+ controller) { |
+ } |
+ |
+ virtual ~TestV2AppLauncherItemController() {} |
+ |
+ // Override for LauncherItemController: |
+ virtual string16 GetTitle() OVERRIDE; |
+ virtual bool IsCurrentlyShownInWindow(aura::Window* window) const OVERRIDE; |
+ virtual bool IsOpen() const OVERRIDE; |
+ virtual bool IsVisible() const OVERRIDE; |
+ virtual void Launch(int event_flags) OVERRIDE; |
+ virtual void Activate() OVERRIDE; |
+ virtual void Close() OVERRIDE; |
+ virtual void Clicked(const ui::Event& event) OVERRIDE; |
+ virtual void OnRemoved() OVERRIDE; |
+ virtual ChromeLauncherAppMenuItems GetApplicationList( |
+ int event_flags) OVERRIDE; |
+ |
+ private: |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestV2AppLauncherItemController); |
+}; |
+ |
+string16 TestV2AppLauncherItemController::GetTitle() { return string16(); } |
+bool TestV2AppLauncherItemController::IsCurrentlyShownInWindow( |
+ aura::Window* window) const { return true; } |
+bool TestV2AppLauncherItemController::IsOpen() const { return true; } |
+bool TestV2AppLauncherItemController::IsVisible() const { return true; } |
+void TestV2AppLauncherItemController::Launch(int event_flags) {} |
+void TestV2AppLauncherItemController::Activate() {} |
+void TestV2AppLauncherItemController::Close() {} |
+void TestV2AppLauncherItemController::Clicked(const ui::Event& event) {} |
+void TestV2AppLauncherItemController::OnRemoved() {} |
+ChromeLauncherAppMenuItems TestV2AppLauncherItemController::GetApplicationList( |
+ int event_flags) { |
+ ChromeLauncherAppMenuItems items; |
+ items.push_back(new ChromeLauncherAppMenuItem(string16(), NULL, false)); |
+ items.push_back(new ChromeLauncherAppMenuItem(string16(), NULL, false)); |
+ return items.Pass(); |
oshima
2013/09/19 21:43:25
can you just inline them?
Mr4D (OOO till 08-26)
2013/09/19 22:31:50
Done.
|
+} |
+ |
} // namespace |
class ChromeLauncherControllerTest : public BrowserWithTestWindowTest { |
@@ -246,6 +294,20 @@ class ChromeLauncherControllerTest : public BrowserWithTestWindowTest { |
&error); |
} |
+ // Creates a running V2 app (not pinned) of type |app_id|. |
+ virtual void CreateRunningV2App(const std::string& app_id) { |
+ ash::LauncherID id = |
+ launcher_controller_->CreateAppShortcutLauncherItemWithType( |
+ app_id, |
+ model_->item_count(), |
+ ash::TYPE_PLATFORM_APP); |
+ DCHECK(id); |
+ // Change the created launcher controller into a V2 app controller. |
+ launcher_controller_->SetItemController(id, |
+ new TestV2AppLauncherItemController(app_id, |
+ launcher_controller_.get())); |
+ } |
+ |
virtual void TearDown() OVERRIDE { |
model_->RemoveObserver(model_observer_.get()); |
model_observer_.reset(); |
@@ -305,10 +367,42 @@ class ChromeLauncherControllerTest : public BrowserWithTestWindowTest { |
} |
} |
+ // Get the setup of the currently shown launcher items in one string. |
+ // Each pinned element will start with a big letter, each running but not |
+ // pinned V1 app will start with a small letter and each running but not |
+ // pinned V2 app will start with a '*' + small letter. |
std::string GetPinnedAppStatus() { |
std::string result; |
for (int i = 0; i < model_->item_count(); i++) { |
switch (model_->items()[i].type) { |
+ case ash::TYPE_PLATFORM_APP: |
+ result+= "*"; |
+ // FALLTHROUGH |
+ case ash::TYPE_WINDOWED_APP: { |
+ const std::string& app = |
+ launcher_controller_->GetAppIDForLauncherID( |
+ model_->items()[i].id); |
+ if (app == extension1_->id()) { |
+ result += "app1, "; |
+ EXPECT_FALSE( |
+ launcher_controller_->IsAppPinned(extension1_->id())); |
+ } else if (app == extension2_->id()) { |
+ result += "app2, "; |
+ EXPECT_FALSE( |
+ launcher_controller_->IsAppPinned(extension2_->id())); |
+ } else if (app == extension3_->id()) { |
+ result += "app3, "; |
+ EXPECT_FALSE( |
+ launcher_controller_->IsAppPinned(extension3_->id())); |
+ } else if (app == extension4_->id()) { |
+ result += "app4, "; |
+ EXPECT_FALSE( |
+ launcher_controller_->IsAppPinned(extension4_->id())); |
+ } else { |
+ result += "unknown, "; |
+ } |
+ break; |
+ } |
case ash::TYPE_APP_SHORTCUT: { |
const std::string& app = |
launcher_controller_->GetAppIDForLauncherID( |
@@ -347,7 +441,7 @@ class ChromeLauncherControllerTest : public BrowserWithTestWindowTest { |
// Set the index at which the chrome icon should be. |
void SetShelfChromeIconIndex(int index) { |
profile()->GetTestingPrefService()->SetInteger(prefs::kShelfChromeIconIndex, |
- index + 1); |
+ index); |
} |
// Needed for extension service & friends to work. |
@@ -787,7 +881,7 @@ TEST_F(ChromeLauncherControllerTest, CheckLockApps) { |
} |
// Check that multiple locks of an application will be properly handled. |
-TEST_F(ChromeLauncherControllerTest, CheckMukltiLockApps) { |
+TEST_F(ChromeLauncherControllerTest, CheckMultiLockApps) { |
InitLauncherController(); |
// Model should only contain the browser shortcut and app list items. |
EXPECT_EQ(2, model_->item_count()); |
@@ -937,6 +1031,114 @@ TEST_F(ChromeLauncherControllerTest, CheckLockPinUnlockUnpin) { |
EXPECT_EQ(2, model_->item_count()); |
} |
+// Check that a locked (windowed V1 application) will be properly converted |
+// between locked and pinned when the order gets changed through a profile / |
+// policy change. |
+TEST_F(ChromeLauncherControllerTest, RestoreDefaultAndLockedAppsResyncOrder) { |
+ InitLauncherController(); |
+ base::ListValue policy_value0; |
+ InsertPrefValue(&policy_value0, 0, extension1_->id()); |
+ InsertPrefValue(&policy_value0, 1, extension3_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value0.DeepCopy()); |
+ // The shelf layout has always one static item at the beginning (App List). |
+ SetShelfChromeIconIndex(0); |
+ extension_service_->AddExtension(extension1_.get()); |
+ EXPECT_EQ("AppList, Chrome, App1, ", GetPinnedAppStatus()); |
+ extension_service_->AddExtension(extension2_.get()); |
+ // No new app icon will be generated. |
+ EXPECT_EQ("AppList, Chrome, App1, ", GetPinnedAppStatus()); |
+ // Add the app as locked app which will add it (un-pinned). |
+ launcher_controller_->LockV1AppWithID(extension2_->id()); |
+ EXPECT_EQ("AppList, Chrome, App1, app2, ", GetPinnedAppStatus()); |
+ extension_service_->AddExtension(extension3_.get()); |
+ EXPECT_EQ("AppList, Chrome, App1, App3, app2, ", GetPinnedAppStatus()); |
+ |
+ // Now request to pin all items which should convert the locked item into a |
+ // pinned item. |
+ base::ListValue policy_value1; |
+ InsertPrefValue(&policy_value1, 0, extension3_->id()); |
+ InsertPrefValue(&policy_value1, 1, extension2_->id()); |
+ InsertPrefValue(&policy_value1, 2, extension1_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value1.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, App2, App1, ", GetPinnedAppStatus()); |
+ |
+ // Going back to a status where there is no requirement for app 2 to be pinned |
+ // should convert it back to locked but not pinned and state. The position |
+ // is determined by the |LauncherModel|'s weight system. Since at the moment |
+ // the weight of a running app has the same as a shortcut, it will remain |
+ // where it is. Surely note ideal, but since the sync process can shift around |
+ // locations - as well as many other edge cases - this gets nearly impossible |
+ // to get right. |
+ // TODO(skuhne): Filed crbug.com/293761 to track of this. |
+ base::ListValue policy_value2; |
+ InsertPrefValue(&policy_value2, 0, extension3_->id()); |
+ InsertPrefValue(&policy_value2, 1, extension1_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value2.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, app2, App1, ", GetPinnedAppStatus()); |
+ |
+ // Removing an item should simply close it and everything should shift. |
+ base::ListValue policy_value3; |
+ InsertPrefValue(&policy_value3, 0, extension3_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value3.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, app2, ", GetPinnedAppStatus()); |
+} |
+ |
+// Check that a running and not pinned V2 application will be properly converted |
+// between locked and pinned when the order gets changed through a profile / |
+// policy change. |
+TEST_F(ChromeLauncherControllerTest, |
+ RestoreDefaultAndRunningV2AppsResyncOrder) { |
+ InitLauncherController(); |
+ base::ListValue policy_value0; |
+ InsertPrefValue(&policy_value0, 0, extension1_->id()); |
+ InsertPrefValue(&policy_value0, 1, extension3_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value0.DeepCopy()); |
+ // The shelf layout has always one static item at the beginning (app List). |
+ SetShelfChromeIconIndex(0); |
+ extension_service_->AddExtension(extension1_.get()); |
+ EXPECT_EQ("AppList, Chrome, App1, ", GetPinnedAppStatus()); |
+ extension_service_->AddExtension(extension2_.get()); |
+ // No new app icon will be generated. |
+ EXPECT_EQ("AppList, Chrome, App1, ", GetPinnedAppStatus()); |
+ // Add the app as an unpinned but running V2 app. |
+ CreateRunningV2App(extension2_->id()); |
+ EXPECT_EQ("AppList, Chrome, App1, *app2, ", GetPinnedAppStatus()); |
+ extension_service_->AddExtension(extension3_.get()); |
+ EXPECT_EQ("AppList, Chrome, App1, App3, *app2, ", GetPinnedAppStatus()); |
+ |
+ // Now request to pin all items which should convert the locked item into a |
+ // pinned item. |
+ base::ListValue policy_value1; |
+ InsertPrefValue(&policy_value1, 0, extension3_->id()); |
+ InsertPrefValue(&policy_value1, 1, extension2_->id()); |
+ InsertPrefValue(&policy_value1, 2, extension1_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value1.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, App2, App1, ", GetPinnedAppStatus()); |
+ |
+ // Going back to a status where there is no requirement for app 2 to be pinned |
+ // should convert it back to running V2 app. Since the position is determined |
+ // by the |LauncherModel|'s weight system, it will be after last pinned item. |
+ base::ListValue policy_value2; |
+ InsertPrefValue(&policy_value2, 0, extension3_->id()); |
+ InsertPrefValue(&policy_value2, 1, extension1_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value2.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, App1, *app2, ", GetPinnedAppStatus()); |
+ |
+ // Removing an item should simply close it and everything should shift. |
+ base::ListValue policy_value3; |
+ InsertPrefValue(&policy_value3, 0, extension3_->id()); |
+ profile()->GetTestingPrefService()->SetUserPref(prefs::kPinnedLauncherApps, |
+ policy_value3.DeepCopy()); |
+ EXPECT_EQ("AppList, Chrome, App3, *app2, ", GetPinnedAppStatus()); |
+} |
+ |
TEST_F(ChromeLauncherControllerTest, Policy) { |
extension_service_->AddExtension(extension1_.get()); |
extension_service_->AddExtension(extension3_.get()); |
@@ -1517,6 +1719,7 @@ TEST_F(ChromeLauncherControllerTest, PersistPinned) { |
launcher_controller_.reset(); |
model_.reset(new ash::LauncherModel); |
+ AddAppListLauncherItem(); |
launcher_controller_.reset( |
ChromeLauncherController::CreateInstance(profile(), model_.get())); |
app_tab_helper = new TestAppTabHelperImpl; |
@@ -1524,7 +1727,6 @@ TEST_F(ChromeLauncherControllerTest, PersistPinned) { |
SetAppTabHelper(app_tab_helper); |
app_icon_loader = new TestAppIconLoaderImpl; |
SetAppIconLoader(app_icon_loader); |
- AddAppListLauncherItem(); |
launcher_controller_->Init(); |
EXPECT_EQ(1, app_icon_loader->fetch_count()); |