// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "extensions/browser/extension_util.h" #include "base/memory/ref_counted.h" #include "base/path_service.h" #include "base/strings/strcat.h" #include "content/public/browser/site_instance.h" #include "content/public/common/url_constants.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_content_client_initializer.h" #include "extensions/common/extension_builder.h" #include "extensions/common/extension_paths.h" #include "extensions/common/extension_set.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/url_constants.h" namespace extensions { namespace { // Returns a barebones test Extension object with the given name. static scoped_refptr CreateExtension(const std::string& name) { base::FilePath path; base::PathService::Get(DIR_TEST_DATA, &path); return ExtensionBuilder(name).SetPath(path.AppendASCII(name)).Build(); } } // namespace // Tests that extension URLs are properly mapped to local file paths. TEST(ExtensionUtilTest, MapUrlToLocalFilePath) { scoped_refptr app(CreateExtension("platform_app")); ExtensionSet extensions; extensions.Insert(app); // Non-extension URLs don't map to anything. base::FilePath non_extension_path; GURL non_extension_url("http://not-an-extension.com/"); EXPECT_FALSE(util::MapUrlToLocalFilePath(&extensions, non_extension_url, false, &non_extension_path)); EXPECT_TRUE(non_extension_path.empty()); // Valid resources return a valid path. base::FilePath valid_path; GURL valid_url = app->GetResourceURL("manifest.json"); EXPECT_TRUE(util::MapUrlToLocalFilePath( &extensions, valid_url, true /* use_blocking_api */, &valid_path)); EXPECT_FALSE(valid_path.empty()); // A file must exist to be mapped to a path using the blocking API. base::FilePath does_not_exist_path; GURL does_not_exist_url = app->GetResourceURL("does-not-exist.html"); EXPECT_FALSE(util::MapUrlToLocalFilePath(&extensions, does_not_exist_url, true /* use_blocking_api */, &does_not_exist_path)); EXPECT_TRUE(does_not_exist_path.empty()); // A file does not need to exist to be mapped to a path with the non-blocking // API. This avoids hitting the disk to see if it exists. EXPECT_TRUE(util::MapUrlToLocalFilePath(&extensions, does_not_exist_url, false /* use_blocking_api */, &does_not_exist_path)); EXPECT_FALSE(does_not_exist_path.empty()); } TEST(ExtensionUtilTest, ExtensionIdForSiteInstance) { content::BrowserTaskEnvironment test_environment; content::TestBrowserContext test_context; // Extension. const ExtensionId kExtensionId1(32, 'a'); scoped_refptr extension_site_instance = content::SiteInstance::CreateForURL( &test_context, Extension::GetBaseURLFromExtensionId(kExtensionId1)); EXPECT_EQ(kExtensionId1, util::GetExtensionIdForSiteInstance(*extension_site_instance)); // GuestView. const ExtensionId kExtensionId2(32, 'b'); scoped_refptr guest_site_instance = content::SiteInstance::CreateForGuest( &test_context, content::StoragePartitionConfig::Create(&test_context, kExtensionId2, "fake_storage_partition_id", true /* in_memory */)); EXPECT_EQ(kExtensionId2, util::GetExtensionIdForSiteInstance(*guest_site_instance)); // Http. scoped_refptr https_site_instance = content::SiteInstance::CreateForURL(&test_context, GURL("https://example.com")); EXPECT_EQ("", util::GetExtensionIdForSiteInstance(*https_site_instance)); } } // namespace extensions