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)#ifndef CHROME_BROWSER_JUMPLIST_WIN_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_JUMPLIST_WIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_observer.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace chrome { 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct FaviconImageResult; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationRegistrar; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageUsageData; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a class used for creating an IShellLink object by the utility 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functions in this file. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class consists of three strings and a integer. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * arguments (std::wstring) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The arguments for the application. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * title (std::wstring) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The string to be displayed in a JumpList. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * icon (std::wstring) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The absolute path to an icon to be displayed in a JumpList. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * index (int) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The icon index in the icon file. If an icon file consists of two or more 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// icons, set this value to identify the icon. If an icon file consists of 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one icon, this value is 0. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Even though an IShellLink also needs the absolute path to an application to 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be executed, this class does not have any variables for it because our 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// utility functions always use "chrome.exe" as the application and we don't 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need it. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShellLinkItem : public base::RefCountedThreadSafe<ShellLinkItem> { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellLinkItem() : index_(0), favicon_(false) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& arguments() const { return arguments_; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& title() const { return title_; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& icon() const { return icon_; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index() const { return index_; } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap& data() const { return data_; } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetArguments(const std::wstring& arguments) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments_ = arguments; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTitle(const std::wstring& title) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_ = title; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIcon(const std::wstring& icon, int index, bool favicon) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = icon; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index_ = index; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_ = favicon; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIconData(const SkBitmap& data) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_ = data; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<ShellLinkItem>; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ShellLinkItem() {} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring arguments_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring title_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring icon_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap data_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool favicon_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShellLinkItem); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<scoped_refptr<ShellLinkItem> > ShellLinkItemList; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class which implements an application JumpList. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class encapsulates operations required for updating an application 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// JumpList: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Retrieving "Most Visited" pages from HistoryService; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Retrieving strings from the application resource; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Creatng COM objects used by JumpList from PageUsageData objects; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Adding COM objects to JumpList, etc. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class also implements TabRestoreServiceObserver. So, once we call 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddObserver() and register this class as an observer, it automatically 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updates a JumpList when a tab is added or removed. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updating a JumpList requires some file operations and it is not good to 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// update it in a UI thread. To solve this problem, this class posts to a 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// runnable method when it actually updates a JumpList. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note. CancelableTaskTracker is not thread safe, so we always delete JumpList 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on UI thread (the same thread it got constructed on). 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JumpList : public TabRestoreServiceObserver, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::RefCountedThreadSafe< 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JumpList, content::BrowserThread::DeleteOnUIThread> { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JumpList(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NotificationObserver implementation. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers (or unregisters) this object as an observer. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the TabRestoreService object notifies the tab status is changed, this 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class automatically updates an application JumpList. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddObserver(Profile* profile); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer callback for TabRestoreService::Observer to notify when a tab is 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added or removed. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function sends a query that retrieves "Most Visited" pages to 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HistoryService. When the query finishes successfully, HistoryService call 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnSegmentUsageAvailable(). 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabRestoreServiceChanged(TabRestoreService* service); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer callback to notice when our associated TabRestoreService 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabRestoreServiceDestroyed(TabRestoreService* service); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel a pending jumplist update. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelPendingUpdate(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Terminate the jumplist: cancel any pending updates and remove observer 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from TabRestoreService. This must be called before the profile provided 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the AddObserver method is destroyed. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Terminate(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the custom JumpList is enabled. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the custom JumpList when we satisfy the following conditions: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // * Chromium is running on Windows 7 and; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // * Chromium is lauched without a "--disable-custom-jumplist" option. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(hbono): to be enabled by default when we finalize the categories and 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items of our JumpList. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Enabled(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a ShellLinkItem object from a tab (or a window) and add it to the 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // given list. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These functions are copied from the RecentlyClosedTabsHandler class for 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compatibility with the new-tab page. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddTab(const TabRestoreService::Tab* tab, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellLinkItemList* list, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_items); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddWindow(const TabRestoreService::Window* window, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellLinkItemList* list, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_items); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts loading a favicon for each URL in |icon_urls_|. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function sends a query to HistoryService. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When finishing loading all favicons, this function posts a task that 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // decompresses collected favicons and updates a JumpList. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartLoadingFavicon(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback function for HistoryService that notify when the "Most Visited" 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list is available. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function updates the ShellLinkItemList objects and send another query 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that retrieves a favicon for each URL in the list. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSegmentUsageAvailable(CancelableRequestProvider::Handle handle, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PageUsageData*>* data); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback function for HistoryService that notify when a requested favicon 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is available. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid file operations, this function just attaches the given data to 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a ShellLinkItem object. 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnFaviconDataAvailable(const chrome::FaviconImageResult& image_result); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for TopSites that notifies when the "Most 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Visited" list is available. This function updates the ShellLinkItemList 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // objects and send another query that retrieves a favicon for each URL in 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the list. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMostVisitedURLsAvailable( 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::MostVisitedURLList& data); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runnable method that updates the jumplist, once all the data 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been fetched. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunUpdate(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method for RunUpdate to create icon files for the asynchrounously 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loaded icons. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateIconFiles(const ShellLinkItemList& item_list); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend struct content::BrowserThread::DeleteOnThread< 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::UI>; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::DeleteHelper<JumpList>; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~JumpList(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For callbacks may be run after destruction. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<JumpList> weak_ptr_factory_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tracks FaviconService tasks. 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker cancelable_task_tracker_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Profile object is used to listen for events 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lives on the UI thread. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::NotificationRegistrar> registrar_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // App id to associate with the jump list. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring app_id_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The directory which contains JumpList icons. 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath icon_dir_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Items in the "Most Visited" category of the application JumpList, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // protected by the list_lock_. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellLinkItemList most_visited_pages_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Items in the "Recently Closed" category of the application JumpList, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // protected by the list_lock_. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellLinkItemList recently_closed_pages_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A list of URLs we need to retrieve their favicons, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // protected by the list_lock_. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<std::string, scoped_refptr<ShellLinkItem> > URLPair; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<URLPair> icon_urls_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Id of last favicon task. It's used to cancel current task if a new one 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // comes in before it finishes. 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker::TaskId task_id_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lock for most_visited_pages_, recently_closed_pages_, icon_urls_ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as they may be used by up to 3 threads. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock list_lock_; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(JumpList); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_JUMPLIST_WIN_H_ 260