1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_JUMPLIST_WIN_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_JUMPLIST_WIN_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <list>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <utility>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/tab_restore_service.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sessions/tab_restore_service_observer.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FilePath;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PageUsageData;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Represents a class used for creating an IShellLink object by the utility
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// functions in this file.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class consists of three strings and a integer.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * arguments (std::wstring)
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The arguments for the application.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * title (std::wstring)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The string to be displayed in a JumpList.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * icon (std::wstring)
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The absolute path to an icon to be displayed in a JumpList.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * index (int)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The icon index in the icon file. If an icon file consists of two or more
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   icons, set this value to identify the icon. If an icon file consists of
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// one icon, this value is 0.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Even though an IShellLink also needs the absolute path to an application to
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// be executed, this class does not have any variables for it because our
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// utility functions always use "chrome.exe" as the application and we don't
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// need it.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ShellLinkItem : public base::RefCountedThreadSafe<ShellLinkItem> {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShellLinkItem() : index_(0), favicon_(false) {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& arguments() const { return arguments_; }
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& title() const { return title_; }
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& icon() const { return icon_; }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index() const { return index_; }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<RefCountedMemory> data() const { return data_; }
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetArguments(const std::wstring& arguments) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arguments_ = arguments;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetTitle(const std::wstring& title) {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    title_ = title;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIcon(const std::wstring& icon, int index, bool favicon) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    icon_ = icon;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    index_ = index;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    favicon_ = favicon;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIconData(scoped_refptr<RefCountedMemory> data) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    data_ = data;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<ShellLinkItem>;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ShellLinkItem() {}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring arguments_;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring title_;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring icon_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<RefCountedMemory> data_;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index_;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool favicon_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ShellLinkItem);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<scoped_refptr<ShellLinkItem> > ShellLinkItemList;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class which implements an application JumpList.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class encapsulates operations required for updating an application
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// JumpList:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Retrieving "Most Visited" pages from HistoryService;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Retrieving strings from the application resource;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Creatng COM objects used by JumpList from PageUsageData objects;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Adding COM objects to JumpList, etc.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This class also implements TabRestoreServiceObserver. So, once we call
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AddObserver() and register this class as an observer, it automatically
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updates a JumpList when a tab is added or removed.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Updating a JumpList requires some file operations and it is not good to
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// update it in a UI thread. To solve this problem, this class posts a
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// task when it actually updates a JumpList. (This task is implemented in an
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// anomynous namespace in "jumplist_win.cc".)
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass JumpList : public TabRestoreServiceObserver {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  JumpList();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~JumpList();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Registers (or unregisters) this object as an observer.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When the TabRestoreService object notifies the tab status is changed, this
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // class automatically updates an application JumpList.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AddObserver(Profile* profile);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveObserver();
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observer callback for TabRestoreService::Observer to notify when a tab is
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // added or removed.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This function sends a query that retrieves "Most Visited" pages to
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HistoryService. When the query finishes successfully, HistoryService call
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // OnSegmentUsageAvailable().
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TabRestoreServiceChanged(TabRestoreService* service);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observer callback to notice when our associated TabRestoreService
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is destroyed.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TabRestoreServiceDestroyed(TabRestoreService* service);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the custom JumpList is enabled.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We use the custom JumpList when we satisfy the following conditions:
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // * Chromium is running on Windows 7 and;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // * Chromium is lauched without a "--disable-custom-jumplist" option.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(hbono): to be enabled by default when we finalize the categories and
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // items of our JumpList.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool Enabled();
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a ShellLinkItem object from a tab (or a window) and add it to the
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // given list.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These functions are copied from the RecentlyClosedTabsHandler class for
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // compatibility with the new-tab page.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AddTab(const TabRestoreService::Tab* tab,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              ShellLinkItemList* list,
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              size_t max_items);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AddWindow(const TabRestoreService::Window* window,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 ShellLinkItemList* list,
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 size_t max_items);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Starts loading a favicon for each URL in |icon_urls_|.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This function just sends a query to HistoryService.
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool StartLoadingFavicon();
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A callback function for HistoryService that notify when the "Most Visited"
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // list is available.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This function updates the ShellLinkItemList objects and send another query
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // that retrieves a favicon for each URL in the list.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnSegmentUsageAvailable(CancelableRequestProvider::Handle handle,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               std::vector<PageUsageData*>* data);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A callback function for HistoryService that notify when a requested favicon
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is available.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // To avoid file operations, this function just attaches the given data to
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a ShellLinkItem object.
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // When finishing loading all favicons, this function posts a task that
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // decompresses collected favicons and updates a JumpList.
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnFaviconDataAvailable(HistoryService::Handle handle,
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              history::FaviconData favicon);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Our consumers for HistoryService.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer most_visited_consumer_;
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CancelableRequestConsumer favicon_consumer_;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The Profile object used for listening its events.
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // App id to associate with the jump list.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring app_id_;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The directory which contains JumpList icons.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath icon_dir_;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Items in the "Most Visited" category of the application JumpList.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShellLinkItemList most_visited_pages_;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Items in the "Recently Closed" category of the application JumpList.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShellLinkItemList recently_closed_pages_;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A list of URLs we need to retrieve their favicons.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::pair<std::string, scoped_refptr<ShellLinkItem> > URLPair;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::list<URLPair> icon_urls_;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_JUMPLIST_WIN_H_
191