1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h" 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_extent.h" 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_icon_set.h" 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/user_script.h" 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/url_pattern.h" 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "googleurl/src/gurl.h" 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h" 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass DictionaryValue; 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionAction; 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionResource; 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ExtensionSidebarDefaults; 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass FileBrowserHandler; 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ListValue; 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass SkBitmap; 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass Version; 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Represents a Chrome extension. 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Extension : public base::RefCountedThreadSafe<Extension> { 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public: 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen typedef std::map<const std::string, GURL> URLOverrideMap; 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef std::vector<std::string> ScriptingWhitelist; 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen typedef std::vector<linked_ptr<FileBrowserHandler> > FileBrowserHandlerList; 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // What an extension was loaded from. 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // NOTE: These values are stored as integers in the preferences and used 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // in histograms so don't remove or reorder existing items. Just append 46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // to the end. 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum Location { 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INVALID, 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INTERNAL, // A crx file from the internal Extensions directory. 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTERNAL_PREF, // A crx file from an external directory (via prefs). 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTERNAL_REGISTRY, // A crx file from an external directory (via eg the 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // registry on Windows). 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen LOAD, // --load-extension. 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen COMPONENT, // An integral component of Chrome itself, which 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // happens to be implemented as an extension. We don't 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // show these in the management UI. 57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch EXTERNAL_PREF_DOWNLOAD, // A crx file from an external directory (via 58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // prefs), installed from an update URL. 59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch EXTERNAL_POLICY_DOWNLOAD, // A crx file from an external directory (via 60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // admin policies), installed from an update URL. 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NUM_LOCATIONS 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum State { 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISABLED = 0, 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ENABLED, 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // An external extension that the user uninstalled. We should not reinstall 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // such extensions on startup. 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXTERNAL_EXTENSION_UNINSTALLED, 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen NUM_STATES 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum InstallType { 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INSTALL_ERROR, 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DOWNGRADE, 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen REINSTALL, 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UPGRADE, 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen NEW_INSTALL 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: If you change this list, you should also change kIconSizes in the cc 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file. 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum Icons { 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_LARGE = 128, 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_MEDIUM = 48, 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_SMALL = 32, 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_SMALLISH = 24, 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXTENSION_ICON_BITTY = 16, 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Do not change the order of entries or remove entries in this list 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // as this is used in UMA_HISTOGRAM_ENUMERATIONs about extensions. 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen enum Type { 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_UNKNOWN = 0, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_EXTENSION, 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_THEME, 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_USER_SCRIPT, 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_HOSTED_APP, 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TYPE_PACKAGED_APP 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // An NPAPI plugin included in the extension. 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick struct PluginInfo { 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path; // Path to the plugin. 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool is_public; // False if only this extension can load this plugin. 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // An NaCl module included in the extension. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen struct NaClModuleInfo { 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url; 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string mime_type; 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen struct TtsVoice { 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string voice_name; 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string locale; 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string gender; 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen }; 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // When prompting the user to install or approve permissions, we display 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // messages describing the effects of the permissions and not the permissions 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // themselves. Each PermissionMessage represents one of the messages that is 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // shown to the user. 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen class PermissionMessage { 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Do not reorder or add new enumerations in this list. If you need to add a 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // new enum, add it just prior to ID_ENUM_BOUNDARY and enter its l10n 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // message in kMessageIds. 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen enum MessageId { 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_UNKNOWN, 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_NONE, 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_BOOKMARKS, 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_GEOLOCATION, 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_BROWSING_HISTORY, 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_TABS, 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_MANAGEMENT, 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_DEBUGGER, 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_HOSTS_1, 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_HOSTS_2, 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_HOSTS_3, 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_HOSTS_4_OR_MORE, 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_HOSTS_ALL, 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_FULL_ACCESS, 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ID_ENUM_BOUNDARY 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Creates a permission message with the given |message_id| and initializes 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // its message to the appropriate value. 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static PermissionMessage CreateFromMessageId(MessageId message_id); 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Creates the corresponding permission message for a list of hosts. This 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // method exists because the hosts are presented as one message that depends 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // on what and how many hosts there are. 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static PermissionMessage CreateFromHostList( 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<std::string> hosts); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Gets the id of the permission message, which can be used in UMA 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // histograms. 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageId message_id() const { return message_id_; } 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Gets a localized message describing this permission. Please note that 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the message will be empty for message types TYPE_NONE and TYPE_UNKNOWN. 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& message() const { return message_; } 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Comparator to work with std::set. 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool operator<(const PermissionMessage& that) const { 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return message_id_ < that.message_id_; 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PermissionMessage(MessageId message_id, string16 message_); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The index of the id in the array is its enum value. The first two values 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // are non-existent message ids to act as placeholders for "unknown" and 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // "none". 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Note: Do not change the order of the items in this list since they 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // are used in a histogram. The order must match the MessageId order. 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const int kMessageIds[]; 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageId message_id_; 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 message_; 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen typedef std::vector<PermissionMessage> PermissionMessages; 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // A permission is defined by its |name| (what is used in the manifest), 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // and the |message_id| that's used by install/update UI. 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen struct Permission { 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* const name; 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const PermissionMessage::MessageId message_id; 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen enum InitFromValueFlags { 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NO_FLAGS = 0, 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Usually, the id of an extension is generated by the "key" property of 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // its manifest, but if |REQUIRE_KEY| is not set, a temporary ID will be 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // generated based on the path. 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen REQUIRE_KEY = 1 << 0, 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // |STRICT_ERROR_CHECKS| enables extra error checking, such as 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // checks that URL patterns do not contain ports. This error 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // checking may find an error that a previous version of 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Chrome did not flag. To avoid errors in installed extensions 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // when Chrome is upgraded, strict error checking is only enabled 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // when loading extensions as a developer would (such as loading 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // an unpacked extension), or when loading an extension that is 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // tied to a specific version of Chrome (such as a component 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // extension). Most callers will set the |STRICT_ERROR_CHECKS| bit when 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Extension::ShouldDoStrictErrorChecking(location) returns true. 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STRICT_ERROR_CHECKS = 1 << 1, 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // |ALLOW_FILE_ACCESS| indicates that the user is allowing this extension 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to have file access. If it's not present, then permissions and content 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // scripts that match file:/// URLs will be filtered out. 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ALLOW_FILE_ACCESS = 1 << 2, 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static scoped_refptr<Extension> Create(const FilePath& path, 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location, 222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const DictionaryValue& value, 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int flags, 224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string* error); 225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Return the update url used by gallery/webstore extensions. 227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static GURL GalleryUpdateUrl(bool secure); 228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Given two install sources, return the one which should take priority 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // over the other. If an extension is installed from two sources A and B, 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // its install source should be set to GetHigherPriorityLocation(A, B). 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static Location GetHigherPriorityLocation(Location loc1, Location loc2); 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get's the install message id for |permission|. Returns 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // MessageId::TYPE_NONE if none exists. 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static PermissionMessage::MessageId GetPermissionMessageId( 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& permission); 2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the full list of permission messages that this extension 2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // should display at install time. 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PermissionMessages GetPermissionMessages() const; 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns the full list of permission messages that this extension 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // should display at install time. The messages are returned as strings 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // for convenience. 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> GetPermissionMessageStrings() const; 2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Returns the distinct hosts that should be displayed in the install UI 249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // for the URL patterns |list|. This discards some of the detail that is 250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // present in the manifest to make it as easy as possible to process by 251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // users. In particular we disregard the scheme and path components of 252201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // URLPatterns and de-dupe the result, which includes filtering out common 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // hosts with differing RCDs (aka Registry Controlled Domains, most of which 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // are Top Level Domains but also include exceptions like co.uk). 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // NOTE: when de-duping hosts the preferred RCD will be returned, given this 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // order of preference: .com, .net, .org, first in list. 257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static std::vector<std::string> GetDistinctHostsForDisplay( 258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& list); 259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Compares two URLPatternLists for security equality by returning whether 261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // the URL patterns in |new_list| contain additional distinct hosts compared 262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // to |old_list|. 263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool IsElevatedHostList( 264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& old_list, const URLPatternList& new_list); 2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Icon sizes used by the extension system. 2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kIconSizes[]; 2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Max size (both dimensions) for browser and page actions. 2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kPageActionIconMaxSize; 2718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kBrowserActionIconMaxSize; 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static const int kSidebarIconMaxSize; 2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Each permission is a module that the extension is permitted to use. 2758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // 2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: To add a new permission, define it here, and add an entry to 2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Extension::kPermissions. 2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kBackgroundPermission[]; 2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kBookmarkPermission[]; 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static const char kContentSettingsPermission[]; 2818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kContextMenusPermission[]; 2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kCookiePermission[]; 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char kChromeosInfoPrivatePermissions[]; 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char kDebuggerPermission[]; 2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kExperimentalPermission[]; 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char kFileBrowserHandlerPermission[]; 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char kFileBrowserPrivatePermission[]; 2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kGeolocationPermission[]; 2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kHistoryPermission[]; 2908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kIdlePermission[]; 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static const char kManagementPermission[]; 2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kNotificationPermission[]; 2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kProxyPermission[]; 2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kTabPermission[]; 2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kUnlimitedStoragePermission[]; 2968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kWebstorePrivatePermission[]; 2978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const Permission kPermissions[]; 2998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kNumPermissions; 3008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char* const kHostedAppPermissionNames[]; 3018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kNumHostedAppPermissions; 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char* const kComponentPrivatePermissionNames[]; 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const size_t kNumComponentPrivatePermissions; 3048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The old name for the unlimited storage permission, which is deprecated but 3068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // still accepted as meaning the same thing as kUnlimitedStoragePermission. 3078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kOldUnlimitedStoragePermission[]; 3088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 309201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Valid schemes for web extent URLPatterns. 310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static const int kValidWebExtentSchemes; 311201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Valid schemes for host permission URLPatterns. 313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static const int kValidHostPermissionSchemes; 314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 3158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the string is one of the known hosted app permissions (see 3168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // kHostedAppPermissionNames). 3178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IsHostedAppPermission(const std::string& permission); 3188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of the manifest inside an extension. 3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kManifestFilename[]; 3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of locale folder inside an extension. 3238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kLocaleFolder[]; 3248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The name of the messages file inside an extension. 3268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const FilePath::CharType kMessagesFilename[]; 3278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN) 3298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kExtensionRegistryPath[]; 3308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif 3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The number of bytes in a legal id. 3338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const size_t kIdSize; 3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The mimetype used for extensions. 3368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const char kMimeType[]; 3378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Checks to see if the extension has a valid ID. 3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IdIsValid(const std::string& id); 3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Generate an ID for an extension in the given path. 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Used while developing extensions, before they have a key. 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static std::string GenerateIdForPath(const FilePath& file_name); 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the specified file is an extension. 3468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool IsExtension(const FilePath& file_name); 3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the |location| is external or not. 3498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static inline bool IsExternalLocation(Location location) { 3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return location == Extension::EXTERNAL_PREF || 3518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen location == Extension::EXTERNAL_REGISTRY || 352513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch location == Extension::EXTERNAL_PREF_DOWNLOAD || 353513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch location == Extension::EXTERNAL_POLICY_DOWNLOAD; 354513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 355513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 356513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether extensions with |location| are auto-updatable or not. 357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static inline bool IsAutoUpdateableLocation(Location location) { 358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Only internal and external extensions can be autoupdated. 359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return location == Extension::INTERNAL || 360513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IsExternalLocation(location); 3618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 3628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Whether extensions with |location| can be uninstalled or not. Policy 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // controlled extensions are silently auto-installed and updated, and cannot 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // be disabled by the user. The same applies for internal components. 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static inline bool UserMayDisable(Location location) { 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return location != Extension::EXTERNAL_POLICY_DOWNLOAD && 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen location != Extension::COMPONENT; 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Whether extensions with |location| should be loaded with strict 372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // error checking. Strict error checks may flag errors older versions 373dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // of chrome did not detect. To avoid breaking installed extensions, 374dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // strict checks are disabled unless the location indicates that the 375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // developer is loading the extension, or the extension is a component 376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // of chrome. 377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static inline bool ShouldDoStrictErrorChecking(Location location) { 378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return location == Extension::LOAD || 379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen location == Extension::COMPONENT; 380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Unpacked extensions start off with file access since they are a developer 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // feature. 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static inline bool ShouldAlwaysAllowFileAccess(Location location) { 385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return location == Extension::LOAD; 386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 38821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // See Type definition above. 38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Type GetType() const; 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 3918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns an absolute url to a resource inside of an extension. The 3928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |extension_url| argument should be the url() from an Extension object. The 3938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |relative_path| can be untrusted user input. The returned URL will either 3948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // be invalid() or a child of |extension_url|. 3958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: Static so that it can be used from multiple threads. 3968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static GURL GetResourceURL(const GURL& extension_url, 3978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& relative_path); 3988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen GURL GetResourceURL(const std::string& relative_path) const { 3998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetResourceURL(url(), relative_path); 4008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 4018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns an extension resource object. |relative_path| should be UTF8 4038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // encoded. 404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetResource(const std::string& relative_path) const; 4058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // As above, but with |relative_path| following the file system's encoding. 407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetResource(const FilePath& relative_path) const; 4088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |input| is expected to be the text of an rsa public or private key. It 4108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // tolerates the presence or absence of bracking header/footer like this: 4118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // -----(BEGIN|END) [RSA PUBLIC/PRIVATE] KEY----- 4128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // and may contain newlines. 4138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool ParsePEMKeyBytes(const std::string& input, std::string* output); 4148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Does a simple base64 encoding of |input| into |output|. 4168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool ProducePEM(const std::string& input, std::string* output); 4178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Generates an extension ID from arbitrary input. The same input string will 4198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // always generate the same output ID. 4208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool GenerateId(const std::string& input, std::string* output); 4218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Expects base64 encoded |input| and formats into |output| including 4238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the appropriate header & footer. 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static bool FormatPEMForFileOutput(const std::string& input, 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string* output, 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_public); 4278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Determine whether |new_extension| has increased privileges compared to 429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // its previously granted permissions, specified by |granted_apis|, 430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // |granted_extent| and |granted_full_access|. 431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool IsPrivilegeIncrease(const bool granted_full_access, 432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::set<std::string>& granted_apis, 433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const ExtensionExtent& granted_extent, 434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* new_extension); 4358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Given an extension and icon size, read it if present and decode it into 4378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // result. In the browser process, this will DCHECK if not called on the 4388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file thread. To easily load extension images on the UI thread, see 4398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // ImageLoadingTracker. 440513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void DecodeIcon(const Extension* extension, 4418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Icons icon_size, 4428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<SkBitmap>* result); 4438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Given an icon_path and icon size, read it if present and decode it into 4458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // result. In the browser process, this will DCHECK if not called on the 4468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // file thread. To easily load extension images on the UI thread, see 4478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // ImageLoadingTracker. 4488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static void DecodeIconFromPath(const FilePath& icon_path, 4498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Icons icon_size, 4508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<SkBitmap>* result); 4518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns the default extension/app icon (for extensions or apps that don't 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // have one). 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const SkBitmap& GetDefaultIcon(bool is_app); 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 4568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the base extension url for a given |extension_id|. 4578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static GURL GetBaseURLFromExtensionId(const std::string& extension_id); 4588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns the url prefix for the extension/apps gallery. Can be set via the 4608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // --apps-gallery-url switch. The URL returned will not contain a trailing 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // slash. Do not use this as a prefix/extent for the store. Instead see 46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // ExtensionService::GetWebStoreApp or 46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // ExtensionService::IsDownloadFromGallery 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static std::string ChromeStoreLaunchURL(); 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Adds an extension to the scripting whitelist. Used for testing only. 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); 46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static const ScriptingWhitelist* GetScriptingWhitelist(); 4698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the extension has the specified API permission. 4718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static bool HasApiPermission(const std::set<std::string>& api_permissions, 4728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& function_name); 4738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Whether the |effective_host_permissions| and |api_permissions| include 475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // effective access to all hosts. See the non-static version of the method 476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // for more details. 477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static bool HasEffectiveAccessToAllHosts( 478201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const ExtensionExtent& effective_host_permissions, 479201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::set<std::string>& api_permissions); 480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 4818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasApiPermission(const std::string& function_name) const { 4828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return HasApiPermission(this->api_permissions(), function_name); 4838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 4848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const ExtensionExtent& GetEffectiveHostPermissions() const { 486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return effective_host_permissions_; 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 4888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether or not the extension is allowed permission for a URL pattern from 4908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the manifest. http, https, and chrome://favicon/ is allowed for all 4918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // extensions, while component extensions are allowed access to 4928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // chrome://resources. 493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool CanSpecifyHostPermission(const URLPattern& pattern) const; 4948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the extension has access to the given URL. 4968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasHostPermission(const GURL& url) const; 4978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Whether the extension has effective access to all hosts. This is true if 4998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // there is a content script that matches all hosts, if there is a host 5008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // permission grants access to all hosts (like <all_urls>) or an api 5018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // permission that effectively grants access to all hosts (e.g. proxy, 5028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // network, etc.) 5038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasEffectiveAccessToAllHosts() const; 5048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 505201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Whether the extension effectively has all permissions (for example, by 506201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // having an NPAPI plugin). 507201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool HasFullPermissions() const; 508201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Whether context menu should be shown for page and browser actions. 51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool ShowConfigureContextMenus() const; 51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the Homepage URL for this extension. If homepage_url was not 513513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // specified in the manifest, this returns the Google Gallery URL. For 5148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // third-party extensions, this returns a blank GURL. 515513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL GetHomepageURL() const; 5168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns a list of paths (relative to the extension dir) for images that 5188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the browser might load (like themes and page action icons). 519513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::set<FilePath> GetBrowserImages() const; 5208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get an extension icon as a resource or URL. 522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionResource GetIconResource( 523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int size, ExtensionIconSet::MatchType match_type) const; 524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL GetIconURL(int size, ExtensionIconSet::MatchType match_type) const; 5258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 5268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Gets the fully resolved absolute launch URL. 5278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen GURL GetFullLaunchURL() const; 52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Image cache related methods. These are only valid on the UI thread and 5308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // not maintained by this class. See ImageLoadingTracker for usage. The 5318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // |original_size| parameter should be the size of the image at |source| 5328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // before any scaling may have been done to produce the pixels in |image|. 5338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetCachedImage(const ExtensionResource& source, 5348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const SkBitmap& image, 535513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& original_size) const; 5368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasCachedImage(const ExtensionResource& source, 537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 5388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkBitmap GetCachedImage(const ExtensionResource& source, 539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returns true if this extension can execute script on a page. If a 54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // UserScript object is passed, permission to run that specific script is 54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // checked (using its matches list). Otherwise, permission to execute script 54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // programmatically is checked (using the extension's host permission). 54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 54672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This method is also aware of certain special pages that extensions are 54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // usually not allowed to run script on. 54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool CanExecuteScriptOnPage(const GURL& page_url, 549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const UserScript* script, 55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string* error) const; 55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns true if this extension is a COMPONENT extension, or if it is 553731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // on the whitelist of extensions that can script all pages. 554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool CanExecuteScriptEverywhere() const; 555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 556dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Returns true if this extension is allowed to obtain the contents of a 557dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // page as an image. Since a page may contain sensitive information, this 558dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // is restricted to the extension's host permissions as well as the 559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // extension page itself. 560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool CanCaptureVisiblePage(const GURL& page_url, std::string* error) const; 561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns true if this extension updates itself using the extension 5634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // gallery. 5644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool UpdatesFromGallery() const; 5654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 566dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Returns true if this extension or app includes areas within |origin|. 567dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool OverlapsWithOrigin(const GURL& origin) const; 568dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 569513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Accessors: 570513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 571513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const FilePath& path() const { return path_; } 572513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& url() const { return extension_url_; } 573513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location() const { return location_; } 574513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& id() const { return id_; } 575513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Version* version() const { return version_.get(); } 576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string VersionString() const; 577513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& name() const { return name_; } 578513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& public_key() const { return public_key_; } 579513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& description() const { return description_; } 580513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool converted_from_user_script() const { 581513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return converted_from_user_script_; 582513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 583513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const UserScriptList& content_scripts() const { return content_scripts_; } 584513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionAction* page_action() const { return page_action_.get(); } 585513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionAction* browser_action() const { return browser_action_.get(); } 58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionSidebarDefaults* sidebar_defaults() const { 58772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return sidebar_defaults_.get(); 58872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FileBrowserHandlerList* file_browser_handlers() const { 590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return file_browser_handlers_.get(); 591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 592513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::vector<PluginInfo>& plugins() const { return plugins_; } 593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<NaClModuleInfo>& nacl_modules() const { 594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return nacl_modules_; 595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 596513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& background_url() const { return background_url_; } 597513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& options_url() const { return options_url_; } 598513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& devtools_url() const { return devtools_url_; } 599513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::vector<GURL>& toolstrips() const { return toolstrips_; } 600513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::set<std::string>& api_permissions() const { 601513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return api_permissions_; 602513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 603513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const URLPatternList& host_permissions() const { return host_permissions_; } 604513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& update_url() const { return update_url_; } 605513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ExtensionIconSet& icons() const { return icons_; } 606513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const DictionaryValue* manifest_value() const { 607513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return manifest_value_.get(); 608513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 609513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string default_locale() const { return default_locale_; } 610513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const URLOverrideMap& GetChromeURLOverrides() const { 611513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return chrome_url_overrides_; 612513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 613513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string omnibox_keyword() const { return omnibox_keyword_; } 614513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool incognito_split_mode() const { return incognito_split_mode_; } 61521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::vector<TtsVoice>& tts_voices() const { return tts_voices_; } 616513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool wants_file_access() const { return wants_file_access_; } 618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 619513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // App-related. 620513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_app() const { return is_app_; } 621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_hosted_app() const { return is_app() && !web_extent().is_empty(); } 622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_packaged_app() const { return is_app() && web_extent().is_empty(); } 623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_storage_isolated() const { return is_app() && is_storage_isolated_; } 624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ExtensionExtent& web_extent() const { return extent_; } 625513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& launch_local_path() const { return launch_local_path_; } 626513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& launch_web_url() const { return launch_web_url_; } 627513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extension_misc::LaunchContainer launch_container() const { 628513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return launch_container_; 629513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 630513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_width() const { return launch_width_; } 631513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_height() const { return launch_height_; } 632513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 633513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Theme-related. 634513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_theme() const { return is_theme_; } 635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeImages() const { return theme_images_.get(); } 636513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeColors() const {return theme_colors_.get(); } 637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeTints() const { return theme_tints_.get(); } 638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DictionaryValue* GetThemeDisplayProperties() const { 639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return theme_display_properties_.get(); 640513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 641513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 6428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen private: 643513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend class base::RefCountedThreadSafe<Extension>; 644513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 645513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // We keep a cache of images loaded from extension resources based on their 646513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // path and a string representation of a size that may have been used to 647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // scale it (or the empty string if the image is at its original size). 648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::pair<FilePath, std::string> ImageCacheKey; 649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::map<ImageCacheKey, SkBitmap> ImageCache; 650513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Normalize the path for use by the extension. On Windows, this will make 652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // sure the drive letter is uppercase. 653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static FilePath MaybeNormalizePath(const FilePath& path); 6548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 655201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Returns the distinct hosts that can be displayed in the install UI or be 656201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // used for privilege comparisons. This discards some of the detail that is 657201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // present in the manifest to make it as easy as possible to process by users. 658201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // In particular we disregard the scheme and path components of URLPatterns 659201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // and de-dupe the result, which includes filtering out common hosts with 660201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // differing RCDs. If |include_rcd| is true, then the de-duped result 661201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // will be the first full entry, including its RCD. So if the list was 662201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // "*.google.co.uk" and "*.google.com", the returned value would just be 663201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // "*.google.co.uk". Keeping the RCD in the result is useful for display 664201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // purposes when you want to show the user one sample hostname from the list. 665201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If you need to compare two URLPatternLists for security equality, then set 666201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // |include_rcd| to false, which will return a result like "*.google.", 667201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // regardless of the order of the patterns. 668201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static std::vector<std::string> GetDistinctHosts( 669201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const URLPatternList& host_patterns, bool include_rcd); 670201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 671513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Extension(const FilePath& path, Location location); 672513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ~Extension(); 673513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 674513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Initialize the extension from a parsed manifest. 675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool InitFromValue(const DictionaryValue& value, int flags, 676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string* error); 677513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 6788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper function for implementing HasCachedImage/GetCachedImage. A return 6798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // value of NULL means there is no matching image cached (we allow caching an 6808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // empty SkBitmap). 6818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkBitmap* GetCachedImageImpl(const ExtensionResource& source, 682513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const gfx::Size& max_size) const; 6838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 6848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method that loads a UserScript object from a 6858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // dictionary in the content_script list of the manifest. 6868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadUserScriptHelper(const DictionaryValue* content_script, 6878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen int definition_index, 688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int flags, 6898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string* error, 6908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UserScript* result); 6918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 6928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method that loads either the include_globs or exclude_globs list 6938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // from an entry in the content_script lists of the manifest. 6948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadGlobsHelper(const DictionaryValue* content_script, 6958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen int content_script_index, 6968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* globs_property_name, 6978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string* error, 6988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void(UserScript::*add_method)(const std::string& glob), 6998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen UserScript *instance); 7008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helpers to load various chunks of the manifest. 7028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadIsApp(const DictionaryValue* manifest, std::string* error); 703dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool LoadExtent(const DictionaryValue* manifest, 704dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* key, 705dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionExtent* extent, 706dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* list_error, 707dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* value_error, 708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen URLPattern::ParseOption parse_strictness, 709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string* error); 7108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadLaunchContainer(const DictionaryValue* manifest, std::string* error); 7118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool LoadLaunchURL(const DictionaryValue* manifest, std::string* error); 712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool LoadAppIsolation(const DictionaryValue* manifest, std::string* error); 7138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool EnsureNotHybridApp(const DictionaryValue* manifest, std::string* error); 7148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method to load an ExtensionAction from the page_action or 7168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // browser_action entries in the manifest. 7178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionAction* LoadExtensionActionHelper( 7188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const DictionaryValue* extension_action, std::string* error); 7198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Helper method to load an FileBrowserHandlerList from the manifest. 721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FileBrowserHandlerList* LoadFileBrowserHandlers( 722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ListValue* extension_actions, std::string* error); 723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Helper method to load an FileBrowserHandler from manifest. 724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FileBrowserHandler* LoadFileBrowserHandler( 725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const DictionaryValue* file_browser_handlers, std::string* error); 726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 72772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Helper method to load an ExtensionSidebarDefaults from the sidebar manifest 72872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // entry. 72972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionSidebarDefaults* LoadExtensionSidebarDefaults( 73072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const DictionaryValue* sidebar, std::string* error); 73172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Calculates the effective host permissions from the permissions and content 733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // script petterns. 734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void InitEffectiveHostPermissions(); 735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 736731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns true if the extension has more than one "UI surface". For example, 737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // an extension that has a browser action and a page action. 738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool HasMultipleUISurfaces() const; 739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Figures out if a source contains keys not associated with themes - we 7418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // don't want to allow scripts and such to be bundled with themes. 742513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool ContainsNonThemeKeys(const DictionaryValue& source) const; 7438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 7448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Returns true if the string is one of the known api permissions (see 7458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // kPermissions). 746513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsAPIPermission(const std::string& permission) const; 7478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if this is a component, or we are not attempting to access a 749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // component-private permission. 750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool IsComponentOnlyPermission(const std::string& permission) const; 751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The set of unique API install messages that the extension has. 7538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // NOTE: This only includes messages related to permissions declared in the 7548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // "permissions" key in the manifest. Permissions implied from other features 7558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // of the manifest, like plugins and content scripts are not included. 756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<PermissionMessage> GetSimplePermissionMessages() const; 757513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 758513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Cached images for this extension. This should only be touched on the UI 759513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // thread. 760513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mutable ImageCache image_cache_; 761513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 762513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A persistent, globally unique ID. An extension's ID is used in things 763513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // like directory structures and URLs, and is expected to not change across 764513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // versions. It is generated as a SHA-256 hash of the extension's public 765513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // key, or as a hash of the path in the case of unpacked extensions. 766513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string id_; 767513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 768513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's human-readable name. Name is used for display purpose. It 769513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // might be wrapped with unicode bidi control characters so that it is 770513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // displayed correctly in RTL context. 771513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // NOTE: Name is UTF-8 and may contain non-ascii characters. 772513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string name_; 773513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 774513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The absolute path to the directory the extension is stored in. 775513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath path_; 776513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 777513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Default locale for fall back. Can be empty if extension is not localized. 778513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string default_locale_; 779513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 780513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // If true, a separate process will be used for the extension in incognito 781513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // mode. 782513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool incognito_split_mode_; 783513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 784513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Defines the set of URLs in the extension's web content. 785513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionExtent extent_; 786513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 787513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The set of host permissions that the extension effectively has access to, 788513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // which is a merge of host_permissions_ and all of the match patterns in 789513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // any content scripts the extension has. This is used to determine which 790513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // URLs have the ability to load an extension's resources via embedded 791513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // chrome-extension: URLs (see extension_protocols.cc). 792513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionExtent effective_host_permissions_; 793513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 794513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The set of module-level APIs this extension can use. 795513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::set<std::string> api_permissions_; 796513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 797513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The icons for the extension. 798513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionIconSet icons_; 799513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 800513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The base extension url for the extension. 801513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL extension_url_; 802513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 803513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The location the extension was loaded from. 804513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Location location_; 805513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 806513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's version. 807513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<Version> version_; 808513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 809513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // An optional longer description of the extension. 810513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string description_; 811513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 812513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // True if the extension was generated from a user script. (We show slightly 813513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // different UI if so). 814513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool converted_from_user_script_; 815513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 816513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Paths to the content scripts the extension contains. 817513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UserScriptList content_scripts_; 818513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 819513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's page action, if any. 820513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<ExtensionAction> page_action_; 821513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 822513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The extension's browser action, if any. 823513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<ExtensionAction> browser_action_; 824513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The extension's file browser actions, if any. 826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<FileBrowserHandlerList> file_browser_handlers_; 827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The extension's sidebar, if any. 82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<ExtensionSidebarDefaults> sidebar_defaults_; 83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 831513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional list of NPAPI plugins and associated properties. 832513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<PluginInfo> plugins_; 833513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Optional list of NaCl modules and associated properties. 835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<NaClModuleInfo> nacl_modules_; 836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 837513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a master page of which a single instance should be always 838513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // loaded in the background. 839513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL background_url_; 840513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 841513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a page for setting options/preferences. 842513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL options_url_; 843513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 844513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional URL to a devtools extension page. 845513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL devtools_url_; 846513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 847513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Optional list of toolstrips and associated properties. 848513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<GURL> toolstrips_; 849513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 850513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The public key used to sign the contents of the crx package. 851513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string public_key_; 852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of resource id's to relative file paths. 854513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_images_; 855513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 856513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of color names to colors. 857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_colors_; 858513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of color names to colors. 860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_tints_; 861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of display properties. 863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> theme_display_properties_; 864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 865513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether the extension is a theme. 866513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_theme_; 867513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 868513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The sites this extension has permission to talk to (using XHR, etc). 869513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch URLPatternList host_permissions_; 870513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 871513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The homepage for this extension. Useful if it is not hosted by Google and 872513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // therefore does not have a Gallery URL. 873513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL homepage_url_; 874513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 875513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // URL for fetching an update manifest 876513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL update_url_; 877513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 878513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A copy of the manifest that this extension was created from. 879513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<DictionaryValue> manifest_value_; 880513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 881513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A map of chrome:// hostnames (newtab, downloads, etc.) to Extension URLs 882513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // which override the handling of those URLs. (see ExtensionOverrideUI). 883513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch URLOverrideMap chrome_url_overrides_; 884513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 885513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether this extension uses app features. 886513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool is_app_; 887513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Whether this extension requests isolated storage. 889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_storage_isolated_; 890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 891513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The local path inside the extension to use with the launcher. 892513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string launch_local_path_; 893513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 894513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A web url to use with the launcher. Note that this might be relative or 895513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // absolute. If relative, it is relative to web_origin. 896513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string launch_web_url_; 8978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 89872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The window type that an app's manifest specifies to launch into. 89972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This is not always the window type an app will open into, because 90072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // users can override the way each app launches. See 90172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // ExtensionPrefs::GetLaunchContainer(), which looks at a per-app pref 90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // to decide what container an app will launch in. 903513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extension_misc::LaunchContainer launch_container_; 9048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 905513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The default size of the container when launching. Only respected for 906513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // containers like panels and windows. 907513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_width_; 908513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int launch_height_; 9098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 910513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The Omnibox keyword for this extension, or empty if there is none. 911513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string omnibox_keyword_; 9128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 91321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // List of text-to-speech voices that this extension provides, if any. 91421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::vector<TtsVoice> tts_voices_; 91521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Whether the extension has host permissions or user script patterns that 917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // imply access to file:/// scheme URLs (the user may not have actually 918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // granted it that access). 919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool wants_file_access_; 920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 92121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, 922201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch UpdateExtensionPreservesLocation); 9238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FRIEND_TEST_ALL_PREFIXES(ExtensionTest, LoadPageActionHelper); 924513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueInvalid); 925513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValid); 926513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValidNameInRTL); 9278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); 9288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 9298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISALLOW_COPY_AND_ASSIGN(Extension); 9308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 9318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 932513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef std::vector< scoped_refptr<const Extension> > ExtensionList; 933731df977c0511bca2206b5f333555b1205ff1f43Iain Merricktypedef std::set<std::string> ExtensionIdSet; 9348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 9358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Handy struct to pass core extension info around. 9368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstruct ExtensionInfo { 9378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionInfo(const DictionaryValue* manifest, 9388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& id, 9398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const FilePath& path, 9408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Extension::Location location); 9418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ~ExtensionInfo(); 9428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 9438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<DictionaryValue> extension_manifest; 9448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string extension_id; 9458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FilePath extension_path; 9468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen Extension::Location extension_location; 9478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 9488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen private: 9498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DISALLOW_COPY_AND_ASSIGN(ExtensionInfo); 9508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 9518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 952731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Struct used for the details of the EXTENSION_UNINSTALLED 953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// notification. 954731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct UninstalledExtensionInfo { 955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit UninstalledExtensionInfo(const Extension& extension); 956731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~UninstalledExtensionInfo(); 957731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string extension_id; 959731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::set<std::string> extension_api_permissions; 96021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Extension::Type extension_type; 961731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL update_url; 962731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 963731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 96421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstruct UnloadedExtensionInfo { 96521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen enum Reason { 96621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DISABLE, // The extension is being disabled. 96721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UPDATE, // The extension is being updated to a newer version. 96821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UNINSTALL, // The extension is being uninstalled. 96921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen }; 97021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 97121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Reason reason; 97221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 97321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Was the extension already disabled? 97421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool already_disabled; 97521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 97621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The extension being unloaded - this should always be non-NULL. 97721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const Extension* extension; 97821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 97921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UnloadedExtensionInfo(const Extension* extension, Reason reason); 98021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 98121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_H_ 983