extension.h revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file. 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_H_ 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#define CHROME_COMMON_EXTENSIONS_EXTENSION_H_ 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#pragma once 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <map> 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <set> 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <string> 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <vector> 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_path.h" 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/gtest_prod_util.h" 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/scoped_ptr.h" 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/ref_counted.h" 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h" 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_extent.h" 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_icon_set.h" 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/user_script.h" 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/url_pattern.h" 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "gfx/size.h" 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "googleurl/src/gurl.h" 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass DictionaryValue; 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionAction; 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionResource; 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass SkBitmap; 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass Version; 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Represents a Chrome extension. 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Extension : public base::RefCountedThreadSafe<Extension> { 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public: 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen typedef std::map<const std::string, GURL> URLOverrideMap; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef std::vector<std::string> ScriptingWhitelist; 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // What an extension was loaded from. 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // NOTE: These values are stored as integers in the preferences and used 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // in histograms so don't remove or reorder existing items. Just append 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // to the end. 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum Location { 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INVALID, 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INTERNAL, // A crx file from the internal Extensions directory. 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTERNAL_PREF, // A crx file from an external directory (via prefs). 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTERNAL_REGISTRY, // A crx file from an external directory (via eg the 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // registry on Windows). 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen LOAD, // --load-extension. 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen COMPONENT, // An integral component of Chrome itself, which 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // happens to be implemented as an extension. We don't 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // show these in the management UI. 52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch EXTERNAL_PREF_DOWNLOAD, // A crx file from an external directory (via 53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // prefs), installed from an update URL. 54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch EXTERNAL_POLICY_DOWNLOAD, // A crx file from an external directory (via 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // admin policies), installed from an update URL. 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NUM_LOCATIONS 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum State { 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISABLED = 0, 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ENABLED, 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen KILLBIT, // Don't install/upgrade (applies to external extensions only). 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen NUM_STATES 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum InstallType { 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INSTALL_ERROR, 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DOWNGRADE, 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen REINSTALL, 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UPGRADE, 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen NEW_INSTALL 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: If you change this list, you should also change kIconSizes in the cc 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file. 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum Icons { 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_LARGE = 128, 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_MEDIUM = 48, 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_SMALL = 32, 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_SMALLISH = 24, 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_BITTY = 16, 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Type used for UMA_HISTOGRAM_ENUMERATION about extensions. 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Do not change the order of entries or remove entries in this list. 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum HistogramType { 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_UNKNOWN = 0, 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_EXTENSION, 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_THEME, 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_USER_SCRIPT, 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_HOSTED_APP, 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_PACKAGED_APP 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // An NPAPI plugin included in the extension. 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick struct PluginInfo { 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path; // Path to the plugin. 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool is_public; // False if only this extension can load this plugin. 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // A permission is defined by its |name| (what is used in the manifest), 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // and the |message_id| that's used by install/update UI. 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen struct Permission { 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* const name; 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const int message_id; 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static scoped_refptr<Extension> Create(const FilePath& path, 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location, 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const DictionaryValue& value, 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool require_key, 114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string* error); 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Return the update url used by gallery/webstore extensions. 117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static GURL GalleryUpdateUrl(bool secure); 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The install message id for |permission|. Returns 0 if none exists. 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static int GetPermissionMessageId(const std::string& permission); 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the full list of permission messages that this extension 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // should display at install time. 124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<string16> GetPermissionMessages() const; 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Returns the distinct hosts that should be displayed in the install UI 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // for the URL patterns |list|. This discards some of the detail that is 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // present in the manifest to make it as easy as possible to process by 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // users. In particular we disregard the scheme and path components of 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // URLPatterns and de-dupe the result, which includes filtering out common 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // hosts with differing RCDs. (NOTE: when de-duping hosts with common RCDs, 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // the first pattern is returned and the rest discarded) 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static std::vector<std::string> GetDistinctHostsForDisplay( 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& list); 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Compares two URLPatternLists for security equality by returning whether 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // the URL patterns in |new_list| contain additional distinct hosts compared 138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // to |old_list|. 139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool IsElevatedHostList( 140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& old_list, const URLPatternList& new_list); 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Icon sizes used by the extension system. 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kIconSizes[]; 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Max size (both dimensions) for browser and page actions. 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kPageActionIconMaxSize; 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kBrowserActionIconMaxSize; 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Each permission is a module that the extension is permitted to use. 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: To add a new permission, define it here, and add an entry to 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Extension::kPermissions. 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kBackgroundPermission[]; 1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kBookmarkPermission[]; 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kContextMenusPermission[]; 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kCookiePermission[]; 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kExperimentalPermission[]; 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kGeolocationPermission[]; 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kHistoryPermission[]; 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kIdlePermission[]; 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static const char kManagementPermission[]; 1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kNotificationPermission[]; 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kProxyPermission[]; 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kTabPermission[]; 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kUnlimitedStoragePermission[]; 1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kWebstorePrivatePermission[]; 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const Permission kPermissions[]; 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kNumPermissions; 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char* const kHostedAppPermissionNames[]; 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kNumHostedAppPermissions; 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The old name for the unlimited storage permission, which is deprecated but 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // still accepted as meaning the same thing as kUnlimitedStoragePermission. 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kOldUnlimitedStoragePermission[]; 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 177201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Valid schemes for web extent URLPatterns. 178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static const int kValidWebExtentSchemes; 179201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Valid schemes for host permission URLPatterns. 181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static const int kValidHostPermissionSchemes; 182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the string is one of the known hosted app permissions (see 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // kHostedAppPermissionNames). 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IsHostedAppPermission(const std::string& permission); 1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of the manifest inside an extension. 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kManifestFilename[]; 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of locale folder inside an extension. 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kLocaleFolder[]; 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of the messages file inside an extension. 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kMessagesFilename[]; 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN) 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kExtensionRegistryPath[]; 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The number of bytes in a legal id. 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kIdSize; 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The mimetype used for extensions. 2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kMimeType[]; 2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Checks to see if the extension has a valid ID. 2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IdIsValid(const std::string& id); 2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Generate an ID for an extension in the given path. 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static std::string GenerateIdForPath(const FilePath& file_name); 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the specified file is an extension. 2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IsExtension(const FilePath& file_name); 2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the |location| is external or not. 2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static inline bool IsExternalLocation(Location location) { 2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return location == Extension::EXTERNAL_PREF || 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen location == Extension::EXTERNAL_REGISTRY || 219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch location == Extension::EXTERNAL_PREF_DOWNLOAD || 220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch location == Extension::EXTERNAL_POLICY_DOWNLOAD; 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether extensions with |location| are auto-updatable or not. 224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static inline bool IsAutoUpdateableLocation(Location location) { 225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Only internal and external extensions can be autoupdated. 226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return location == Extension::INTERNAL || 227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IsExternalLocation(location); 2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // See HistogramType definition above. 231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HistogramType GetHistogramType() const; 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns an absolute url to a resource inside of an extension. The 2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |extension_url| argument should be the url() from an Extension object. The 2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |relative_path| can be untrusted user input. The returned URL will either 2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // be invalid() or a child of |extension_url|. 2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: Static so that it can be used from multiple threads. 2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static GURL GetResourceURL(const GURL& extension_url, 2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& relative_path); 2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen GURL GetResourceURL(const std::string& relative_path) const { 2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetResourceURL(url(), relative_path); 2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns an extension resource object. |relative_path| should be UTF8 2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // encoded. 246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetResource(const std::string& relative_path) const; 2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // As above, but with |relative_path| following the file system's encoding. 249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetResource(const FilePath& relative_path) const; 2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |input| is expected to be the text of an rsa public or private key. It 2528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // tolerates the presence or absence of bracking header/footer like this: 2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // -----(BEGIN|END) [RSA PUBLIC/PRIVATE] KEY----- 2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // and may contain newlines. 2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool ParsePEMKeyBytes(const std::string& input, std::string* output); 2568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Does a simple base64 encoding of |input| into |output|. 2588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool ProducePEM(const std::string& input, std::string* output); 2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Generates an extension ID from arbitrary input. The same input string will 2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // always generate the same output ID. 2628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool GenerateId(const std::string& input, std::string* output); 2638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Expects base64 encoded |input| and formats into |output| including 2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the appropriate header & footer. 2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool FormatPEMForFileOutput(const std::string input, 2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string* output, bool is_public); 2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Determine whether |new_extension| has increased privileges compared to 270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // its previously granted permissions, specified by |granted_apis|, 271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // |granted_extent| and |granted_full_access|. 272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool IsPrivilegeIncrease(const bool granted_full_access, 273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::set<std::string>& granted_apis, 274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const ExtensionExtent& granted_extent, 275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* new_extension); 2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Given an extension and icon size, read it if present and decode it into 2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // result. In the browser process, this will DCHECK if not called on the 2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file thread. To easily load extension images on the UI thread, see 2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // ImageLoadingTracker. 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void DecodeIcon(const Extension* extension, 2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Icons icon_size, 2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<SkBitmap>* result); 2848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Given an icon_path and icon size, read it if present and decode it into 2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // result. In the browser process, this will DCHECK if not called on the 2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file thread. To easily load extension images on the UI thread, see 2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // ImageLoadingTracker. 2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static void DecodeIconFromPath(const FilePath& icon_path, 2908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Icons icon_size, 2918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<SkBitmap>* result); 2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the base extension url for a given |extension_id|. 2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static GURL GetBaseURLFromExtensionId(const std::string& extension_id); 2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the url prefix for the extension/apps gallery. Can be set via the 2978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // --apps-gallery-url switch. The URL returned will not contain a trailing 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // slash. Do not use this as a prefix/extent for the store. Instead see 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ExtensionsService::GetWebStoreApp or 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ExtensionsService::IsDownloadFromGallery 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static std::string ChromeStoreLaunchURL(); 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Helper function that consolidates the check for whether the script can 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // execute into one location. |page_url| is the page that is the candidate 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // for running the script, |can_execute_script_everywhere| specifies whether 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the extension is on the whitelist, |allowed_pages| is a vector of 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // URLPatterns, listing what access the extension has, |script| is the script 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // pointer (if content script) and |error| is an optional parameter, which 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // will receive the error string listing why access was denied. 310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static bool CanExecuteScriptOnPage( 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GURL& page_url, 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool can_execute_script_everywhere, 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::vector<URLPattern>* allowed_pages, 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UserScript* script, 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string* error); 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Adds an extension to the scripting whitelist. Used for testing only. 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); 3198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the extension has the specified API permission. 3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool HasApiPermission(const std::set<std::string>& api_permissions, 3228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& function_name); 3238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 324201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Whether the |effective_host_permissions| and |api_permissions| include 325201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // effective access to all hosts. See the non-static version of the method 326201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // for more details. 327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool HasEffectiveAccessToAllHosts( 328201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const ExtensionExtent& effective_host_permissions, 329201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::set<std::string>& api_permissions); 330201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasApiPermission(const std::string& function_name) const { 3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return HasApiPermission(this->api_permissions(), function_name); 3338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const ExtensionExtent& GetEffectiveHostPermissions() const { 336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return effective_host_permissions_; 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether or not the extension is allowed permission for a URL pattern from 3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the manifest. http, https, and chrome://favicon/ is allowed for all 3418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // extensions, while component extensions are allowed access to 3428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // chrome://resources. 343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool CanSpecifyHostPermission(const URLPattern& pattern) const; 3448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the extension has access to the given URL. 3468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasHostPermission(const GURL& url) const; 3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the extension has effective access to all hosts. This is true if 3498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // there is a content script that matches all hosts, if there is a host 3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // permission grants access to all hosts (like <all_urls>) or an api 3518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // permission that effectively grants access to all hosts (e.g. proxy, 3528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // network, etc.) 3538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasEffectiveAccessToAllHosts() const; 3548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Whether the extension effectively has all permissions (for example, by 356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // having an NPAPI plugin). 357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool HasFullPermissions() const; 358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the Homepage URL for this extension. If homepage_url was not 360513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // specified in the manifest, this returns the Google Gallery URL. For 3618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // third-party extensions, this returns a blank GURL. 362513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL GetHomepageURL() const; 3638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns a list of paths (relative to the extension dir) for images that 3658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the browser might load (like themes and page action icons). 366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::set<FilePath> GetBrowserImages() const; 3678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get an extension icon as a resource or URL. 369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetIconResource( 370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int size, ExtensionIconSet::MatchType match_type) const; 371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL GetIconURL(int size, ExtensionIconSet::MatchType match_type) const; 3728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Gets the fully resolved absolute launch URL. 3748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen GURL GetFullLaunchURL() const; 3758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Image cache related methods. These are only valid on the UI thread and 3768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // not maintained by this class. See ImageLoadingTracker for usage. The 3778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |original_size| parameter should be the size of the image at |source| 3788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // before any scaling may have been done to produce the pixels in |image|. 3798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetCachedImage(const ExtensionResource& source, 3808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const SkBitmap& image, 381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& original_size) const; 3828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasCachedImage(const ExtensionResource& source, 383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 3848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkBitmap GetCachedImage(const ExtensionResource& source, 385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns true if this extension is a COMPONENT extension, or if it is 387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // on the whitelist of extensions that can script all pages. 388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool CanExecuteScriptEverywhere() const; 389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 3904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns true if this extension updates itself using the extension 3914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // gallery. 3924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool UpdatesFromGallery() const; 3934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Accessors: 395513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const FilePath& path() const { return path_; } 397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& url() const { return extension_url_; } 398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location() const { return location_; } 399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& id() const { return id_; } 400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Version* version() const { return version_.get(); } 401513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string VersionString() const; 402513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& name() const { return name_; } 403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& public_key() const { return public_key_; } 404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& description() const { return description_; } 405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool converted_from_user_script() const { 406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return converted_from_user_script_; 407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const UserScriptList& content_scripts() const { return content_scripts_; } 409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionAction* page_action() const { return page_action_.get(); } 410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionAction* browser_action() const { return browser_action_.get(); } 411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::vector<PluginInfo>& plugins() const { return plugins_; } 412513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& background_url() const { return background_url_; } 413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& options_url() const { return options_url_; } 414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& devtools_url() const { return devtools_url_; } 415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::vector<GURL>& toolstrips() const { return toolstrips_; } 416513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::set<std::string>& api_permissions() const { 417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return api_permissions_; 418513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 419513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const URLPatternList& host_permissions() const { return host_permissions_; } 420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& update_url() const { return update_url_; } 421513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ExtensionIconSet& icons() const { return icons_; } 422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const DictionaryValue* manifest_value() const { 423513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return manifest_value_.get(); 424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string default_locale() const { return default_locale_; } 426513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const URLOverrideMap& GetChromeURLOverrides() const { 427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return chrome_url_overrides_; 428513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 429513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string omnibox_keyword() const { return omnibox_keyword_; } 430513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool incognito_split_mode() const { return incognito_split_mode_; } 431513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 432513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // App-related. 433513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_app() const { return is_app_; } 434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_hosted_app() const { return is_app() && !web_extent().is_empty(); } 435513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_packaged_app() const { return is_app() && web_extent().is_empty(); } 436513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ExtensionExtent& web_extent() const { return extent_; } 437513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& launch_local_path() const { return launch_local_path_; } 438513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& launch_web_url() const { return launch_web_url_; } 439513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extension_misc::LaunchContainer launch_container() const { 440513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return launch_container_; 441513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 442513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_width() const { return launch_width_; } 443513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_height() const { return launch_height_; } 444513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 445513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Theme-related. 446513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_theme() const { return is_theme_; } 447513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeImages() const { return theme_images_.get(); } 448513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeColors() const {return theme_colors_.get(); } 449513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeTints() const { return theme_tints_.get(); } 450513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeDisplayProperties() const { 451513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return theme_display_properties_.get(); 452513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 453513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 4548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen private: 455513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend class base::RefCountedThreadSafe<Extension>; 456513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 457513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // We keep a cache of images loaded from extension resources based on their 458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // path and a string representation of a size that may have been used to 459513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // scale it (or the empty string if the image is at its original size). 460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::pair<FilePath, std::string> ImageCacheKey; 461513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::map<ImageCacheKey, SkBitmap> ImageCache; 462513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Normalize the path for use by the extension. On Windows, this will make 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // sure the drive letter is uppercase. 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static FilePath MaybeNormalizePath(const FilePath& path); 4668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Returns the distinct hosts that can be displayed in the install UI or be 468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // used for privilege comparisons. This discards some of the detail that is 469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // present in the manifest to make it as easy as possible to process by users. 470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // In particular we disregard the scheme and path components of URLPatterns 471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // and de-dupe the result, which includes filtering out common hosts with 472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // differing RCDs. If |include_rcd| is true, then the de-duped result 473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // will be the first full entry, including its RCD. So if the list was 474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // "*.google.co.uk" and "*.google.com", the returned value would just be 475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // "*.google.co.uk". Keeping the RCD in the result is useful for display 476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // purposes when you want to show the user one sample hostname from the list. 477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If you need to compare two URLPatternLists for security equality, then set 478201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // |include_rcd| to false, which will return a result like "*.google.", 479201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // regardless of the order of the patterns. 480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static std::vector<std::string> GetDistinctHosts( 481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& host_patterns, bool include_rcd); 482201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 483513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Extension(const FilePath& path, Location location); 484513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ~Extension(); 485513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Initialize the extension from a parsed manifest. 487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Usually, the id of an extension is generated by the "key" property of 488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // its manifest, but if |require_key| is |false|, a temporary ID will be 489513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // generated based on the path. 490513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool InitFromValue(const DictionaryValue& value, bool require_key, 491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string* error); 492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 4938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper function for implementing HasCachedImage/GetCachedImage. A return 4948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // value of NULL means there is no matching image cached (we allow caching an 4958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // empty SkBitmap). 4968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkBitmap* GetCachedImageImpl(const ExtensionResource& source, 497513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 4988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method that loads a UserScript object from a 5008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // dictionary in the content_script list of the manifest. 5018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadUserScriptHelper(const DictionaryValue* content_script, 5028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen int definition_index, 5038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string* error, 5048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UserScript* result); 5058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method that loads either the include_globs or exclude_globs list 5078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // from an entry in the content_script lists of the manifest. 5088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadGlobsHelper(const DictionaryValue* content_script, 5098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen int content_script_index, 5108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* globs_property_name, 5118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string* error, 5128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void(UserScript::*add_method)(const std::string& glob), 5138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UserScript *instance); 5148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helpers to load various chunks of the manifest. 5168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadIsApp(const DictionaryValue* manifest, std::string* error); 5178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadExtent(const DictionaryValue* manifest, const char* key, 5188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionExtent* extent, const char* list_error, 5198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* value_error, std::string* error); 5208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadLaunchContainer(const DictionaryValue* manifest, std::string* error); 5218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadLaunchURL(const DictionaryValue* manifest, std::string* error); 5228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool EnsureNotHybridApp(const DictionaryValue* manifest, std::string* error); 5238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method to load an ExtensionAction from the page_action or 5258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // browser_action entries in the manifest. 5268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionAction* LoadExtensionActionHelper( 5278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const DictionaryValue* extension_action, std::string* error); 5288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Calculates the effective host permissions from the permissions and content 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // script petterns. 531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void InitEffectiveHostPermissions(); 532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns true if the extension has more than one "UI surface". For example, 534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // an extension that has a browser action and a page action. 535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool HasMultipleUISurfaces() const; 536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Figures out if a source contains keys not associated with themes - we 5388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // don't want to allow scripts and such to be bundled with themes. 539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool ContainsNonThemeKeys(const DictionaryValue& source) const; 5408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the string is one of the known api permissions (see 5428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // kPermissions). 543513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsAPIPermission(const std::string& permission) const; 5448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The set of unique API install messages that the extension has. 5468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: This only includes messages related to permissions declared in the 5478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // "permissions" key in the manifest. Permissions implied from other features 5488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // of the manifest, like plugins and content scripts are not included. 549513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::set<string16> GetSimplePermissionMessages() const; 5508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The permission message displayed related to the host permissions for 5528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // this extension. 553513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 GetHostPermissionMessage() const; 554513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 555513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Cached images for this extension. This should only be touched on the UI 556513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // thread. 557513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mutable ImageCache image_cache_; 558513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 559513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A persistent, globally unique ID. An extension's ID is used in things 560513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // like directory structures and URLs, and is expected to not change across 561513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // versions. It is generated as a SHA-256 hash of the extension's public 562513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // key, or as a hash of the path in the case of unpacked extensions. 563513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string id_; 564513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 565513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's human-readable name. Name is used for display purpose. It 566513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // might be wrapped with unicode bidi control characters so that it is 567513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // displayed correctly in RTL context. 568513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // NOTE: Name is UTF-8 and may contain non-ascii characters. 569513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string name_; 570513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 571513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The absolute path to the directory the extension is stored in. 572513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath path_; 573513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 574513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Default locale for fall back. Can be empty if extension is not localized. 575513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string default_locale_; 576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 577513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // If true, a separate process will be used for the extension in incognito 578513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // mode. 579513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool incognito_split_mode_; 580513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 581513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Defines the set of URLs in the extension's web content. 582513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionExtent extent_; 583513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 584513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The set of host permissions that the extension effectively has access to, 585513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // which is a merge of host_permissions_ and all of the match patterns in 586513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // any content scripts the extension has. This is used to determine which 587513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // URLs have the ability to load an extension's resources via embedded 588513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // chrome-extension: URLs (see extension_protocols.cc). 589513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionExtent effective_host_permissions_; 590513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 591513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The set of module-level APIs this extension can use. 592513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::set<std::string> api_permissions_; 593513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 594513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The icons for the extension. 595513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionIconSet icons_; 596513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 597513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The base extension url for the extension. 598513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL extension_url_; 599513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 600513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The location the extension was loaded from. 601513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location_; 602513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 603513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's version. 604513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<Version> version_; 605513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 606513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // An optional longer description of the extension. 607513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string description_; 608513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 609513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // True if the extension was generated from a user script. (We show slightly 610513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // different UI if so). 611513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool converted_from_user_script_; 612513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 613513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Paths to the content scripts the extension contains. 614513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UserScriptList content_scripts_; 615513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 616513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's page action, if any. 617513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<ExtensionAction> page_action_; 618513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 619513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's browser action, if any. 620513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<ExtensionAction> browser_action_; 621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional list of NPAPI plugins and associated properties. 623513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<PluginInfo> plugins_; 624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 625513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a master page of which a single instance should be always 626513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // loaded in the background. 627513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL background_url_; 628513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 629513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a page for setting options/preferences. 630513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL options_url_; 631513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 632513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a devtools extension page. 633513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL devtools_url_; 634513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional list of toolstrips and associated properties. 636513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<GURL> toolstrips_; 637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The public key used to sign the contents of the crx package. 639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string public_key_; 640513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 641513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of resource id's to relative file paths. 642513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_images_; 643513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 644513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of color names to colors. 645513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_colors_; 646513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of color names to colors. 648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_tints_; 649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 650513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of display properties. 651513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_display_properties_; 652513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 653513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether the extension is a theme. 654513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_theme_; 655513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 656513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sites this extension has permission to talk to (using XHR, etc). 657513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch URLPatternList host_permissions_; 658513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 659513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The homepage for this extension. Useful if it is not hosted by Google and 660513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // therefore does not have a Gallery URL. 661513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL homepage_url_; 662513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 663513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // URL for fetching an update manifest 664513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL update_url_; 665513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 666513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A copy of the manifest that this extension was created from. 667513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> manifest_value_; 668513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 669513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of chrome:// hostnames (newtab, downloads, etc.) to Extension URLs 670513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // which override the handling of those URLs. (see ExtensionOverrideUI). 671513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch URLOverrideMap chrome_url_overrides_; 672513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 673513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether this extension uses app features. 674513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_app_; 675513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 676513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The local path inside the extension to use with the launcher. 677513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string launch_local_path_; 678513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 679513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A web url to use with the launcher. Note that this might be relative or 680513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // absolute. If relative, it is relative to web_origin. 681513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string launch_web_url_; 6828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 683513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The type of container to launch into. 684513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extension_misc::LaunchContainer launch_container_; 6858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 686513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The default size of the container when launching. Only respected for 687513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // containers like panels and windows. 688513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_width_; 689513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_height_; 6908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 691513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The Omnibox keyword for this extension, or empty if there is none. 692513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string omnibox_keyword_; 6938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionsServiceTest, 695201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch UpdateExtensionPreservesLocation); 6968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FRIEND_TEST_ALL_PREFIXES(ExtensionTest, LoadPageActionHelper); 697513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueInvalid); 698513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValid); 699513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValidNameInRTL); 7008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); 7018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISALLOW_COPY_AND_ASSIGN(Extension); 7038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 7048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 705513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef std::vector< scoped_refptr<const Extension> > ExtensionList; 706731df977c0511bca2206b5f333555b1205ff1f43Iain Merricktypedef std::set<std::string> ExtensionIdSet; 7078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Handy struct to pass core extension info around. 7098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstruct ExtensionInfo { 7108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionInfo(const DictionaryValue* manifest, 7118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& id, 7128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const FilePath& path, 7138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Extension::Location location); 7148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ~ExtensionInfo(); 7158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<DictionaryValue> extension_manifest; 7178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string extension_id; 7188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FilePath extension_path; 7198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Extension::Location extension_location; 7208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen private: 7228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISALLOW_COPY_AND_ASSIGN(ExtensionInfo); 7238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 7248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Struct used for the details of the EXTENSION_UNINSTALLED 726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// notification. 727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct UninstalledExtensionInfo { 728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit UninstalledExtensionInfo(const Extension& extension); 729731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~UninstalledExtensionInfo(); 730731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string extension_id; 732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> extension_api_permissions; 733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(akalin): Once we have a unified ExtensionType, replace the 734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // below member variables with a member of that type. 735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool is_theme; 736731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool is_app; 737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool converted_from_user_script; 738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL update_url; 739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_H_ 742