1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_JUMPLIST_UPDATER_WIN_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_JUMPLIST_UPDATER_WIN_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <windows.h> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <shobjidl.h> 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/win/scoped_comptr.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Represents a class used for creating an IShellLink object. 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Even though an IShellLink also needs the absolute path to an application to 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// be executed, this class does not have any variables for it because current 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// users always use "chrome.exe" as the application. 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ShellLinkItem : public base::RefCountedThreadSafe<ShellLinkItem> { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ShellLinkItem(); 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::wstring& title() const { return title_; } 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::wstring& icon_path() const { return icon_path_; } 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_index() const { return icon_index_; } 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkBitmap& icon_data() const { return icon_data_; } 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::wstring GetArguments() const; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CommandLine* GetCommandLine(); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_title(const std::wstring& title) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_ = title; 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_icon(const std::wstring& path, int index) { 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_path_ = path; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_index_ = index; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_icon_data(const SkBitmap& data) { 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_data_ = data; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class base::RefCountedThreadSafe<ShellLinkItem>; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~ShellLinkItem(); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Used for storing and appending command-line arguments. 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CommandLine command_line_; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The string to be displayed in a JumpList. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::wstring title_; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The absolute path to an icon to be displayed in a JumpList. 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::wstring icon_path_; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The icon index in the icon file. If an icon file consists of two or more 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // icons, set this value to identify the icon. If an icon file consists of 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // one icon, this value is 0. 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_index_; 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Icon bitmap. Used by the browser JumpList. 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note that an icon path must be supplied to IShellLink, so users of this 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // class must save icon data to disk. 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBitmap icon_data_; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShellLinkItem); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef std::vector<scoped_refptr<ShellLinkItem> > ShellLinkItemList; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// A utility class that hides the boilerplate for updating Windows JumpLists. 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Note that JumpLists are available in Windows 7 and later only. 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Example of usage: 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// JumpListUpdater updater(app_id); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// if (updater.BeginUpdate()) { 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// updater.AddTasks(...); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// updater.AddCustomCategory(...); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// updater.CommitUpdate(); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// } 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Note: 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// - Each JumpListUpdater instance is expected to be used once only. 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// - The JumpList must be updated in its entirety, i.e. even if a category has 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// not changed, all its items must be added in each update. 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class JumpListUpdater { 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit JumpListUpdater(const std::wstring& app_user_model_id); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~JumpListUpdater(); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if JumpLists are enabled on this OS. 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool IsEnabled(); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns the current user setting for the maximum number of items to display 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // in JumpLists. The setting is retrieved in BeginUpdate(). 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t user_max_items() const { return user_max_items_; } 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Starts a transaction that updates the JumpList of this application. 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This must be called prior to updating the JumpList. If this function 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // returns false, this instance should not be used. 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool BeginUpdate(); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Commits the update. 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool CommitUpdate(); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Updates the predefined "Tasks" category of the JumpList. 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool AddTasks(const ShellLinkItemList& link_items); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Updates an unregistered category of the JumpList. 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This function cannot update registered categories (such as "Tasks") 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // because special steps are required for updating them. 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |max_items| specifies the maximum number of items from |link_items| to add 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to the JumpList. 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool AddCustomCategory(const std::wstring& category_name, 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ShellLinkItemList& link_items, 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t max_items); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The app ID. 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::wstring app_user_model_id_; 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Windows API interface used to modify JumpLists. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::win::ScopedComPtr<ICustomDestinationList> destination_list_; 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The current user setting for "Number of recent items to display in Jump 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Lists" option in the "Taskbar and Start Menu Properties". 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t user_max_items_; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(JumpListUpdater); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // CHROME_BROWSER_JUMPLIST_UPDATER_WIN_H_ 140