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