blob: 36e02663d88f311b1ca930fc99e29011ae201534 [file] [log] [blame]
// Copyright (c) 2010 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 "base/file_path.h"
#include "base/file_util.h"
#include "base/path_service.h"
#include "base/scoped_ptr.h"
#include "base/string_util.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_error_utils.h"
#include "chrome/common/json_value_serializer.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace errors = extension_manifest_errors;
class ManifestTest : public testing::Test {
public:
ManifestTest() : enable_apps_(true) {}
protected:
Extension* LoadExtension(const std::string& name,
std::string* error) {
return LoadExtensionWithLocation(name, Extension::INTERNAL, error);
}
Extension* LoadExtensionWithLocation(const std::string& name,
Extension::Location location,
std::string* error) {
FilePath path;
PathService::Get(chrome::DIR_TEST_DATA, &path);
path = path.AppendASCII("extensions")
.AppendASCII("manifest_tests")
.AppendASCII(name.c_str());
EXPECT_TRUE(file_util::PathExists(path));
JSONFileValueSerializer serializer(path);
scoped_ptr<DictionaryValue> value(
static_cast<DictionaryValue*>(serializer.Deserialize(NULL, error)));
if (!value.get())
return NULL;
scoped_ptr<Extension> extension(new Extension(path.DirName()));
extension->set_location(location);
if (enable_apps_)
extension->set_apps_enabled(true);
if (!extension->InitFromValue(*value, false, error))
return NULL;
return extension.release();
}
Extension* LoadAndExpectSuccess(const std::string& name) {
std::string error;
Extension* extension = LoadExtension(name, &error);
EXPECT_TRUE(extension);
EXPECT_EQ("", error);
return extension;
}
void LoadAndExpectError(const std::string& name,
const std::string& expected_error) {
std::string error;
scoped_ptr<Extension> extension(LoadExtension(name, &error));
EXPECT_FALSE(extension.get()) <<
"Expected failure loading extension '" << name <<
"', but didn't get one.";
EXPECT_TRUE(MatchPatternASCII(error, expected_error)) << name <<
" expected '" << expected_error << "' but got '" << error << "'";
}
bool enable_apps_;
};
TEST_F(ManifestTest, AppsDisabledByDefault) {
enable_apps_ = false;
LoadAndExpectError("web_content_disabled.json", errors::kAppsNotEnabled);
LoadAndExpectError("launch_local_path.json", errors::kAppsNotEnabled);
}
TEST_F(ManifestTest, ValidApp) {
scoped_ptr<Extension> extension(LoadAndExpectSuccess("valid_app.json"));
EXPECT_TRUE(extension->web_content_enabled());
EXPECT_EQ(GURL("http://www.google.com/"), extension->web_extent().origin());
EXPECT_EQ(2u, extension->web_extent().paths().size());
EXPECT_EQ("mail/", extension->web_extent().paths()[0]);
EXPECT_EQ("foobar/", extension->web_extent().paths()[1]);
EXPECT_EQ(Extension::LAUNCH_WINDOW, extension->launch_container());
EXPECT_EQ(false, extension->launch_fullscreen());
EXPECT_EQ("mail/", extension->launch_web_url());
}
TEST_F(ManifestTest, AppWebContentEnabled) {
LoadAndExpectError("web_content_enabled_invalid.json",
errors::kInvalidWebContentEnabled);
LoadAndExpectError("web_content_disabled.json",
errors::kWebContentMustBeEnabled);
LoadAndExpectError("web_content_not_enabled.json",
errors::kWebContentMustBeEnabled);
}
TEST_F(ManifestTest, AppWebOrigin) {
LoadAndExpectError("web_origin_wrong_type.json",
errors::kInvalidWebOrigin);
LoadAndExpectError("web_origin_invalid_1.json",
errors::kInvalidWebOrigin);
LoadAndExpectError("web_origin_invalid_2.json",
errors::kInvalidWebOrigin);
LoadAndExpectError("web_origin_invalid_3.json",
errors::kInvalidWebOrigin);
}
TEST_F(ManifestTest, AppWebPaths) {
LoadAndExpectError("web_paths_wrong_type.json",
errors::kInvalidWebPaths);
LoadAndExpectError("web_paths_invalid_path_1.json",
ExtensionErrorUtils::FormatErrorMessage(
errors::kInvalidWebPath, "0"));
LoadAndExpectError("web_paths_invalid_path_2.json",
ExtensionErrorUtils::FormatErrorMessage(
errors::kInvalidWebPath, "0"));
}
TEST_F(ManifestTest, AppLaunchContainer) {
scoped_ptr<Extension> extension;
extension.reset(LoadAndExpectSuccess("launch_tab.json"));
EXPECT_EQ(Extension::LAUNCH_TAB, extension->launch_container());
extension.reset(LoadAndExpectSuccess("launch_window.json"));
EXPECT_EQ(Extension::LAUNCH_WINDOW, extension->launch_container());
extension.reset(LoadAndExpectSuccess("launch_panel.json"));
EXPECT_EQ(Extension::LAUNCH_PANEL, extension->launch_container());
extension.reset(LoadAndExpectSuccess("launch_default.json"));
EXPECT_EQ(Extension::LAUNCH_TAB, extension->launch_container());
extension.reset(LoadAndExpectSuccess("launch_fullscreen.json"));
EXPECT_EQ(true, extension->launch_fullscreen());
LoadAndExpectError("launch_container_invalid_type.json",
errors::kInvalidLaunchContainer);
LoadAndExpectError("launch_container_invalid_value.json",
errors::kInvalidLaunchContainer);
LoadAndExpectError("launch_container_without_launch_url.json",
errors::kLaunchContainerWithoutURL);
LoadAndExpectError("launch_fullscreen_invalid.json",
errors::kInvalidLaunchFullscreen);
}
TEST_F(ManifestTest, AppLaunchURL) {
LoadAndExpectError("launch_path_and_url.json",
errors::kLaunchPathAndURLAreExclusive);
LoadAndExpectError("launch_path_invalid_type.json",
errors::kInvalidLaunchLocalPath);
LoadAndExpectError("launch_path_invalid_value.json",
errors::kInvalidLaunchLocalPath);
LoadAndExpectError("launch_url_invalid_type.json",
errors::kInvalidLaunchWebURL);
scoped_ptr<Extension> extension;
extension.reset(LoadAndExpectSuccess("launch_local_path.json"));
EXPECT_EQ(extension->url().spec() + "launch.html",
extension->GetFullLaunchURL().spec());
extension.reset(LoadAndExpectSuccess("launch_web_url_relative.json"));
EXPECT_EQ(GURL("http://www.google.com/launch.html"),
extension->GetFullLaunchURL());
extension.reset(LoadAndExpectSuccess("launch_web_url_absolute.json"));
EXPECT_EQ(GURL("http://www.google.com/launch.html"),
extension->GetFullLaunchURL());
}
TEST_F(ManifestTest, Override) {
LoadAndExpectError("override_newtab_and_history.json",
errors::kMultipleOverrides);
LoadAndExpectError("override_invalid_page.json",
errors::kInvalidChromeURLOverrides);
scoped_ptr<Extension> extension;
extension.reset(LoadAndExpectSuccess("override_new_tab.json"));
EXPECT_EQ(extension->url().spec() + "newtab.html",
extension->GetChromeURLOverrides().find("newtab")->second.spec());
extension.reset(LoadAndExpectSuccess("override_history.json"));
EXPECT_EQ(extension->url().spec() + "history.html",
extension->GetChromeURLOverrides().find("history")->second.spec());
}
TEST_F(ManifestTest, ChromeURLPermissionInvalid) {
LoadAndExpectError("permission_chrome_url_invalid.json",
errors::kInvalidPermissionScheme);
}
TEST_F(ManifestTest, ChromeResourcesPermissionValidOnlyForComponents) {
LoadAndExpectError("permission_chrome_resources_url.json",
errors::kInvalidPermissionScheme);
std::string error;
scoped_ptr<Extension> extension;
extension.reset(LoadExtensionWithLocation(
"permission_chrome_resources_url.json",
Extension::COMPONENT,
&error));
EXPECT_EQ("", error);
}
TEST_F(ManifestTest, ChromeURLContentScriptInvalid) {
LoadAndExpectError("content_script_chrome_url_invalid.json",
errors::kInvalidMatch);
}