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