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