15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_view_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_path.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/feedback/feedback_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_controller_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_list/apps_model_builder.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_list/chrome_app_list_item.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/app_list/chrome_signin_delegate.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/search_controller.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/web_applications/web_app_ui.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/web_applications/web_app.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/url_constants.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_thread.h" 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/page_navigator.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/app_list/app_sync_ui_state_watcher.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/web_applications/web_app_win.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CreateShortcutInWebAppDir( 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& app_data_dir, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Callback<void(const base::FilePath&)> callback, 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ShellIntegration::ShortcutInfo& info) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::PostTaskAndReplyWithResult( 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::FILE, 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(web_app::CreateShortcutInWebAppDir, app_data_dir, info), 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback); 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppListViewDelegate::AppListViewDelegate(AppListControllerDelegate* controller, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : controller_(controller), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_(profile) {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppListViewDelegate::~AppListViewDelegate() {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::SetModel(app_list::AppListModel* model) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_builder_.reset(new AppsModelBuilder(profile_, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->apps(), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.get())); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_builder_->Build(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_.reset(new app_list::SearchController( 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_, model->search_box(), model->results(), controller_.get())); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_delegate_.reset(new ChromeSigninDelegate(profile_)); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_builder_.reset(); 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_.reset(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_sync_ui_state_watcher_.reset(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)app_list::SigninDelegate* AppListViewDelegate::GetSigninDelegate() { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return signin_delegate_.get(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::ActivateAppListItem( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_list::AppListItemModel* item, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_flags) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("AppList_ClickOnApp")); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ChromeAppListItem*>(item)->Activate(event_flags); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppListViewDelegate::GetShortcutPathForApp( 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& app_id, 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Callback<void(const base::FilePath&)>& callback) { 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExtensionService* service = profile_->GetExtensionService(); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(service); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const extensions::Extension* extension = 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch service->GetInstalledExtension(app_id); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!extension) { 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.Run(base::FilePath()); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath app_data_dir( 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_app::GetWebAppDataDirectory(profile_->GetPath(), 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extension->id(), 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL())); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_app::UpdateShortcutInfoAndIconForApp( 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *extension, 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_, 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(CreateShortcutInWebAppDir, app_data_dir, callback)); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.Run(base::FilePath()); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::StartSearch() { 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (search_controller_.get()) 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_->Start(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::StopSearch() { 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (search_controller_.get()) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_->Stop(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::OpenSearchResult( 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) app_list::SearchResult* result, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_flags) { 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_->OpenResult(result, event_flags); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::InvokeSearchResultAction( 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) app_list::SearchResult* result, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int action_index, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_flags) { 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) search_controller_->InvokeResultAction(result, action_index, event_flags); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListViewDelegate::Dismiss() { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->DismissView(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::ViewClosing() { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->ViewClosing(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListViewDelegate::ViewActivationChanged(bool active) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->ViewActivationChanged(active); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::ImageSkia AppListViewDelegate::GetWindowIcon() { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return controller_->GetWindowIcon(); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AppListViewDelegate::GetCurrentUserName() { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileInfoCache& cache = 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache(); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t profile_index = cache.GetIndexOfProfileWithPath(profile_->GetPath()); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_index != std::string::npos) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cache.GetNameOfProfileAtIndex(profile_index); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return string16(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AppListViewDelegate::GetCurrentUserEmail() { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileInfoCache& cache = 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t profile_index = cache.GetIndexOfProfileWithPath(profile_->GetPath()); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_index != std::string::npos) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cache.GetUserNameOfProfileAtIndex(profile_index); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return string16(); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListViewDelegate::OpenSettings() { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = profile_->GetExtensionService(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(service); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* extension = service->GetInstalledExtension( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::kSettingsAppId); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(extension); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->ActivateApp(profile_, extension, 0); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AppListViewDelegate::OpenHelp() { 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow( 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller_->GetAppListWindow()); 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser* browser = chrome::FindOrCreateTabbedBrowser( 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_, desktop); 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser->OpenURL(content::OpenURLParams(GURL(chrome::kAppLauncherHelpURL), 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::Referrer(), 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NEW_FOREGROUND_TAB, 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PAGE_TRANSITION_LINK, 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) false)); 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListViewDelegate::OpenFeedback() { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow( 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->GetAppListWindow()); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindOrCreateTabbedBrowser( 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_, desktop); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::ShowFeedbackPage(browser, std::string(), 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::kAppLauncherCategoryTag); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 212