web_app.h revision 868fa2fe829687343ffae624259930155e16dbd8
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)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h"
15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/web_application_info.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace gfx {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ImageFamily;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace web_app {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the user data directory for given web app. The path for the directory is
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on |extension_id|. If |extension_id| is empty then |url| is used
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to construct a unique ID.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const std::string& extension_id,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const GURL& url);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the user data directory to use for |extension| located inside
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |profile_path|.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetWebAppDataDirectory(const base::FilePath& profile_path,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const extensions::Extension& extension);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on data in the shortcut_info.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromInfo(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on the URL. We use this pseudo name
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as a key to store window location per application URLs in Browser and
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as app id for BrowserWindow, shortcut and jump list.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromURL(const GURL& url);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute a deterministic name based on an extension/apps's id.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GenerateApplicationNameFromExtensionId(const std::string& id);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the extension id from the app name.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetExtensionIdFromApplicationName(const std::string& app_name);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates shortcuts for web application based on given shortcut data.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |shortcut_info| contains information about the shortcuts to create, and
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |creation_locations| contains information about where to create them.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CreateShortcuts(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete all the shortcuts that have been created for the given
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |shortcut_data| in the profile with |profile_path|.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteAllShortcuts(const ShellIntegration::ShortcutInfo& shortcut_info);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Updates shortcuts for web application based on given shortcut data. This
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// refreshes existing shortcuts and their icons, but does not create new ones.
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |old_app_title| contains the title of the app prior to this update.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |shortcut_info| contains information about the shortcuts to update.
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UpdateAllShortcuts(const string16& old_app_title,
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        const ShellIntegration::ShortcutInfo& shortcut_info);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a shortcut. Must be called on the file thread. This is used to
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implement CreateShortcuts() above, and can also be used directly from the
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// file thread. |shortcut_info| contains info about the shortcut to create, and
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |creation_locations| contains information about where to create them.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CreateShortcutsOnFileThread(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if given url is a valid web app url.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidUrl(const GURL& url);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts icons info from web app data. Take only square shaped icons and
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sort them from smallest to largest.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<WebApplicationInfo::IconInfo> IconInfoList;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetIconsInfo(const WebApplicationInfo& app_info,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  IconInfoList* icons);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GTK+ windows that correspond to web apps need to have a deterministic (and
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different) WMClass than normal chrome windows so the window manager groups
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them as a separate application.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetWMClassFromAppName(std::string app_name);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Gets the name of the Chrome Apps menu folder in which to place app shortcuts.
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 GetAppShortcutsSubdirName();
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internals {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool CheckAndSaveIcon(const base::FilePath& icon_file,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const gfx::ImageFamily& image);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<base::FilePath> GetShortcutPaths(
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implemented for each platform, does the platform specific parts of creating
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shortcuts. Used internally by CreateShortcutsOnFileThread.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |shortcut_data_path| is where to store any resources created for the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shortcut, and is also used as the UserDataDir for platform app shortcuts.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |shortcut_info| contains info about the shortcut to create, and
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |creation_locations| contains information about where to create them.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CreatePlatformShortcuts(
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete all the shortcuts we have added for this extension. This is the
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platform specific implementation of the DeleteAllShortcuts function, and
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is executed on the FILE thread.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeletePlatformShortcuts(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates all the shortcuts we have added for this extension. This is the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platform specific implementation of the UpdateAllShortcuts function, and
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is executed on the FILE thread.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdatePlatformShortcuts(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& shortcut_data_path,
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const string16& old_app_title,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanitizes |name| and returns a version of it that is safe to use as an
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on-disk file name .
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetSanitizedFileName(const string16& name);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internals
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace web_app
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_
146