OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 } | 348 } |
349 | 349 |
350 void ChromeLauncherControllerImpl::CloseLauncherItem(ash::ShelfID id) { | 350 void ChromeLauncherControllerImpl::CloseLauncherItem(ash::ShelfID id) { |
351 CHECK(id); | 351 CHECK(id); |
352 if (IsPinned(id)) { | 352 if (IsPinned(id)) { |
353 // Create a new shortcut controller. | 353 // Create a new shortcut controller. |
354 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 354 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
355 CHECK(iter != id_to_item_controller_map_.end()); | 355 CHECK(iter != id_to_item_controller_map_.end()); |
356 SetItemStatus(id, ash::STATUS_CLOSED); | 356 SetItemStatus(id, ash::STATUS_CLOSED); |
357 std::string app_id = iter->second->app_id(); | 357 std::string app_id = iter->second->app_id(); |
358 iter->second = AppShortcutLauncherItemController::Create(app_id, this); | 358 std::string app_shelf_id = iter->second->app_id(); |
359 if (iter->second->type() == LauncherItemController::TYPE_APP) { | |
360 AppWindowLauncherItemController* app_window_controller = | |
361 static_cast<AppWindowLauncherItemController*>(iter->second); | |
362 app_shelf_id = app_window_controller->app_shelf_id(); | |
363 } | |
364 iter->second = | |
365 AppShortcutLauncherItemController::Create(app_id, app_shelf_id, this); | |
359 iter->second->set_shelf_id(id); | 366 iter->second->set_shelf_id(id); |
360 // Existing controller is destroyed and replaced by registering again. | 367 // Existing controller is destroyed and replaced by registering again. |
361 SetShelfItemDelegate(id, iter->second); | 368 SetShelfItemDelegate(id, iter->second); |
362 } else { | 369 } else { |
363 LauncherItemClosed(id); | 370 LauncherItemClosed(id); |
364 } | 371 } |
365 } | 372 } |
366 | 373 |
367 void ChromeLauncherControllerImpl::Pin(ash::ShelfID id) { | 374 void ChromeLauncherControllerImpl::Pin(ash::ShelfID id) { |
368 DCHECK(HasShelfIDToAppIDMapping(id)); | 375 DCHECK(HasShelfIDToAppIDMapping(id)); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
421 return false; | 428 return false; |
422 | 429 |
423 ash::ShelfItemType type = model_->items()[index].type; | 430 ash::ShelfItemType type = model_->items()[index].type; |
424 std::string app_id; | 431 std::string app_id; |
425 return ((type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_PLATFORM_APP || | 432 return ((type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_PLATFORM_APP || |
426 type == ash::TYPE_WINDOWED_APP) && | 433 type == ash::TYPE_WINDOWED_APP) && |
427 model_->GetShelfItemDelegate(id)->CanPin()); | 434 model_->GetShelfItemDelegate(id)->CanPin()); |
428 } | 435 } |
429 | 436 |
430 void ChromeLauncherControllerImpl::LockV1AppWithID(const std::string& app_id) { | 437 void ChromeLauncherControllerImpl::LockV1AppWithID(const std::string& app_id) { |
431 ash::ShelfID id = GetShelfIDForAppID(app_id); | 438 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
432 if (!IsPinned(id) && !IsWindowedAppInLauncher(app_id)) { | 439 if (!IsPinned(id) && !IsWindowedAppInLauncher(app_id)) { |
433 CreateAppShortcutLauncherItemWithType(app_id, model_->item_count(), | 440 CreateAppShortcutLauncherItemWithType(app_id, model_->item_count(), |
434 ash::TYPE_WINDOWED_APP); | 441 ash::TYPE_WINDOWED_APP); |
435 id = GetShelfIDForAppID(app_id); | 442 id = GetShelfIDForAppID(app_id, app_id); |
436 } | 443 } |
437 CHECK(id); | 444 CHECK(id); |
438 id_to_item_controller_map_[id]->lock(); | 445 id_to_item_controller_map_[id]->lock(); |
439 } | 446 } |
440 | 447 |
441 void ChromeLauncherControllerImpl::UnlockV1AppWithID( | 448 void ChromeLauncherControllerImpl::UnlockV1AppWithID( |
442 const std::string& app_id) { | 449 const std::string& app_id) { |
443 ash::ShelfID id = GetShelfIDForAppID(app_id); | 450 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
444 CHECK(id); | 451 CHECK(id); |
445 CHECK(IsPinned(id) || IsWindowedAppInLauncher(app_id)); | 452 CHECK(IsPinned(id) || IsWindowedAppInLauncher(app_id)); |
446 LauncherItemController* controller = id_to_item_controller_map_[id]; | 453 LauncherItemController* controller = id_to_item_controller_map_[id]; |
447 controller->unlock(); | 454 controller->unlock(); |
448 if (!controller->locked() && !IsPinned(id)) | 455 if (!controller->locked() && !IsPinned(id)) |
449 CloseLauncherItem(id); | 456 CloseLauncherItem(id); |
450 } | 457 } |
451 | 458 |
452 void ChromeLauncherControllerImpl::Launch(ash::ShelfID id, int event_flags) { | 459 void ChromeLauncherControllerImpl::Launch(ash::ShelfID id, int event_flags) { |
453 LauncherItemController* controller = GetLauncherItemController(id); | 460 LauncherItemController* controller = GetLauncherItemController(id); |
(...skipping 30 matching lines...) Expand all Loading... | |
484 void ChromeLauncherControllerImpl::LaunchApp(const std::string& app_id, | 491 void ChromeLauncherControllerImpl::LaunchApp(const std::string& app_id, |
485 ash::LaunchSource source, | 492 ash::LaunchSource source, |
486 int event_flags) { | 493 int event_flags) { |
487 launcher_controller_helper_->LaunchApp(app_id, source, event_flags); | 494 launcher_controller_helper_->LaunchApp(app_id, source, event_flags); |
488 } | 495 } |
489 | 496 |
490 void ChromeLauncherControllerImpl::ActivateApp(const std::string& app_id, | 497 void ChromeLauncherControllerImpl::ActivateApp(const std::string& app_id, |
491 ash::LaunchSource source, | 498 ash::LaunchSource source, |
492 int event_flags) { | 499 int event_flags) { |
493 // If there is an existing non-shortcut controller for this app, open it. | 500 // If there is an existing non-shortcut controller for this app, open it. |
494 ash::ShelfID id = GetShelfIDForAppID(app_id); | 501 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
495 if (id) { | 502 if (id) { |
496 LauncherItemController* controller = GetLauncherItemController(id); | 503 LauncherItemController* controller = GetLauncherItemController(id); |
497 controller->Activate(source); | 504 controller->Activate(source); |
498 return; | 505 return; |
499 } | 506 } |
500 | 507 |
501 // Create a temporary application launcher item and use it to see if there are | 508 // Create a temporary application launcher item and use it to see if there are |
502 // running instances. | 509 // running instances. |
503 std::unique_ptr<AppShortcutLauncherItemController> app_controller( | 510 std::unique_ptr<AppShortcutLauncherItemController> app_controller( |
504 AppShortcutLauncherItemController::Create(app_id, this)); | 511 AppShortcutLauncherItemController::Create(app_id, app_id, this)); |
505 if (!app_controller->GetRunningApplications().empty()) | 512 if (!app_controller->GetRunningApplications().empty()) |
506 app_controller->Activate(source); | 513 app_controller->Activate(source); |
507 else | 514 else |
508 LaunchApp(app_id, source, event_flags); | 515 LaunchApp(app_id, source, event_flags); |
509 } | 516 } |
510 | 517 |
511 extensions::LaunchType ChromeLauncherControllerImpl::GetLaunchType( | 518 extensions::LaunchType ChromeLauncherControllerImpl::GetLaunchType( |
512 ash::ShelfID id) { | 519 ash::ShelfID id) { |
513 const Extension* extension = | 520 const Extension* extension = |
514 GetExtensionForAppID(GetAppIDForShelfID(id), profile_); | 521 GetExtensionForAppID(GetAppIDForShelfID(id), profile_); |
(...skipping 12 matching lines...) Expand all Loading... | |
527 int index = model_->ItemIndexByID(shelf_id); | 534 int index = model_->ItemIndexByID(shelf_id); |
528 if (index == -1) | 535 if (index == -1) |
529 return; | 536 return; |
530 ash::ShelfItem item = model_->items()[index]; | 537 ash::ShelfItem item = model_->items()[index]; |
531 item.image = image; | 538 item.image = image; |
532 model_->Set(index, item); | 539 model_->Set(index, item); |
533 } | 540 } |
534 | 541 |
535 bool ChromeLauncherControllerImpl::IsWindowedAppInLauncher( | 542 bool ChromeLauncherControllerImpl::IsWindowedAppInLauncher( |
536 const std::string& app_id) { | 543 const std::string& app_id) { |
537 int index = model_->ItemIndexByID(GetShelfIDForAppID(app_id)); | 544 int index = model_->ItemIndexByID(GetShelfIDForAppID(app_id, app_id)); |
538 if (index < 0) | 545 if (index < 0) |
539 return false; | 546 return false; |
540 | 547 |
541 ash::ShelfItemType type = model_->items()[index].type; | 548 ash::ShelfItemType type = model_->items()[index].type; |
542 return type == ash::TYPE_WINDOWED_APP; | 549 return type == ash::TYPE_WINDOWED_APP; |
543 } | 550 } |
544 | 551 |
545 void ChromeLauncherControllerImpl::SetLaunchType( | 552 void ChromeLauncherControllerImpl::SetLaunchType( |
546 ash::ShelfID id, | 553 ash::ShelfID id, |
547 extensions::LaunchType launch_type) { | 554 extensions::LaunchType launch_type) { |
(...skipping 16 matching lines...) Expand all Loading... | |
564 // Check if the gMail app is loaded and it matches the given content. | 571 // Check if the gMail app is loaded and it matches the given content. |
565 // This special treatment is needed to address crbug.com/234268. | 572 // This special treatment is needed to address crbug.com/234268. |
566 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) | 573 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) |
567 app_id = kGmailAppId; | 574 app_id = kGmailAppId; |
568 | 575 |
569 // Check the old |app_id| for a tab. If the contents has changed we need to | 576 // Check the old |app_id| for a tab. If the contents has changed we need to |
570 // remove it from the previous app. | 577 // remove it from the previous app. |
571 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { | 578 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { |
572 std::string last_app_id = web_contents_to_app_id_[contents]; | 579 std::string last_app_id = web_contents_to_app_id_[contents]; |
573 if (last_app_id != app_id) { | 580 if (last_app_id != app_id) { |
574 ash::ShelfID id = GetShelfIDForAppID(last_app_id); | 581 ash::ShelfID id = GetShelfIDForAppID(last_app_id, last_app_id); |
575 if (id) { | 582 if (id) { |
576 // Since GetAppState() will use |web_contents_to_app_id_| we remove | 583 // Since GetAppState() will use |web_contents_to_app_id_| we remove |
577 // the connection before calling it. | 584 // the connection before calling it. |
578 web_contents_to_app_id_.erase(contents); | 585 web_contents_to_app_id_.erase(contents); |
579 SetItemStatus(id, GetAppState(last_app_id)); | 586 SetItemStatus(id, GetAppState(last_app_id)); |
580 } | 587 } |
581 } | 588 } |
582 } | 589 } |
583 | 590 |
584 if (app_state == APP_STATE_REMOVED) | 591 if (app_state == APP_STATE_REMOVED) |
585 web_contents_to_app_id_.erase(contents); | 592 web_contents_to_app_id_.erase(contents); |
586 else | 593 else |
587 web_contents_to_app_id_[contents] = app_id; | 594 web_contents_to_app_id_[contents] = app_id; |
588 | 595 |
589 ash::ShelfID id = GetShelfIDForAppID(app_id); | 596 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
590 if (id) { | 597 if (id) { |
591 SetItemStatus(id, (app_state == APP_STATE_WINDOW_ACTIVE || | 598 SetItemStatus(id, (app_state == APP_STATE_WINDOW_ACTIVE || |
592 app_state == APP_STATE_ACTIVE) | 599 app_state == APP_STATE_ACTIVE) |
593 ? ash::STATUS_ACTIVE | 600 ? ash::STATUS_ACTIVE |
594 : GetAppState(app_id)); | 601 : GetAppState(app_id)); |
595 } | 602 } |
596 } | 603 } |
597 | 604 |
598 ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForWebContents( | 605 ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForWebContents( |
599 content::WebContents* contents) { | 606 content::WebContents* contents) { |
600 DCHECK(contents); | 607 DCHECK(contents); |
601 | 608 |
602 std::string app_id = launcher_controller_helper_->GetAppID(contents); | 609 std::string app_id = launcher_controller_helper_->GetAppID(contents); |
603 | 610 |
604 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) | 611 if (app_id.empty() && ContentCanBeHandledByGmailApp(contents)) |
605 app_id = kGmailAppId; | 612 app_id = kGmailAppId; |
606 | 613 |
607 ash::ShelfID id = GetShelfIDForAppID(app_id); | 614 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
608 | 615 |
609 if (app_id.empty() || !id) { | 616 if (app_id.empty() || !id) { |
610 int browser_index = model_->GetItemIndexForType(ash::TYPE_BROWSER_SHORTCUT); | 617 int browser_index = model_->GetItemIndexForType(ash::TYPE_BROWSER_SHORTCUT); |
611 return model_->items()[browser_index].id; | 618 return model_->items()[browser_index].id; |
612 } | 619 } |
613 | 620 |
614 return id; | 621 return id; |
615 } | 622 } |
616 | 623 |
617 void ChromeLauncherControllerImpl::SetRefocusURLPatternForTest( | 624 void ChromeLauncherControllerImpl::SetRefocusURLPatternForTest( |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 for (auto& controller : app_window_controllers_) | 711 for (auto& controller : app_window_controllers_) |
705 controller->AdditionalUserAddedToSession(profile); | 712 controller->AdditionalUserAddedToSession(profile); |
706 } | 713 } |
707 | 714 |
708 ChromeLauncherAppMenuItems ChromeLauncherControllerImpl::GetApplicationList( | 715 ChromeLauncherAppMenuItems ChromeLauncherControllerImpl::GetApplicationList( |
709 const ash::ShelfItem& item, | 716 const ash::ShelfItem& item, |
710 int event_flags) { | 717 int event_flags) { |
711 // Make sure that there is a controller associated with the id and that the | 718 // Make sure that there is a controller associated with the id and that the |
712 // extension itself is a valid application and not a panel. | 719 // extension itself is a valid application and not a panel. |
713 LauncherItemController* controller = GetLauncherItemController(item.id); | 720 LauncherItemController* controller = GetLauncherItemController(item.id); |
714 if (!controller || !GetShelfIDForAppID(controller->app_id())) | 721 if (!controller || |
722 !GetShelfIDForAppID(controller->app_id(), controller->app_id())) | |
715 return ChromeLauncherAppMenuItems(); | 723 return ChromeLauncherAppMenuItems(); |
716 | 724 |
717 return controller->GetApplicationList(event_flags); | 725 return controller->GetApplicationList(event_flags); |
718 } | 726 } |
719 | 727 |
720 std::vector<content::WebContents*> | 728 std::vector<content::WebContents*> |
721 ChromeLauncherControllerImpl::GetV1ApplicationsFromAppId( | 729 ChromeLauncherControllerImpl::GetV1ApplicationsFromAppId( |
722 const std::string& app_id) { | 730 const std::string& app_id) { |
723 ash::ShelfID id = GetShelfIDForAppID(app_id); | 731 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
724 | 732 |
725 // If there is no such an item pinned to the launcher, no menu gets created. | 733 // If there is no such an item pinned to the launcher, no menu gets created. |
726 if (id) { | 734 if (id) { |
727 LauncherItemController* controller = GetLauncherItemController(id); | 735 LauncherItemController* controller = GetLauncherItemController(id); |
728 DCHECK(controller); | 736 DCHECK(controller); |
729 if (controller->type() == LauncherItemController::TYPE_SHORTCUT) | 737 if (controller->type() == LauncherItemController::TYPE_SHORTCUT) |
730 return GetV1ApplicationsFromController(controller); | 738 return GetV1ApplicationsFromController(controller); |
731 } | 739 } |
732 return std::vector<content::WebContents*>(); | 740 return std::vector<content::WebContents*>(); |
733 } | 741 } |
734 | 742 |
735 void ChromeLauncherControllerImpl::ActivateShellApp(const std::string& app_id, | 743 void ChromeLauncherControllerImpl::ActivateShellApp(const std::string& app_id, |
736 int index) { | 744 int index) { |
737 ash::ShelfID id = GetShelfIDForAppID(app_id); | 745 ash::ShelfID id = GetShelfIDForAppID(app_id, app_id); |
738 if (id) { | 746 if (id) { |
739 LauncherItemController* controller = GetLauncherItemController(id); | 747 LauncherItemController* controller = GetLauncherItemController(id); |
740 if (controller && controller->type() == LauncherItemController::TYPE_APP) { | 748 if (controller && controller->type() == LauncherItemController::TYPE_APP) { |
741 AppWindowLauncherItemController* app_window_controller = | 749 AppWindowLauncherItemController* app_window_controller = |
742 static_cast<AppWindowLauncherItemController*>(controller); | 750 static_cast<AppWindowLauncherItemController*>(controller); |
743 app_window_controller->ActivateIndexedApp(index); | 751 app_window_controller->ActivateIndexedApp(index); |
744 } | 752 } |
745 } | 753 } |
746 } | 754 } |
747 | 755 |
748 bool ChromeLauncherControllerImpl::IsWebContentHandledByApplication( | 756 bool ChromeLauncherControllerImpl::IsWebContentHandledByApplication( |
749 content::WebContents* web_contents, | 757 content::WebContents* web_contents, |
750 const std::string& app_id) { | 758 const std::string& app_id) { |
751 if ((web_contents_to_app_id_.find(web_contents) != | 759 if ((web_contents_to_app_id_.find(web_contents) != |
752 web_contents_to_app_id_.end()) && | 760 web_contents_to_app_id_.end()) && |
753 (web_contents_to_app_id_[web_contents] == app_id)) | 761 (web_contents_to_app_id_[web_contents] == app_id)) |
754 return true; | 762 return true; |
755 return (app_id == kGmailAppId && ContentCanBeHandledByGmailApp(web_contents)); | 763 return (app_id == kGmailAppId && ContentCanBeHandledByGmailApp(web_contents)); |
756 } | 764 } |
757 | 765 |
758 bool ChromeLauncherControllerImpl::ContentCanBeHandledByGmailApp( | 766 bool ChromeLauncherControllerImpl::ContentCanBeHandledByGmailApp( |
759 content::WebContents* web_contents) { | 767 content::WebContents* web_contents) { |
760 ash::ShelfID id = GetShelfIDForAppID(kGmailAppId); | 768 ash::ShelfID id = GetShelfIDForAppID(kGmailAppId, kGmailAppId); |
761 if (id) { | 769 if (id) { |
762 const GURL url = web_contents->GetURL(); | 770 const GURL url = web_contents->GetURL(); |
763 // We need to extend the application matching for the gMail app beyond the | 771 // We need to extend the application matching for the gMail app beyond the |
764 // manifest file's specification. This is required because of the namespace | 772 // manifest file's specification. This is required because of the namespace |
765 // overlap with the offline app ("/mail/mu/"). | 773 // overlap with the offline app ("/mail/mu/"). |
766 if (!base::MatchPattern(url.path(), "/mail/mu/*") && | 774 if (!base::MatchPattern(url.path(), "/mail/mu/*") && |
767 base::MatchPattern(url.path(), "/mail/*") && | 775 base::MatchPattern(url.path(), "/mail/*") && |
768 GetExtensionForAppID(kGmailAppId, profile_) && | 776 GetExtensionForAppID(kGmailAppId, profile_) && |
769 GetExtensionForAppID(kGmailAppId, profile_)->OverlapsWithOrigin(url)) | 777 GetExtensionForAppID(kGmailAppId, profile_)->OverlapsWithOrigin(url)) |
770 return true; | 778 return true; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
887 shelf->auto_hide_behavior()); | 895 shelf->auto_hide_behavior()); |
888 } | 896 } |
889 | 897 |
890 void ChromeLauncherControllerImpl::OnShelfAutoHideStateChanged( | 898 void ChromeLauncherControllerImpl::OnShelfAutoHideStateChanged( |
891 ash::Shelf* shelf) {} | 899 ash::Shelf* shelf) {} |
892 | 900 |
893 void ChromeLauncherControllerImpl::OnShelfVisibilityStateChanged( | 901 void ChromeLauncherControllerImpl::OnShelfVisibilityStateChanged( |
894 ash::Shelf* shelf) {} | 902 ash::Shelf* shelf) {} |
895 | 903 |
896 ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForAppID( | 904 ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForAppID( |
897 const std::string& app_id) { | 905 const std::string& app_id, |
906 const std::string& app_shelf_id) { | |
898 for (IDToItemControllerMap::const_iterator i = | 907 for (IDToItemControllerMap::const_iterator i = |
899 id_to_item_controller_map_.begin(); | 908 id_to_item_controller_map_.begin(); |
900 i != id_to_item_controller_map_.end(); ++i) { | 909 i != id_to_item_controller_map_.end(); ++i) { |
stevenjb
2016/08/29 15:56:30
Convert this to a C++11 style iterator
Andra Paraschiv
2016/08/30 09:58:24
Done.
| |
901 if (i->second->type() == LauncherItemController::TYPE_APP_PANEL) | 910 if (i->second->type() == LauncherItemController::TYPE_APP_PANEL) |
902 continue; // Don't include panels | 911 continue; // Don't include panels |
903 if (i->second->app_id() == app_id) | 912 // If app window controller, check app_id and app_shelf_id. |
913 if (i->second->type() == LauncherItemController::TYPE_APP) { | |
914 AppWindowLauncherItemController* app_window_controller = | |
915 static_cast<AppWindowLauncherItemController*>(i->second); | |
916 if ((app_window_controller->app_id() == app_id) && | |
917 (app_window_controller->app_shelf_id() == app_shelf_id)) { | |
918 return i->first; | |
919 } | |
920 // If not browser shortcut controller, check app_id and app_shelf_id. | |
921 } else if ((i->second->type() == LauncherItemController::TYPE_SHORTCUT) && | |
922 (i->second->app_id() != extension_misc::kChromeAppId)) { | |
923 AppShortcutLauncherItemController* app_shortcut_controller = | |
924 static_cast<AppShortcutLauncherItemController*>(i->second); | |
925 if ((app_shortcut_controller->app_id() == app_id) && | |
926 (app_shortcut_controller->app_shelf_id() == app_shelf_id)) { | |
927 return i->first; | |
928 } | |
929 } else if (i->second->app_id() == app_id) { | |
904 return i->first; | 930 return i->first; |
931 } | |
905 } | 932 } |
906 return 0; | 933 return 0; |
907 } | 934 } |
908 | 935 |
909 bool ChromeLauncherControllerImpl::HasShelfIDToAppIDMapping( | 936 bool ChromeLauncherControllerImpl::HasShelfIDToAppIDMapping( |
910 ash::ShelfID id) const { | 937 ash::ShelfID id) const { |
911 return id_to_item_controller_map_.find(id) != | 938 return id_to_item_controller_map_.find(id) != |
912 id_to_item_controller_map_.end(); | 939 id_to_item_controller_map_.end(); |
913 } | 940 } |
914 | 941 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
969 if (app_icon_loader) | 996 if (app_icon_loader) |
970 app_icon_loader->UpdateImage(app_id); | 997 app_icon_loader->UpdateImage(app_id); |
971 } | 998 } |
972 | 999 |
973 void ChromeLauncherControllerImpl::OnAppUninstalledPrepared( | 1000 void ChromeLauncherControllerImpl::OnAppUninstalledPrepared( |
974 content::BrowserContext* browser_context, | 1001 content::BrowserContext* browser_context, |
975 const std::string& app_id) { | 1002 const std::string& app_id) { |
976 // Since we might have windowed apps of this type which might have | 1003 // Since we might have windowed apps of this type which might have |
977 // outstanding locks which needs to be removed. | 1004 // outstanding locks which needs to be removed. |
978 const Profile* profile = Profile::FromBrowserContext(browser_context); | 1005 const Profile* profile = Profile::FromBrowserContext(browser_context); |
979 if (GetShelfIDForAppID(app_id)) | 1006 if (GetShelfIDForAppID(app_id, app_id)) |
980 CloseWindowedAppsFromRemovedExtension(app_id, profile); | 1007 CloseWindowedAppsFromRemovedExtension(app_id, profile); |
981 | 1008 |
982 if (IsAppPinned(app_id)) { | 1009 if (IsAppPinned(app_id)) { |
983 if (profile == profile_) | 1010 if (profile == profile_) |
984 DoUnpinAppWithID(app_id); | 1011 DoUnpinAppWithID(app_id); |
985 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); | 1012 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); |
986 if (app_icon_loader) | 1013 if (app_icon_loader) |
987 app_icon_loader->ClearImage(app_id); | 1014 app_icon_loader->ClearImage(app_id); |
988 } | 1015 } |
989 } | 1016 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1034 const std::string& user_id) { | 1061 const std::string& user_id) { |
1035 const RunningAppListIdMap::iterator app_id_list = | 1062 const RunningAppListIdMap::iterator app_id_list = |
1036 last_used_running_application_order_.find(user_id); | 1063 last_used_running_application_order_.find(user_id); |
1037 if (app_id_list == last_used_running_application_order_.end()) | 1064 if (app_id_list == last_used_running_application_order_.end()) |
1038 return; | 1065 return; |
1039 | 1066 |
1040 // Find the first insertion point for running applications. | 1067 // Find the first insertion point for running applications. |
1041 int running_index = model_->FirstRunningAppIndex(); | 1068 int running_index = model_->FirstRunningAppIndex(); |
1042 for (RunningAppListIds::iterator app_id = app_id_list->second.begin(); | 1069 for (RunningAppListIds::iterator app_id = app_id_list->second.begin(); |
1043 app_id != app_id_list->second.end(); ++app_id) { | 1070 app_id != app_id_list->second.end(); ++app_id) { |
1044 ash::ShelfID shelf_id = GetShelfIDForAppID(*app_id); | 1071 ash::ShelfID shelf_id = GetShelfIDForAppID(*app_id, *app_id); |
1045 if (shelf_id) { | 1072 if (shelf_id) { |
1046 int app_index = model_->ItemIndexByID(shelf_id); | 1073 int app_index = model_->ItemIndexByID(shelf_id); |
1047 DCHECK_GE(app_index, 0); | 1074 DCHECK_GE(app_index, 0); |
1048 ash::ShelfItemType type = model_->items()[app_index].type; | 1075 ash::ShelfItemType type = model_->items()[app_index].type; |
1049 if (type == ash::TYPE_WINDOWED_APP || type == ash::TYPE_PLATFORM_APP) { | 1076 if (type == ash::TYPE_WINDOWED_APP || type == ash::TYPE_PLATFORM_APP) { |
1050 if (running_index != app_index) | 1077 if (running_index != app_index) |
1051 model_->Move(running_index, app_index); | 1078 model_->Move(running_index, app_index); |
1052 running_index++; | 1079 running_index++; |
1053 } | 1080 } |
1054 } | 1081 } |
1055 } | 1082 } |
1056 } | 1083 } |
1057 | 1084 |
1058 ash::ShelfID | 1085 ash::ShelfID |
1059 ChromeLauncherControllerImpl::CreateAppShortcutLauncherItemWithType( | 1086 ChromeLauncherControllerImpl::CreateAppShortcutLauncherItemWithType( |
1060 const std::string& app_id, | 1087 const std::string& app_id, |
1061 int index, | 1088 int index, |
1062 ash::ShelfItemType shelf_item_type) { | 1089 ash::ShelfItemType shelf_item_type) { |
1063 AppShortcutLauncherItemController* controller = | 1090 AppShortcutLauncherItemController* controller = |
1064 AppShortcutLauncherItemController::Create(app_id, this); | 1091 AppShortcutLauncherItemController::Create(app_id, app_id, this); |
1065 ash::ShelfID shelf_id = InsertAppLauncherItem( | 1092 ash::ShelfID shelf_id = InsertAppLauncherItem( |
1066 controller, app_id, ash::STATUS_CLOSED, index, shelf_item_type); | 1093 controller, app_id, ash::STATUS_CLOSED, index, shelf_item_type); |
1067 return shelf_id; | 1094 return shelf_id; |
1068 } | 1095 } |
1069 | 1096 |
1070 void ChromeLauncherControllerImpl::LauncherItemClosed(ash::ShelfID id) { | 1097 void ChromeLauncherControllerImpl::LauncherItemClosed(ash::ShelfID id) { |
1071 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 1098 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
1072 CHECK(iter != id_to_item_controller_map_.end()); | 1099 CHECK(iter != id_to_item_controller_map_.end()); |
1073 CHECK(iter->second); | 1100 CHECK(iter->second); |
1074 const std::string& app_id = iter->second->app_id(); | 1101 const std::string& app_id = iter->second->app_id(); |
1075 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); | 1102 AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); |
1076 if (app_icon_loader) | 1103 if (app_icon_loader) |
1077 app_icon_loader->ClearImage(app_id); | 1104 app_icon_loader->ClearImage(app_id); |
1078 id_to_item_controller_map_.erase(iter); | 1105 id_to_item_controller_map_.erase(iter); |
1079 int index = model_->ItemIndexByID(id); | 1106 int index = model_->ItemIndexByID(id); |
1080 // A "browser proxy" is not known to the model and this removal does | 1107 // A "browser proxy" is not known to the model and this removal does |
1081 // therefore not need to be propagated to the model. | 1108 // therefore not need to be propagated to the model. |
1082 if (index != -1) | 1109 if (index != -1) |
1083 model_->RemoveItemAt(index); | 1110 model_->RemoveItemAt(index); |
1084 } | 1111 } |
1085 | 1112 |
1086 void ChromeLauncherControllerImpl::DoPinAppWithID(const std::string& app_id) { | 1113 void ChromeLauncherControllerImpl::DoPinAppWithID(const std::string& app_id) { |
1087 // If there is an item, do nothing and return. | 1114 // If there is an item, do nothing and return. |
1088 if (IsAppPinned(app_id)) | 1115 if (IsAppPinned(app_id)) |
1089 return; | 1116 return; |
1090 | 1117 |
1091 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1118 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id, app_id); |
1092 if (shelf_id) { | 1119 if (shelf_id) { |
1093 // App item exists, pin it | 1120 // App item exists, pin it |
1094 Pin(shelf_id); | 1121 Pin(shelf_id); |
1095 } else { | 1122 } else { |
1096 // Otherwise, create a shortcut item for it. | 1123 // Otherwise, create a shortcut item for it. |
1097 shelf_id = CreateAppShortcutLauncherItem(app_id, model_->item_count()); | 1124 shelf_id = CreateAppShortcutLauncherItem(app_id, model_->item_count()); |
1098 SyncPinPosition(shelf_id); | 1125 SyncPinPosition(shelf_id); |
1099 } | 1126 } |
1100 } | 1127 } |
1101 | 1128 |
1102 void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id) { | 1129 void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id) { |
1103 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); | 1130 ash::ShelfID shelf_id = GetShelfIDForAppID(app_id, app_id); |
1104 if (shelf_id && IsPinned(shelf_id)) | 1131 if (shelf_id && IsPinned(shelf_id)) |
1105 Unpin(shelf_id); | 1132 Unpin(shelf_id); |
1106 } | 1133 } |
1107 | 1134 |
1108 int ChromeLauncherControllerImpl::PinRunningAppInternal(int index, | 1135 int ChromeLauncherControllerImpl::PinRunningAppInternal(int index, |
1109 ash::ShelfID shelf_id) { | 1136 ash::ShelfID shelf_id) { |
1110 int running_index = model_->ItemIndexByID(shelf_id); | 1137 int running_index = model_->ItemIndexByID(shelf_id); |
1111 ash::ShelfItem item = model_->items()[running_index]; | 1138 ash::ShelfItem item = model_->items()[running_index]; |
1112 DCHECK(item.type == ash::TYPE_WINDOWED_APP || | 1139 DCHECK(item.type == ash::TYPE_WINDOWED_APP || |
1113 item.type == ash::TYPE_PLATFORM_APP); | 1140 item.type == ash::TYPE_PLATFORM_APP); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1251 --max_index; | 1278 --max_index; |
1252 } | 1279 } |
1253 --index; | 1280 --index; |
1254 } | 1281 } |
1255 } | 1282 } |
1256 // If the item wasn't found, that means id_to_item_controller_map_ | 1283 // If the item wasn't found, that means id_to_item_controller_map_ |
1257 // is out of sync. | 1284 // is out of sync. |
1258 DCHECK(index <= max_index); | 1285 DCHECK(index <= max_index); |
1259 } else { | 1286 } else { |
1260 // Check if the item was already running but not yet pinned. | 1287 // Check if the item was already running but not yet pinned. |
1261 ash::ShelfID shelf_id = GetShelfIDForAppID(*pref_app_id); | 1288 ash::ShelfID shelf_id = GetShelfIDForAppID(*pref_app_id, *pref_app_id); |
1262 if (shelf_id) { | 1289 if (shelf_id) { |
1263 // This app is running but not yet pinned. So pin and move it. | 1290 // This app is running but not yet pinned. So pin and move it. |
1264 index = PinRunningAppInternal(index, shelf_id); | 1291 index = PinRunningAppInternal(index, shelf_id); |
1265 } else { | 1292 } else { |
1266 // This app wasn't pinned before, insert a new entry. | 1293 // This app wasn't pinned before, insert a new entry. |
1267 shelf_id = CreateAppShortcutLauncherItem(*pref_app_id, index); | 1294 shelf_id = CreateAppShortcutLauncherItem(*pref_app_id, index); |
1268 ++max_index; | 1295 ++max_index; |
1269 index = model_->ItemIndexByID(shelf_id); | 1296 index = model_->ItemIndexByID(shelf_id); |
1270 } | 1297 } |
1271 ++pref_app_id; | 1298 ++pref_app_id; |
(...skipping 22 matching lines...) Expand all Loading... | |
1294 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) { | 1321 for (; pref_app_id != pinned_apps.end(); ++pref_app_id) { |
1295 // Update apps icon if applicable. | 1322 // Update apps icon if applicable. |
1296 OnAppUpdated(profile_, *pref_app_id); | 1323 OnAppUpdated(profile_, *pref_app_id); |
1297 if (*pref_app_id == extension_misc::kChromeAppId) { | 1324 if (*pref_app_id == extension_misc::kChromeAppId) { |
1298 int target_index = FindInsertionPoint(); | 1325 int target_index = FindInsertionPoint(); |
1299 DCHECK(seen_chrome_index >= 0 && seen_chrome_index < target_index); | 1326 DCHECK(seen_chrome_index >= 0 && seen_chrome_index < target_index); |
1300 model_->Move(seen_chrome_index, target_index); | 1327 model_->Move(seen_chrome_index, target_index); |
1301 } else { | 1328 } else { |
1302 DoPinAppWithID(*pref_app_id); | 1329 DoPinAppWithID(*pref_app_id); |
1303 int target_index = FindInsertionPoint(); | 1330 int target_index = FindInsertionPoint(); |
1304 ash::ShelfID id = GetShelfIDForAppID(*pref_app_id); | 1331 ash::ShelfID id = GetShelfIDForAppID(*pref_app_id, *pref_app_id); |
1305 int source_index = model_->ItemIndexByID(id); | 1332 int source_index = model_->ItemIndexByID(id); |
1306 if (source_index != target_index) | 1333 if (source_index != target_index) |
1307 model_->Move(source_index, target_index); | 1334 model_->Move(source_index, target_index); |
1308 } | 1335 } |
1309 } | 1336 } |
1310 } | 1337 } |
1311 | 1338 |
1312 void ChromeLauncherControllerImpl::SetShelfAutoHideBehaviorFromPrefs() { | 1339 void ChromeLauncherControllerImpl::SetShelfAutoHideBehaviorFromPrefs() { |
1313 for (ash::WmWindow* window : ash::WmShell::Get()->GetAllRootWindows()) { | 1340 for (ash::WmWindow* window : ash::WmShell::Get()->GetAllRootWindows()) { |
1314 ash::Shelf* shelf = ash::Shelf::ForWindow(window); | 1341 ash::Shelf* shelf = ash::Shelf::ForWindow(window); |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1680 if (index == -1) | 1707 if (index == -1) |
1681 continue; | 1708 continue; |
1682 ash::ShelfItem item = model_->items()[index]; | 1709 ash::ShelfItem item = model_->items()[index]; |
1683 item.image = image; | 1710 item.image = image; |
1684 if (arc_deferred_launcher_) | 1711 if (arc_deferred_launcher_) |
1685 arc_deferred_launcher_->MaybeApplySpinningEffect(id, &item.image); | 1712 arc_deferred_launcher_->MaybeApplySpinningEffect(id, &item.image); |
1686 model_->Set(index, item); | 1713 model_->Set(index, item); |
1687 // It's possible we're waiting on more than one item, so don't break. | 1714 // It's possible we're waiting on more than one item, so don't break. |
1688 } | 1715 } |
1689 } | 1716 } |
OLD | NEW |