extension_constants.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)#include "chrome/common/extensions/extension_constants.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/net/url_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_urls { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetWebstoreLaunchURL() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string gallery_prefix = kGalleryBrowsePrefix; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAppsGalleryURL)) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gallery_prefix = CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsGalleryURL); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(gallery_prefix, "/", true)) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gallery_prefix = gallery_prefix.substr(0, gallery_prefix.length() - 1); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gallery_prefix; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetExtensionGalleryURL() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWebstoreLaunchURL() + "/category/extensions"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetWebstoreItemDetailURLPrefix() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWebstoreLaunchURL() + "/detail/"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetWebstoreIntentQueryURL(const std::string& action, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& type) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kIntentsCategoryPath[] = "category/collection/webintent_apps"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(std::string(kGalleryBrowsePrefix) + "/"); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = url.Resolve(kIntentsCategoryPath); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = chrome_common_net::AppendQueryParameter(url, "_wi", action); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = chrome_common_net::AppendQueryParameter(url, "_mt", type); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetWebstoreItemJsonDataURL(const std::string& extension_id) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(GetWebstoreLaunchURL() + "/inlineinstall/detail/" + extension_id); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGalleryUpdateHttpsUrl[] = 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://clients2.google.com/service/update2/crx"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(battre): Delete the HTTP URL once the blacklist is downloaded via HTTPS. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionBlocklistUrlPrefix[] = 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.gstatic.com/chrome/extensions/blacklist"; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionBlocklistHttpsUrlPrefix[] = 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://www.gstatic.com/chrome/extensions/blacklist"; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetWebstoreUpdateUrl() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* cmdline = CommandLine::ForCurrentProcess(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cmdline->HasSwitch(switches::kAppsGalleryUpdateURL)) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(cmdline->GetSwitchValueASCII(switches::kAppsGalleryUpdateURL)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(kGalleryUpdateHttpsUrl); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWebstoreUpdateUrl(const GURL& update_url) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL store_url = GetWebstoreUpdateUrl(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (update_url == store_url) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (update_url.host() == store_url.host() && 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_url.path() == store_url.path()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsBlacklistUpdateUrl(const GURL& url) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension blacklist URL is returned from the update service and 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // therefore not determined by Chromium. If the location of the blacklist file 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ever changes, we need to update this function. A DCHECK in the 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionUpdater ensures that we notice a change. This is the full URL 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of a blacklist: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://www.gstatic.com/chrome/extensions/blacklist/l_0_0_0_7.txt 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return StartsWithASCII(url.spec(), kExtensionBlocklistUrlPrefix, true) || 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(url.spec(), kExtensionBlocklistHttpsUrlPrefix, true); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGalleryBrowsePrefix[] = "https://chrome.google.com/webstore"; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extension_urls 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_filenames { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTempExtensionName[] = "CRX_INSTALL"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The file to write our decoded images to, relative to the extension_path. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDecodedImagesFilename[] = "DECODED_IMAGES"; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The file to write our decoded message catalogs to, relative to the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension_path. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDecodedMessageCatalogsFilename[] = "DECODED_MESSAGE_CATALOGS"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGeneratedBackgroundPageFilename[] = 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "_generated_background_page.html"; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These must match the values expected by the chrome.management extension API. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_info_keys { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kDescriptionKey[] = "description"; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEnabledKey[] = "enabled"; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kHomepageUrlKey[] = "homepageUrl"; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kIdKey[] = "id"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kNameKey[] = "name"; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kOfflineEnabledKey[] = "offlineEnabled"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kOptionsUrlKey[] = "optionsUrl"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kDetailsUrlKey[] = "detailsUrl"; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kVersionKey[] = "version"; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kPackagedAppKey[] = "packagedApp"; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extension_filenames 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_misc { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBookmarkManagerId[] = "eemcgdkfndhakfknompkggombfjjjeno"; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCitrixReceiverAppId[] = "haiffjcadagjlijoggckpgfnoeiflnem"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCitrixReceiverAppBetaId[] = "gnedhmakppccajfpfiihfcdlnpgomkcf"; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCitrixReceiverAppDevId[] = "fjcibdnjlbfnbfdjneajpipnlcppleek"; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEnterpriseWebStoreAppId[] = "afchcafgojfnemjkcbhfekplkmjaldaa"; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHTermAppId[] = "pnhechapfaindjhompbnflcldabbghjo"; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHTermDevAppId[] = "okddffdblfhhnmhodogpojmfkjmhinfp"; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCroshBuiltinAppId[] = "nkoccljplnhpfnfiajclkommnmllphnl"; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWebStoreAppId[] = "ahfgeienlihckogmohjhadlkjgocpleb"; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCloudPrintAppId[] = "mfehgcgbbipciphmccgaenjidiccnmng"; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChromeAppId[] = "mgndgikekgjfcpckkfioiadnlibdjbkf"; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppLaunchHistogram[] = "Extensions.AppLaunch"; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccessExtensionPath[] = 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/usr/share/chromeos-assets/accessibility/extensions"; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChromeVoxDirectoryName[] = "access_chromevox"; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWallpaperManagerId[] = "obklkkbkpaoaejdabbfldmcfplpdgolj"; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateNotInstalled[] = "not_installed"; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateInstalled[] = "installed"; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateDisabled[] = "disabled"; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateRunning[] = "running"; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateCannotRun[] = "cannot_run"; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppStateReadyToRun[] = "ready_to_run"; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMediaFileSystemPathPart[] = "_"; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppNotificationsIncognitoError[] = 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This API is not accessible by 'split' mode " 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "extensions in incognito windows."; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kExtensionIconSizes[] = { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_GIGANTOR, // 512 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_EXTRA_LARGE, // 256 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_LARGE, // 128 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_MEDIUM, // 48 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_SMALL, // 32 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_SMALLISH, // 24 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_BITTY // 16 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kNumExtensionIconSizes = 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kExtensionIconSizes); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kExtensionActionIconSizes[] = { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_ACTION, // 19, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2 * EXTENSION_ICON_ACTION // 38 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kNumExtensionActionIconSizes = 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kExtensionActionIconSizes); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScriptBadgeIconSizes[] = { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_ICON_BITTY, // 16 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2 * EXTENSION_ICON_BITTY // 32 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kNumScriptBadgeIconSizes = 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kScriptBadgeIconSizes); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extension_misc 185