| 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; | 
| -} | 
|  |