blob: c31bd0e619d6f802acb602b5172bf5f233d93f5a [file] [log] [blame]
// 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 "build/android_buildflags.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<const Extension> 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<const Extension> 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());
}
// TODO(https://crbug.com/356905053):Strict site isolation is not enabled on
// Android, so this test is disabled on desktop android.
#if BUILDFLAG(IS_DESKTOP_ANDROID)
#define MAYBE_ExtensionIdForSiteInstance DISABLED_ExtensionIdForSiteInstance
#else
#define MAYBE_ExtensionIdForSiteInstance ExtensionIdForSiteInstance
#endif
TEST(ExtensionUtilTest, MAYBE_ExtensionIdForSiteInstance) {
content::BrowserTaskEnvironment test_environment;
content::TestBrowserContext test_context;
// Extension.
const ExtensionId kExtensionId1(32, 'a');
scoped_refptr<content::SiteInstance> 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<content::SiteInstance> 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<content::SiteInstance> https_site_instance =
content::SiteInstance::CreateForURL(&test_context,
GURL("https://example.com"));
EXPECT_EQ("", util::GetExtensionIdForSiteInstance(*https_site_instance));
}
} // namespace extensions