Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc |
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc |
index 0970835c3313d2ae54b3ea018e9d2fa2403ebd20..6a87f6a25e47d6849f0972d2bf86b1165553fbaf 100644 |
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc |
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.cc |
@@ -300,8 +300,11 @@ ash::LauncherID ChromeLauncherControllerPerApp::CreateAppLauncherItem( |
const std::string& app_id, |
ash::LauncherItemStatus status) { |
DCHECK(controller); |
- return InsertAppLauncherItem(controller, app_id, status, |
- model_->item_count()); |
+ return InsertAppLauncherItem(controller, |
+ app_id, |
+ status, |
+ model_->item_count(), |
+ controller->GetLauncherItemType()); |
} |
void ChromeLauncherControllerPerApp::SetItemStatus( |
@@ -354,11 +357,13 @@ void ChromeLauncherControllerPerApp::Pin(ash::LauncherID id) { |
ash::LauncherItem item = model_->items()[index]; |
- if (item.type != ash::TYPE_PLATFORM_APP) |
+ if (item.type == ash::TYPE_PLATFORM_APP || |
+ item.type == ash::TYPE_WINDOWED_APP) { |
+ item.type = ash::TYPE_APP_SHORTCUT; |
+ model_->Set(index, item); |
+ } else if (item.type != ash::TYPE_APP_SHORTCUT) { |
return; |
- |
- item.type = ash::TYPE_APP_SHORTCUT; |
- model_->Set(index, item); |
+ } |
if (CanPin()) |
PersistPinnedState(); |
@@ -375,7 +380,17 @@ void ChromeLauncherControllerPerApp::Unpin(ash::LauncherID id) { |
item.type = ash::TYPE_PLATFORM_APP; |
model_->Set(index, item); |
} else { |
- LauncherItemClosed(id); |
+ // Prevent the removal of items upon unpin if it is locked by a running |
+ // windowed V1 app. |
+ if (!controller->locked()) { |
+ LauncherItemClosed(id); |
+ } else { |
+ int index = model_->ItemIndexByID(id); |
+ DCHECK_GE(index, 0); |
+ ash::LauncherItem item = model_->items()[index]; |
+ item.type = ash::TYPE_WINDOWED_APP; |
+ model_->Set(index, item); |
+ } |
} |
if (CanPin()) |
PersistPinnedState(); |
@@ -405,10 +420,36 @@ bool ChromeLauncherControllerPerApp::IsPinnable(ash::LauncherID id) const { |
return false; |
ash::LauncherItemType type = model_->items()[index].type; |
- return ((type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_PLATFORM_APP) && |
+ return ((type == ash::TYPE_APP_SHORTCUT || |
+ type == ash::TYPE_PLATFORM_APP || |
+ type == ash::TYPE_WINDOWED_APP) && |
CanPin()); |
} |
+void ChromeLauncherControllerPerApp::LockV1AppWithID( |
+ const std::string& app_id) { |
+ ash::LauncherID id = GetLauncherIDForAppID(app_id); |
+ if (!IsPinned(id) && !IsWindowedAppInLauncher(app_id)) { |
+ CreateAppShortcutLauncherItemWithType(app_id, |
+ model_->item_count(), |
+ ash::TYPE_WINDOWED_APP); |
+ id = GetLauncherIDForAppID(app_id); |
+ } |
+ DCHECK(id); |
+ id_to_item_controller_map_[id]->lock(); |
+} |
+ |
+void ChromeLauncherControllerPerApp::UnlockV1AppWithID( |
+ const std::string& app_id) { |
+ ash::LauncherID id = GetLauncherIDForAppID(app_id); |
+ DCHECK(IsPinned(id) || IsWindowedAppInLauncher(app_id)); |
+ DCHECK(id); |
+ LauncherItemController* controller = id_to_item_controller_map_[id]; |
+ controller->unlock(); |
+ if (!controller->locked() && !IsPinned(id)) |
+ CloseLauncherItem(id); |
+} |
+ |
void ChromeLauncherControllerPerApp::Launch(ash::LauncherID id, |
int event_flags) { |
if (!HasItemController(id)) |
@@ -572,6 +613,16 @@ bool ChromeLauncherControllerPerApp::IsAppPinned(const std::string& app_id) { |
return false; |
} |
+bool ChromeLauncherControllerPerApp::IsWindowedAppInLauncher( |
+ const std::string& app_id) { |
+ int index = model_->ItemIndexByID(GetLauncherIDForAppID(app_id)); |
+ if (index < 0) |
+ return false; |
+ |
+ ash::LauncherItemType type = model_->items()[index].type; |
+ return type == ash::TYPE_WINDOWED_APP; |
+} |
+ |
void ChromeLauncherControllerPerApp::PinAppWithID(const std::string& app_id) { |
if (CanPin()) |
DoPinAppWithID(app_id); |
@@ -780,7 +831,7 @@ void ChromeLauncherControllerPerApp::SetRefocusURLPatternForTest( |
} |
ash::LauncherItemType type = model_->items()[index].type; |
- if (type == ash::TYPE_APP_SHORTCUT) { |
+ if (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_WINDOWED_APP) { |
AppShortcutLauncherItemController* app_controller = |
static_cast<AppShortcutLauncherItemController*>(controller); |
app_controller->set_refocus_url(url); |
@@ -864,7 +915,8 @@ ash::LauncherID ChromeLauncherControllerPerApp::GetIDByWindow( |
bool ChromeLauncherControllerPerApp::IsDraggable( |
const ash::LauncherItem& item) { |
- return item.type == ash::TYPE_APP_SHORTCUT ? CanPin() : true; |
+ return (item.type == ash::TYPE_APP_SHORTCUT || |
+ item.type == ash::TYPE_WINDOWED_APP) ? CanPin() : true; |
} |
void ChromeLauncherControllerPerApp::LauncherItemAdded(int index) { |
@@ -1067,11 +1119,9 @@ void ChromeLauncherControllerPerApp::OnBrowserRemoved(Browser* browser) { |
ash::LauncherID ChromeLauncherControllerPerApp::CreateAppShortcutLauncherItem( |
const std::string& app_id, |
int index) { |
- AppShortcutLauncherItemController* controller = |
- new AppShortcutLauncherItemController(app_id, this); |
- ash::LauncherID launcher_id = InsertAppLauncherItem( |
- controller, app_id, ash::STATUS_CLOSED, index); |
- return launcher_id; |
+ return CreateAppShortcutLauncherItemWithType(app_id, |
+ index, |
+ ash::TYPE_APP_SHORTCUT); |
} |
void ChromeLauncherControllerPerApp::SetAppTabHelperForTest( |
@@ -1090,6 +1140,18 @@ ChromeLauncherControllerPerApp::GetAppIdFromLauncherIdForTest( |
return id_to_item_controller_map_[id]->app_id(); |
} |
+ash::LauncherID |
+ChromeLauncherControllerPerApp::CreateAppShortcutLauncherItemWithType( |
+ const std::string& app_id, |
+ int index, |
+ ash::LauncherItemType launcher_item_type) { |
+ AppShortcutLauncherItemController* controller = |
+ new AppShortcutLauncherItemController(app_id, this); |
+ ash::LauncherID launcher_id = InsertAppLauncherItem( |
+ controller, app_id, ash::STATUS_CLOSED, index, launcher_item_type); |
+ return launcher_id; |
+} |
+ |
void ChromeLauncherControllerPerApp::UpdateBrowserItemStatus() { |
// Determine the new browser's active state and change if necessary. |
int browser_index = ash::launcher::GetBrowserItemIndex(*model_); |
@@ -1317,7 +1379,8 @@ ash::LauncherID ChromeLauncherControllerPerApp::InsertAppLauncherItem( |
LauncherItemController* controller, |
const std::string& app_id, |
ash::LauncherItemStatus status, |
- int index) { |
+ int index, |
+ ash::LauncherItemType launcher_item_type) { |
ash::LauncherID id = model_->next_id(); |
DCHECK(!HasItemController(id)); |
DCHECK(controller); |
@@ -1325,7 +1388,7 @@ ash::LauncherID ChromeLauncherControllerPerApp::InsertAppLauncherItem( |
controller->set_launcher_id(id); |
ash::LauncherItem item; |
- item.type = controller->GetLauncherItemType(); |
+ item.type = launcher_item_type; |
item.is_incognito = false; |
item.image = Extension::GetDefaultIcon(true); |
@@ -1380,6 +1443,11 @@ ChromeLauncherControllerPerApp::GetBrowserApplicationList() { |
Browser* browser = *it; |
if (browser->is_type_tabbed()) |
found_tabbed_browser = true; |
+ else if (browser->is_app() && |
+ browser->is_type_popup() && |
+ GetLauncherIDForAppID(web_app::GetExtensionIdFromApplicationName( |
+ browser->app_name())) > 0) |
+ continue; |
TabStripModel* tab_strip = browser->tab_strip_model(); |
WebContents* web_contents = |
tab_strip->GetWebContentsAt(tab_strip->active_index()); |