OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_per_app.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_per_app.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/launcher/launcher.h" | 10 #include "ash/launcher/launcher.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 #include "chrome/browser/ui/extensions/extension_enable_flow.h" | 54 #include "chrome/browser/ui/extensions/extension_enable_flow.h" |
55 #include "chrome/browser/ui/host_desktop.h" | 55 #include "chrome/browser/ui/host_desktop.h" |
56 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 56 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
57 #include "chrome/browser/web_applications/web_app.h" | 57 #include "chrome/browser/web_applications/web_app.h" |
58 #include "chrome/common/chrome_switches.h" | 58 #include "chrome/common/chrome_switches.h" |
59 #include "chrome/common/extensions/extension.h" | 59 #include "chrome/common/extensions/extension.h" |
60 #include "chrome/common/extensions/manifest_handlers/icons_handler.h" | 60 #include "chrome/common/extensions/manifest_handlers/icons_handler.h" |
61 #include "chrome/common/pref_names.h" | 61 #include "chrome/common/pref_names.h" |
62 #include "chrome/common/url_constants.h" | 62 #include "chrome/common/url_constants.h" |
63 #include "content/public/browser/navigation_entry.h" | 63 #include "content/public/browser/navigation_entry.h" |
| 64 #include "content/public/browser/notification_registrar.h" |
64 #include "content/public/browser/notification_service.h" | 65 #include "content/public/browser/notification_service.h" |
65 #include "content/public/browser/web_contents.h" | 66 #include "content/public/browser/web_contents.h" |
66 #include "extensions/common/extension_resource.h" | 67 #include "extensions/common/extension_resource.h" |
67 #include "extensions/common/url_pattern.h" | 68 #include "extensions/common/url_pattern.h" |
68 #include "grit/ash_resources.h" | 69 #include "grit/ash_resources.h" |
69 #include "grit/chromium_strings.h" | 70 #include "grit/chromium_strings.h" |
70 #include "grit/generated_resources.h" | 71 #include "grit/generated_resources.h" |
71 #include "grit/theme_resources.h" | 72 #include "grit/theme_resources.h" |
72 #include "grit/ui_resources.h" | 73 #include "grit/ui_resources.h" |
73 #include "ui/aura/root_window.h" | 74 #include "ui/aura/root_window.h" |
74 #include "ui/aura/window.h" | 75 #include "ui/aura/window.h" |
75 #include "ui/base/l10n/l10n_util.h" | 76 #include "ui/base/l10n/l10n_util.h" |
76 #include "ui/views/corewm/window_animations.h" | 77 #include "ui/views/corewm/window_animations.h" |
77 | 78 |
78 #if defined(OS_CHROMEOS) | 79 #if defined(OS_CHROMEOS) |
79 #include "chrome/browser/chromeos/login/default_pinned_apps_field_trial.h" | 80 #include "chrome/browser/chromeos/login/default_pinned_apps_field_trial.h" |
80 #endif | 81 #endif |
81 | 82 |
82 using extensions::Extension; | 83 using extensions::Extension; |
83 using extension_misc::kGmailAppId; | 84 using extension_misc::kGmailAppId; |
84 using content::WebContents; | 85 using content::WebContents; |
85 | 86 |
| 87 // static |
| 88 ChromeLauncherController* ChromeLauncherController::instance_ = NULL; |
| 89 |
86 namespace { | 90 namespace { |
87 | 91 |
88 std::string GetPrefKeyForRootWindow(aura::RootWindow* root_window) { | 92 std::string GetPrefKeyForRootWindow(aura::RootWindow* root_window) { |
89 gfx::Display display = gfx::Screen::GetScreenFor( | 93 gfx::Display display = gfx::Screen::GetScreenFor( |
90 root_window)->GetDisplayNearestWindow(root_window); | 94 root_window)->GetDisplayNearestWindow(root_window); |
91 DCHECK(display.is_valid()); | 95 DCHECK(display.is_valid()); |
92 | 96 |
93 return base::Int64ToString(display.id()); | 97 return base::Int64ToString(display.id()); |
94 } | 98 } |
95 | 99 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 if (!pref_service->FindPreference(local_path)->HasUserSetting() && | 183 if (!pref_service->FindPreference(local_path)->HasUserSetting() && |
180 pref_service->IsSyncing()) { | 184 pref_service->IsSyncing()) { |
181 // First time the user is using this machine, propagate from remote to | 185 // First time the user is using this machine, propagate from remote to |
182 // local. | 186 // local. |
183 pref_service->SetString(local_path, pref_service->GetString(synced_path)); | 187 pref_service->SetString(local_path, pref_service->GetString(synced_path)); |
184 } | 188 } |
185 } | 189 } |
186 | 190 |
187 } // namespace | 191 } // namespace |
188 | 192 |
189 ChromeLauncherControllerPerApp::ChromeLauncherControllerPerApp( | 193 ChromeLauncherController::ChromeLauncherController( |
190 Profile* profile, | 194 Profile* profile, |
191 ash::LauncherModel* model) | 195 ash::LauncherModel* model) |
192 : model_(model), | 196 : model_(model), |
193 profile_(profile), | 197 profile_(profile), |
194 app_sync_ui_state_(NULL), | 198 app_sync_ui_state_(NULL), |
195 ignore_persist_pinned_state_change_(false) { | 199 ignore_persist_pinned_state_change_(false) { |
196 if (!profile_) { | 200 if (!profile_) { |
197 // Use the original profile as on chromeos we may get a temporary off the | 201 // Use the original profile as on chromeos we may get a temporary off the |
198 // record profile. | 202 // record profile. |
199 profile_ = ProfileManager::GetDefaultProfile()->GetOriginalProfile(); | 203 profile_ = ProfileManager::GetDefaultProfile()->GetOriginalProfile(); |
(...skipping 17 matching lines...) Expand all Loading... |
217 | 221 |
218 notification_registrar_.Add(this, | 222 notification_registrar_.Add(this, |
219 chrome::NOTIFICATION_EXTENSION_LOADED, | 223 chrome::NOTIFICATION_EXTENSION_LOADED, |
220 content::Source<Profile>(profile_)); | 224 content::Source<Profile>(profile_)); |
221 notification_registrar_.Add(this, | 225 notification_registrar_.Add(this, |
222 chrome::NOTIFICATION_EXTENSION_UNLOADED, | 226 chrome::NOTIFICATION_EXTENSION_UNLOADED, |
223 content::Source<Profile>(profile_)); | 227 content::Source<Profile>(profile_)); |
224 pref_change_registrar_.Init(profile_->GetPrefs()); | 228 pref_change_registrar_.Init(profile_->GetPrefs()); |
225 pref_change_registrar_.Add( | 229 pref_change_registrar_.Add( |
226 prefs::kPinnedLauncherApps, | 230 prefs::kPinnedLauncherApps, |
227 base::Bind(&ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref, | 231 base::Bind(&ChromeLauncherController::UpdateAppLaunchersFromPref, |
228 base::Unretained(this))); | 232 base::Unretained(this))); |
229 pref_change_registrar_.Add( | 233 pref_change_registrar_.Add( |
230 prefs::kShelfAlignmentLocal, | 234 prefs::kShelfAlignmentLocal, |
231 base::Bind(&ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs, | 235 base::Bind(&ChromeLauncherController::SetShelfAlignmentFromPrefs, |
232 base::Unretained(this))); | 236 base::Unretained(this))); |
233 pref_change_registrar_.Add( | 237 pref_change_registrar_.Add( |
234 prefs::kShelfAutoHideBehaviorLocal, | 238 prefs::kShelfAutoHideBehaviorLocal, |
235 base::Bind(&ChromeLauncherControllerPerApp:: | 239 base::Bind(&ChromeLauncherController:: |
236 SetShelfAutoHideBehaviorFromPrefs, | 240 SetShelfAutoHideBehaviorFromPrefs, |
237 base::Unretained(this))); | 241 base::Unretained(this))); |
238 pref_change_registrar_.Add( | 242 pref_change_registrar_.Add( |
239 prefs::kShelfPreferences, | 243 prefs::kShelfPreferences, |
240 base::Bind(&ChromeLauncherControllerPerApp::SetShelfBehaviorsFromPrefs, | 244 base::Bind(&ChromeLauncherController::SetShelfBehaviorsFromPrefs, |
241 base::Unretained(this))); | 245 base::Unretained(this))); |
242 } | 246 } |
243 | 247 |
244 ChromeLauncherControllerPerApp::~ChromeLauncherControllerPerApp() { | 248 ChromeLauncherController::~ChromeLauncherController() { |
245 // Reset the shell window controller here since it has a weak pointer to this. | 249 // Reset the shell window controller here since it has a weak pointer to this. |
246 shell_window_controller_.reset(); | 250 shell_window_controller_.reset(); |
247 | 251 |
248 for (std::set<ash::Launcher*>::iterator iter = launchers_.begin(); | 252 for (std::set<ash::Launcher*>::iterator iter = launchers_.begin(); |
249 iter != launchers_.end(); | 253 iter != launchers_.end(); |
250 ++iter) | 254 ++iter) |
251 (*iter)->shelf_widget()->shelf_layout_manager()->RemoveObserver(this); | 255 (*iter)->shelf_widget()->shelf_layout_manager()->RemoveObserver(this); |
252 | 256 |
253 model_->RemoveObserver(this); | 257 model_->RemoveObserver(this); |
254 BrowserList::RemoveObserver(this); | 258 BrowserList::RemoveObserver(this); |
(...skipping 13 matching lines...) Expand all Loading... |
268 model_->RemoveItemAt(index); | 272 model_->RemoveItemAt(index); |
269 } | 273 } |
270 | 274 |
271 if (ash::Shell::HasInstance()) | 275 if (ash::Shell::HasInstance()) |
272 ash::Shell::GetInstance()->RemoveShellObserver(this); | 276 ash::Shell::GetInstance()->RemoveShellObserver(this); |
273 | 277 |
274 if (app_sync_ui_state_) | 278 if (app_sync_ui_state_) |
275 app_sync_ui_state_->RemoveObserver(this); | 279 app_sync_ui_state_->RemoveObserver(this); |
276 | 280 |
277 PrefServiceSyncable::FromProfile(profile_)->RemoveObserver(this); | 281 PrefServiceSyncable::FromProfile(profile_)->RemoveObserver(this); |
| 282 |
| 283 if (instance_ == this) |
| 284 instance_ = NULL; |
278 } | 285 } |
279 | 286 |
280 void ChromeLauncherControllerPerApp::Init() { | 287 // static |
| 288 ChromeLauncherController* ChromeLauncherController::CreateInstance( |
| 289 Profile* profile, |
| 290 ash::LauncherModel* model) { |
| 291 // We do not check here for re-creation of the ChromeLauncherController since |
| 292 // it appears that it might be intentional that the ChromeLauncherController |
| 293 // can be re-created. |
| 294 instance_ = new ChromeLauncherController(profile, model); |
| 295 return instance_; |
| 296 } |
| 297 |
| 298 void ChromeLauncherController::Init() { |
281 UpdateAppLaunchersFromPref(); | 299 UpdateAppLaunchersFromPref(); |
282 CreateBrowserShortcutLauncherItem(); | 300 CreateBrowserShortcutLauncherItem(); |
283 | 301 |
284 // TODO(sky): update unit test so that this test isn't necessary. | 302 // TODO(sky): update unit test so that this test isn't necessary. |
285 if (ash::Shell::HasInstance()) { | 303 if (ash::Shell::HasInstance()) { |
286 SetShelfAutoHideBehaviorFromPrefs(); | 304 SetShelfAutoHideBehaviorFromPrefs(); |
287 SetShelfAlignmentFromPrefs(); | 305 SetShelfAlignmentFromPrefs(); |
288 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); | 306 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); |
289 if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() || | 307 if (!prefs->FindPreference(prefs::kShelfAlignmentLocal)->HasUserSetting() || |
290 !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)-> | 308 !prefs->FindPreference(prefs::kShelfAutoHideBehaviorLocal)-> |
291 HasUserSetting()) { | 309 HasUserSetting()) { |
292 // This causes OnIsSyncingChanged to be called when the value of | 310 // This causes OnIsSyncingChanged to be called when the value of |
293 // PrefService::IsSyncing() changes. | 311 // PrefService::IsSyncing() changes. |
294 prefs->AddObserver(this); | 312 prefs->AddObserver(this); |
295 } | 313 } |
296 ash::Shell::GetInstance()->AddShellObserver(this); | 314 ash::Shell::GetInstance()->AddShellObserver(this); |
297 } | 315 } |
298 } | 316 } |
299 | 317 |
300 ChromeLauncherControllerPerApp* | 318 ash::LauncherID ChromeLauncherController::CreateAppLauncherItem( |
301 ChromeLauncherControllerPerApp::GetPerAppInterface() { | |
302 return this; | |
303 } | |
304 | |
305 ash::LauncherID ChromeLauncherControllerPerApp::CreateTabbedLauncherItem( | |
306 LauncherItemController* controller, | |
307 IncognitoState is_incognito, | |
308 ash::LauncherItemStatus status) { | |
309 // The PerAppLauncher doesn't need an empty slot for TabbedLauncherItem and | |
310 // its LauncherItemController. | |
311 // TODO(skuhne): Remove function when PerBrowser launcher gets removed. | |
312 return 0; | |
313 } | |
314 | |
315 ash::LauncherID ChromeLauncherControllerPerApp::CreateAppLauncherItem( | |
316 LauncherItemController* controller, | 319 LauncherItemController* controller, |
317 const std::string& app_id, | 320 const std::string& app_id, |
318 ash::LauncherItemStatus status) { | 321 ash::LauncherItemStatus status) { |
319 CHECK(controller); | 322 CHECK(controller); |
320 int index = 0; | 323 int index = 0; |
321 // Panels are inserted on the left so as not to push all existing panels over. | 324 // Panels are inserted on the left so as not to push all existing panels over. |
322 if (controller->GetLauncherItemType() != ash::TYPE_APP_PANEL) { | 325 if (controller->GetLauncherItemType() != ash::TYPE_APP_PANEL) { |
323 index = model_->item_count(); | 326 index = model_->item_count(); |
324 // For the alternate shelf layout increment the index (after the app icon) | 327 // For the alternate shelf layout increment the index (after the app icon) |
325 if (ash::switches::UseAlternateShelfLayout()) | 328 if (ash::switches::UseAlternateShelfLayout()) |
326 ++index; | 329 ++index; |
327 } | 330 } |
328 return InsertAppLauncherItem(controller, | 331 return InsertAppLauncherItem(controller, |
329 app_id, | 332 app_id, |
330 status, | 333 status, |
331 index, | 334 index, |
332 controller->GetLauncherItemType()); | 335 controller->GetLauncherItemType()); |
333 } | 336 } |
334 | 337 |
335 void ChromeLauncherControllerPerApp::SetItemStatus( | 338 void ChromeLauncherController::SetItemStatus( |
336 ash::LauncherID id, | 339 ash::LauncherID id, |
337 ash::LauncherItemStatus status) { | 340 ash::LauncherItemStatus status) { |
338 int index = model_->ItemIndexByID(id); | 341 int index = model_->ItemIndexByID(id); |
339 // Since ordinary browser windows are not registered, we might get a negative | 342 // Since ordinary browser windows are not registered, we might get a negative |
340 // index here. | 343 // index here. |
341 if (index >= 0) { | 344 if (index >= 0) { |
342 ash::LauncherItem item = model_->items()[index]; | 345 ash::LauncherItem item = model_->items()[index]; |
343 item.status = status; | 346 item.status = status; |
344 model_->Set(index, item); | 347 model_->Set(index, item); |
345 | 348 |
346 if (model_->items()[index].type == ash::TYPE_BROWSER_SHORTCUT) | 349 if (model_->items()[index].type == ash::TYPE_BROWSER_SHORTCUT) |
347 return; | 350 return; |
348 } | 351 } |
349 UpdateBrowserItemStatus(); | 352 UpdateBrowserItemStatus(); |
350 } | 353 } |
351 | 354 |
352 void ChromeLauncherControllerPerApp::SetItemController( | 355 void ChromeLauncherController::SetItemController( |
353 ash::LauncherID id, | 356 ash::LauncherID id, |
354 LauncherItemController* controller) { | 357 LauncherItemController* controller) { |
355 CHECK(controller); | 358 CHECK(controller); |
356 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 359 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
357 CHECK(iter != id_to_item_controller_map_.end()); | 360 CHECK(iter != id_to_item_controller_map_.end()); |
358 iter->second->OnRemoved(); | 361 iter->second->OnRemoved(); |
359 iter->second = controller; | 362 iter->second = controller; |
360 controller->set_launcher_id(id); | 363 controller->set_launcher_id(id); |
361 } | 364 } |
362 | 365 |
363 void ChromeLauncherControllerPerApp::CloseLauncherItem(ash::LauncherID id) { | 366 void ChromeLauncherController::CloseLauncherItem(ash::LauncherID id) { |
364 CHECK(id); | 367 CHECK(id); |
365 if (IsPinned(id)) { | 368 if (IsPinned(id)) { |
366 // Create a new shortcut controller. | 369 // Create a new shortcut controller. |
367 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 370 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
368 CHECK(iter != id_to_item_controller_map_.end()); | 371 CHECK(iter != id_to_item_controller_map_.end()); |
369 SetItemStatus(id, ash::STATUS_CLOSED); | 372 SetItemStatus(id, ash::STATUS_CLOSED); |
370 std::string app_id = iter->second->app_id(); | 373 std::string app_id = iter->second->app_id(); |
371 iter->second->OnRemoved(); | 374 iter->second->OnRemoved(); |
372 iter->second = new AppShortcutLauncherItemController(app_id, this); | 375 iter->second = new AppShortcutLauncherItemController(app_id, this); |
373 iter->second->set_launcher_id(id); | 376 iter->second->set_launcher_id(id); |
374 } else { | 377 } else { |
375 LauncherItemClosed(id); | 378 LauncherItemClosed(id); |
376 } | 379 } |
377 } | 380 } |
378 | 381 |
379 void ChromeLauncherControllerPerApp::Pin(ash::LauncherID id) { | 382 void ChromeLauncherController::Pin(ash::LauncherID id) { |
380 DCHECK(HasItemController(id)); | 383 DCHECK(HasItemController(id)); |
381 | 384 |
382 int index = model_->ItemIndexByID(id); | 385 int index = model_->ItemIndexByID(id); |
383 DCHECK_GE(index, 0); | 386 DCHECK_GE(index, 0); |
384 | 387 |
385 ash::LauncherItem item = model_->items()[index]; | 388 ash::LauncherItem item = model_->items()[index]; |
386 | 389 |
387 if (item.type == ash::TYPE_PLATFORM_APP || | 390 if (item.type == ash::TYPE_PLATFORM_APP || |
388 item.type == ash::TYPE_WINDOWED_APP) { | 391 item.type == ash::TYPE_WINDOWED_APP) { |
389 item.type = ash::TYPE_APP_SHORTCUT; | 392 item.type = ash::TYPE_APP_SHORTCUT; |
390 model_->Set(index, item); | 393 model_->Set(index, item); |
391 } else if (item.type != ash::TYPE_APP_SHORTCUT) { | 394 } else if (item.type != ash::TYPE_APP_SHORTCUT) { |
392 return; | 395 return; |
393 } | 396 } |
394 | 397 |
395 if (CanPin()) | 398 if (CanPin()) |
396 PersistPinnedState(); | 399 PersistPinnedState(); |
397 } | 400 } |
398 | 401 |
399 void ChromeLauncherControllerPerApp::Unpin(ash::LauncherID id) { | 402 void ChromeLauncherController::Unpin(ash::LauncherID id) { |
400 DCHECK(HasItemController(id)); | 403 DCHECK(HasItemController(id)); |
401 | 404 |
402 LauncherItemController* controller = id_to_item_controller_map_[id]; | 405 LauncherItemController* controller = id_to_item_controller_map_[id]; |
403 if (controller->type() == LauncherItemController::TYPE_APP) { | 406 if (controller->type() == LauncherItemController::TYPE_APP) { |
404 int index = model_->ItemIndexByID(id); | 407 int index = model_->ItemIndexByID(id); |
405 DCHECK_GE(index, 0); | 408 DCHECK_GE(index, 0); |
406 ash::LauncherItem item = model_->items()[index]; | 409 ash::LauncherItem item = model_->items()[index]; |
407 item.type = ash::TYPE_PLATFORM_APP; | 410 item.type = ash::TYPE_PLATFORM_APP; |
408 model_->Set(index, item); | 411 model_->Set(index, item); |
409 } else { | 412 } else { |
410 // Prevent the removal of items upon unpin if it is locked by a running | 413 // Prevent the removal of items upon unpin if it is locked by a running |
411 // windowed V1 app. | 414 // windowed V1 app. |
412 if (!controller->locked()) { | 415 if (!controller->locked()) { |
413 LauncherItemClosed(id); | 416 LauncherItemClosed(id); |
414 } else { | 417 } else { |
415 int index = model_->ItemIndexByID(id); | 418 int index = model_->ItemIndexByID(id); |
416 DCHECK_GE(index, 0); | 419 DCHECK_GE(index, 0); |
417 ash::LauncherItem item = model_->items()[index]; | 420 ash::LauncherItem item = model_->items()[index]; |
418 item.type = ash::TYPE_WINDOWED_APP; | 421 item.type = ash::TYPE_WINDOWED_APP; |
419 model_->Set(index, item); | 422 model_->Set(index, item); |
420 } | 423 } |
421 } | 424 } |
422 if (CanPin()) | 425 if (CanPin()) |
423 PersistPinnedState(); | 426 PersistPinnedState(); |
424 } | 427 } |
425 | 428 |
426 bool ChromeLauncherControllerPerApp::IsPinned(ash::LauncherID id) { | 429 bool ChromeLauncherController::IsPinned(ash::LauncherID id) { |
427 int index = model_->ItemIndexByID(id); | 430 int index = model_->ItemIndexByID(id); |
428 if (index < 0) | 431 if (index < 0) |
429 return false; | 432 return false; |
430 ash::LauncherItemType type = model_->items()[index].type; | 433 ash::LauncherItemType type = model_->items()[index].type; |
431 return (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_BROWSER_SHORTCUT); | 434 return (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_BROWSER_SHORTCUT); |
432 } | 435 } |
433 | 436 |
434 void ChromeLauncherControllerPerApp::TogglePinned(ash::LauncherID id) { | 437 void ChromeLauncherController::TogglePinned(ash::LauncherID id) { |
435 if (!HasItemController(id)) | 438 if (!HasItemController(id)) |
436 return; // May happen if item closed with menu open. | 439 return; // May happen if item closed with menu open. |
437 | 440 |
438 if (IsPinned(id)) | 441 if (IsPinned(id)) |
439 Unpin(id); | 442 Unpin(id); |
440 else | 443 else |
441 Pin(id); | 444 Pin(id); |
442 } | 445 } |
443 | 446 |
444 bool ChromeLauncherControllerPerApp::IsPinnable(ash::LauncherID id) const { | 447 bool ChromeLauncherController::IsPinnable(ash::LauncherID id) const { |
445 int index = model_->ItemIndexByID(id); | 448 int index = model_->ItemIndexByID(id); |
446 if (index == -1) | 449 if (index == -1) |
447 return false; | 450 return false; |
448 | 451 |
449 ash::LauncherItemType type = model_->items()[index].type; | 452 ash::LauncherItemType type = model_->items()[index].type; |
450 return ((type == ash::TYPE_APP_SHORTCUT || | 453 return ((type == ash::TYPE_APP_SHORTCUT || |
451 type == ash::TYPE_PLATFORM_APP || | 454 type == ash::TYPE_PLATFORM_APP || |
452 type == ash::TYPE_WINDOWED_APP) && | 455 type == ash::TYPE_WINDOWED_APP) && |
453 CanPin()); | 456 CanPin()); |
454 } | 457 } |
455 | 458 |
456 void ChromeLauncherControllerPerApp::LockV1AppWithID( | 459 void ChromeLauncherController::LockV1AppWithID( |
457 const std::string& app_id) { | 460 const std::string& app_id) { |
458 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 461 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
459 if (!IsPinned(id) && !IsWindowedAppInLauncher(app_id)) { | 462 if (!IsPinned(id) && !IsWindowedAppInLauncher(app_id)) { |
460 CreateAppShortcutLauncherItemWithType(app_id, | 463 CreateAppShortcutLauncherItemWithType(app_id, |
461 model_->item_count(), | 464 model_->item_count(), |
462 ash::TYPE_WINDOWED_APP); | 465 ash::TYPE_WINDOWED_APP); |
463 id = GetLauncherIDForAppID(app_id); | 466 id = GetLauncherIDForAppID(app_id); |
464 } | 467 } |
465 CHECK(id); | 468 CHECK(id); |
466 id_to_item_controller_map_[id]->lock(); | 469 id_to_item_controller_map_[id]->lock(); |
467 } | 470 } |
468 | 471 |
469 void ChromeLauncherControllerPerApp::UnlockV1AppWithID( | 472 void ChromeLauncherController::UnlockV1AppWithID( |
470 const std::string& app_id) { | 473 const std::string& app_id) { |
471 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 474 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
472 CHECK(IsPinned(id) || IsWindowedAppInLauncher(app_id)); | 475 CHECK(IsPinned(id) || IsWindowedAppInLauncher(app_id)); |
473 CHECK(id); | 476 CHECK(id); |
474 LauncherItemController* controller = id_to_item_controller_map_[id]; | 477 LauncherItemController* controller = id_to_item_controller_map_[id]; |
475 controller->unlock(); | 478 controller->unlock(); |
476 if (!controller->locked() && !IsPinned(id)) | 479 if (!controller->locked() && !IsPinned(id)) |
477 CloseLauncherItem(id); | 480 CloseLauncherItem(id); |
478 } | 481 } |
479 | 482 |
480 void ChromeLauncherControllerPerApp::Launch(ash::LauncherID id, | 483 void ChromeLauncherController::Launch(ash::LauncherID id, |
481 int event_flags) { | 484 int event_flags) { |
482 if (!HasItemController(id)) | 485 if (!HasItemController(id)) |
483 return; // In case invoked from menu and item closed while menu up. | 486 return; // In case invoked from menu and item closed while menu up. |
484 id_to_item_controller_map_[id]->Launch(event_flags); | 487 id_to_item_controller_map_[id]->Launch(event_flags); |
485 } | 488 } |
486 | 489 |
487 void ChromeLauncherControllerPerApp::Close(ash::LauncherID id) { | 490 void ChromeLauncherController::Close(ash::LauncherID id) { |
488 if (!HasItemController(id)) | 491 if (!HasItemController(id)) |
489 return; // May happen if menu closed. | 492 return; // May happen if menu closed. |
490 id_to_item_controller_map_[id]->Close(); | 493 id_to_item_controller_map_[id]->Close(); |
491 } | 494 } |
492 | 495 |
493 bool ChromeLauncherControllerPerApp::IsOpen(ash::LauncherID id) { | 496 bool ChromeLauncherController::IsOpen(ash::LauncherID id) { |
494 if (!HasItemController(id)) | 497 if (!HasItemController(id)) |
495 return false; | 498 return false; |
496 return id_to_item_controller_map_[id]->IsOpen(); | 499 return id_to_item_controller_map_[id]->IsOpen(); |
497 } | 500 } |
498 | 501 |
499 bool ChromeLauncherControllerPerApp::IsPlatformApp(ash::LauncherID id) { | 502 bool ChromeLauncherController::IsPlatformApp(ash::LauncherID id) { |
500 if (!HasItemController(id)) | 503 if (!HasItemController(id)) |
501 return false; | 504 return false; |
502 | 505 |
503 std::string app_id = GetAppIDForLauncherID(id); | 506 std::string app_id = GetAppIDForLauncherID(id); |
504 const Extension* extension = GetExtensionForAppID(app_id); | 507 const Extension* extension = GetExtensionForAppID(app_id); |
505 // An extension can be synced / updated at any time and therefore not be | 508 // An extension can be synced / updated at any time and therefore not be |
506 // available. | 509 // available. |
507 return extension ? extension->is_platform_app() : false; | 510 return extension ? extension->is_platform_app() : false; |
508 } | 511 } |
509 | 512 |
510 void ChromeLauncherControllerPerApp::LaunchApp(const std::string& app_id, | 513 void ChromeLauncherController::LaunchApp(const std::string& app_id, |
511 int event_flags) { | 514 int event_flags) { |
512 // |extension| could be NULL when it is being unloaded for updating. | 515 // |extension| could be NULL when it is being unloaded for updating. |
513 const Extension* extension = GetExtensionForAppID(app_id); | 516 const Extension* extension = GetExtensionForAppID(app_id); |
514 if (!extension) | 517 if (!extension) |
515 return; | 518 return; |
516 | 519 |
517 const ExtensionService* service = | 520 const ExtensionService* service = |
518 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 521 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
519 if (!service->IsExtensionEnabledForLauncher(app_id)) { | 522 if (!service->IsExtensionEnabledForLauncher(app_id)) { |
520 // Do nothing if there is already a running enable flow. | 523 // Do nothing if there is already a running enable flow. |
521 if (extension_enable_flow_) | 524 if (extension_enable_flow_) |
522 return; | 525 return; |
523 | 526 |
524 extension_enable_flow_.reset( | 527 extension_enable_flow_.reset( |
525 new ExtensionEnableFlow(profile_, app_id, this)); | 528 new ExtensionEnableFlow(profile_, app_id, this)); |
526 extension_enable_flow_->StartForNativeWindow(NULL); | 529 extension_enable_flow_->StartForNativeWindow(NULL); |
527 return; | 530 return; |
528 } | 531 } |
529 | 532 |
530 chrome::OpenApplication(chrome::AppLaunchParams(GetProfileForNewWindows(), | 533 chrome::OpenApplication(chrome::AppLaunchParams(GetProfileForNewWindows(), |
531 extension, | 534 extension, |
532 event_flags)); | 535 event_flags)); |
533 } | 536 } |
534 | 537 |
535 void ChromeLauncherControllerPerApp::ActivateApp(const std::string& app_id, | 538 void ChromeLauncherController::ActivateApp(const std::string& app_id, |
536 int event_flags) { | 539 int event_flags) { |
537 // If there is an existing non-shortcut controller for this app, open it. | 540 // If there is an existing non-shortcut controller for this app, open it. |
538 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 541 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
539 if (id) { | 542 if (id) { |
540 LauncherItemController* controller = id_to_item_controller_map_[id]; | 543 LauncherItemController* controller = id_to_item_controller_map_[id]; |
541 controller->Activate(); | 544 controller->Activate(); |
542 return; | 545 return; |
543 } | 546 } |
544 | 547 |
545 // Create a temporary application launcher item and use it to see if there are | 548 // Create a temporary application launcher item and use it to see if there are |
546 // running instances. | 549 // running instances. |
547 scoped_ptr<AppShortcutLauncherItemController> app_controller( | 550 scoped_ptr<AppShortcutLauncherItemController> app_controller( |
548 new AppShortcutLauncherItemController(app_id, this)); | 551 new AppShortcutLauncherItemController(app_id, this)); |
549 if (!app_controller->GetRunningApplications().empty()) | 552 if (!app_controller->GetRunningApplications().empty()) |
550 app_controller->Activate(); | 553 app_controller->Activate(); |
551 else | 554 else |
552 LaunchApp(app_id, event_flags); | 555 LaunchApp(app_id, event_flags); |
553 } | 556 } |
554 | 557 |
555 extensions::ExtensionPrefs::LaunchType | 558 extensions::ExtensionPrefs::LaunchType |
556 ChromeLauncherControllerPerApp::GetLaunchType(ash::LauncherID id) { | 559 ChromeLauncherController::GetLaunchType(ash::LauncherID id) { |
557 DCHECK(HasItemController(id)); | 560 DCHECK(HasItemController(id)); |
558 | 561 |
559 const Extension* extension = GetExtensionForAppID( | 562 const Extension* extension = GetExtensionForAppID( |
560 id_to_item_controller_map_[id]->app_id()); | 563 id_to_item_controller_map_[id]->app_id()); |
561 | 564 |
562 // An extension can be unloaded/updated/unavailable at any time. | 565 // An extension can be unloaded/updated/unavailable at any time. |
563 if (!extension) | 566 if (!extension) |
564 return extensions::ExtensionPrefs::LAUNCH_DEFAULT; | 567 return extensions::ExtensionPrefs::LAUNCH_DEFAULT; |
565 | 568 |
566 return profile_->GetExtensionService()->extension_prefs()->GetLaunchType( | 569 return profile_->GetExtensionService()->extension_prefs()->GetLaunchType( |
567 extension, | 570 extension, |
568 extensions::ExtensionPrefs::LAUNCH_DEFAULT); | 571 extensions::ExtensionPrefs::LAUNCH_DEFAULT); |
569 } | 572 } |
570 | 573 |
571 std::string ChromeLauncherControllerPerApp::GetAppID( | 574 std::string ChromeLauncherController::GetAppID(content::WebContents* tab) { |
572 content::WebContents* tab) { | |
573 return app_tab_helper_->GetAppID(tab); | 575 return app_tab_helper_->GetAppID(tab); |
574 } | 576 } |
575 | 577 |
576 ash::LauncherID ChromeLauncherControllerPerApp::GetLauncherIDForAppID( | 578 ash::LauncherID ChromeLauncherController::GetLauncherIDForAppID( |
577 const std::string& app_id) { | 579 const std::string& app_id) { |
578 for (IDToItemControllerMap::const_iterator i = | 580 for (IDToItemControllerMap::const_iterator i = |
579 id_to_item_controller_map_.begin(); | 581 id_to_item_controller_map_.begin(); |
580 i != id_to_item_controller_map_.end(); ++i) { | 582 i != id_to_item_controller_map_.end(); ++i) { |
581 if (i->second->type() == LauncherItemController::TYPE_APP_PANEL) | 583 if (i->second->type() == LauncherItemController::TYPE_APP_PANEL) |
582 continue; // Don't include panels | 584 continue; // Don't include panels |
583 if (i->second->app_id() == app_id) | 585 if (i->second->app_id() == app_id) |
584 return i->first; | 586 return i->first; |
585 } | 587 } |
586 return 0; | 588 return 0; |
587 } | 589 } |
588 | 590 |
589 std::string ChromeLauncherControllerPerApp::GetAppIDForLauncherID( | 591 std::string ChromeLauncherController::GetAppIDForLauncherID( |
590 ash::LauncherID id) { | 592 ash::LauncherID id) { |
591 CHECK(HasItemController(id)); | 593 CHECK(HasItemController(id)); |
592 return id_to_item_controller_map_[id]->app_id(); | 594 return id_to_item_controller_map_[id]->app_id(); |
593 } | 595 } |
594 | 596 |
595 void ChromeLauncherControllerPerApp::SetAppImage( | 597 void ChromeLauncherController::SetAppImage(const std::string& id, |
596 const std::string& id, | 598 const gfx::ImageSkia& image) { |
597 const gfx::ImageSkia& image) { | |
598 // TODO: need to get this working for shortcuts. | 599 // TODO: need to get this working for shortcuts. |
599 | 600 |
600 for (IDToItemControllerMap::const_iterator i = | 601 for (IDToItemControllerMap::const_iterator i = |
601 id_to_item_controller_map_.begin(); | 602 id_to_item_controller_map_.begin(); |
602 i != id_to_item_controller_map_.end(); ++i) { | 603 i != id_to_item_controller_map_.end(); ++i) { |
603 LauncherItemController* controller = i->second; | 604 LauncherItemController* controller = i->second; |
604 if (controller->app_id() != id) | 605 if (controller->app_id() != id) |
605 continue; | 606 continue; |
606 if (controller->image_set_by_controller()) | 607 if (controller->image_set_by_controller()) |
607 continue; | 608 continue; |
608 int index = model_->ItemIndexByID(i->first); | 609 int index = model_->ItemIndexByID(i->first); |
609 if (index == -1) | 610 if (index == -1) |
610 continue; | 611 continue; |
611 ash::LauncherItem item = model_->items()[index]; | 612 ash::LauncherItem item = model_->items()[index]; |
612 item.image = image; | 613 item.image = image; |
613 model_->Set(index, item); | 614 model_->Set(index, item); |
614 // It's possible we're waiting on more than one item, so don't break. | 615 // It's possible we're waiting on more than one item, so don't break. |
615 } | 616 } |
616 } | 617 } |
617 | 618 |
618 void ChromeLauncherControllerPerApp::OnAutoHideBehaviorChanged( | 619 void ChromeLauncherController::OnAutoHideBehaviorChanged( |
619 aura::RootWindow* root_window, | 620 aura::RootWindow* root_window, |
620 ash::ShelfAutoHideBehavior new_behavior) { | 621 ash::ShelfAutoHideBehavior new_behavior) { |
621 SetShelfAutoHideBehaviorPrefs(new_behavior, root_window); | 622 SetShelfAutoHideBehaviorPrefs(new_behavior, root_window); |
622 } | 623 } |
623 | 624 |
624 void ChromeLauncherControllerPerApp::SetLauncherItemImage( | 625 void ChromeLauncherController::SetLauncherItemImage( |
625 ash::LauncherID launcher_id, | 626 ash::LauncherID launcher_id, |
626 const gfx::ImageSkia& image) { | 627 const gfx::ImageSkia& image) { |
627 int index = model_->ItemIndexByID(launcher_id); | 628 int index = model_->ItemIndexByID(launcher_id); |
628 if (index == -1) | 629 if (index == -1) |
629 return; | 630 return; |
630 ash::LauncherItem item = model_->items()[index]; | 631 ash::LauncherItem item = model_->items()[index]; |
631 item.image = image; | 632 item.image = image; |
632 model_->Set(index, item); | 633 model_->Set(index, item); |
633 } | 634 } |
634 | 635 |
635 bool ChromeLauncherControllerPerApp::IsAppPinned(const std::string& app_id) { | 636 bool ChromeLauncherController::IsAppPinned(const std::string& app_id) { |
636 for (IDToItemControllerMap::const_iterator i = | 637 for (IDToItemControllerMap::const_iterator i = |
637 id_to_item_controller_map_.begin(); | 638 id_to_item_controller_map_.begin(); |
638 i != id_to_item_controller_map_.end(); ++i) { | 639 i != id_to_item_controller_map_.end(); ++i) { |
639 if (IsPinned(i->first) && i->second->app_id() == app_id) | 640 if (IsPinned(i->first) && i->second->app_id() == app_id) |
640 return true; | 641 return true; |
641 } | 642 } |
642 return false; | 643 return false; |
643 } | 644 } |
644 | 645 |
645 bool ChromeLauncherControllerPerApp::IsWindowedAppInLauncher( | 646 bool ChromeLauncherController::IsWindowedAppInLauncher( |
646 const std::string& app_id) { | 647 const std::string& app_id) { |
647 int index = model_->ItemIndexByID(GetLauncherIDForAppID(app_id)); | 648 int index = model_->ItemIndexByID(GetLauncherIDForAppID(app_id)); |
648 if (index < 0) | 649 if (index < 0) |
649 return false; | 650 return false; |
650 | 651 |
651 ash::LauncherItemType type = model_->items()[index].type; | 652 ash::LauncherItemType type = model_->items()[index].type; |
652 return type == ash::TYPE_WINDOWED_APP; | 653 return type == ash::TYPE_WINDOWED_APP; |
653 } | 654 } |
654 | 655 |
655 void ChromeLauncherControllerPerApp::PinAppWithID(const std::string& app_id) { | 656 void ChromeLauncherController::PinAppWithID(const std::string& app_id) { |
656 if (CanPin()) | 657 if (CanPin()) |
657 DoPinAppWithID(app_id); | 658 DoPinAppWithID(app_id); |
658 else | 659 else |
659 NOTREACHED(); | 660 NOTREACHED(); |
660 } | 661 } |
661 | 662 |
662 void ChromeLauncherControllerPerApp::SetLaunchType( | 663 void ChromeLauncherController::SetLaunchType( |
663 ash::LauncherID id, | 664 ash::LauncherID id, |
664 extensions::ExtensionPrefs::LaunchType launch_type) { | 665 extensions::ExtensionPrefs::LaunchType launch_type) { |
665 if (!HasItemController(id)) | 666 if (!HasItemController(id)) |
666 return; | 667 return; |
667 | 668 |
668 profile_->GetExtensionService()->extension_prefs()->SetLaunchType( | 669 profile_->GetExtensionService()->extension_prefs()->SetLaunchType( |
669 id_to_item_controller_map_[id]->app_id(), launch_type); | 670 id_to_item_controller_map_[id]->app_id(), launch_type); |
670 } | 671 } |
671 | 672 |
672 void ChromeLauncherControllerPerApp::UnpinAppsWithID( | 673 void ChromeLauncherController::UnpinAppsWithID(const std::string& app_id) { |
673 const std::string& app_id) { | |
674 if (CanPin()) | 674 if (CanPin()) |
675 DoUnpinAppsWithID(app_id); | 675 DoUnpinAppsWithID(app_id); |
676 else | 676 else |
677 NOTREACHED(); | 677 NOTREACHED(); |
678 } | 678 } |
679 | 679 |
680 bool ChromeLauncherControllerPerApp::IsLoggedInAsGuest() { | 680 bool ChromeLauncherController::IsLoggedInAsGuest() { |
681 return ProfileManager::GetDefaultProfileOrOffTheRecord()->IsOffTheRecord(); | 681 return ProfileManager::GetDefaultProfileOrOffTheRecord()->IsOffTheRecord(); |
682 } | 682 } |
683 | 683 |
684 void ChromeLauncherControllerPerApp::CreateNewWindow() { | 684 void ChromeLauncherController::CreateNewWindow() { |
685 chrome::NewEmptyWindow( | 685 chrome::NewEmptyWindow( |
686 GetProfileForNewWindows(), chrome::HOST_DESKTOP_TYPE_ASH); | 686 GetProfileForNewWindows(), chrome::HOST_DESKTOP_TYPE_ASH); |
687 } | 687 } |
688 | 688 |
689 void ChromeLauncherControllerPerApp::CreateNewIncognitoWindow() { | 689 void ChromeLauncherController::CreateNewIncognitoWindow() { |
690 chrome::NewEmptyWindow(GetProfileForNewWindows()->GetOffTheRecordProfile(), | 690 chrome::NewEmptyWindow(GetProfileForNewWindows()->GetOffTheRecordProfile(), |
691 chrome::HOST_DESKTOP_TYPE_ASH); | 691 chrome::HOST_DESKTOP_TYPE_ASH); |
692 } | 692 } |
693 | 693 |
694 bool ChromeLauncherControllerPerApp::CanPin() const { | 694 bool ChromeLauncherController::CanPin() const { |
695 const PrefService::Preference* pref = | 695 const PrefService::Preference* pref = |
696 profile_->GetPrefs()->FindPreference(prefs::kPinnedLauncherApps); | 696 profile_->GetPrefs()->FindPreference(prefs::kPinnedLauncherApps); |
697 return pref && pref->IsUserModifiable(); | 697 return pref && pref->IsUserModifiable(); |
698 } | 698 } |
699 | 699 |
700 void ChromeLauncherControllerPerApp::PersistPinnedState() { | 700 void ChromeLauncherController::PersistPinnedState() { |
701 if (ignore_persist_pinned_state_change_) | 701 if (ignore_persist_pinned_state_change_) |
702 return; | 702 return; |
703 // It is a coding error to call PersistPinnedState() if the pinned apps are | 703 // It is a coding error to call PersistPinnedState() if the pinned apps are |
704 // not user-editable. The code should check earlier and not perform any | 704 // not user-editable. The code should check earlier and not perform any |
705 // modification actions that trigger persisting the state. | 705 // modification actions that trigger persisting the state. |
706 if (!CanPin()) { | 706 if (!CanPin()) { |
707 NOTREACHED() << "Can't pin but pinned state being updated"; | 707 NOTREACHED() << "Can't pin but pinned state being updated"; |
708 return; | 708 return; |
709 } | 709 } |
710 | 710 |
(...skipping 13 matching lines...) Expand all Loading... |
724 if (app_value) | 724 if (app_value) |
725 updater->Append(app_value); | 725 updater->Append(app_value); |
726 } | 726 } |
727 } else if (model_->items()[i].type == ash::TYPE_BROWSER_SHORTCUT) { | 727 } else if (model_->items()[i].type == ash::TYPE_BROWSER_SHORTCUT) { |
728 PersistChromeItemIndex(i); | 728 PersistChromeItemIndex(i); |
729 } | 729 } |
730 } | 730 } |
731 } | 731 } |
732 pref_change_registrar_.Add( | 732 pref_change_registrar_.Add( |
733 prefs::kPinnedLauncherApps, | 733 prefs::kPinnedLauncherApps, |
734 base::Bind(&ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref, | 734 base::Bind(&ChromeLauncherController::UpdateAppLaunchersFromPref, |
735 base::Unretained(this))); | 735 base::Unretained(this))); |
736 } | 736 } |
737 | 737 |
738 ash::LauncherModel* ChromeLauncherControllerPerApp::model() { | 738 ash::LauncherModel* ChromeLauncherController::model() { |
739 return model_; | 739 return model_; |
740 } | 740 } |
741 | 741 |
742 Profile* ChromeLauncherControllerPerApp::profile() { | 742 Profile* ChromeLauncherController::profile() { |
743 return profile_; | 743 return profile_; |
744 } | 744 } |
745 | 745 |
746 ash::ShelfAutoHideBehavior | 746 ash::ShelfAutoHideBehavior ChromeLauncherController::GetShelfAutoHideBehavior( |
747 ChromeLauncherControllerPerApp::GetShelfAutoHideBehavior( | 747 aura::RootWindow* root_window) const { |
748 aura::RootWindow* root_window) const { | |
749 // Don't show the shelf in app mode. | 748 // Don't show the shelf in app mode. |
750 if (chrome::IsRunningInAppMode()) | 749 if (chrome::IsRunningInAppMode()) |
751 return ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN; | 750 return ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN; |
752 | 751 |
753 // See comment in |kShelfAlignment| as to why we consider two prefs. | 752 // See comment in |kShelfAlignment| as to why we consider two prefs. |
754 const std::string behavior_value( | 753 const std::string behavior_value( |
755 GetPrefForRootWindow(profile_->GetPrefs(), | 754 GetPrefForRootWindow(profile_->GetPrefs(), |
756 root_window, | 755 root_window, |
757 prefs::kShelfAutoHideBehaviorLocal, | 756 prefs::kShelfAutoHideBehaviorLocal, |
758 prefs::kShelfAutoHideBehavior)); | 757 prefs::kShelfAutoHideBehavior)); |
759 | 758 |
760 // Note: To maintain sync compatibility with old images of chrome/chromeos | 759 // Note: To maintain sync compatibility with old images of chrome/chromeos |
761 // the set of values that may be encountered includes the now-extinct | 760 // the set of values that may be encountered includes the now-extinct |
762 // "Default" as well as "Never" and "Always", "Default" should now | 761 // "Default" as well as "Never" and "Always", "Default" should now |
763 // be treated as "Never" (http://crbug.com/146773). | 762 // be treated as "Never" (http://crbug.com/146773). |
764 if (behavior_value == ash::kShelfAutoHideBehaviorAlways) | 763 if (behavior_value == ash::kShelfAutoHideBehaviorAlways) |
765 return ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; | 764 return ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; |
766 return ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER; | 765 return ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER; |
767 } | 766 } |
768 | 767 |
769 bool ChromeLauncherControllerPerApp::CanUserModifyShelfAutoHideBehavior( | 768 bool ChromeLauncherController::CanUserModifyShelfAutoHideBehavior( |
770 aura::RootWindow* root_window) const { | 769 aura::RootWindow* root_window) const { |
771 return profile_->GetPrefs()-> | 770 return profile_->GetPrefs()-> |
772 FindPreference(prefs::kShelfAutoHideBehaviorLocal)->IsUserModifiable(); | 771 FindPreference(prefs::kShelfAutoHideBehaviorLocal)->IsUserModifiable(); |
773 } | 772 } |
774 | 773 |
775 void ChromeLauncherControllerPerApp::ToggleShelfAutoHideBehavior( | 774 void ChromeLauncherController::ToggleShelfAutoHideBehavior( |
776 aura::RootWindow* root_window) { | 775 aura::RootWindow* root_window) { |
777 ash::ShelfAutoHideBehavior behavior = GetShelfAutoHideBehavior(root_window) == | 776 ash::ShelfAutoHideBehavior behavior = GetShelfAutoHideBehavior(root_window) == |
778 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ? | 777 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ? |
779 ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER : | 778 ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER : |
780 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; | 779 ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; |
781 SetShelfAutoHideBehaviorPrefs(behavior, root_window); | 780 SetShelfAutoHideBehaviorPrefs(behavior, root_window); |
782 return; | 781 return; |
783 } | 782 } |
784 | 783 |
785 void ChromeLauncherControllerPerApp::RemoveTabFromRunningApp( | 784 void ChromeLauncherController::RemoveTabFromRunningApp( |
786 WebContents* tab, | 785 WebContents* tab, |
787 const std::string& app_id) { | 786 const std::string& app_id) { |
788 web_contents_to_app_id_.erase(tab); | 787 web_contents_to_app_id_.erase(tab); |
789 AppIDToWebContentsListMap::iterator i_app_id = | 788 AppIDToWebContentsListMap::iterator i_app_id = |
790 app_id_to_web_contents_list_.find(app_id); | 789 app_id_to_web_contents_list_.find(app_id); |
791 if (i_app_id != app_id_to_web_contents_list_.end()) { | 790 if (i_app_id != app_id_to_web_contents_list_.end()) { |
792 WebContentsList* tab_list = &i_app_id->second; | 791 WebContentsList* tab_list = &i_app_id->second; |
793 tab_list->remove(tab); | 792 tab_list->remove(tab); |
794 if (tab_list->empty()) { | 793 if (tab_list->empty()) { |
795 app_id_to_web_contents_list_.erase(i_app_id); | 794 app_id_to_web_contents_list_.erase(i_app_id); |
796 i_app_id = app_id_to_web_contents_list_.end(); | 795 i_app_id = app_id_to_web_contents_list_.end(); |
797 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 796 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
798 if (id) | 797 if (id) |
799 SetItemStatus(id, ash::STATUS_CLOSED); | 798 SetItemStatus(id, ash::STATUS_CLOSED); |
800 } | 799 } |
801 } | 800 } |
802 } | 801 } |
803 | 802 |
804 void ChromeLauncherControllerPerApp::UpdateAppState( | 803 void ChromeLauncherController::UpdateAppState(content::WebContents* contents, |
805 content::WebContents* contents, | 804 AppState app_state) { |
806 AppState app_state) { | |
807 std::string app_id = GetAppID(contents); | 805 std::string app_id = GetAppID(contents); |
808 | 806 |
809 // Check if the gMail app is loaded and it matches the given content. | 807 // Check if the gMail app is loaded and it matches the given content. |
810 // This special treatment is needed to address crbug.com/234268. | 808 // This special treatment is needed to address crbug.com/234268. |
811 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) | 809 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) |
812 app_id = kGmailAppId; | 810 app_id = kGmailAppId; |
813 | 811 |
814 // Check the old |app_id| for a tab. If the contents has changed we need to | 812 // Check the old |app_id| for a tab. If the contents has changed we need to |
815 // remove it from the previous app. | 813 // remove it from the previous app. |
816 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { | 814 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 849 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
852 if (id) { | 850 if (id) { |
853 // If the window is active, mark the app as active. | 851 // If the window is active, mark the app as active. |
854 SetItemStatus(id, app_state == APP_STATE_WINDOW_ACTIVE ? | 852 SetItemStatus(id, app_state == APP_STATE_WINDOW_ACTIVE ? |
855 ash::STATUS_ACTIVE : ash::STATUS_RUNNING); | 853 ash::STATUS_ACTIVE : ash::STATUS_RUNNING); |
856 } | 854 } |
857 } | 855 } |
858 UpdateBrowserItemStatus(); | 856 UpdateBrowserItemStatus(); |
859 } | 857 } |
860 | 858 |
861 void ChromeLauncherControllerPerApp::SetRefocusURLPatternForTest( | 859 void ChromeLauncherController::SetRefocusURLPatternForTest(ash::LauncherID id, |
862 ash::LauncherID id, | 860 const GURL& url) { |
863 const GURL& url) { | |
864 DCHECK(HasItemController(id)); | 861 DCHECK(HasItemController(id)); |
865 LauncherItemController* controller = id_to_item_controller_map_[id]; | 862 LauncherItemController* controller = id_to_item_controller_map_[id]; |
866 | 863 |
867 int index = model_->ItemIndexByID(id); | 864 int index = model_->ItemIndexByID(id); |
868 if (index == -1) { | 865 if (index == -1) { |
869 NOTREACHED() << "Invalid launcher id"; | 866 NOTREACHED() << "Invalid launcher id"; |
870 return; | 867 return; |
871 } | 868 } |
872 | 869 |
873 ash::LauncherItemType type = model_->items()[index].type; | 870 ash::LauncherItemType type = model_->items()[index].type; |
874 if (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_WINDOWED_APP) { | 871 if (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_WINDOWED_APP) { |
875 AppShortcutLauncherItemController* app_controller = | 872 AppShortcutLauncherItemController* app_controller = |
876 static_cast<AppShortcutLauncherItemController*>(controller); | 873 static_cast<AppShortcutLauncherItemController*>(controller); |
877 app_controller->set_refocus_url(url); | 874 app_controller->set_refocus_url(url); |
878 } else { | 875 } else { |
879 NOTREACHED() << "Invalid launcher type"; | 876 NOTREACHED() << "Invalid launcher type"; |
880 } | 877 } |
881 } | 878 } |
882 | 879 |
883 const Extension* ChromeLauncherControllerPerApp::GetExtensionForAppID( | 880 const Extension* ChromeLauncherController::GetExtensionForAppID( |
884 const std::string& app_id) const { | 881 const std::string& app_id) const { |
885 // Some unit tests do not have a real extension. | 882 // Some unit tests do not have a real extension. |
886 return (profile_->GetExtensionService()) ? | 883 return (profile_->GetExtensionService()) ? |
887 profile_->GetExtensionService()->GetInstalledExtension(app_id) : NULL; | 884 profile_->GetExtensionService()->GetInstalledExtension(app_id) : NULL; |
888 } | 885 } |
889 | 886 |
890 void ChromeLauncherControllerPerApp::ActivateWindowOrMinimizeIfActive( | 887 void ChromeLauncherController::ActivateWindowOrMinimizeIfActive( |
891 ui::BaseWindow* window, | 888 ui::BaseWindow* window, |
892 bool allow_minimize) { | 889 bool allow_minimize) { |
893 if (window->IsActive() && allow_minimize) { | 890 if (window->IsActive() && allow_minimize) { |
894 if (CommandLine::ForCurrentProcess()->HasSwitch( | 891 if (CommandLine::ForCurrentProcess()->HasSwitch( |
895 switches::kDisableMinimizeOnSecondLauncherItemClick)) { | 892 switches::kDisableMinimizeOnSecondLauncherItemClick)) { |
896 AnimateWindow(window->GetNativeWindow(), | 893 AnimateWindow(window->GetNativeWindow(), |
897 views::corewm::WINDOW_ANIMATION_TYPE_BOUNCE); | 894 views::corewm::WINDOW_ANIMATION_TYPE_BOUNCE); |
898 } else { | 895 } else { |
899 window->Minimize(); | 896 window->Minimize(); |
900 } | 897 } |
901 } else { | 898 } else { |
902 window->Show(); | 899 window->Show(); |
903 window->Activate(); | 900 window->Activate(); |
904 } | 901 } |
905 } | 902 } |
906 | 903 |
907 void ChromeLauncherControllerPerApp::ItemSelected(const ash::LauncherItem& item, | 904 void ChromeLauncherController::ItemSelected(const ash::LauncherItem& item, |
908 const ui::Event& event) { | 905 const ui::Event& event) { |
909 DCHECK(HasItemController(item.id)); | 906 DCHECK(HasItemController(item.id)); |
910 LauncherItemController* item_controller = id_to_item_controller_map_[item.id]; | 907 LauncherItemController* item_controller = id_to_item_controller_map_[item.id]; |
911 #if defined(OS_CHROMEOS) | 908 #if defined(OS_CHROMEOS) |
912 if (!item_controller->app_id().empty()) { | 909 if (!item_controller->app_id().empty()) { |
913 chromeos::default_pinned_apps_field_trial::RecordShelfAppClick( | 910 chromeos::default_pinned_apps_field_trial::RecordShelfAppClick( |
914 item_controller->app_id()); | 911 item_controller->app_id()); |
915 } | 912 } |
916 #endif | 913 #endif |
917 item_controller->Clicked(event); | 914 item_controller->Clicked(event); |
918 } | 915 } |
919 | 916 |
920 string16 ChromeLauncherControllerPerApp::GetTitle( | 917 string16 ChromeLauncherController::GetTitle(const ash::LauncherItem& item) { |
921 const ash::LauncherItem& item) { | |
922 DCHECK(HasItemController(item.id)); | 918 DCHECK(HasItemController(item.id)); |
923 return id_to_item_controller_map_[item.id]->GetTitle(); | 919 return id_to_item_controller_map_[item.id]->GetTitle(); |
924 } | 920 } |
925 | 921 |
926 ui::MenuModel* ChromeLauncherControllerPerApp::CreateContextMenu( | 922 ui::MenuModel* ChromeLauncherController::CreateContextMenu( |
927 const ash::LauncherItem& item, | 923 const ash::LauncherItem& item, |
928 aura::RootWindow* root_window) { | 924 aura::RootWindow* root_window) { |
929 return new LauncherContextMenu(this, &item, root_window); | 925 return new LauncherContextMenu(this, &item, root_window); |
930 } | 926 } |
931 | 927 |
932 ash::LauncherMenuModel* ChromeLauncherControllerPerApp::CreateApplicationMenu( | 928 ash::LauncherMenuModel* ChromeLauncherController::CreateApplicationMenu( |
933 const ash::LauncherItem& item, | 929 const ash::LauncherItem& item, |
934 int event_flags) { | 930 int event_flags) { |
935 return new LauncherApplicationMenuItemModel(GetApplicationList(item, | 931 return new LauncherApplicationMenuItemModel(GetApplicationList(item, |
936 event_flags)); | 932 event_flags)); |
937 } | 933 } |
938 | 934 |
939 ash::LauncherID ChromeLauncherControllerPerApp::GetIDByWindow( | 935 ash::LauncherID ChromeLauncherController::GetIDByWindow(aura::Window* window) { |
940 aura::Window* window) { | |
941 int browser_index = ash::launcher::GetBrowserItemIndex(*model_); | 936 int browser_index = ash::launcher::GetBrowserItemIndex(*model_); |
942 DCHECK_GE(browser_index, 0); | 937 DCHECK_GE(browser_index, 0); |
943 ash::LauncherID browser_id = model_->items()[browser_index].id; | 938 ash::LauncherID browser_id = model_->items()[browser_index].id; |
944 | 939 |
945 IDToItemControllerMap::const_iterator i = id_to_item_controller_map_.begin(); | 940 IDToItemControllerMap::const_iterator i = id_to_item_controller_map_.begin(); |
946 for (; i != id_to_item_controller_map_.end(); ++i) { | 941 for (; i != id_to_item_controller_map_.end(); ++i) { |
947 // Since a |window| can be used by multiple applications, an explicit | 942 // Since a |window| can be used by multiple applications, an explicit |
948 // application always gets chosen over the generic browser. | 943 // application always gets chosen over the generic browser. |
949 if (i->first != browser_id && i->second->IsCurrentlyShownInWindow(window)) | 944 if (i->first != browser_id && i->second->IsCurrentlyShownInWindow(window)) |
950 return i->first; | 945 return i->first; |
951 } | 946 } |
952 | 947 |
953 if (i == id_to_item_controller_map_.end() && | 948 if (i == id_to_item_controller_map_.end() && |
954 GetBrowserShortcutLauncherItemController()-> | 949 GetBrowserShortcutLauncherItemController()-> |
955 IsCurrentlyShownInWindow(window)) | 950 IsCurrentlyShownInWindow(window)) |
956 return browser_id; | 951 return browser_id; |
957 | 952 |
958 return 0; | 953 return 0; |
959 } | 954 } |
960 | 955 |
961 bool ChromeLauncherControllerPerApp::IsDraggable( | 956 bool ChromeLauncherController::IsDraggable(const ash::LauncherItem& item) { |
962 const ash::LauncherItem& item) { | |
963 return (item.type == ash::TYPE_APP_SHORTCUT || | 957 return (item.type == ash::TYPE_APP_SHORTCUT || |
964 item.type == ash::TYPE_WINDOWED_APP) ? CanPin() : true; | 958 item.type == ash::TYPE_WINDOWED_APP) ? CanPin() : true; |
965 } | 959 } |
966 | 960 |
967 bool ChromeLauncherControllerPerApp::ShouldShowTooltip( | 961 bool ChromeLauncherController::ShouldShowTooltip( |
968 const ash::LauncherItem& item) { | 962 const ash::LauncherItem& item) { |
969 if (item.type == ash::TYPE_APP_PANEL && | 963 if (item.type == ash::TYPE_APP_PANEL && |
970 id_to_item_controller_map_[item.id]->IsVisible()) | 964 id_to_item_controller_map_[item.id]->IsVisible()) |
971 return false; | 965 return false; |
972 return true; | 966 return true; |
973 } | 967 } |
974 | 968 |
975 void ChromeLauncherControllerPerApp::OnLauncherCreated( | 969 void ChromeLauncherController::OnLauncherCreated(ash::Launcher* launcher) { |
976 ash::Launcher* launcher) { | |
977 launchers_.insert(launcher); | 970 launchers_.insert(launcher); |
978 launcher->shelf_widget()->shelf_layout_manager()->AddObserver(this); | 971 launcher->shelf_widget()->shelf_layout_manager()->AddObserver(this); |
979 } | 972 } |
980 | 973 |
981 void ChromeLauncherControllerPerApp::OnLauncherDestroyed( | 974 void ChromeLauncherController::OnLauncherDestroyed(ash::Launcher* launcher) { |
982 ash::Launcher* launcher) { | |
983 launchers_.erase(launcher); | 975 launchers_.erase(launcher); |
984 // RemoveObserver is not called here, since by the time this method is called | 976 // RemoveObserver is not called here, since by the time this method is called |
985 // Launcher is already in its destructor. | 977 // Launcher is already in its destructor. |
986 } | 978 } |
987 | 979 |
988 void ChromeLauncherControllerPerApp::LauncherItemAdded(int index) { | 980 void ChromeLauncherController::LauncherItemAdded(int index) { |
989 } | 981 } |
990 | 982 |
991 void ChromeLauncherControllerPerApp::LauncherItemRemoved( | 983 void ChromeLauncherController::LauncherItemRemoved(int index, |
992 int index, | 984 ash::LauncherID id) { |
993 ash::LauncherID id) { | |
994 } | 985 } |
995 | 986 |
996 void ChromeLauncherControllerPerApp::LauncherItemMoved( | 987 void ChromeLauncherController::LauncherItemMoved(int start_index, |
997 int start_index, | 988 int target_index) { |
998 int target_index) { | |
999 ash::LauncherID id = model_->items()[target_index].id; | 989 ash::LauncherID id = model_->items()[target_index].id; |
1000 if (HasItemController(id) && IsPinned(id)) | 990 if (HasItemController(id) && IsPinned(id)) |
1001 PersistPinnedState(); | 991 PersistPinnedState(); |
1002 } | 992 } |
1003 | 993 |
1004 void ChromeLauncherControllerPerApp::LauncherItemChanged( | 994 void ChromeLauncherController::LauncherItemChanged( |
1005 int index, | 995 int index, |
1006 const ash::LauncherItem& old_item) { | 996 const ash::LauncherItem& old_item) { |
1007 ash::LauncherID id = model_->items()[index].id; | 997 ash::LauncherID id = model_->items()[index].id; |
1008 DCHECK(HasItemController(id)); | 998 DCHECK(HasItemController(id)); |
1009 id_to_item_controller_map_[id]->LauncherItemChanged(index, old_item); | 999 id_to_item_controller_map_[id]->LauncherItemChanged(index, old_item); |
1010 } | 1000 } |
1011 | 1001 |
1012 void ChromeLauncherControllerPerApp::LauncherStatusChanged() { | 1002 void ChromeLauncherController::LauncherStatusChanged() { |
1013 } | 1003 } |
1014 | 1004 |
1015 void ChromeLauncherControllerPerApp::Observe( | 1005 void ChromeLauncherController::Observe( |
1016 int type, | 1006 int type, |
1017 const content::NotificationSource& source, | 1007 const content::NotificationSource& source, |
1018 const content::NotificationDetails& details) { | 1008 const content::NotificationDetails& details) { |
1019 switch (type) { | 1009 switch (type) { |
1020 case chrome::NOTIFICATION_EXTENSION_LOADED: { | 1010 case chrome::NOTIFICATION_EXTENSION_LOADED: { |
1021 const Extension* extension = | 1011 const Extension* extension = |
1022 content::Details<const Extension>(details).ptr(); | 1012 content::Details<const Extension>(details).ptr(); |
1023 if (IsAppPinned(extension->id())) { | 1013 if (IsAppPinned(extension->id())) { |
1024 // Clear and re-fetch to ensure icon is up-to-date. | 1014 // Clear and re-fetch to ensure icon is up-to-date. |
1025 app_icon_loader_->ClearImage(extension->id()); | 1015 app_icon_loader_->ClearImage(extension->id()); |
(...skipping 23 matching lines...) Expand all Loading... |
1049 app_icon_loader_->UpdateImage(id); | 1039 app_icon_loader_->UpdateImage(id); |
1050 } | 1040 } |
1051 } | 1041 } |
1052 break; | 1042 break; |
1053 } | 1043 } |
1054 default: | 1044 default: |
1055 NOTREACHED() << "Unexpected notification type=" << type; | 1045 NOTREACHED() << "Unexpected notification type=" << type; |
1056 } | 1046 } |
1057 } | 1047 } |
1058 | 1048 |
1059 void ChromeLauncherControllerPerApp::OnShelfAlignmentChanged( | 1049 void ChromeLauncherController::OnShelfAlignmentChanged( |
1060 aura::RootWindow* root_window) { | 1050 aura::RootWindow* root_window) { |
1061 const char* pref_value = NULL; | 1051 const char* pref_value = NULL; |
1062 switch (ash::Shell::GetInstance()->GetShelfAlignment(root_window)) { | 1052 switch (ash::Shell::GetInstance()->GetShelfAlignment(root_window)) { |
1063 case ash::SHELF_ALIGNMENT_BOTTOM: | 1053 case ash::SHELF_ALIGNMENT_BOTTOM: |
1064 pref_value = ash::kShelfAlignmentBottom; | 1054 pref_value = ash::kShelfAlignmentBottom; |
1065 break; | 1055 break; |
1066 case ash::SHELF_ALIGNMENT_LEFT: | 1056 case ash::SHELF_ALIGNMENT_LEFT: |
1067 pref_value = ash::kShelfAlignmentLeft; | 1057 pref_value = ash::kShelfAlignmentLeft; |
1068 break; | 1058 break; |
1069 case ash::SHELF_ALIGNMENT_RIGHT: | 1059 case ash::SHELF_ALIGNMENT_RIGHT: |
1070 pref_value = ash::kShelfAlignmentRight; | 1060 pref_value = ash::kShelfAlignmentRight; |
1071 break; | 1061 break; |
1072 case ash::SHELF_ALIGNMENT_TOP: | 1062 case ash::SHELF_ALIGNMENT_TOP: |
1073 pref_value = ash::kShelfAlignmentTop; | 1063 pref_value = ash::kShelfAlignmentTop; |
1074 } | 1064 } |
1075 | 1065 |
1076 UpdatePerDisplayPref( | 1066 UpdatePerDisplayPref( |
1077 profile_->GetPrefs(), root_window, prefs::kShelfAlignment, pref_value); | 1067 profile_->GetPrefs(), root_window, prefs::kShelfAlignment, pref_value); |
1078 | 1068 |
1079 if (root_window == ash::Shell::GetPrimaryRootWindow()) { | 1069 if (root_window == ash::Shell::GetPrimaryRootWindow()) { |
1080 // See comment in |kShelfAlignment| about why we have two prefs here. | 1070 // See comment in |kShelfAlignment| about why we have two prefs here. |
1081 profile_->GetPrefs()->SetString(prefs::kShelfAlignmentLocal, pref_value); | 1071 profile_->GetPrefs()->SetString(prefs::kShelfAlignmentLocal, pref_value); |
1082 profile_->GetPrefs()->SetString(prefs::kShelfAlignment, pref_value); | 1072 profile_->GetPrefs()->SetString(prefs::kShelfAlignment, pref_value); |
1083 } | 1073 } |
1084 } | 1074 } |
1085 | 1075 |
1086 void ChromeLauncherControllerPerApp::OnDisplayConfigurationChanging() { | 1076 void ChromeLauncherController::OnDisplayConfigurationChanging() { |
1087 } | 1077 } |
1088 | 1078 |
1089 void ChromeLauncherControllerPerApp::OnDisplayConfigurationChanged() { | 1079 void ChromeLauncherController::OnDisplayConfigurationChanged() { |
1090 SetShelfBehaviorsFromPrefs(); | 1080 SetShelfBehaviorsFromPrefs(); |
1091 } | 1081 } |
1092 | 1082 |
1093 void ChromeLauncherControllerPerApp::OnIsSyncingChanged() { | 1083 void ChromeLauncherController::OnIsSyncingChanged() { |
1094 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); | 1084 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); |
1095 MaybePropagatePrefToLocal(prefs, | 1085 MaybePropagatePrefToLocal(prefs, |
1096 prefs::kShelfAlignmentLocal, | 1086 prefs::kShelfAlignmentLocal, |
1097 prefs::kShelfAlignment); | 1087 prefs::kShelfAlignment); |
1098 MaybePropagatePrefToLocal(prefs, | 1088 MaybePropagatePrefToLocal(prefs, |
1099 prefs::kShelfAutoHideBehaviorLocal, | 1089 prefs::kShelfAutoHideBehaviorLocal, |
1100 prefs::kShelfAutoHideBehavior); | 1090 prefs::kShelfAutoHideBehavior); |
1101 } | 1091 } |
1102 | 1092 |
1103 void ChromeLauncherControllerPerApp::OnAppSyncUIStatusChanged() { | 1093 void ChromeLauncherController::OnAppSyncUIStatusChanged() { |
1104 if (app_sync_ui_state_->status() == AppSyncUIState::STATUS_SYNCING) | 1094 if (app_sync_ui_state_->status() == AppSyncUIState::STATUS_SYNCING) |
1105 model_->SetStatus(ash::LauncherModel::STATUS_LOADING); | 1095 model_->SetStatus(ash::LauncherModel::STATUS_LOADING); |
1106 else | 1096 else |
1107 model_->SetStatus(ash::LauncherModel::STATUS_NORMAL); | 1097 model_->SetStatus(ash::LauncherModel::STATUS_NORMAL); |
1108 } | 1098 } |
1109 | 1099 |
1110 void ChromeLauncherControllerPerApp::ExtensionEnableFlowFinished() { | 1100 void ChromeLauncherController::ExtensionEnableFlowFinished() { |
1111 LaunchApp(extension_enable_flow_->extension_id(), ui::EF_NONE); | 1101 LaunchApp(extension_enable_flow_->extension_id(), ui::EF_NONE); |
1112 extension_enable_flow_.reset(); | 1102 extension_enable_flow_.reset(); |
1113 } | 1103 } |
1114 | 1104 |
1115 void ChromeLauncherControllerPerApp::ExtensionEnableFlowAborted( | 1105 void ChromeLauncherController::ExtensionEnableFlowAborted(bool user_initiated) { |
1116 bool user_initiated) { | |
1117 extension_enable_flow_.reset(); | 1106 extension_enable_flow_.reset(); |
1118 } | 1107 } |
1119 | 1108 |
1120 ChromeLauncherAppMenuItems ChromeLauncherControllerPerApp::GetApplicationList( | 1109 ChromeLauncherAppMenuItems ChromeLauncherController::GetApplicationList( |
1121 const ash::LauncherItem& item, | 1110 const ash::LauncherItem& item, |
1122 int event_flags) { | 1111 int event_flags) { |
1123 // Make sure that there is a controller associated with the id and that the | 1112 // Make sure that there is a controller associated with the id and that the |
1124 // extension itself is a valid application and not a panel. | 1113 // extension itself is a valid application and not a panel. |
1125 if (!HasItemController(item.id) || | 1114 if (!HasItemController(item.id) || |
1126 !GetLauncherIDForAppID(id_to_item_controller_map_[item.id]->app_id())) | 1115 !GetLauncherIDForAppID(id_to_item_controller_map_[item.id]->app_id())) |
1127 return ChromeLauncherAppMenuItems().Pass(); | 1116 return ChromeLauncherAppMenuItems().Pass(); |
1128 | 1117 |
1129 return id_to_item_controller_map_[item.id]->GetApplicationList(event_flags); | 1118 return id_to_item_controller_map_[item.id]->GetApplicationList(event_flags); |
1130 } | 1119 } |
1131 | 1120 |
1132 std::vector<content::WebContents*> | 1121 std::vector<content::WebContents*> |
1133 ChromeLauncherControllerPerApp::GetV1ApplicationsFromAppId( | 1122 ChromeLauncherController::GetV1ApplicationsFromAppId(std::string app_id) { |
1134 std::string app_id) { | |
1135 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 1123 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
1136 | 1124 |
1137 // If there is no such an item pinned to the launcher, no menu gets created. | 1125 // If there is no such an item pinned to the launcher, no menu gets created. |
1138 if (id) { | 1126 if (id) { |
1139 LauncherItemController* controller = id_to_item_controller_map_[id]; | 1127 LauncherItemController* controller = id_to_item_controller_map_[id]; |
1140 DCHECK(controller); | 1128 DCHECK(controller); |
1141 if (controller->type() == LauncherItemController::TYPE_SHORTCUT) | 1129 if (controller->type() == LauncherItemController::TYPE_SHORTCUT) |
1142 return GetV1ApplicationsFromController(controller); | 1130 return GetV1ApplicationsFromController(controller); |
1143 } | 1131 } |
1144 return std::vector<content::WebContents*>(); | 1132 return std::vector<content::WebContents*>(); |
1145 } | 1133 } |
1146 | 1134 |
1147 void ChromeLauncherControllerPerApp::ActivateShellApp( | 1135 void ChromeLauncherController::ActivateShellApp(const std::string& app_id, |
1148 const std::string& app_id, | 1136 int index) { |
1149 int index) { | |
1150 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 1137 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
1151 if (id) { | 1138 if (id) { |
1152 LauncherItemController* controller = id_to_item_controller_map_[id]; | 1139 LauncherItemController* controller = id_to_item_controller_map_[id]; |
1153 if (controller->type() == LauncherItemController::TYPE_APP) { | 1140 if (controller->type() == LauncherItemController::TYPE_APP) { |
1154 ShellWindowLauncherItemController* shell_window_controller = | 1141 ShellWindowLauncherItemController* shell_window_controller = |
1155 static_cast<ShellWindowLauncherItemController*>(controller); | 1142 static_cast<ShellWindowLauncherItemController*>(controller); |
1156 shell_window_controller->ActivateIndexedApp(index); | 1143 shell_window_controller->ActivateIndexedApp(index); |
1157 } | 1144 } |
1158 } | 1145 } |
1159 } | 1146 } |
1160 | 1147 |
1161 bool ChromeLauncherControllerPerApp::IsWebContentHandledByApplication( | 1148 bool ChromeLauncherController::IsWebContentHandledByApplication( |
1162 content::WebContents* web_contents, | 1149 content::WebContents* web_contents, |
1163 const std::string& app_id) { | 1150 const std::string& app_id) { |
1164 if ((web_contents_to_app_id_.find(web_contents) != | 1151 if ((web_contents_to_app_id_.find(web_contents) != |
1165 web_contents_to_app_id_.end()) && | 1152 web_contents_to_app_id_.end()) && |
1166 (web_contents_to_app_id_[web_contents] == app_id)) | 1153 (web_contents_to_app_id_[web_contents] == app_id)) |
1167 return true; | 1154 return true; |
1168 return (app_id == kGmailAppId && ContentCanBeHandledByGmailApp(web_contents)); | 1155 return (app_id == kGmailAppId && ContentCanBeHandledByGmailApp(web_contents)); |
1169 } | 1156 } |
1170 | 1157 |
1171 bool ChromeLauncherControllerPerApp::ContentCanBeHandledByGmailApp( | 1158 bool ChromeLauncherController::ContentCanBeHandledByGmailApp( |
1172 content::WebContents* web_contents) { | 1159 content::WebContents* web_contents) { |
1173 ash::LauncherID id = GetLauncherIDForAppID(kGmailAppId); | 1160 ash::LauncherID id = GetLauncherIDForAppID(kGmailAppId); |
1174 if (id) { | 1161 if (id) { |
1175 const GURL url = web_contents->GetURL(); | 1162 const GURL url = web_contents->GetURL(); |
1176 // We need to extend the application matching for the gMail app beyond the | 1163 // We need to extend the application matching for the gMail app beyond the |
1177 // manifest file's specification. This is required because of the namespace | 1164 // manifest file's specification. This is required because of the namespace |
1178 // overlap with the offline app ("/mail/mu/"). | 1165 // overlap with the offline app ("/mail/mu/"). |
1179 if (!MatchPattern(url.path(), "/mail/mu/*") && | 1166 if (!MatchPattern(url.path(), "/mail/mu/*") && |
1180 MatchPattern(url.path(), "/mail/*") && | 1167 MatchPattern(url.path(), "/mail/*") && |
1181 GetExtensionForAppID(kGmailAppId) && | 1168 GetExtensionForAppID(kGmailAppId) && |
1182 GetExtensionForAppID(kGmailAppId)->OverlapsWithOrigin(url)) | 1169 GetExtensionForAppID(kGmailAppId)->OverlapsWithOrigin(url)) |
1183 return true; | 1170 return true; |
1184 } | 1171 } |
1185 return false; | 1172 return false; |
1186 } | 1173 } |
1187 | 1174 |
1188 gfx::Image ChromeLauncherControllerPerApp::GetAppListIcon( | 1175 gfx::Image ChromeLauncherController::GetAppListIcon( |
1189 content::WebContents* web_contents) const { | 1176 content::WebContents* web_contents) const { |
1190 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 1177 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
1191 if (IsIncognito(web_contents)) | 1178 if (IsIncognito(web_contents)) |
1192 return rb.GetImageNamed(IDR_AURA_LAUNCHER_LIST_INCOGNITO_BROWSER); | 1179 return rb.GetImageNamed(IDR_AURA_LAUNCHER_LIST_INCOGNITO_BROWSER); |
1193 FaviconTabHelper* favicon_tab_helper = | 1180 FaviconTabHelper* favicon_tab_helper = |
1194 FaviconTabHelper::FromWebContents(web_contents); | 1181 FaviconTabHelper::FromWebContents(web_contents); |
1195 gfx::Image result = favicon_tab_helper->GetFavicon(); | 1182 gfx::Image result = favicon_tab_helper->GetFavicon(); |
1196 if (result.IsEmpty()) | 1183 if (result.IsEmpty()) |
1197 return rb.GetImageNamed(IDR_DEFAULT_FAVICON); | 1184 return rb.GetImageNamed(IDR_DEFAULT_FAVICON); |
1198 return result; | 1185 return result; |
1199 } | 1186 } |
1200 | 1187 |
1201 string16 ChromeLauncherControllerPerApp::GetAppListTitle( | 1188 string16 ChromeLauncherController::GetAppListTitle( |
1202 content::WebContents* web_contents) const { | 1189 content::WebContents* web_contents) const { |
1203 string16 title = web_contents->GetTitle(); | 1190 string16 title = web_contents->GetTitle(); |
1204 if (!title.empty()) | 1191 if (!title.empty()) |
1205 return title; | 1192 return title; |
1206 WebContentsToAppIDMap::const_iterator iter = | 1193 WebContentsToAppIDMap::const_iterator iter = |
1207 web_contents_to_app_id_.find(web_contents); | 1194 web_contents_to_app_id_.find(web_contents); |
1208 if (iter != web_contents_to_app_id_.end()) { | 1195 if (iter != web_contents_to_app_id_.end()) { |
1209 std::string app_id = iter->second; | 1196 std::string app_id = iter->second; |
1210 const extensions::Extension* extension = GetExtensionForAppID(app_id); | 1197 const extensions::Extension* extension = GetExtensionForAppID(app_id); |
1211 if (extension) | 1198 if (extension) |
1212 return UTF8ToUTF16(extension->name()); | 1199 return UTF8ToUTF16(extension->name()); |
1213 } | 1200 } |
1214 return l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE); | 1201 return l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE); |
1215 } | 1202 } |
1216 | 1203 |
1217 void ChromeLauncherControllerPerApp::OnBrowserRemoved(Browser* browser) { | 1204 void ChromeLauncherController::OnBrowserRemoved(Browser* browser) { |
1218 // When called by a unit test it is possible that there is no shell. | 1205 // When called by a unit test it is possible that there is no shell. |
1219 // In that case, the following function should not get called. | 1206 // In that case, the following function should not get called. |
1220 if (ash::Shell::HasInstance()) | 1207 if (ash::Shell::HasInstance()) |
1221 UpdateBrowserItemStatus(); | 1208 UpdateBrowserItemStatus(); |
1222 } | 1209 } |
1223 | 1210 |
1224 ash::LauncherID ChromeLauncherControllerPerApp::CreateAppShortcutLauncherItem( | 1211 ash::LauncherID ChromeLauncherController::CreateAppShortcutLauncherItem( |
1225 const std::string& app_id, | 1212 const std::string& app_id, |
1226 int index) { | 1213 int index) { |
1227 return CreateAppShortcutLauncherItemWithType(app_id, | 1214 return CreateAppShortcutLauncherItemWithType(app_id, |
1228 index, | 1215 index, |
1229 ash::TYPE_APP_SHORTCUT); | 1216 ash::TYPE_APP_SHORTCUT); |
1230 } | 1217 } |
1231 | 1218 |
1232 void ChromeLauncherControllerPerApp::SetAppTabHelperForTest( | 1219 void ChromeLauncherController::SetAppTabHelperForTest(AppTabHelper* helper) { |
1233 AppTabHelper* helper) { | |
1234 app_tab_helper_.reset(helper); | 1220 app_tab_helper_.reset(helper); |
1235 } | 1221 } |
1236 | 1222 |
1237 void ChromeLauncherControllerPerApp::SetAppIconLoaderForTest( | 1223 void ChromeLauncherController::SetAppIconLoaderForTest( |
1238 extensions::AppIconLoader* loader) { | 1224 extensions::AppIconLoader* loader) { |
1239 app_icon_loader_.reset(loader); | 1225 app_icon_loader_.reset(loader); |
1240 } | 1226 } |
1241 | 1227 |
1242 const std::string& | 1228 const std::string& ChromeLauncherController::GetAppIdFromLauncherIdForTest( |
1243 ChromeLauncherControllerPerApp::GetAppIdFromLauncherIdForTest( | |
1244 ash::LauncherID id) { | 1229 ash::LauncherID id) { |
1245 return id_to_item_controller_map_[id]->app_id(); | 1230 return id_to_item_controller_map_[id]->app_id(); |
1246 } | 1231 } |
1247 | 1232 |
1248 ash::LauncherID | 1233 ash::LauncherID ChromeLauncherController::CreateAppShortcutLauncherItemWithType( |
1249 ChromeLauncherControllerPerApp::CreateAppShortcutLauncherItemWithType( | |
1250 const std::string& app_id, | 1234 const std::string& app_id, |
1251 int index, | 1235 int index, |
1252 ash::LauncherItemType launcher_item_type) { | 1236 ash::LauncherItemType launcher_item_type) { |
1253 AppShortcutLauncherItemController* controller = | 1237 AppShortcutLauncherItemController* controller = |
1254 new AppShortcutLauncherItemController(app_id, this); | 1238 new AppShortcutLauncherItemController(app_id, this); |
1255 ash::LauncherID launcher_id = InsertAppLauncherItem( | 1239 ash::LauncherID launcher_id = InsertAppLauncherItem( |
1256 controller, app_id, ash::STATUS_CLOSED, index, launcher_item_type); | 1240 controller, app_id, ash::STATUS_CLOSED, index, launcher_item_type); |
1257 return launcher_id; | 1241 return launcher_id; |
1258 } | 1242 } |
1259 | 1243 |
1260 void ChromeLauncherControllerPerApp::UpdateBrowserItemStatus() { | 1244 void ChromeLauncherController::UpdateBrowserItemStatus() { |
1261 // Determine the new browser's active state and change if necessary. | 1245 // Determine the new browser's active state and change if necessary. |
1262 size_t browser_index = ash::launcher::GetBrowserItemIndex(*model_); | 1246 size_t browser_index = ash::launcher::GetBrowserItemIndex(*model_); |
1263 DCHECK_GE(browser_index, 0u); | 1247 DCHECK_GE(browser_index, 0u); |
1264 ash::LauncherItem browser_item = model_->items()[browser_index]; | 1248 ash::LauncherItem browser_item = model_->items()[browser_index]; |
1265 ash::LauncherItemStatus browser_status = ash::STATUS_CLOSED; | 1249 ash::LauncherItemStatus browser_status = ash::STATUS_CLOSED; |
1266 | 1250 |
1267 aura::Window* window = ash::wm::GetActiveWindow(); | 1251 aura::Window* window = ash::wm::GetActiveWindow(); |
1268 if (window) { | 1252 if (window) { |
1269 // Check if the active browser / tab is a browser which is not an app, | 1253 // Check if the active browser / tab is a browser which is not an app, |
1270 // a windowed app, a popup or any other item which is not a browser of | 1254 // a windowed app, a popup or any other item which is not a browser of |
(...skipping 22 matching lines...) Expand all Loading... |
1293 browser_status = ash::STATUS_RUNNING; | 1277 browser_status = ash::STATUS_RUNNING; |
1294 } | 1278 } |
1295 } | 1279 } |
1296 | 1280 |
1297 if (browser_status != browser_item.status) { | 1281 if (browser_status != browser_item.status) { |
1298 browser_item.status = browser_status; | 1282 browser_item.status = browser_status; |
1299 model_->Set(browser_index, browser_item); | 1283 model_->Set(browser_index, browser_item); |
1300 } | 1284 } |
1301 } | 1285 } |
1302 | 1286 |
1303 Profile* ChromeLauncherControllerPerApp::GetProfileForNewWindows() { | 1287 Profile* ChromeLauncherController::GetProfileForNewWindows() { |
1304 return ProfileManager::GetDefaultProfileOrOffTheRecord(); | 1288 return ProfileManager::GetDefaultProfileOrOffTheRecord(); |
1305 } | 1289 } |
1306 | 1290 |
1307 void ChromeLauncherControllerPerApp::LauncherItemClosed(ash::LauncherID id) { | 1291 void ChromeLauncherController::LauncherItemClosed(ash::LauncherID id) { |
1308 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 1292 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
1309 CHECK(iter != id_to_item_controller_map_.end()); | 1293 CHECK(iter != id_to_item_controller_map_.end()); |
1310 CHECK(iter->second); | 1294 CHECK(iter->second); |
1311 app_icon_loader_->ClearImage(iter->second->app_id()); | 1295 app_icon_loader_->ClearImage(iter->second->app_id()); |
1312 iter->second->OnRemoved(); | 1296 iter->second->OnRemoved(); |
1313 id_to_item_controller_map_.erase(iter); | 1297 id_to_item_controller_map_.erase(iter); |
1314 int index = model_->ItemIndexByID(id); | 1298 int index = model_->ItemIndexByID(id); |
1315 // A "browser proxy" is not known to the model and this removal does | 1299 // A "browser proxy" is not known to the model and this removal does |
1316 // therefore not need to be propagated to the model. | 1300 // therefore not need to be propagated to the model. |
1317 if (index != -1) | 1301 if (index != -1) |
1318 model_->RemoveItemAt(index); | 1302 model_->RemoveItemAt(index); |
1319 } | 1303 } |
1320 | 1304 |
1321 void ChromeLauncherControllerPerApp::DoPinAppWithID( | 1305 void ChromeLauncherController::DoPinAppWithID(const std::string& app_id) { |
1322 const std::string& app_id) { | |
1323 // If there is an item, do nothing and return. | 1306 // If there is an item, do nothing and return. |
1324 if (IsAppPinned(app_id)) | 1307 if (IsAppPinned(app_id)) |
1325 return; | 1308 return; |
1326 | 1309 |
1327 ash::LauncherID launcher_id = GetLauncherIDForAppID(app_id); | 1310 ash::LauncherID launcher_id = GetLauncherIDForAppID(app_id); |
1328 if (launcher_id) { | 1311 if (launcher_id) { |
1329 // App item exists, pin it | 1312 // App item exists, pin it |
1330 Pin(launcher_id); | 1313 Pin(launcher_id); |
1331 } else { | 1314 } else { |
1332 // Otherwise, create a shortcut item for it. | 1315 // Otherwise, create a shortcut item for it. |
1333 CreateAppShortcutLauncherItem(app_id, model_->item_count()); | 1316 CreateAppShortcutLauncherItem(app_id, model_->item_count()); |
1334 if (CanPin()) | 1317 if (CanPin()) |
1335 PersistPinnedState(); | 1318 PersistPinnedState(); |
1336 } | 1319 } |
1337 } | 1320 } |
1338 | 1321 |
1339 void ChromeLauncherControllerPerApp::DoUnpinAppsWithID( | 1322 void ChromeLauncherController::DoUnpinAppsWithID(const std::string& app_id) { |
1340 const std::string& app_id) { | |
1341 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); | 1323 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); |
1342 i != id_to_item_controller_map_.end(); ) { | 1324 i != id_to_item_controller_map_.end(); ) { |
1343 IDToItemControllerMap::iterator current(i); | 1325 IDToItemControllerMap::iterator current(i); |
1344 ++i; | 1326 ++i; |
1345 if (current->second->app_id() == app_id && IsPinned(current->first)) | 1327 if (current->second->app_id() == app_id && IsPinned(current->first)) |
1346 Unpin(current->first); | 1328 Unpin(current->first); |
1347 } | 1329 } |
1348 } | 1330 } |
1349 | 1331 |
1350 void ChromeLauncherControllerPerApp::UpdateAppLaunchersFromPref() { | 1332 void ChromeLauncherController::UpdateAppLaunchersFromPref() { |
1351 // Construct a vector representation of to-be-pinned apps from the pref. | 1333 // Construct a vector representation of to-be-pinned apps from the pref. |
1352 std::vector<std::string> pinned_apps; | 1334 std::vector<std::string> pinned_apps; |
1353 int chrome_icon_index = GetChromeIconIndexFromPref(); | 1335 int chrome_icon_index = GetChromeIconIndexFromPref(); |
1354 int index = 0; | 1336 int index = 0; |
1355 int max_index = model_->item_count(); | 1337 int max_index = model_->item_count(); |
1356 // Using the alternate shelf layout the App Icon should be the first item in | 1338 // Using the alternate shelf layout the App Icon should be the first item in |
1357 // the list thus start adding items at slot 1 (instead of slot 0). | 1339 // the list thus start adding items at slot 1 (instead of slot 0). |
1358 if (ash::switches::UseAlternateShelfLayout()) { | 1340 if (ash::switches::UseAlternateShelfLayout()) { |
1359 ++index; | 1341 ++index; |
1360 ++max_index; | 1342 ++max_index; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 | 1426 |
1445 // Append unprocessed items from the pref to the end of the model. | 1427 // Append unprocessed items from the pref to the end of the model. |
1446 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) { | 1428 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) { |
1447 // Ignore the chrome icon. | 1429 // Ignore the chrome icon. |
1448 if (*pref_app_id != extension_misc::kChromeAppId) | 1430 if (*pref_app_id != extension_misc::kChromeAppId) |
1449 DoPinAppWithID(*pref_app_id); | 1431 DoPinAppWithID(*pref_app_id); |
1450 } | 1432 } |
1451 | 1433 |
1452 } | 1434 } |
1453 | 1435 |
1454 void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorPrefs( | 1436 void ChromeLauncherController::SetShelfAutoHideBehaviorPrefs( |
1455 ash::ShelfAutoHideBehavior behavior, | 1437 ash::ShelfAutoHideBehavior behavior, |
1456 aura::RootWindow* root_window) { | 1438 aura::RootWindow* root_window) { |
1457 const char* value = NULL; | 1439 const char* value = NULL; |
1458 switch (behavior) { | 1440 switch (behavior) { |
1459 case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS: | 1441 case ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS: |
1460 value = ash::kShelfAutoHideBehaviorAlways; | 1442 value = ash::kShelfAutoHideBehaviorAlways; |
1461 break; | 1443 break; |
1462 case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER: | 1444 case ash::SHELF_AUTO_HIDE_BEHAVIOR_NEVER: |
1463 value = ash::kShelfAutoHideBehaviorNever; | 1445 value = ash::kShelfAutoHideBehaviorNever; |
1464 break; | 1446 break; |
1465 case ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN: | 1447 case ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN: |
1466 // This one should not be a valid preference option for now. We only want | 1448 // This one should not be a valid preference option for now. We only want |
1467 // to completely hide it when we run app mode. | 1449 // to completely hide it when we run app mode. |
1468 NOTREACHED(); | 1450 NOTREACHED(); |
1469 return; | 1451 return; |
1470 } | 1452 } |
1471 | 1453 |
1472 UpdatePerDisplayPref( | 1454 UpdatePerDisplayPref( |
1473 profile_->GetPrefs(), root_window, prefs::kShelfAutoHideBehavior, value); | 1455 profile_->GetPrefs(), root_window, prefs::kShelfAutoHideBehavior, value); |
1474 | 1456 |
1475 if (root_window == ash::Shell::GetPrimaryRootWindow()) { | 1457 if (root_window == ash::Shell::GetPrimaryRootWindow()) { |
1476 // See comment in |kShelfAlignment| about why we have two prefs here. | 1458 // See comment in |kShelfAlignment| about why we have two prefs here. |
1477 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value); | 1459 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehaviorLocal, value); |
1478 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value); | 1460 profile_->GetPrefs()->SetString(prefs::kShelfAutoHideBehavior, value); |
1479 } | 1461 } |
1480 } | 1462 } |
1481 | 1463 |
1482 void ChromeLauncherControllerPerApp::SetShelfAutoHideBehaviorFromPrefs() { | 1464 void ChromeLauncherController::SetShelfAutoHideBehaviorFromPrefs() { |
1483 ash::Shell::RootWindowList root_windows = ash::Shell::GetAllRootWindows(); | 1465 ash::Shell::RootWindowList root_windows = ash::Shell::GetAllRootWindows(); |
1484 | 1466 |
1485 for (ash::Shell::RootWindowList::const_iterator iter = root_windows.begin(); | 1467 for (ash::Shell::RootWindowList::const_iterator iter = root_windows.begin(); |
1486 iter != root_windows.end(); ++iter) { | 1468 iter != root_windows.end(); ++iter) { |
1487 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( | 1469 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( |
1488 GetShelfAutoHideBehavior(*iter), *iter); | 1470 GetShelfAutoHideBehavior(*iter), *iter); |
1489 } | 1471 } |
1490 } | 1472 } |
1491 | 1473 |
1492 void ChromeLauncherControllerPerApp::SetShelfAlignmentFromPrefs() { | 1474 void ChromeLauncherController::SetShelfAlignmentFromPrefs() { |
1493 if (!ash::ShelfWidget::ShelfAlignmentAllowed()) | 1475 if (!ash::ShelfWidget::ShelfAlignmentAllowed()) |
1494 return; | 1476 return; |
1495 | 1477 |
1496 ash::Shell::RootWindowList root_windows = ash::Shell::GetAllRootWindows(); | 1478 ash::Shell::RootWindowList root_windows = ash::Shell::GetAllRootWindows(); |
1497 | 1479 |
1498 for (ash::Shell::RootWindowList::const_iterator iter = root_windows.begin(); | 1480 for (ash::Shell::RootWindowList::const_iterator iter = root_windows.begin(); |
1499 iter != root_windows.end(); ++iter) { | 1481 iter != root_windows.end(); ++iter) { |
1500 // See comment in |kShelfAlignment| as to why we consider two prefs. | 1482 // See comment in |kShelfAlignment| as to why we consider two prefs. |
1501 const std::string alignment_value( | 1483 const std::string alignment_value( |
1502 GetPrefForRootWindow(profile_->GetPrefs(), | 1484 GetPrefForRootWindow(profile_->GetPrefs(), |
1503 *iter, | 1485 *iter, |
1504 prefs::kShelfAlignmentLocal, | 1486 prefs::kShelfAlignmentLocal, |
1505 prefs::kShelfAlignment)); | 1487 prefs::kShelfAlignment)); |
1506 ash::ShelfAlignment alignment = ash::SHELF_ALIGNMENT_BOTTOM; | 1488 ash::ShelfAlignment alignment = ash::SHELF_ALIGNMENT_BOTTOM; |
1507 if (alignment_value == ash::kShelfAlignmentLeft) | 1489 if (alignment_value == ash::kShelfAlignmentLeft) |
1508 alignment = ash::SHELF_ALIGNMENT_LEFT; | 1490 alignment = ash::SHELF_ALIGNMENT_LEFT; |
1509 else if (alignment_value == ash::kShelfAlignmentRight) | 1491 else if (alignment_value == ash::kShelfAlignmentRight) |
1510 alignment = ash::SHELF_ALIGNMENT_RIGHT; | 1492 alignment = ash::SHELF_ALIGNMENT_RIGHT; |
1511 else if (alignment_value == ash::kShelfAlignmentTop) | 1493 else if (alignment_value == ash::kShelfAlignmentTop) |
1512 alignment = ash::SHELF_ALIGNMENT_TOP; | 1494 alignment = ash::SHELF_ALIGNMENT_TOP; |
1513 ash::Shell::GetInstance()->SetShelfAlignment(alignment, *iter); | 1495 ash::Shell::GetInstance()->SetShelfAlignment(alignment, *iter); |
1514 } | 1496 } |
1515 } | 1497 } |
1516 | 1498 |
1517 void ChromeLauncherControllerPerApp::SetShelfBehaviorsFromPrefs() { | 1499 void ChromeLauncherController::SetShelfBehaviorsFromPrefs() { |
1518 SetShelfAutoHideBehaviorFromPrefs(); | 1500 SetShelfAutoHideBehaviorFromPrefs(); |
1519 SetShelfAlignmentFromPrefs(); | 1501 SetShelfAlignmentFromPrefs(); |
1520 } | 1502 } |
1521 | 1503 |
1522 WebContents* ChromeLauncherControllerPerApp::GetLastActiveWebContents( | 1504 WebContents* ChromeLauncherController::GetLastActiveWebContents( |
1523 const std::string& app_id) { | 1505 const std::string& app_id) { |
1524 AppIDToWebContentsListMap::const_iterator i = | 1506 AppIDToWebContentsListMap::const_iterator i = |
1525 app_id_to_web_contents_list_.find(app_id); | 1507 app_id_to_web_contents_list_.find(app_id); |
1526 if (i == app_id_to_web_contents_list_.end()) | 1508 if (i == app_id_to_web_contents_list_.end()) |
1527 return NULL; | 1509 return NULL; |
1528 DCHECK_GT(i->second.size(), 0u); | 1510 DCHECK_GT(i->second.size(), 0u); |
1529 return *i->second.begin(); | 1511 return *i->second.begin(); |
1530 } | 1512 } |
1531 | 1513 |
1532 ash::LauncherID ChromeLauncherControllerPerApp::InsertAppLauncherItem( | 1514 ash::LauncherID ChromeLauncherController::InsertAppLauncherItem( |
1533 LauncherItemController* controller, | 1515 LauncherItemController* controller, |
1534 const std::string& app_id, | 1516 const std::string& app_id, |
1535 ash::LauncherItemStatus status, | 1517 ash::LauncherItemStatus status, |
1536 int index, | 1518 int index, |
1537 ash::LauncherItemType launcher_item_type) { | 1519 ash::LauncherItemType launcher_item_type) { |
1538 ash::LauncherID id = model_->next_id(); | 1520 ash::LauncherID id = model_->next_id(); |
1539 CHECK(!HasItemController(id)); | 1521 CHECK(!HasItemController(id)); |
1540 CHECK(controller); | 1522 CHECK(controller); |
1541 id_to_item_controller_map_[id] = controller; | 1523 id_to_item_controller_map_[id] = controller; |
1542 controller->set_launcher_id(id); | 1524 controller->set_launcher_id(id); |
(...skipping 14 matching lines...) Expand all Loading... |
1557 } | 1539 } |
1558 item.status = status; | 1540 item.status = status; |
1559 | 1541 |
1560 model_->AddAt(index, item); | 1542 model_->AddAt(index, item); |
1561 | 1543 |
1562 app_icon_loader_->FetchImage(app_id); | 1544 app_icon_loader_->FetchImage(app_id); |
1563 | 1545 |
1564 return id; | 1546 return id; |
1565 } | 1547 } |
1566 | 1548 |
1567 bool ChromeLauncherControllerPerApp::HasItemController( | 1549 bool ChromeLauncherController::HasItemController(ash::LauncherID id) const { |
1568 ash::LauncherID id) const { | |
1569 return id_to_item_controller_map_.find(id) != | 1550 return id_to_item_controller_map_.find(id) != |
1570 id_to_item_controller_map_.end(); | 1551 id_to_item_controller_map_.end(); |
1571 } | 1552 } |
1572 | 1553 |
1573 std::vector<content::WebContents*> | 1554 std::vector<content::WebContents*> |
1574 ChromeLauncherControllerPerApp::GetV1ApplicationsFromController( | 1555 ChromeLauncherController::GetV1ApplicationsFromController( |
1575 LauncherItemController* controller) { | 1556 LauncherItemController* controller) { |
1576 DCHECK(controller->type() == LauncherItemController::TYPE_SHORTCUT); | 1557 DCHECK(controller->type() == LauncherItemController::TYPE_SHORTCUT); |
1577 AppShortcutLauncherItemController* app_controller = | 1558 AppShortcutLauncherItemController* app_controller = |
1578 static_cast<AppShortcutLauncherItemController*>(controller); | 1559 static_cast<AppShortcutLauncherItemController*>(controller); |
1579 return app_controller->GetRunningApplications(); | 1560 return app_controller->GetRunningApplications(); |
1580 } | 1561 } |
1581 | 1562 |
1582 bool ChromeLauncherControllerPerApp::IsBrowserRepresentedInBrowserList( | 1563 bool ChromeLauncherController::IsBrowserRepresentedInBrowserList( |
1583 Browser* browser) { | 1564 Browser* browser) { |
1584 return (browser && | 1565 return (browser && |
1585 (browser->is_type_tabbed() || | 1566 (browser->is_type_tabbed() || |
1586 !browser->is_app() || | 1567 !browser->is_app() || |
1587 !browser->is_type_popup() || | 1568 !browser->is_type_popup() || |
1588 GetLauncherIDForAppID(web_app::GetExtensionIdFromApplicationName( | 1569 GetLauncherIDForAppID(web_app::GetExtensionIdFromApplicationName( |
1589 browser->app_name())) <= 0)); | 1570 browser->app_name())) <= 0)); |
1590 } | 1571 } |
1591 | 1572 |
1592 LauncherItemController* | 1573 LauncherItemController* |
1593 ChromeLauncherControllerPerApp::GetBrowserShortcutLauncherItemController() { | 1574 ChromeLauncherController::GetBrowserShortcutLauncherItemController() { |
1594 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); | 1575 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); |
1595 i != id_to_item_controller_map_.end(); ++i) { | 1576 i != id_to_item_controller_map_.end(); ++i) { |
1596 int index = model_->ItemIndexByID(i->first); | 1577 int index = model_->ItemIndexByID(i->first); |
1597 const ash::LauncherItem& item = model_->items()[index]; | 1578 const ash::LauncherItem& item = model_->items()[index]; |
1598 if (item.type == ash::TYPE_BROWSER_SHORTCUT) | 1579 if (item.type == ash::TYPE_BROWSER_SHORTCUT) |
1599 return i->second; | 1580 return i->second; |
1600 } | 1581 } |
1601 // LauncerItemController For Browser Shortcut must be existed. If it does not | 1582 // LauncerItemController For Browser Shortcut must be existed. If it does not |
1602 // existe create it. | 1583 // existe create it. |
1603 ash::LauncherID id = CreateBrowserShortcutLauncherItem(); | 1584 ash::LauncherID id = CreateBrowserShortcutLauncherItem(); |
1604 DCHECK(id_to_item_controller_map_[id]); | 1585 DCHECK(id_to_item_controller_map_[id]); |
1605 return id_to_item_controller_map_[id]; | 1586 return id_to_item_controller_map_[id]; |
1606 } | 1587 } |
1607 | 1588 |
1608 ash::LauncherID | 1589 ash::LauncherID ChromeLauncherController::CreateBrowserShortcutLauncherItem() { |
1609 ChromeLauncherControllerPerApp::CreateBrowserShortcutLauncherItem() { | |
1610 ash::LauncherItem browser_shortcut; | 1590 ash::LauncherItem browser_shortcut; |
1611 browser_shortcut.type = ash::TYPE_BROWSER_SHORTCUT; | 1591 browser_shortcut.type = ash::TYPE_BROWSER_SHORTCUT; |
1612 browser_shortcut.is_incognito = false; | 1592 browser_shortcut.is_incognito = false; |
1613 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 1593 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
1614 browser_shortcut.image = *rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_32); | 1594 browser_shortcut.image = *rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_32); |
1615 ash::LauncherID id = model_->next_id(); | 1595 ash::LauncherID id = model_->next_id(); |
1616 size_t index = GetChromeIconIndexFromPref(); | 1596 size_t index = GetChromeIconIndexFromPref(); |
1617 model_->AddAt(index, browser_shortcut); | 1597 model_->AddAt(index, browser_shortcut); |
1618 browser_item_controller_.reset( | 1598 browser_item_controller_.reset( |
1619 new BrowserShortcutLauncherItemController(this, profile_)); | 1599 new BrowserShortcutLauncherItemController(this, profile_)); |
1620 id_to_item_controller_map_[id] = browser_item_controller_.get(); | 1600 id_to_item_controller_map_[id] = browser_item_controller_.get(); |
1621 id_to_item_controller_map_[id]->set_launcher_id(id); | 1601 id_to_item_controller_map_[id]->set_launcher_id(id); |
1622 return id; | 1602 return id; |
1623 } | 1603 } |
1624 | 1604 |
1625 void ChromeLauncherControllerPerApp::PersistChromeItemIndex(int index) { | 1605 void ChromeLauncherController::PersistChromeItemIndex(int index) { |
1626 profile_->GetPrefs()->SetInteger(prefs::kShelfChromeIconIndex, index); | 1606 profile_->GetPrefs()->SetInteger(prefs::kShelfChromeIconIndex, index); |
1627 } | 1607 } |
1628 | 1608 |
1629 int ChromeLauncherControllerPerApp::GetChromeIconIndexFromPref() const { | 1609 int ChromeLauncherController::GetChromeIconIndexFromPref() const { |
1630 size_t index = profile_->GetPrefs()->GetInteger(prefs::kShelfChromeIconIndex); | 1610 size_t index = profile_->GetPrefs()->GetInteger(prefs::kShelfChromeIconIndex); |
1631 const base::ListValue* pinned_apps_pref = | 1611 const base::ListValue* pinned_apps_pref = |
1632 profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps); | 1612 profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps); |
1633 if (ash::switches::UseAlternateShelfLayout()) | 1613 if (ash::switches::UseAlternateShelfLayout()) |
1634 return std::max(static_cast<size_t>(1), | 1614 return std::max(static_cast<size_t>(1), |
1635 std::min(pinned_apps_pref->GetSize() + 1, index)); | 1615 std::min(pinned_apps_pref->GetSize() + 1, index)); |
1636 return std::max(static_cast<size_t>(0), | 1616 return std::max(static_cast<size_t>(0), |
1637 std::min(pinned_apps_pref->GetSize(), index)); | 1617 std::min(pinned_apps_pref->GetSize(), index)); |
1638 } | 1618 } |
1639 | 1619 |
1640 bool ChromeLauncherControllerPerApp::IsIncognito( | 1620 bool ChromeLauncherController::IsIncognito( |
1641 content::WebContents* web_contents) const { | 1621 content::WebContents* web_contents) const { |
1642 const Profile* profile = | 1622 const Profile* profile = |
1643 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 1623 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
1644 return profile->IsOffTheRecord() && !profile->IsGuestSession(); | 1624 return profile->IsOffTheRecord() && !profile->IsGuestSession(); |
1645 } | 1625 } |
1646 | 1626 |
1647 void ChromeLauncherControllerPerApp::CloseWindowedAppsFromRemovedExtension( | 1627 void ChromeLauncherController::CloseWindowedAppsFromRemovedExtension( |
1648 const std::string& app_id) { | 1628 const std::string& app_id) { |
1649 // This function cannot rely on the controller's enumeration functionality | 1629 // This function cannot rely on the controller's enumeration functionality |
1650 // since the extension has already be unloaded. | 1630 // since the extension has already be unloaded. |
1651 const BrowserList* ash_browser_list = | 1631 const BrowserList* ash_browser_list = |
1652 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH); | 1632 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH); |
1653 std::vector<Browser*> browser_to_close; | 1633 std::vector<Browser*> browser_to_close; |
1654 for (BrowserList::const_reverse_iterator | 1634 for (BrowserList::const_reverse_iterator |
1655 it = ash_browser_list->begin_last_active(); | 1635 it = ash_browser_list->begin_last_active(); |
1656 it != ash_browser_list->end_last_active(); ++it) { | 1636 it != ash_browser_list->end_last_active(); ++it) { |
1657 Browser* browser = *it; | 1637 Browser* browser = *it; |
1658 if (!browser->is_type_tabbed() && | 1638 if (!browser->is_type_tabbed() && |
1659 browser->is_type_popup() && | 1639 browser->is_type_popup() && |
1660 browser->is_app() && | 1640 browser->is_app() && |
1661 app_id == web_app::GetExtensionIdFromApplicationName( | 1641 app_id == web_app::GetExtensionIdFromApplicationName( |
1662 browser->app_name())) { | 1642 browser->app_name())) { |
1663 browser_to_close.push_back(browser); | 1643 browser_to_close.push_back(browser); |
1664 } | 1644 } |
1665 } | 1645 } |
1666 while (!browser_to_close.empty()) { | 1646 while (!browser_to_close.empty()) { |
1667 TabStripModel* tab_strip = browser_to_close.back()->tab_strip_model(); | 1647 TabStripModel* tab_strip = browser_to_close.back()->tab_strip_model(); |
1668 tab_strip->CloseWebContentsAt(0, TabStripModel::CLOSE_NONE); | 1648 tab_strip->CloseWebContentsAt(0, TabStripModel::CLOSE_NONE); |
1669 browser_to_close.pop_back(); | 1649 browser_to_close.pop_back(); |
1670 } | 1650 } |
1671 } | 1651 } |
1672 | 1652 |
1673 void | 1653 void |
1674 ChromeLauncherControllerPerApp::MoveItemWithoutPinnedStateChangeNotification( | 1654 ChromeLauncherController::MoveItemWithoutPinnedStateChangeNotification( |
1675 int source_index, int target_index) { | 1655 int source_index, int target_index) { |
1676 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true); | 1656 base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true); |
1677 model_->Move(source_index, target_index); | 1657 model_->Move(source_index, target_index); |
1678 } | 1658 } |
OLD | NEW |