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