| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
| 10 #include "ash/desktop_background/desktop_background_controller.h" | 10 #include "ash/desktop_background/desktop_background_controller.h" |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 app_window_controller_.reset(new AppWindowLauncherController(this)); | 417 app_window_controller_.reset(new AppWindowLauncherController(this)); |
| 418 #endif | 418 #endif |
| 419 | 419 |
| 420 // Right now ash::Shell isn't created for tests. | 420 // Right now ash::Shell isn't created for tests. |
| 421 // TODO(mukai): Allows it to observe display change and write tests. | 421 // TODO(mukai): Allows it to observe display change and write tests. |
| 422 if (ash::Shell::HasInstance()) { | 422 if (ash::Shell::HasInstance()) { |
| 423 ash::Shell::GetInstance()->display_controller()->AddObserver(this); | 423 ash::Shell::GetInstance()->display_controller()->AddObserver(this); |
| 424 item_delegate_manager_ = | 424 item_delegate_manager_ = |
| 425 ash::Shell::GetInstance()->shelf_item_delegate_manager(); | 425 ash::Shell::GetInstance()->shelf_item_delegate_manager(); |
| 426 } | 426 } |
| 427 | |
| 428 notification_registrar_.Add( | |
| 429 this, | |
| 430 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | |
| 431 content::Source<Profile>(profile_)); | |
| 432 notification_registrar_.Add( | |
| 433 this, | |
| 434 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | |
| 435 content::Source<Profile>(profile_)); | |
| 436 } | 427 } |
| 437 | 428 |
| 438 ChromeLauncherController::~ChromeLauncherController() { | 429 ChromeLauncherController::~ChromeLauncherController() { |
| 439 // Reset the BrowserStatusMonitor as it has a weak pointer to this. | 430 // Reset the BrowserStatusMonitor as it has a weak pointer to this. |
| 440 browser_status_monitor_.reset(); | 431 browser_status_monitor_.reset(); |
| 441 | 432 |
| 442 // Reset the app window controller here since it has a weak pointer to this. | 433 // Reset the app window controller here since it has a weak pointer to this. |
| 443 app_window_controller_.reset(); | 434 app_window_controller_.reset(); |
| 444 | 435 |
| 445 for (std::set<ash::Shelf*>::iterator iter = shelves_.begin(); | 436 for (std::set<ash::Shelf*>::iterator iter = shelves_.begin(); |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 // Force on-screen keyboard to reset. | 1161 // Force on-screen keyboard to reset. |
| 1171 if (keyboard::IsKeyboardEnabled()) | 1162 if (keyboard::IsKeyboardEnabled()) |
| 1172 ash::Shell::GetInstance()->CreateKeyboard(); | 1163 ash::Shell::GetInstance()->CreateKeyboard(); |
| 1173 } | 1164 } |
| 1174 | 1165 |
| 1175 void ChromeLauncherController::AdditionalUserAddedToSession(Profile* profile) { | 1166 void ChromeLauncherController::AdditionalUserAddedToSession(Profile* profile) { |
| 1176 // Switch the running applications to the new user. | 1167 // Switch the running applications to the new user. |
| 1177 app_window_controller_->AdditionalUserAddedToSession(profile); | 1168 app_window_controller_->AdditionalUserAddedToSession(profile); |
| 1178 } | 1169 } |
| 1179 | 1170 |
| 1180 void ChromeLauncherController::Observe( | 1171 void ChromeLauncherController::OnExtensionLoaded( |
| 1181 int type, | 1172 content::BrowserContext* browser_context, |
| 1182 const content::NotificationSource& source, | 1173 const Extension* extension) { |
| 1183 const content::NotificationDetails& details) { | 1174 if (IsAppPinned(extension->id())) { |
| 1184 switch (type) { | 1175 // Clear and re-fetch to ensure icon is up-to-date. |
| 1185 case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { | 1176 app_icon_loader_->ClearImage(extension->id()); |
| 1186 const Extension* extension = | 1177 app_icon_loader_->FetchImage(extension->id()); |
| 1187 content::Details<const Extension>(details).ptr(); | 1178 } |
| 1188 if (IsAppPinned(extension->id())) { | 1179 |
| 1189 // Clear and re-fetch to ensure icon is up-to-date. | 1180 UpdateAppLaunchersFromPref(); |
| 1190 app_icon_loader_->ClearImage(extension->id()); | 1181 } |
| 1191 app_icon_loader_->FetchImage(extension->id()); | 1182 |
| 1183 void ChromeLauncherController::OnExtensionUnloaded( |
| 1184 content::BrowserContext* browser_context, |
| 1185 const Extension* extension, |
| 1186 UnloadedExtensionInfo::Reason reason) { |
| 1187 const std::string& id = extension->id(); |
| 1188 const Profile* profile = Profile::FromBrowserContext(browser_context); |
| 1189 |
| 1190 // Since we might have windowed apps of this type which might have |
| 1191 // outstanding locks which needs to be removed. |
| 1192 if (GetShelfIDForAppID(id) && |
| 1193 reason == UnloadedExtensionInfo::REASON_UNINSTALL) { |
| 1194 CloseWindowedAppsFromRemovedExtension(id, profile); |
| 1195 } |
| 1196 |
| 1197 if (IsAppPinned(id)) { |
| 1198 if (reason == UnloadedExtensionInfo::REASON_UNINSTALL) { |
| 1199 if (profile == profile_) { |
| 1200 DoUnpinAppWithID(id); |
| 1192 } | 1201 } |
| 1193 | 1202 app_icon_loader_->ClearImage(id); |
| 1194 UpdateAppLaunchersFromPref(); | 1203 } else { |
| 1195 break; | 1204 app_icon_loader_->UpdateImage(id); |
| 1196 } | 1205 } |
| 1197 case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { | |
| 1198 const content::Details<UnloadedExtensionInfo>& unload_info(details); | |
| 1199 const Extension* extension = unload_info->extension; | |
| 1200 const std::string& id = extension->id(); | |
| 1201 // Since we might have windowed apps of this type which might have | |
| 1202 // outstanding locks which needs to be removed. | |
| 1203 if (GetShelfIDForAppID(id) && | |
| 1204 unload_info->reason == UnloadedExtensionInfo::REASON_UNINSTALL) { | |
| 1205 CloseWindowedAppsFromRemovedExtension(id); | |
| 1206 } | |
| 1207 | |
| 1208 if (IsAppPinned(id)) { | |
| 1209 if (unload_info->reason == UnloadedExtensionInfo::REASON_UNINSTALL) { | |
| 1210 DoUnpinAppWithID(id); | |
| 1211 app_icon_loader_->ClearImage(id); | |
| 1212 } else { | |
| 1213 app_icon_loader_->UpdateImage(id); | |
| 1214 } | |
| 1215 } | |
| 1216 break; | |
| 1217 } | |
| 1218 default: | |
| 1219 NOTREACHED() << "Unexpected notification type=" << type; | |
| 1220 } | 1206 } |
| 1221 } | 1207 } |
| 1222 | 1208 |
| 1223 void ChromeLauncherController::OnShelfAlignmentChanged( | 1209 void ChromeLauncherController::OnShelfAlignmentChanged( |
| 1224 aura::Window* root_window) { | 1210 aura::Window* root_window) { |
| 1225 const char* pref_value = NULL; | 1211 const char* pref_value = NULL; |
| 1226 switch (ash::Shell::GetInstance()->GetShelfAlignment(root_window)) { | 1212 switch (ash::Shell::GetInstance()->GetShelfAlignment(root_window)) { |
| 1227 case ash::SHELF_ALIGNMENT_BOTTOM: | 1213 case ash::SHELF_ALIGNMENT_BOTTOM: |
| 1228 pref_value = ash::kShelfAlignmentBottom; | 1214 pref_value = ash::kShelfAlignmentBottom; |
| 1229 break; | 1215 break; |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2010 } | 1996 } |
| 2011 | 1997 |
| 2012 bool ChromeLauncherController::IsIncognito( | 1998 bool ChromeLauncherController::IsIncognito( |
| 2013 const content::WebContents* web_contents) const { | 1999 const content::WebContents* web_contents) const { |
| 2014 const Profile* profile = | 2000 const Profile* profile = |
| 2015 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 2001 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| 2016 return profile->IsOffTheRecord() && !profile->IsGuestSession(); | 2002 return profile->IsOffTheRecord() && !profile->IsGuestSession(); |
| 2017 } | 2003 } |
| 2018 | 2004 |
| 2019 void ChromeLauncherController::CloseWindowedAppsFromRemovedExtension( | 2005 void ChromeLauncherController::CloseWindowedAppsFromRemovedExtension( |
| 2020 const std::string& app_id) { | 2006 const std::string& app_id, |
| 2007 const Profile* profile) { |
| 2021 // This function cannot rely on the controller's enumeration functionality | 2008 // This function cannot rely on the controller's enumeration functionality |
| 2022 // since the extension has already be unloaded. | 2009 // since the extension has already be unloaded. |
| 2023 const BrowserList* ash_browser_list = | 2010 const BrowserList* ash_browser_list = |
| 2024 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH); | 2011 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH); |
| 2025 std::vector<Browser*> browser_to_close; | 2012 std::vector<Browser*> browser_to_close; |
| 2026 for (BrowserList::const_reverse_iterator | 2013 for (BrowserList::const_reverse_iterator |
| 2027 it = ash_browser_list->begin_last_active(); | 2014 it = ash_browser_list->begin_last_active(); |
| 2028 it != ash_browser_list->end_last_active(); ++it) { | 2015 it != ash_browser_list->end_last_active(); ++it) { |
| 2029 Browser* browser = *it; | 2016 Browser* browser = *it; |
| 2030 if (!browser->is_type_tabbed() && | 2017 if (!browser->is_type_tabbed() && browser->is_type_popup() && |
| 2031 browser->is_type_popup() && | |
| 2032 browser->is_app() && | 2018 browser->is_app() && |
| 2033 app_id == web_app::GetExtensionIdFromApplicationName( | 2019 app_id == |
| 2034 browser->app_name())) { | 2020 web_app::GetExtensionIdFromApplicationName(browser->app_name()) && |
| 2021 profile == browser->profile()) { |
| 2035 browser_to_close.push_back(browser); | 2022 browser_to_close.push_back(browser); |
| 2036 } | 2023 } |
| 2037 } | 2024 } |
| 2038 while (!browser_to_close.empty()) { | 2025 while (!browser_to_close.empty()) { |
| 2039 TabStripModel* tab_strip = browser_to_close.back()->tab_strip_model(); | 2026 TabStripModel* tab_strip = browser_to_close.back()->tab_strip_model(); |
| 2040 tab_strip->CloseWebContentsAt(0, TabStripModel::CLOSE_NONE); | 2027 tab_strip->CloseWebContentsAt(0, TabStripModel::CLOSE_NONE); |
| 2041 browser_to_close.pop_back(); | 2028 browser_to_close.pop_back(); |
| 2042 } | 2029 } |
| 2043 } | 2030 } |
| 2044 | 2031 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2085 pref_change_registrar_.Add( | 2072 pref_change_registrar_.Add( |
| 2086 prefs::kShelfPreferences, | 2073 prefs::kShelfPreferences, |
| 2087 base::Bind(&ChromeLauncherController::SetShelfBehaviorsFromPrefs, | 2074 base::Bind(&ChromeLauncherController::SetShelfBehaviorsFromPrefs, |
| 2088 base::Unretained(this))); | 2075 base::Unretained(this))); |
| 2089 #if defined(OS_CHROMEOS) | 2076 #if defined(OS_CHROMEOS) |
| 2090 pref_change_registrar_.Add( | 2077 pref_change_registrar_.Add( |
| 2091 prefs::kTouchVirtualKeyboardEnabled, | 2078 prefs::kTouchVirtualKeyboardEnabled, |
| 2092 base::Bind(&ChromeLauncherController::SetVirtualKeyboardBehaviorFromPrefs, | 2079 base::Bind(&ChromeLauncherController::SetVirtualKeyboardBehaviorFromPrefs, |
| 2093 base::Unretained(this))); | 2080 base::Unretained(this))); |
| 2094 #endif // defined(OS_CHROMEOS) | 2081 #endif // defined(OS_CHROMEOS) |
| 2082 |
| 2083 extensions::ExtensionRegistry::Get(profile_)->AddObserver(this); |
| 2095 } | 2084 } |
| 2096 | 2085 |
| 2097 void ChromeLauncherController::ReleaseProfile() { | 2086 void ChromeLauncherController::ReleaseProfile() { |
| 2098 if (app_sync_ui_state_) | 2087 if (app_sync_ui_state_) |
| 2099 app_sync_ui_state_->RemoveObserver(this); | 2088 app_sync_ui_state_->RemoveObserver(this); |
| 2100 | 2089 |
| 2090 extensions::ExtensionRegistry::Get(profile_)->RemoveObserver(this); |
| 2091 |
| 2101 PrefServiceSyncable::FromProfile(profile_)->RemoveObserver(this); | 2092 PrefServiceSyncable::FromProfile(profile_)->RemoveObserver(this); |
| 2102 | 2093 |
| 2103 pref_change_registrar_.RemoveAll(); | 2094 pref_change_registrar_.RemoveAll(); |
| 2104 } | 2095 } |
| OLD | NEW |