web_app.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved. 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Use of this source code is governed by a BSD-style license that can be 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// found in the LICENSE file. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_ 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_ 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include <string> 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include <vector> 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "base/callback.h" 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "base/files/file_path.h" 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "base/strings/string16.h" 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "build/build_config.h" 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/browser/shell_integration.h" 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "chrome/common/web_application_info.h" 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass Profile; 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace content { 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass WebContents; 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace extensions { 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass Extension; 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace gfx { 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgclass ImageFamily; 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace web_app { 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// This encodes the cause of shortcut creation as the correct behavior in each 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// case is implementation specific. 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgenum ShortcutCreationReason { 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org SHORTCUT_CREATION_BY_USER, 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org SHORTCUT_CREATION_AUTOMATED, 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgtypedef base::Callback<void(const ShellIntegration::ShortcutInfo&)> 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ShortcutInfoCallback; 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Extracts shortcut info of the given WebContents. 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid GetShortcutInfoForTab(content::WebContents* web_contents, 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ShellIntegration::ShortcutInfo* info); 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Updates web app shortcut of the WebContents. This function checks and 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// updates web app icon and shortcuts if needed. For icon, the check is based 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// on MD5 hash of icon image. For shortcuts, it checks the desktop, start menu 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// and quick launch (as well as pinned shortcut) for shortcut and only 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// updates (recreates) them if they exits. 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid UpdateShortcutForTabContents(content::WebContents* web_contents); 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgShellIntegration::ShortcutInfo ShortcutInfoForExtensionAndProfile( 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const extensions::Extension* app, 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Profile* profile); 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Fetches the icon for |extension| and calls |callback| with shortcut info 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// filled out as by UpdateShortcutInfoForApp. 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid UpdateShortcutInfoAndIconForApp( 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const extensions::Extension* extension, 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Profile* profile, 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShortcutInfoCallback& callback); 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Gets the user data directory for given web app. The path for the directory is 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// based on |extension_id|. If |extension_id| is empty then |url| is used 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// to construct a unique ID. 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbase::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path, 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const std::string& extension_id, 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const GURL& url); 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Gets the user data directory to use for |extension| located inside 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |profile_path|. 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbase::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path, 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const extensions::Extension& extension); 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Compute a deterministic name based on data in the shortcut_info. 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::string GenerateApplicationNameFromInfo( 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info); 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Compute a deterministic name based on the URL. We use this pseudo name 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// as a key to store window location per application URLs in Browser and 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// as app id for BrowserWindow, shortcut and jump list. 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::string GenerateApplicationNameFromURL(const GURL& url); 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Compute a deterministic name based on an extension/apps's id. 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::string GenerateApplicationNameFromExtensionId(const std::string& id); 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Extracts the extension id from the app name. 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::string GetExtensionIdFromApplicationName(const std::string& app_name); 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Create shortcuts for web application based on given shortcut data. 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |shortcut_info| contains information about the shortcuts to create, and 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |creation_locations| contains information about where to create them. 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid CreateShortcutsForShortcutInfo( 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org web_app::ShortcutCreationReason reason, 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutLocations& locations, 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info); 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Creates shortcuts for an app. 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid CreateShortcuts( 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ShortcutCreationReason reason, 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutLocations& locations, 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Profile* profile, 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const extensions::Extension* app); 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Delete all shortcuts that have been created for the given profile and 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// extension. 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid DeleteAllShortcuts(Profile* profile, const extensions::Extension* app); 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Updates shortcuts for web application based on given shortcut data. This 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// refreshes existing shortcuts and their icons, but does not create new ones. 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |old_app_title| contains the title of the app prior to this update. 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid UpdateAllShortcuts(const base::string16& old_app_title, 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org Profile* profile, 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const extensions::Extension* app); 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Returns true if given url is a valid web app url. 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbool IsValidUrl(const GURL& url); 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if defined(TOOLKIT_VIEWS) 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Extracts icons info from web app data. Take only square shaped icons and 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// sort them from smallest to largest. 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgtypedef std::vector<WebApplicationInfo::IconInfo> IconInfoList; 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid GetIconsInfo(const WebApplicationInfo& app_info, 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org IconInfoList* icons); 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if defined(OS_LINUX) 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Windows that correspond to web apps need to have a deterministic (and 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// different) WMClass than normal chrome windows so the window manager groups 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// them as a separate application. 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::string GetWMClassFromAppName(std::string app_name); 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgnamespace internals { 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if defined(OS_WIN) 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Returns the Windows user-level shortcut paths that are specified in 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |creation_locations|. 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstd::vector<base::FilePath> GetShortcutPaths( 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutLocations& creation_locations); 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Creates a shortcut. Must be called on the file thread. This is used to 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// implement CreateShortcuts() above, and can also be used directly from the 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// file thread. |shortcut_info| contains info about the shortcut to create, and 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |creation_locations| contains information about where to create them. 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbool CreateShortcutsOnFileThread( 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ShortcutCreationReason reason, 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutLocations& locations, 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info); 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Implemented for each platform, does the platform specific parts of creating 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// shortcuts. Used internally by CreateShortcutsOnFileThread. 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |shortcut_data_path| is where to store any resources created for the 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// shortcut, and is also used as the UserDataDir for platform app shortcuts. 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |shortcut_info| contains info about the shortcut to create, and 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// |creation_locations| contains information about where to create them. 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbool CreatePlatformShortcuts( 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const base::FilePath& shortcut_data_path, 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info, 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutLocations& creation_locations, 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ShortcutCreationReason creation_reason); 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Delete all the shortcuts we have added for this extension. This is the 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// platform specific implementation of the DeleteAllShortcuts function, and 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// is executed on the FILE thread. 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid DeletePlatformShortcuts( 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const base::FilePath& shortcut_data_path, 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info); 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Updates all the shortcuts we have added for this extension. This is the 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// platform specific implementation of the UpdateAllShortcuts function, and 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// is executed on the FILE thread. 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid UpdatePlatformShortcuts( 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const base::FilePath& shortcut_data_path, 1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const base::string16& old_app_title, 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const ShellIntegration::ShortcutInfo& shortcut_info); 1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Delete all the shortcuts for an entire profile. 1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// This is executed on the FILE thread. 1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid DeleteAllShortcutsForProfile(const base::FilePath& profile_path); 1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// Sanitizes |name| and returns a version of it that is safe to use as an 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org// on-disk file name . 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgbase::FilePath GetSanitizedFileName(const base::string16& name); 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} // namespace internals 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} // namespace web_app 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_ 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org