diff options
Diffstat (limited to 'chrome/common')
-rw-r--r-- | chrome/common/extensions/extension.cc | 28 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 53 | ||||
-rw-r--r-- | chrome/common/extensions/extension_file_util.cc | 29 | ||||
-rw-r--r-- | chrome/common/extensions/extension_file_util.h | 8 | ||||
-rw-r--r-- | chrome/common/extensions/extension_file_util_unittest.cc | 10 | ||||
-rw-r--r-- | chrome/common/extensions/extension_l10n_util.cc | 4 | ||||
-rw-r--r-- | chrome/common/extensions/extension_l10n_util.h | 2 | ||||
-rw-r--r-- | chrome/common/extensions/extension_manifests_unittest.cc | 106 | ||||
-rw-r--r-- | chrome/common/extensions/extension_unittest.cc | 110 | ||||
-rw-r--r-- | chrome/common/extensions/extension_unpacker.cc | 13 |
10 files changed, 178 insertions, 185 deletions
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc index 8bf9938..e0cdc5d 100644 --- a/chrome/common/extensions/extension.cc +++ b/chrome/common/extensions/extension.cc @@ -283,18 +283,6 @@ Extension::RuntimeData::~RuntimeData() { // // static -scoped_refptr<Extension> Extension::Create(const FilePath& path, - Location location, - const DictionaryValue& value, - bool require_key, - std::string* error) { - scoped_refptr<Extension> extension = new Extension(path, location); - if (!extension->InitFromValue(value, require_key, error)) - return NULL; - return extension; -} - -// static int Extension::GetPermissionMessageId(const std::string& permission) { return ExtensionConfig::GetSingleton()->GetPermissionMessageId(permission); } @@ -413,6 +401,9 @@ bool Extension::IsHostedAppPermission(const std::string& str) { return false; } +Extension::~Extension() { +} + const std::string Extension::VersionString() const { return version()->GetString(); } @@ -1007,16 +998,15 @@ bool Extension::EnsureNotHybridApp(const DictionaryValue* manifest, return true; } -Extension::Extension(const FilePath& path, Location location) - : mutable_static_data_(new StaticData) { +Extension::Extension(const FilePath& path) + : mutable_static_data_(new StaticData), + runtime_data_(new RuntimeData) { DCHECK(path.IsAbsolute()); static_data_ = mutable_static_data_; - mutable_static_data_->location = location; - mutable_static_data_->path = MaybeNormalizePath(path); -} + mutable_static_data_->location = INVALID; -Extension::~Extension() { + mutable_static_data_->path = MaybeNormalizePath(path); } ExtensionResource Extension::GetResource(const std::string& relative_path) { @@ -2246,7 +2236,7 @@ bool Extension::CanExecuteScriptEverywhere() const { Extension::RuntimeData* Extension::GetRuntimeData() const { // TODO(mpcomplete): it would be nice if I could verify we were on the UI // thread, but we're in common and don't have access to BrowserThread. - return const_cast<Extension::RuntimeData*>(&runtime_data_); + return const_cast<Extension::RuntimeData*>(runtime_data_.get()); } ExtensionInfo::ExtensionInfo(const DictionaryValue* manifest, diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h index 82c007b..c073987 100644 --- a/chrome/common/extensions/extension.h +++ b/chrome/common/extensions/extension.h @@ -30,7 +30,7 @@ class SkBitmap; class Version; // Represents a Chrome extension. -class Extension : public base::RefCountedThreadSafe<Extension> { +class Extension { public: typedef std::map<const std::string, GURL> URLOverrideMap; typedef std::vector<std::string> ScriptingWhitelist; @@ -105,6 +105,18 @@ class Extension : public base::RefCountedThreadSafe<Extension> { struct StaticData : public base::RefCountedThreadSafe<StaticData> { StaticData(); + // TODO(mpcomplete): RefCountedThreadSafe does not allow AddRef/Release on + // const objects. I think that is a mistake. Until we can fix that, here's + // a workaround. + void AddRef() const { + const_cast<StaticData*>(this)-> + base::RefCountedThreadSafe<StaticData>::AddRef(); + } + void Release() const { + const_cast<StaticData*>(this)-> + base::RefCountedThreadSafe<StaticData>::Release(); + } + // A persistent, globally unique ID. An extension's ID is used in things // like directory structures and URLs, and is expected to not change across // versions. It is generated as a SHA-256 hash of the extension's public @@ -274,12 +286,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { const int message_id; }; - static scoped_refptr<Extension> Create(const FilePath& path, - Location location, - const DictionaryValue& value, - bool require_key, - std::string* error); - // The install message id for |permission|. Returns 0 if none exists. static int GetPermissionMessageId(const std::string& permission); @@ -353,6 +359,9 @@ class Extension : public base::RefCountedThreadSafe<Extension> { // The mimetype used for extensions. static const char kMimeType[]; + explicit Extension(const FilePath& path); + virtual ~Extension(); + // Checks to see if the extension has a valid ID. static bool IdIsValid(const std::string& id); @@ -464,11 +473,22 @@ class Extension : public base::RefCountedThreadSafe<Extension> { // Adds an extension to the scripting whitelist. Used for testing only. static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); + // Initialize the extension from a parsed manifest. + // Usually, the id of an extension is generated by the "key" property of + // its manifest, but if |require_key| is |false|, a temporary ID will be + // generated based on the path. + bool InitFromValue(const DictionaryValue& value, bool require_key, + std::string* error); + const StaticData* static_data() const { return static_data_; } const FilePath& path() const { return static_data_->path; } const GURL& url() const { return static_data_->extension_url; } Location location() const { return static_data_->location; } + void set_location(Location location) { + mutable_static_data_->location = location; + } + const std::string& id() const { return static_data_->id; } const Version* version() const { return static_data_->version.get(); } // String representation of the version number. @@ -638,22 +658,10 @@ class Extension : public base::RefCountedThreadSafe<Extension> { bool CanExecuteScriptEverywhere() const; private: - friend class base::RefCountedThreadSafe<Extension>; - // Normalize the path for use by the extension. On Windows, this will make // sure the drive letter is uppercase. static FilePath MaybeNormalizePath(const FilePath& path); - Extension(const FilePath& path, Location location); - ~Extension(); - - // Initialize the extension from a parsed manifest. - // Usually, the id of an extension is generated by the "key" property of - // its manifest, but if |require_key| is |false|, a temporary ID will be - // generated based on the path. - bool InitFromValue(const DictionaryValue& value, bool require_key, - std::string* error); - // Helper function for implementing HasCachedImage/GetCachedImage. A return // value of NULL means there is no matching image cached (we allow caching an // empty SkBitmap). @@ -728,18 +736,15 @@ class Extension : public base::RefCountedThreadSafe<Extension> { scoped_refptr<const StaticData> static_data_; // Runtime data. - const RuntimeData runtime_data_; + scoped_ptr<const RuntimeData> runtime_data_; FRIEND_TEST_ALL_PREFIXES(ExtensionTest, LoadPageActionHelper); - FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueInvalid); - FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValid); - FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValidNameInRTL); FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); DISALLOW_COPY_AND_ASSIGN(Extension); }; -typedef std::vector< scoped_refptr<Extension> > ExtensionList; +typedef std::vector<Extension*> ExtensionList; typedef std::set<std::string> ExtensionIdSet; // Handy struct to pass core extension info around. diff --git a/chrome/common/extensions/extension_file_util.cc b/chrome/common/extensions/extension_file_util.cc index c7be522..d530357 100644 --- a/chrome/common/extensions/extension_file_util.cc +++ b/chrome/common/extensions/extension_file_util.cc @@ -81,14 +81,15 @@ void UninstallExtension(const FilePath& extensions_dir, file_util::Delete(extensions_dir.AppendASCII(id), true); // recursive. } -scoped_refptr<Extension> LoadExtension(const FilePath& extension_path, - Extension::Location location, - bool require_key, - std::string* error) { +Extension* LoadExtension(const FilePath& extension_path, + Extension::Location location, + bool require_key, + std::string* error) { FilePath manifest_path = extension_path.Append(Extension::kManifestFilename); if (!file_util::PathExists(manifest_path)) { - *error = l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_UNREADABLE); + *error = + l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_UNREADABLE); return NULL; } @@ -100,7 +101,8 @@ scoped_refptr<Extension> LoadExtension(const FilePath& extension_path, // It would be cleaner to have the JSON reader give a specific error // in this case, but other code tests for a file error with // error->empty(). For now, be consistent. - *error = l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_UNREADABLE); + *error = + l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_UNREADABLE); } else { *error = StringPrintf("%s %s", errors::kManifestParseError, @@ -110,23 +112,26 @@ scoped_refptr<Extension> LoadExtension(const FilePath& extension_path, } if (!root->IsType(Value::TYPE_DICTIONARY)) { - *error = l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_INVALID); + *error = + l10n_util::GetStringUTF8(IDS_EXTENSION_MANIFEST_INVALID); return NULL; } DictionaryValue* manifest = static_cast<DictionaryValue*>(root.get()); - if (!extension_l10n_util::LocalizeExtension(extension_path, manifest, error)) + + scoped_ptr<Extension> extension(new Extension(extension_path)); + extension->set_location(location); + + if (!extension_l10n_util::LocalizeExtension(extension.get(), manifest, error)) return NULL; - scoped_refptr<Extension> extension(Extension::Create( - extension_path, location, *manifest, require_key, error)); - if (!extension.get()) + if (!extension->InitFromValue(*manifest, require_key, error)) return NULL; if (!ValidateExtension(extension.get(), error)) return NULL; - return extension; + return extension.release(); } bool ValidateExtension(Extension* extension, std::string* error) { diff --git a/chrome/common/extensions/extension_file_util.h b/chrome/common/extensions/extension_file_util.h index f6a72bc..1b8fb76 100644 --- a/chrome/common/extensions/extension_file_util.h +++ b/chrome/common/extensions/extension_file_util.h @@ -37,10 +37,10 @@ void UninstallExtension(const FilePath& extensions_dir, // Loads and validates an extension from the specified directory. Returns NULL // on failure, with a description of the error in |error|. -scoped_refptr<Extension> LoadExtension(const FilePath& extension_root, - Extension::Location location, - bool require_key, - std::string* error); +Extension* LoadExtension(const FilePath& extension_root, + Extension::Location location, + bool require_key, + std::string* error); // Returns true if the given extension object is valid and consistent. // Otherwise, a description of the error is returned in |error|. diff --git a/chrome/common/extensions/extension_file_util_unittest.cc b/chrome/common/extensions/extension_file_util_unittest.cc index 230712d..634df05 100644 --- a/chrome/common/extensions/extension_file_util_unittest.cc +++ b/chrome/common/extensions/extension_file_util_unittest.cc @@ -78,7 +78,7 @@ TEST(ExtensionFileUtil, LoadExtensionWithValidLocales) { .AppendASCII("1.0.0.0"); std::string error; - scoped_refptr<Extension> extension(extension_file_util::LoadExtension( + scoped_ptr<Extension> extension(extension_file_util::LoadExtension( install_dir, Extension::LOAD, false, &error)); ASSERT_TRUE(extension != NULL); EXPECT_EQ("The first extension that I made.", extension->description()); @@ -94,7 +94,7 @@ TEST(ExtensionFileUtil, LoadExtensionWithoutLocalesFolder) { .AppendASCII("1.0"); std::string error; - scoped_refptr<Extension> extension(extension_file_util::LoadExtension( + scoped_ptr<Extension> extension(extension_file_util::LoadExtension( install_dir, Extension::LOAD, false, &error)); ASSERT_FALSE(extension == NULL); EXPECT_TRUE(error.empty()); @@ -152,7 +152,7 @@ TEST(ExtensionFileUtil, LoadExtensionGivesHelpfullErrorOnMissingManifest) { .AppendASCII("1.0"); std::string error; - scoped_refptr<Extension> extension(extension_file_util::LoadExtension( + scoped_ptr<Extension> extension(extension_file_util::LoadExtension( install_dir, Extension::LOAD, false, &error)); ASSERT_TRUE(extension == NULL); ASSERT_FALSE(error.empty()); @@ -169,7 +169,7 @@ TEST(ExtensionFileUtil, LoadExtensionGivesHelpfullErrorOnBadManifest) { .AppendASCII("1.0"); std::string error; - scoped_refptr<Extension> extension(extension_file_util::LoadExtension( + scoped_ptr<Extension> extension(extension_file_util::LoadExtension( install_dir, Extension::LOAD, false, &error)); ASSERT_TRUE(extension == NULL); ASSERT_FALSE(error.empty()); @@ -185,7 +185,7 @@ TEST(ExtensionFileUtil, FailLoadingNonUTF8Scripts) { .AppendASCII("bad_encoding"); std::string error; - scoped_refptr<Extension> extension(extension_file_util::LoadExtension( + scoped_ptr<Extension> extension(extension_file_util::LoadExtension( install_dir, Extension::LOAD, false, &error)); ASSERT_TRUE(extension == NULL); ASSERT_STREQ("Could not load file 'bad_encoding.js' for content script. " diff --git a/chrome/common/extensions/extension_l10n_util.cc b/chrome/common/extensions/extension_l10n_util.cc index 53950cb..4187689 100644 --- a/chrome/common/extensions/extension_l10n_util.cc +++ b/chrome/common/extensions/extension_l10n_util.cc @@ -113,7 +113,7 @@ bool LocalizeManifest(const ExtensionMessageBundle& messages, return true; } -bool LocalizeExtension(const FilePath& extension_path, +bool LocalizeExtension(Extension* extension, DictionaryValue* manifest, std::string* error) { DCHECK(manifest); @@ -122,7 +122,7 @@ bool LocalizeExtension(const FilePath& extension_path, scoped_ptr<ExtensionMessageBundle> message_bundle( extension_file_util::LoadExtensionMessageBundle( - extension_path, default_locale, error)); + extension->path(), default_locale, error)); if (!message_bundle.get() && !error->empty()) return false; diff --git a/chrome/common/extensions/extension_l10n_util.h b/chrome/common/extensions/extension_l10n_util.h index e1fdfa0..48dc901 100644 --- a/chrome/common/extensions/extension_l10n_util.h +++ b/chrome/common/extensions/extension_l10n_util.h @@ -44,7 +44,7 @@ bool LocalizeManifest(const ExtensionMessageBundle& messages, // Load message catalogs, localize manifest and attach message bundle to the // extension. -bool LocalizeExtension(const FilePath& extension_path, +bool LocalizeExtension(Extension* extension, DictionaryValue* manifest, std::string* error); diff --git a/chrome/common/extensions/extension_manifests_unittest.cc b/chrome/common/extensions/extension_manifests_unittest.cc index c27e2dd..e800cd9 100644 --- a/chrome/common/extensions/extension_manifests_unittest.cc +++ b/chrome/common/extensions/extension_manifests_unittest.cc @@ -37,48 +37,53 @@ class ExtensionManifestTest : public testing::Test { return static_cast<DictionaryValue*>(serializer.Deserialize(NULL, error)); } - scoped_refptr<Extension> LoadExtensionWithLocation( - DictionaryValue* value, - Extension::Location location, - std::string* error) { + Extension* LoadExtensionWithLocation(DictionaryValue* value, + Extension::Location location, + std::string* error) { FilePath path; PathService::Get(chrome::DIR_TEST_DATA, &path); path = path.AppendASCII("extensions").AppendASCII("manifest_tests"); - return Extension::Create(path.DirName(), location, *value, false, error); + + scoped_ptr<Extension> extension(new Extension(path.DirName())); + extension->set_location(location); + + if (!extension->InitFromValue(*value, false, error)) + return NULL; + + return extension.release(); } - scoped_refptr<Extension> LoadExtension(const std::string& name, - std::string* error) { + Extension* LoadExtension(const std::string& name, + std::string* error) { return LoadExtensionWithLocation(name, Extension::INTERNAL, error); } - scoped_refptr<Extension> LoadExtension(DictionaryValue* value, - std::string* error) { + Extension* LoadExtension(DictionaryValue* value, + std::string* error) { return LoadExtensionWithLocation(value, Extension::INTERNAL, error); } - scoped_refptr<Extension> LoadExtensionWithLocation( - const std::string& name, - Extension::Location location, - std::string* error) { + Extension* LoadExtensionWithLocation(const std::string& name, + Extension::Location location, + std::string* error) { scoped_ptr<DictionaryValue> value(LoadManifestFile(name, error)); if (!value.get()) return NULL; return LoadExtensionWithLocation(value.get(), location, error); } - scoped_refptr<Extension> LoadAndExpectSuccess(const std::string& name) { + Extension* LoadAndExpectSuccess(const std::string& name) { std::string error; - scoped_refptr<Extension> extension = LoadExtension(name, &error); + Extension* extension = LoadExtension(name, &error); EXPECT_TRUE(extension) << name; EXPECT_EQ("", error) << name; return extension; } - scoped_refptr<Extension> LoadAndExpectSuccess(DictionaryValue* manifest, - const std::string& name) { + Extension* LoadAndExpectSuccess(DictionaryValue* manifest, + const std::string& name) { std::string error; - scoped_refptr<Extension> extension = LoadExtension(manifest, &error); + Extension* extension = LoadExtension(manifest, &error); EXPECT_TRUE(extension) << "Unexpected success for " << name; EXPECT_EQ("", error) << "Unexpected no error for " << name; return extension; @@ -98,7 +103,7 @@ class ExtensionManifestTest : public testing::Test { void LoadAndExpectError(const std::string& name, const std::string& expected_error) { std::string error; - scoped_refptr<Extension> extension(LoadExtension(name, &error)); + scoped_ptr<Extension> extension(LoadExtension(name, &error)); VerifyExpectedError(extension.get(), name, error, expected_error); } @@ -106,7 +111,7 @@ class ExtensionManifestTest : public testing::Test { const std::string& name, const std::string& expected_error) { std::string error; - scoped_refptr<Extension> extension(LoadExtension(manifest, &error)); + scoped_ptr<Extension> extension(LoadExtension(manifest, &error)); VerifyExpectedError(extension.get(), name, error, expected_error); } @@ -114,7 +119,7 @@ class ExtensionManifestTest : public testing::Test { }; TEST_F(ExtensionManifestTest, ValidApp) { - scoped_refptr<Extension> extension(LoadAndExpectSuccess("valid_app.json")); + scoped_ptr<Extension> extension(LoadAndExpectSuccess("valid_app.json")); ASSERT_EQ(2u, extension->web_extent().patterns().size()); EXPECT_EQ("http://www.google.com/mail/*", extension->web_extent().patterns()[0].GetAsString()); @@ -140,7 +145,7 @@ TEST_F(ExtensionManifestTest, AppWebUrls) { ExtensionErrorUtils::FormatErrorMessage( errors::kInvalidWebURL, "0")); - scoped_refptr<Extension> extension( + scoped_ptr<Extension> extension( LoadAndExpectSuccess("web_urls_default.json")); ASSERT_EQ(1u, extension->web_extent().patterns().size()); EXPECT_EQ("*://www.google.com/*", @@ -148,21 +153,21 @@ TEST_F(ExtensionManifestTest, AppWebUrls) { } TEST_F(ExtensionManifestTest, AppLaunchContainer) { - scoped_refptr<Extension> extension; + scoped_ptr<Extension> extension; - extension = LoadAndExpectSuccess("launch_tab.json"); + extension.reset(LoadAndExpectSuccess("launch_tab.json")); EXPECT_EQ(extension_misc::LAUNCH_TAB, extension->launch_container()); - extension = LoadAndExpectSuccess("launch_panel.json"); + extension.reset(LoadAndExpectSuccess("launch_panel.json")); EXPECT_EQ(extension_misc::LAUNCH_PANEL, extension->launch_container()); - extension = LoadAndExpectSuccess("launch_default.json"); + extension.reset(LoadAndExpectSuccess("launch_default.json")); EXPECT_EQ(extension_misc::LAUNCH_TAB, extension->launch_container()); - extension = LoadAndExpectSuccess("launch_width.json"); + extension.reset(LoadAndExpectSuccess("launch_width.json")); EXPECT_EQ(640, extension->launch_width()); - extension = LoadAndExpectSuccess("launch_height.json"); + extension.reset(LoadAndExpectSuccess("launch_height.json")); EXPECT_EQ(480, extension->launch_height()); LoadAndExpectError("launch_window.json", @@ -193,15 +198,15 @@ TEST_F(ExtensionManifestTest, AppLaunchURL) { LoadAndExpectError("launch_url_invalid_type.json", errors::kInvalidLaunchWebURL); - scoped_refptr<Extension> extension; - extension = LoadAndExpectSuccess("launch_local_path.json"); + scoped_ptr<Extension> extension; + extension.reset(LoadAndExpectSuccess("launch_local_path.json")); EXPECT_EQ(extension->url().spec() + "launch.html", extension->GetFullLaunchURL().spec()); LoadAndExpectError("launch_web_url_relative.json", errors::kInvalidLaunchWebURL); - extension = LoadAndExpectSuccess("launch_web_url_absolute.json"); + extension.reset(LoadAndExpectSuccess("launch_web_url_absolute.json")); EXPECT_EQ(GURL("http://www.google.com/launch.html"), extension->GetFullLaunchURL()); } @@ -212,13 +217,13 @@ TEST_F(ExtensionManifestTest, Override) { LoadAndExpectError("override_invalid_page.json", errors::kInvalidChromeURLOverrides); - scoped_refptr<Extension> extension; + scoped_ptr<Extension> extension; - extension = LoadAndExpectSuccess("override_new_tab.json"); + extension.reset(LoadAndExpectSuccess("override_new_tab.json")); EXPECT_EQ(extension->url().spec() + "newtab.html", extension->GetChromeURLOverrides().find("newtab")->second.spec()); - extension = LoadAndExpectSuccess("override_history.json"); + extension.reset(LoadAndExpectSuccess("override_history.json")); EXPECT_EQ(extension->url().spec() + "history.html", extension->GetChromeURLOverrides().find("history")->second.spec()); } @@ -232,11 +237,11 @@ TEST_F(ExtensionManifestTest, ChromeResourcesPermissionValidOnlyForComponents) { LoadAndExpectError("permission_chrome_resources_url.json", errors::kInvalidPermissionScheme); std::string error; - scoped_refptr<Extension> extension; - extension = LoadExtensionWithLocation( + scoped_ptr<Extension> extension; + extension.reset(LoadExtensionWithLocation( "permission_chrome_resources_url.json", Extension::COMPONENT, - &error); + &error)); EXPECT_EQ("", error); } @@ -255,8 +260,8 @@ TEST_F(ExtensionManifestTest, DevToolsExtensions) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableExperimentalExtensionApis); - scoped_refptr<Extension> extension; - extension = LoadAndExpectSuccess("devtools_extension.json"); + scoped_ptr<Extension> extension; + extension.reset(LoadAndExpectSuccess("devtools_extension.json")); EXPECT_EQ(extension->url().spec() + "devtools.html", extension->devtools_url().spec()); *CommandLine::ForCurrentProcess() = old_command_line; @@ -270,10 +275,11 @@ TEST_F(ExtensionManifestTest, DisallowHybridApps) { } TEST_F(ExtensionManifestTest, OptionsPageInApps) { - scoped_refptr<Extension> extension; + scoped_ptr<Extension> extension; // Allow options page with absolute URL in hosed apps. - extension = LoadAndExpectSuccess("hosted_app_absolute_options.json"); + extension.reset( + LoadAndExpectSuccess("hosted_app_absolute_options.json")); EXPECT_STREQ("http", extension->options_url().scheme().c_str()); EXPECT_STREQ("example.com", @@ -309,8 +315,8 @@ TEST_F(ExtensionManifestTest, DisallowExtensionPermissions) { permissions->Append(p); std::string message_name = StringPrintf("permission-%s", name); if (Extension::IsHostedAppPermission(name)) { - scoped_refptr<Extension> extension; - extension = LoadAndExpectSuccess(manifest.get(), message_name); + scoped_ptr<Extension> extension; + extension.reset(LoadAndExpectSuccess(manifest.get(), message_name)); } else { LoadAndExpectError(manifest.get(), message_name, errors::kInvalidPermission); @@ -319,7 +325,7 @@ TEST_F(ExtensionManifestTest, DisallowExtensionPermissions) { } TEST_F(ExtensionManifestTest, NormalizeIconPaths) { - scoped_refptr<Extension> extension( + scoped_ptr<Extension> extension( LoadAndExpectSuccess("normalize_icon_paths.json")); EXPECT_EQ("16.png", extension->icons().Get(16, ExtensionIconSet::MATCH_EXACTLY)); @@ -334,8 +340,7 @@ TEST_F(ExtensionManifestTest, DisallowMultipleUISurfaces) { } TEST_F(ExtensionManifestTest, ParseHomepageURLs) { - scoped_refptr<Extension> extension( - LoadAndExpectSuccess("homepage_valid.json")); + scoped_ptr<Extension> extension(LoadAndExpectSuccess("homepage_valid.json")); LoadAndExpectError("homepage_empty.json", extension_manifest_errors::kInvalidHomepageURL); LoadAndExpectError("homepage_invalid.json", @@ -343,23 +348,22 @@ TEST_F(ExtensionManifestTest, ParseHomepageURLs) { } TEST_F(ExtensionManifestTest, GetHomepageURL) { - scoped_refptr<Extension> extension( - LoadAndExpectSuccess("homepage_valid.json")); + scoped_ptr<Extension> extension(LoadAndExpectSuccess("homepage_valid.json")); EXPECT_EQ(GURL("http://foo.com#bar"), extension->GetHomepageURL()); // The Google Gallery URL ends with the id, which depends on the path, which // can be different in testing, so we just check the part before id. - extension = LoadAndExpectSuccess("homepage_google_hosted.json"); + extension.reset(LoadAndExpectSuccess("homepage_google_hosted.json")); EXPECT_TRUE(StartsWithASCII(extension->GetHomepageURL().spec(), "https://chrome.google.com/extensions/detail/", false)); - extension = LoadAndExpectSuccess("homepage_externally_hosted.json"); + extension.reset(LoadAndExpectSuccess("homepage_externally_hosted.json")); EXPECT_EQ(GURL(), extension->GetHomepageURL()); } TEST_F(ExtensionManifestTest, DefaultPathForExtent) { - scoped_refptr<Extension> extension( + scoped_ptr<Extension> extension( LoadAndExpectSuccess("default_path_for_extent.json")); ASSERT_EQ(1u, extension->web_extent().patterns().size()); diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc index 3bad1dc..d2a7049 100644 --- a/chrome/common/extensions/extension_unittest.cc +++ b/chrome/common/extensions/extension_unittest.cc @@ -77,9 +77,7 @@ TEST(ExtensionTest, InitFromValueInvalid) { #elif defined(OS_POSIX) FilePath path(FILE_PATH_LITERAL("/foo")); #endif - scoped_refptr<Extension> extension_ptr(new Extension(path, - Extension::INVALID)); - Extension& extension = *extension_ptr; + Extension extension(path); int error_code = 0; std::string error; @@ -305,9 +303,7 @@ TEST(ExtensionTest, InitFromValueValid) { #elif defined(OS_POSIX) FilePath path(FILE_PATH_LITERAL("/foo")); #endif - scoped_refptr<Extension> extension_ptr(new Extension(path, - Extension::INVALID)); - Extension& extension = *extension_ptr; + Extension extension(path); std::string error; DictionaryValue input_value; @@ -370,9 +366,7 @@ TEST(ExtensionTest, InitFromValueValidNameInRTL) { #elif defined(OS_POSIX) FilePath path(FILE_PATH_LITERAL("/foo")); #endif - scoped_refptr<Extension> extension_ptr(new Extension(path, - Extension::INVALID)); - Extension& extension = *extension_ptr; + Extension extension(path); std::string error; DictionaryValue input_value; @@ -409,20 +403,18 @@ TEST(ExtensionTest, GetResourceURLAndPath) { #elif defined(OS_POSIX) FilePath path(FILE_PATH_LITERAL("/foo")); #endif + Extension extension(path); DictionaryValue input_value; input_value.SetString(keys::kVersion, "1.0.0.0"); input_value.SetString(keys::kName, "my extension"); - scoped_refptr<Extension> extension(Extension::Create( - path, Extension::INVALID, input_value, false, NULL)); - EXPECT_TRUE(extension.get()); - - EXPECT_EQ(extension->url().spec() + "bar/baz.js", - Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); - EXPECT_EQ(extension->url().spec() + "baz.js", - Extension::GetResourceURL(extension->url(), - "bar/../baz.js").spec()); - EXPECT_EQ(extension->url().spec() + "baz.js", - Extension::GetResourceURL(extension->url(), "../baz.js").spec()); + EXPECT_TRUE(extension.InitFromValue(input_value, false, NULL)); + + EXPECT_EQ(extension.url().spec() + "bar/baz.js", + Extension::GetResourceURL(extension.url(), "bar/baz.js").spec()); + EXPECT_EQ(extension.url().spec() + "baz.js", + Extension::GetResourceURL(extension.url(), "bar/../baz.js").spec()); + EXPECT_EQ(extension.url().spec() + "baz.js", + Extension::GetResourceURL(extension.url(), "../baz.js").spec()); } TEST(ExtensionTest, LoadPageActionHelper) { @@ -431,9 +423,7 @@ TEST(ExtensionTest, LoadPageActionHelper) { #else FilePath path(StringPrintf("/extension")); #endif - scoped_refptr<Extension> extension_ptr(new Extension(path, - Extension::INVALID)); - Extension& extension = *extension_ptr; + Extension extension(path); std::string error_msg; scoped_ptr<ExtensionAction> action; DictionaryValue input; @@ -665,15 +655,14 @@ TEST(ExtensionTest, UpdateUrls) { #else FilePath path(StringPrintf("/extension%" PRIuS, i)); #endif + Extension extension(path); std::string error; input_value.SetString(keys::kVersion, "1.0"); input_value.SetString(keys::kName, "Test"); input_value.SetString(keys::kUpdateURL, url.spec()); - scoped_refptr<Extension> extension(Extension::Create( - path, Extension::INVALID, input_value, false, &error)); - EXPECT_TRUE(extension.get()) << error; + EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); } // Test some invalid update urls @@ -690,14 +679,13 @@ TEST(ExtensionTest, UpdateUrls) { #else FilePath path(StringPrintf("/extension%" PRIuS, i)); #endif + Extension extension(path); std::string error; input_value.SetString(keys::kVersion, "1.0"); input_value.SetString(keys::kName, "Test"); input_value.SetString(keys::kUpdateURL, invalid[i]); - scoped_refptr<Extension> extension(Extension::Create( - path, Extension::INVALID, input_value, false, &error)); - EXPECT_FALSE(extension.get()); + EXPECT_FALSE(extension.InitFromValue(input_value, false, &error)); EXPECT_TRUE(MatchPattern(error, errors::kInvalidUpdateURL)); } } @@ -726,8 +714,8 @@ TEST(ExtensionTest, MimeTypeSniffing) { EXPECT_EQ("application/octet-stream", result); } -static scoped_refptr<Extension> LoadManifest(const std::string& dir, - const std::string& test_file) { +static Extension* LoadManifest(const std::string& dir, + const std::string& test_file) { FilePath path; PathService::Get(chrome::DIR_TEST_DATA, &path); path = path.AppendASCII("extensions") @@ -742,70 +730,74 @@ static scoped_refptr<Extension> LoadManifest(const std::string& dir, return NULL; } - scoped_refptr<Extension> extension = Extension::Create( - path.DirName(), Extension::INVALID, - *static_cast<DictionaryValue*>(result.get()), false, &error); - EXPECT_TRUE(extension) << error; - return extension; + scoped_ptr<Extension> extension(new Extension(path.DirName())); + EXPECT_TRUE(extension->InitFromValue( + *static_cast<DictionaryValue*>(result.get()), false, &error)) << error; + + return extension.release(); } TEST(ExtensionTest, EffectiveHostPermissions) { - scoped_refptr<Extension> extension; + scoped_ptr<Extension> extension; ExtensionExtent hosts; - extension = LoadManifest("effective_host_permissions", "empty.json"); + extension.reset(LoadManifest("effective_host_permissions", "empty.json")); EXPECT_EQ(0u, extension->GetEffectiveHostPermissions().patterns().size()); EXPECT_FALSE(hosts.ContainsURL(GURL("http://www.google.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", "one_host.json"); + extension.reset(LoadManifest("effective_host_permissions", "one_host.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com"))); EXPECT_FALSE(hosts.ContainsURL(GURL("https://www.google.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", - "one_host_wildcard.json"); + extension.reset(LoadManifest("effective_host_permissions", + "one_host_wildcard.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://foo.google.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", "two_hosts.json"); + extension.reset(LoadManifest("effective_host_permissions", + "two_hosts.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.reddit.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", - "https_not_considered.json"); + extension.reset(LoadManifest("effective_host_permissions", + "https_not_considered.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com"))); EXPECT_TRUE(hosts.ContainsURL(GURL("https://google.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", - "two_content_scripts.json"); + extension.reset(LoadManifest("effective_host_permissions", + "two_content_scripts.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.reddit.com"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://news.ycombinator.com"))); EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", "all_hosts.json"); + extension.reset(LoadManifest("effective_host_permissions", + "all_hosts.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://test/"))); EXPECT_FALSE(hosts.ContainsURL(GURL("https://test/"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com"))); EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", "all_hosts2.json"); + extension.reset(LoadManifest("effective_host_permissions", + "all_hosts2.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_TRUE(hosts.ContainsURL(GURL("http://test/"))); EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com"))); EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts()); - extension = LoadManifest("effective_host_permissions", "all_hosts3.json"); + extension.reset(LoadManifest("effective_host_permissions", + "all_hosts3.json")); hosts = extension->GetEffectiveHostPermissions(); EXPECT_FALSE(hosts.ContainsURL(GURL("http://test/"))); EXPECT_TRUE(hosts.ContainsURL(GURL("https://test/"))); @@ -842,10 +834,10 @@ TEST(ExtensionTest, IsPrivilegeIncrease) { }; for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { - scoped_refptr<Extension> old_extension( + scoped_ptr<Extension> old_extension( LoadManifest("allow_silent_upgrade", std::string(kTests[i].base_name) + "_old.json")); - scoped_refptr<Extension> new_extension( + scoped_ptr<Extension> new_extension( LoadManifest("allow_silent_upgrade", std::string(kTests[i].base_name) + "_new.json")); @@ -920,12 +912,11 @@ TEST(ExtensionTest, ImageCaching) { // Initialize the Extension. std::string errors; + scoped_ptr<Extension> extension(new Extension(path)); DictionaryValue values; values.SetString(keys::kName, "test"); values.SetString(keys::kVersion, "0.1"); - scoped_refptr<Extension> extension(Extension::Create( - path, Extension::INVALID, values, false, &errors)); - ASSERT_TRUE(extension.get()); + ASSERT_TRUE(extension->InitFromValue(values, false, &errors)); // Create an ExtensionResource pointing at an icon. FilePath icon_relative_path(FILE_PATH_LITERAL("icon3.png")); @@ -1006,11 +997,10 @@ TEST(ExtensionTest, OldUnlimitedStoragePermission) { // Initialize the extension and make sure the permission for unlimited storage // is present. + Extension extension(extension_path); std::string errors; - scoped_refptr<Extension> extension(Extension::Create( - extension_path, Extension::INVALID, dictionary, false, &errors)); - EXPECT_TRUE(extension.get()); - EXPECT_TRUE(extension->HasApiPermission( + EXPECT_TRUE(extension.InitFromValue(dictionary, false, &errors)); + EXPECT_TRUE(extension.HasApiPermission( Extension::kUnlimitedStoragePermission)); } @@ -1046,8 +1036,8 @@ TEST(ExtensionTest, ApiPermissions) { { "tabs.getSelected", false}, }; - scoped_refptr<Extension> extension; - extension = LoadManifest("empty_manifest", "empty.json"); + scoped_ptr<Extension> extension; + extension.reset(LoadManifest("empty_manifest", "empty.json")); for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { EXPECT_EQ(kTests[i].expect_success, diff --git a/chrome/common/extensions/extension_unpacker.cc b/chrome/common/extensions/extension_unpacker.cc index 3f718c9..d431bcb 100644 --- a/chrome/common/extensions/extension_unpacker.cc +++ b/chrome/common/extensions/extension_unpacker.cc @@ -175,21 +175,20 @@ bool ExtensionUnpacker::Run() { // InitFromValue is allowed to generate a temporary id for the extension. // ANY CODE THAT FOLLOWS SHOULD NOT DEPEND ON THE CORRECT ID OF THIS // EXTENSION. + Extension extension(temp_install_dir_); std::string error; - scoped_refptr<Extension> extension(Extension::Create( - temp_install_dir_, Extension::INVALID, *parsed_manifest_, false, &error)); - if (!extension.get()) { + if (!extension.InitFromValue(*parsed_manifest_, false, &error)) { SetError(error); return false; } - if (!extension_file_util::ValidateExtension(extension.get(), &error)) { + if (!extension_file_util::ValidateExtension(&extension, &error)) { SetError(error); return false; } // Decode any images that the browser needs to display. - std::set<FilePath> image_paths = extension->GetBrowserImages(); + std::set<FilePath> image_paths = extension.GetBrowserImages(); for (std::set<FilePath>::iterator it = image_paths.begin(); it != image_paths.end(); ++it) { if (!AddDecodedImage(*it)) @@ -198,8 +197,8 @@ bool ExtensionUnpacker::Run() { // Parse all message catalogs (if any). parsed_catalogs_.reset(new DictionaryValue); - if (!extension->default_locale().empty()) { - if (!ReadAllMessageCatalogs(extension->default_locale())) + if (!extension.default_locale().empty()) { + if (!ReadAllMessageCatalogs(extension.default_locale())) return false; // Error was already reported. } |