| Index: chrome/browser/ui/views/aura/launcher/chrome_launcher_delegate.cc
|
| diff --git a/chrome/browser/ui/views/aura/launcher/chrome_launcher_delegate.cc b/chrome/browser/ui/views/aura/launcher/chrome_launcher_delegate.cc
|
| deleted file mode 100644
|
| index 625452eaaed882b553765f6f7a06ac179a392857..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/views/aura/launcher/chrome_launcher_delegate.cc
|
| +++ /dev/null
|
| @@ -1,479 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/ui/views/aura/launcher/chrome_launcher_delegate.h"
|
| -
|
| -#include "ash/launcher/launcher_model.h"
|
| -#include "ash/launcher/launcher_types.h"
|
| -#include "ash/wm/window_util.h"
|
| -#include "base/command_line.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/defaults.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| -#include "chrome/browser/prefs/incognito_mode_prefs.h"
|
| -#include "chrome/browser/prefs/pref_service.h"
|
| -#include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/profiles/profile_manager.h"
|
| -#include "chrome/browser/tabs/tab_strip_model.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| -#include "chrome/browser/ui/views/aura/launcher/launcher_context_menu.h"
|
| -#include "chrome/browser/ui/views/aura/launcher/launcher_icon_loader.h"
|
| -#include "chrome/browser/ui/views/aura/launcher/launcher_updater.h"
|
| -#include "chrome/browser/web_applications/web_app.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| -#include "chrome/common/extensions/extension_resource.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "grit/theme_resources.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/views/widget/widget.h"
|
| -
|
| -namespace {
|
| -
|
| -// See description in PersistPinnedState().
|
| -const char kAppIDPath[] = "id";
|
| -const char kAppTypePath[] = "type";
|
| -const char kAppTypeTab[] = "tab";
|
| -const char kAppTypeWindow[] = "window";
|
| -
|
| -} // namespace
|
| -
|
| -// ChromeLauncherDelegate::Item ------------------------------------------------
|
| -
|
| -ChromeLauncherDelegate::Item::Item()
|
| - : item_type(TYPE_TABBED_BROWSER),
|
| - app_type(APP_TYPE_WINDOW),
|
| - updater(NULL),
|
| - pinned(false) {
|
| -}
|
| -
|
| -ChromeLauncherDelegate::Item::~Item() {
|
| -}
|
| -
|
| -// ChromeLauncherDelegate ------------------------------------------------------
|
| -
|
| -// static
|
| -ChromeLauncherDelegate* ChromeLauncherDelegate::instance_ = NULL;
|
| -
|
| -ChromeLauncherDelegate::ChromeLauncherDelegate(Profile* profile,
|
| - ash::LauncherModel* model)
|
| - : model_(model),
|
| - profile_(profile) {
|
| - if (!profile_) {
|
| - // Use the original profile as on chromeos we may get a temporary off the
|
| - // record profile.
|
| - profile_ = ProfileManager::GetDefaultProfile()->GetOriginalProfile();
|
| - }
|
| - instance_ = this;
|
| - model_->AddObserver(this);
|
| - app_icon_loader_.reset(new LauncherIconLoader(profile_, this));
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| - content::Source<Profile>(profile_));
|
| -}
|
| -
|
| -ChromeLauncherDelegate::~ChromeLauncherDelegate() {
|
| - model_->RemoveObserver(this);
|
| - for (IDToItemMap::iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - model_->RemoveItemAt(model_->ItemIndexByID(i->first));
|
| - }
|
| - if (instance_ == this)
|
| - instance_ = NULL;
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Init() {
|
| - const base::ListValue* pinned_apps =
|
| - profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps);
|
| - for (size_t i = 0; i < pinned_apps->GetSize(); ++i) {
|
| - DictionaryValue* app = NULL;
|
| - if (pinned_apps->GetDictionary(i, &app)) {
|
| - std::string app_id, type_string;
|
| - if (app->GetString(kAppIDPath, &app_id) &&
|
| - app->GetString(kAppTypePath, &type_string) &&
|
| - app_icon_loader_->IsValidID(app_id)) {
|
| - AppType app_type = (type_string == kAppTypeWindow) ?
|
| - APP_TYPE_WINDOW : APP_TYPE_TAB;
|
| - CreateAppLauncherItem(NULL, app_id, app_type);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -// static
|
| -void ChromeLauncherDelegate::RegisterUserPrefs(PrefService* user_prefs) {
|
| - // TODO: If we want to support multiple profiles this will likely need to be
|
| - // pushed to local state and we'll need to track profile per item.
|
| - user_prefs->RegisterListPref(prefs::kPinnedLauncherApps,
|
| - PrefService::SYNCABLE_PREF);
|
| -}
|
| -
|
| -ash::LauncherID ChromeLauncherDelegate::CreateTabbedLauncherItem(
|
| - LauncherUpdater* updater) {
|
| - // Tabbed items always get a new item. Put the tabbed item before the app
|
| - // tabs. If there are no app tabs put it at the end.
|
| - int index = static_cast<int>(model_->items().size());
|
| - for (IDToItemMap::const_iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - if (i->second.updater == updater) {
|
| - DCHECK_EQ(TYPE_APP, i->second.item_type);
|
| - index = std::min(index, model_->ItemIndexByID(i->first));
|
| - }
|
| - }
|
| - ash::LauncherID id = model_->next_id();
|
| - ash::LauncherItem item(ash::TYPE_TABBED);
|
| - model_->Add(index, item);
|
| - DCHECK(id_to_item_map_.find(id) == id_to_item_map_.end());
|
| - id_to_item_map_[id].item_type = TYPE_TABBED_BROWSER;
|
| - id_to_item_map_[id].updater = updater;
|
| - return id;
|
| -}
|
| -
|
| -ash::LauncherID ChromeLauncherDelegate::CreateAppLauncherItem(
|
| - LauncherUpdater* updater,
|
| - const std::string& app_id,
|
| - AppType app_type) {
|
| - // See if we have a closed item that matches the app.
|
| - if (updater) {
|
| - for (IDToItemMap::iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - if (i->second.updater == NULL && i->second.app_id == app_id &&
|
| - i->second.app_type == app_type) {
|
| - i->second.updater = updater;
|
| - return i->first;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Newly created apps go after all existing apps. If there are no apps put it
|
| - // at after the tabbed item, and if there is no tabbed item put it at the end.
|
| - int item_count = static_cast<int>(model_->items().size());
|
| - int min_app_index = item_count;
|
| - int min_tab_index = min_app_index;
|
| - if (updater) {
|
| - for (IDToItemMap::const_iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - if (i->second.updater == updater) {
|
| - if (i->second.item_type == TYPE_APP) {
|
| - min_app_index =
|
| - std::min(min_app_index, model_->ItemIndexByID(i->first));
|
| - } else {
|
| - min_tab_index =
|
| - std::min(min_app_index, model_->ItemIndexByID(i->first));
|
| - }
|
| - }
|
| - }
|
| - }
|
| - int insert_index = min_app_index != item_count ?
|
| - min_app_index : std::min(item_count, min_tab_index + 1);
|
| - ash::LauncherID id = model_->next_id();
|
| - ash::LauncherItem item(ash::TYPE_APP);
|
| - model_->Add(insert_index, item);
|
| - DCHECK(id_to_item_map_.find(id) == id_to_item_map_.end());
|
| - id_to_item_map_[id].item_type = TYPE_APP;
|
| - id_to_item_map_[id].app_type = app_type;
|
| - id_to_item_map_[id].app_id = app_id;
|
| - id_to_item_map_[id].updater = updater;
|
| - id_to_item_map_[id].pinned = updater == NULL;
|
| -
|
| - app_icon_loader_->FetchImage(app_id);
|
| - return id;
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::ConvertAppToTabbed(ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - DCHECK_EQ(TYPE_APP, id_to_item_map_[id].item_type);
|
| - DCHECK(!id_to_item_map_[id].pinned);
|
| - id_to_item_map_[id].item_type = TYPE_TABBED_BROWSER;
|
| - id_to_item_map_[id].app_id.clear();
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::ConvertTabbedToApp(ash::LauncherID id,
|
| - const std::string& app_id,
|
| - AppType app_type) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - DCHECK_EQ(TYPE_TABBED_BROWSER, id_to_item_map_[id].item_type);
|
| - DCHECK(!id_to_item_map_[id].pinned);
|
| - id_to_item_map_[id].item_type = TYPE_APP;
|
| - id_to_item_map_[id].app_type = app_type;
|
| - id_to_item_map_[id].app_id = app_id;
|
| -
|
| - ash::LauncherItem item(ash::TYPE_APP);
|
| - item.id = id;
|
| - model_->Set(model_->ItemIndexByID(id), item);
|
| -
|
| - app_icon_loader_->FetchImage(app_id);
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemClosed(ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - if (id_to_item_map_[id].pinned) {
|
| - // The item is pinned, leave it in the launcher.
|
| - id_to_item_map_[id].updater = NULL;
|
| - } else {
|
| - id_to_item_map_.erase(id);
|
| - model_->RemoveItemAt(model_->ItemIndexByID(id));
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::AppIDChanged(ash::LauncherID id,
|
| - const std::string& app_id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - id_to_item_map_[id].app_id = app_id;
|
| - PersistPinnedState();
|
| -
|
| - app_icon_loader_->FetchImage(app_id);
|
| -}
|
| -
|
| -bool ChromeLauncherDelegate::HasClosedAppItem(const std::string& app_id,
|
| - AppType app_type) {
|
| - for (IDToItemMap::const_iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - if (!i->second.updater && i->second.item_type == TYPE_APP &&
|
| - i->second.app_type == app_type && i->second.app_id == app_id)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Pin(ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - id_to_item_map_[id].pinned = true;
|
| - PersistPinnedState();
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Unpin(ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - id_to_item_map_[id].pinned = false;
|
| - if (!id_to_item_map_[id].updater)
|
| - LauncherItemClosed(id);
|
| - PersistPinnedState();
|
| -}
|
| -
|
| -bool ChromeLauncherDelegate::IsPinned(ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - return id_to_item_map_[id].pinned;
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::TogglePinned(ash::LauncherID id) {
|
| - if (id_to_item_map_.find(id) == id_to_item_map_.end())
|
| - return; // May happen if item closed with menu open.
|
| -
|
| - if (IsPinned(id))
|
| - Unpin(id);
|
| - else
|
| - Pin(id);
|
| -}
|
| -
|
| -bool ChromeLauncherDelegate::IsPinnable(ash::LauncherID id) {
|
| - return id_to_item_map_.find(id) != id_to_item_map_.end() &&
|
| - id_to_item_map_[id].item_type == TYPE_APP;
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Open(ash::LauncherID id) {
|
| - if (id_to_item_map_.find(id) == id_to_item_map_.end())
|
| - return; // In case invoked from menu and item closed while menu up.
|
| -
|
| - LauncherUpdater* updater = id_to_item_map_[id].updater;
|
| - if (updater) {
|
| - updater->window()->Show();
|
| - ash::wm::ActivateWindow(updater->window());
|
| - TabContentsWrapper* tab = updater->GetTab(id);
|
| - if (tab) {
|
| - updater->tab_model()->ActivateTabAt(
|
| - updater->tab_model()->GetIndexOfTabContents(tab), true);
|
| - }
|
| - } else {
|
| - DCHECK_EQ(TYPE_APP, id_to_item_map_[id].item_type);
|
| - if (id_to_item_map_[id].app_type == APP_TYPE_TAB) {
|
| - const Extension* extension =
|
| - profile_->GetExtensionService()->GetInstalledExtension(
|
| - id_to_item_map_[id].app_id);
|
| - DCHECK(extension);
|
| - Browser::OpenApplicationTab(GetProfileForNewWindows(), extension, GURL(),
|
| - NEW_FOREGROUND_TAB);
|
| - if (id_to_item_map_[id].updater)
|
| - id_to_item_map_[id].updater->window()->Show();
|
| - } else {
|
| - std::string app_name = web_app::GenerateApplicationNameFromExtensionId(
|
| - id_to_item_map_[id].app_id);
|
| - Browser* browser = Browser::CreateForApp(
|
| - Browser::TYPE_POPUP, app_name, gfx::Rect(),
|
| - GetProfileForNewWindows());
|
| - browser->window()->Show();
|
| - }
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Close(ash::LauncherID id) {
|
| - if (id_to_item_map_.find(id) == id_to_item_map_.end())
|
| - return; // May happen if menu closed.
|
| -
|
| - if (!id_to_item_map_[id].updater)
|
| - return; // TODO: maybe should treat as unpin?
|
| -
|
| - TabContentsWrapper* tab = id_to_item_map_[id].updater->GetTab(id);
|
| - if (tab) {
|
| - content::WebContentsDelegate* delegate =
|
| - tab->web_contents()->GetDelegate();
|
| - if (delegate)
|
| - delegate->CloseContents(tab->web_contents());
|
| - else
|
| - delete tab;
|
| - } else {
|
| - views::Widget* widget = views::Widget::GetWidgetForNativeView(
|
| - id_to_item_map_[id].updater->window());
|
| - if (widget)
|
| - widget->Close();
|
| - }
|
| -}
|
| -
|
| -bool ChromeLauncherDelegate::IsOpen(ash::LauncherID id) {
|
| - return id_to_item_map_.find(id) != id_to_item_map_.end() &&
|
| - id_to_item_map_[id].updater != NULL;
|
| -}
|
| -
|
| -ChromeLauncherDelegate::AppType ChromeLauncherDelegate::GetAppType(
|
| - ash::LauncherID id) {
|
| - DCHECK(id_to_item_map_.find(id) != id_to_item_map_.end());
|
| - return id_to_item_map_[id].app_type;
|
| -}
|
| -
|
| -std::string ChromeLauncherDelegate::GetAppID(TabContentsWrapper* tab) {
|
| - return app_icon_loader_->GetAppID(tab);
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::SetAppImage(const std::string& id,
|
| - SkBitmap* image) {
|
| - for (IDToItemMap::const_iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ++i) {
|
| - if (i->second.app_id == id) {
|
| - int index = model_->ItemIndexByID(i->first);
|
| - ash::LauncherItem item = model_->items()[index];
|
| - item.image = image ? *image : Extension::GetDefaultIcon(true);
|
| - model_->Set(index, item);
|
| - // It's possible we're waiting on more than one item, so don't break.
|
| - }
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::CreateNewWindow() {
|
| - Browser::OpenEmptyWindow(GetProfileForNewWindows());
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::ItemClicked(const ash::LauncherItem& item) {
|
| - DCHECK(id_to_item_map_.find(item.id) != id_to_item_map_.end());
|
| - Open(item.id);
|
| -}
|
| -
|
| -int ChromeLauncherDelegate::GetBrowserShortcutResourceId() {
|
| - return IDR_PRODUCT_LOGO_32;
|
| -}
|
| -
|
| -string16 ChromeLauncherDelegate::GetTitle(const ash::LauncherItem& item) {
|
| - DCHECK(id_to_item_map_.find(item.id) != id_to_item_map_.end());
|
| - LauncherUpdater* updater = id_to_item_map_[item.id].updater;
|
| - if (updater) {
|
| - if (id_to_item_map_[item.id].item_type == TYPE_TABBED_BROWSER) {
|
| - return updater->tab_model()->GetActiveTabContents() ?
|
| - updater->tab_model()->GetActiveTabContents()->web_contents()->
|
| - GetTitle() : string16();
|
| - }
|
| - // Fall through to get title from extension.
|
| - }
|
| - const Extension* extension = profile_->GetExtensionService()->
|
| - GetInstalledExtension(id_to_item_map_[item.id].app_id);
|
| - return extension ? UTF8ToUTF16(extension->name()) : string16();
|
| -}
|
| -
|
| -ui::MenuModel* ChromeLauncherDelegate::CreateContextMenu(
|
| - const ash::LauncherItem& item) {
|
| - return new LauncherContextMenu(this, item.id);
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemAdded(int index) {
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemRemoved(int index,
|
| - ash::LauncherID id) {
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemMoved(
|
| - int start_index,
|
| - int target_index) {
|
| - ash::LauncherID id = model_->items()[target_index].id;
|
| - if (id_to_item_map_.find(id) != id_to_item_map_.end() &&
|
| - id_to_item_map_[id].pinned) {
|
| - PersistPinnedState();
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemChanged(
|
| - int index,
|
| - const ash::LauncherItem& old_item) {
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::LauncherItemWillChange(int index) {
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK_EQ(type, chrome::NOTIFICATION_EXTENSION_UNLOADED);
|
| - const Extension* extension =
|
| - content::Details<UnloadedExtensionInfo>(details)->extension;
|
| - UnpinAppsWithID(extension->id());
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::PersistPinnedState() {
|
| - ListPrefUpdate updater(profile_->GetPrefs(), prefs::kPinnedLauncherApps);
|
| - updater.Get()->Clear();
|
| - for (size_t i = 0; i < model_->items().size(); ++i) {
|
| - if (model_->items()[i].type == ash::TYPE_APP) {
|
| - ash::LauncherID id = model_->items()[i].id;
|
| - if (id_to_item_map_.find(id) != id_to_item_map_.end() &&
|
| - id_to_item_map_[id].pinned) {
|
| - base::DictionaryValue* app_value = new base::DictionaryValue;
|
| - app_value->SetString(kAppIDPath, id_to_item_map_[id].app_id);
|
| - const char* app_type_string =
|
| - id_to_item_map_[id].app_type == APP_TYPE_WINDOW ?
|
| - kAppTypeWindow : kAppTypeTab;
|
| - app_value->SetString(kAppTypePath, app_type_string);
|
| - updater.Get()->Append(app_value);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::UnpinAppsWithID(const std::string& app_id) {
|
| - for (IDToItemMap::iterator i = id_to_item_map_.begin();
|
| - i != id_to_item_map_.end(); ) {
|
| - IDToItemMap::iterator current(i);
|
| - ++i;
|
| - if (current->second.app_id == app_id && current->second.pinned)
|
| - Unpin(current->first);
|
| - }
|
| -}
|
| -
|
| -void ChromeLauncherDelegate::SetAppIconLoaderForTest(AppIconLoader* loader) {
|
| - app_icon_loader_.reset(loader);
|
| -}
|
| -
|
| -Profile* ChromeLauncherDelegate::GetProfileForNewWindows() {
|
| - Profile* profile = ProfileManager::GetDefaultProfile();
|
| - if (browser_defaults::kAlwaysOpenIncognitoWindow &&
|
| - IncognitoModePrefs::ShouldLaunchIncognito(
|
| - *CommandLine::ForCurrentProcess(),
|
| - profile->GetPrefs())) {
|
| - profile = profile->GetOffTheRecordProfile();
|
| - }
|
| - return profile;
|
| -}
|
|
|