web_app.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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_WEB_APPLICATIONS_WEB_APP_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/callback.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h"
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/web_application_info.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass Profile;
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace content {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass WebContents;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace gfx {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ImageFamily;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace web_app {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// This encodes the cause of shortcut creation as the correct behavior in each
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// case is implementation specific.
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochenum ShortcutCreationReason {
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SHORTCUT_CREATION_BY_USER,
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SHORTCUT_CREATION_AUTOMATED,
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochtypedef base::Callback<void(const ShellIntegration::ShortcutInfo&)>
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ShortcutInfoCallback;
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Extracts shortcut info of the given WebContents.
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid GetShortcutInfoForTab(content::WebContents* web_contents,
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           ShellIntegration::ShortcutInfo* info);
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Updates web app shortcut of the WebContents. This function checks and
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// updates web app icon and shortcuts if needed. For icon, the check is based
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// on MD5 hash of icon image. For shortcuts, it checks the desktop, start menu
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// and quick launch (as well as pinned shortcut) for shortcut and only
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// updates (recreates) them if they exits.
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid UpdateShortcutForTabContents(content::WebContents* web_contents);
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochShellIntegration::ShortcutInfo ShortcutInfoForExtensionAndProfile(
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const extensions::Extension* app,
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    Profile* profile);
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Fetches the icon for |extension| and calls |callback| with shortcut info
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// filled out as by UpdateShortcutInfoForApp.
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid UpdateShortcutInfoAndIconForApp(
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const extensions::Extension* extension,
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    Profile* profile,
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const ShortcutInfoCallback& callback);
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the user data directory for given web app. The path for the directory is
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on |extension_id|. If |extension_id| is empty then |url| is used
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to construct a unique ID.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const std::string& extension_id,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const GURL& url);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the user data directory to use for |extension| located inside
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |profile_path|.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const extensions::Extension& extension);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on data in the shortcut_info.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromInfo(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on the URL. We use this pseudo name
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as a key to store window location per application URLs in Browser and
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as app id for BrowserWindow, shortcut and jump list.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromURL(const GURL& url);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on an extension/apps's id.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromExtensionId(const std::string& id);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the extension id from the app name.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetExtensionIdFromApplicationName(const std::string& app_name);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Create shortcuts for web application based on given shortcut data.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |shortcut_info| contains information about the shortcuts to create, and
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |creation_locations| contains information about where to create them.
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid CreateShortcutsForShortcutInfo(
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    web_app::ShortcutCreationReason reason,
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const ShellIntegration::ShortcutLocations& locations,
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const ShellIntegration::ShortcutInfo& shortcut_info);
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Creates shortcuts for an app.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CreateShortcuts(
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ShortcutCreationReason reason,
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const ShellIntegration::ShortcutLocations& locations,
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Profile* profile,
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const extensions::Extension* app);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Delete all shortcuts that have been created for the given profile and
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// extension.
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid DeleteAllShortcuts(Profile* profile, const extensions::Extension* app);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Updates shortcuts for web application based on given shortcut data. This
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// refreshes existing shortcuts and their icons, but does not create new ones.
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |old_app_title| contains the title of the app prior to this update.
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UpdateAllShortcuts(const base::string16& old_app_title,
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        Profile* profile,
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        const extensions::Extension* app);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if given url is a valid web app url.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidUrl(const GURL& url);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts icons info from web app data. Take only square shaped icons and
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sort them from smallest to largest.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<WebApplicationInfo::IconInfo> IconInfoList;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetIconsInfo(const WebApplicationInfo& app_info,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  IconInfoList* icons);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_LINUX)
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Windows that correspond to web apps need to have a deterministic (and
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different) WMClass than normal chrome windows so the window manager groups
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them as a separate application.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetWMClassFromAppName(std::string app_name);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internals {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Returns the Windows user-level shortcut paths that are specified in
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// |creation_locations|.
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<base::FilePath> GetShortcutPaths(
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Creates a shortcut. Must be called on the file thread. This is used to
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// implement CreateShortcuts() above, and can also be used directly from the
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// file thread. |shortcut_info| contains info about the shortcut to create, and
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// |creation_locations| contains information about where to create them.
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool CreateShortcutsOnFileThread(
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ShortcutCreationReason reason,
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const ShellIntegration::ShortcutLocations& locations,
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const ShellIntegration::ShortcutInfo& shortcut_info);
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implemented for each platform, does the platform specific parts of creating
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shortcuts. Used internally by CreateShortcutsOnFileThread.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |shortcut_data_path| is where to store any resources created for the
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shortcut, and is also used as the UserDataDir for platform app shortcuts.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |shortcut_info| contains info about the shortcut to create, and
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |creation_locations| contains information about where to create them.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CreatePlatformShortcuts(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info,
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ShellIntegration::ShortcutLocations& creation_locations,
165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ShortcutCreationReason creation_reason);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete all the shortcuts we have added for this extension. This is the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platform specific implementation of the DeleteAllShortcuts function, and
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is executed on the FILE thread.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeletePlatformShortcuts(
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates all the shortcuts we have added for this extension. This is the
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platform specific implementation of the UpdateAllShortcuts function, and
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is executed on the FILE thread.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdatePlatformShortcuts(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& old_app_title,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Delete all the shortcuts for an entire profile.
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This is executed on the FILE thread.
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeleteAllShortcutsForProfile(const base::FilePath& profile_path);
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanitizes |name| and returns a version of it that is safe to use as an
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on-disk file name .
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::FilePath GetSanitizedFileName(const base::string16& name);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internals
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace web_app
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_
195