blob: 78b5d61e4f96b5ad49afbeabda5054c876560a16 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include "base/command_line.h"
#include "base/values.h"
#include "chrome/common/extensions/features/feature_channel.h"
#include "chrome/common/extensions/manifest_tests/chrome_manifest_test.h"
#include "components/version_info/version_info.h"
#include "extensions/common/constants.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
namespace errors = manifest_errors;
namespace keys = manifest_keys;
class ExtensionManifestBackgroundTest : public ChromeManifestTest {
};
TEST_F(ExtensionManifestBackgroundTest, BackgroundPermission) {
LoadAndExpectError("background_permission.json",
errors::kBackgroundPermissionNeeded);
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundScripts) {
std::string error;
std::unique_ptr<base::DictionaryValue> manifest =
LoadManifest("background_scripts.json", &error);
ASSERT_TRUE(manifest.get());
scoped_refptr<Extension> extension(
LoadAndExpectSuccess(ManifestData(manifest.get(), "")));
ASSERT_TRUE(extension.get());
const std::vector<std::string>& background_scripts =
BackgroundInfo::GetBackgroundScripts(extension.get());
ASSERT_EQ(2u, background_scripts.size());
EXPECT_EQ("foo.js", background_scripts[0u]);
EXPECT_EQ("bar/baz.js", background_scripts[1u]);
EXPECT_TRUE(BackgroundInfo::HasBackgroundPage(extension.get()));
EXPECT_EQ(
std::string("/") + kGeneratedBackgroundPageFilename,
BackgroundInfo::GetBackgroundURL(extension.get()).path());
manifest->SetString("background_page", "monkey.html");
LoadAndExpectError(ManifestData(manifest.get(), ""),
errors::kInvalidBackgroundCombination);
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundPage) {
scoped_refptr<Extension> extension(
LoadAndExpectSuccess("background_page.json"));
ASSERT_TRUE(extension.get());
EXPECT_EQ("/foo.html",
BackgroundInfo::GetBackgroundURL(extension.get()).path());
EXPECT_TRUE(BackgroundInfo::AllowJSAccess(extension.get()));
std::string error;
std::unique_ptr<base::DictionaryValue> manifest(
LoadManifest("background_page_legacy.json", &error));
ASSERT_TRUE(manifest.get());
extension = LoadAndExpectSuccess(ManifestData(manifest.get(), ""));
ASSERT_TRUE(extension.get());
EXPECT_EQ("/foo.html",
BackgroundInfo::GetBackgroundURL(extension.get()).path());
manifest->SetInteger(keys::kManifestVersion, 2);
LoadAndExpectWarning(
ManifestData(manifest.get(), ""),
"'background_page' requires manifest version of 1 or lower.");
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundAllowNoJsAccess) {
scoped_refptr<Extension> extension;
extension = LoadAndExpectSuccess("background_allow_no_js_access.json");
ASSERT_TRUE(extension.get());
EXPECT_FALSE(BackgroundInfo::AllowJSAccess(extension.get()));
extension = LoadAndExpectSuccess("background_allow_no_js_access2.json");
ASSERT_TRUE(extension.get());
EXPECT_FALSE(BackgroundInfo::AllowJSAccess(extension.get()));
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundPageWebRequest) {
ScopedCurrentChannel current_channel(version_info::Channel::DEV);
std::string error;
std::unique_ptr<base::DictionaryValue> manifest(
LoadManifest("background_page.json", &error));
ASSERT_TRUE(manifest.get());
manifest->SetBoolean(keys::kBackgroundPersistent, false);
manifest->SetInteger(keys::kManifestVersion, 2);
scoped_refptr<Extension> extension(
LoadAndExpectSuccess(ManifestData(manifest.get(), "")));
ASSERT_TRUE(extension.get());
EXPECT_TRUE(BackgroundInfo::HasLazyBackgroundPage(extension.get()));
base::ListValue* permissions = new base::ListValue();
permissions->AppendString("webRequest");
manifest->Set(keys::kPermissions, permissions);
LoadAndExpectError(ManifestData(manifest.get(), ""),
errors::kWebRequestConflictsWithLazyBackground);
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundPagePersistentPlatformApp) {
scoped_refptr<Extension> extension =
LoadAndExpectSuccess("background_page_persistent_app.json");
ASSERT_TRUE(extension->is_platform_app());
ASSERT_TRUE(BackgroundInfo::HasBackgroundPage(extension.get()));
EXPECT_FALSE(BackgroundInfo::HasPersistentBackgroundPage(extension.get()));
std::string error;
std::vector<InstallWarning> warnings;
ManifestHandler::ValidateExtension(extension.get(), &error, &warnings);
// Persistent background pages are not supported for packaged apps.
// The persistent flag is ignored and a warining is printed.
EXPECT_EQ(1U, warnings.size());
EXPECT_EQ(errors::kInvalidBackgroundPersistentInPlatformApp,
warnings[0].message);
}
TEST_F(ExtensionManifestBackgroundTest, BackgroundPagePersistentInvalidKey) {
scoped_refptr<Extension> extension =
LoadAndExpectSuccess("background_page_invalid_persistent_key_app.json");
ASSERT_TRUE(extension->is_platform_app());
ASSERT_TRUE(BackgroundInfo::HasBackgroundPage(extension.get()));
EXPECT_FALSE(BackgroundInfo::HasPersistentBackgroundPage(extension.get()));
std::string error;
std::vector<InstallWarning> warnings;
ManifestHandler::ValidateExtension(extension.get(), &error, &warnings);
// The key 'background.persistent' is not supported for packaged apps.
EXPECT_EQ(1U, warnings.size());
EXPECT_EQ(errors::kBackgroundPersistentInvalidForPlatformApps,
warnings[0].message);
}
} // namespace extensions