blob: f34ac12ac98d40b7a037d44a8e7c9882bcc20a04 [file] [log] [blame]
// Copyright 2017 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 <utility>
#include "base/test/values_test_util.h"
#include "components/version_info/version_info.h"
#include "extensions/common/features/feature_channel.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/action_handlers_handler.h"
#include "extensions/common/manifest_test.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
namespace app_runtime = api::app_runtime;
namespace {
class ActionHandlersManifestTest : public ManifestTest {
protected:
ManifestData CreateManifest(const std::string& action_handlers) {
std::unique_ptr<base::DictionaryValue> manifest =
base::DictionaryValue::From(base::test::ParseJson(R"json({
"name": "test",
"version": "1",
"app": {
"background": {
"scripts": ["background.js"]
}
},
"manifest_version": 2,
"action_handlers": )json" +
action_handlers +
"}"));
EXPECT_TRUE(manifest);
return ManifestData(std::move(manifest), "test");
}
// Returns all action handlers associated with |extension|.
std::set<app_runtime::ActionType> GetActionHandlers(
const Extension* extension) {
ActionHandlersInfo* info = static_cast<ActionHandlersInfo*>(
extension->GetManifestData(manifest_keys::kActionHandlers));
return info ? info->action_handlers : std::set<app_runtime::ActionType>();
}
// Returns all action handlers associated with |extension|.
std::set<app_runtime::ActionType> GetLockScreenActionHandlers(
const Extension* extension) {
ActionHandlersInfo* info = static_cast<ActionHandlersInfo*>(
extension->GetManifestData(manifest_keys::kActionHandlers));
return info ? info->lock_screen_action_handlers
: std::set<app_runtime::ActionType>();
}
};
} // namespace
TEST_F(ActionHandlersManifestTest, InvalidType) {
LoadAndExpectError(CreateManifest("32"),
manifest_errors::kInvalidActionHandlersType);
LoadAndExpectError(CreateManifest("[true]"),
manifest_errors::kInvalidActionHandlersType);
LoadAndExpectError(CreateManifest(R"(["invalid_handler"])"),
manifest_errors::kInvalidActionHandlersActionType);
LoadAndExpectError(CreateManifest(R"(["invalid_handler"])"),
manifest_errors::kInvalidActionHandlersActionType);
LoadAndExpectError(CreateManifest("[{}]"),
manifest_errors::kInvalidActionHandlerDictionary);
LoadAndExpectError(CreateManifest(R"([{"enabled_on_lock_screen": false}])"),
manifest_errors::kInvalidActionHandlerDictionary);
LoadAndExpectError(CreateManifest(R"([{"action": "invalid_handler"}])"),
manifest_errors::kInvalidActionHandlersActionType);
}
TEST_F(ActionHandlersManifestTest, VerifyParse) {
scoped_refptr<Extension> none = LoadAndExpectSuccess(CreateManifest("[]"));
EXPECT_TRUE(GetActionHandlers(none.get()).empty());
EXPECT_FALSE(ActionHandlersInfo::HasActionHandler(
none.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
none.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
scoped_refptr<Extension> new_note =
LoadAndExpectSuccess(CreateManifest("[\"new_note\"]"));
EXPECT_EQ(
std::set<app_runtime::ActionType>{app_runtime::ACTION_TYPE_NEW_NOTE},
GetActionHandlers(new_note.get()));
EXPECT_TRUE(GetLockScreenActionHandlers(new_note.get()).empty());
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
new_note.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
new_note.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
}
TEST_F(ActionHandlersManifestTest, ParseDictionaryActionValues) {
scoped_refptr<Extension> no_enabled_on_lock_screen_key =
LoadAndExpectSuccess(CreateManifest(R"([{"action": "new_note"}])"));
EXPECT_EQ(
std::set<app_runtime::ActionType>{app_runtime::ACTION_TYPE_NEW_NOTE},
GetActionHandlers(no_enabled_on_lock_screen_key.get()));
EXPECT_TRUE(
GetLockScreenActionHandlers(no_enabled_on_lock_screen_key.get()).empty());
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
no_enabled_on_lock_screen_key.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
no_enabled_on_lock_screen_key.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
scoped_refptr<Extension> enabled_on_lock_screen_false =
LoadAndExpectSuccess(CreateManifest(
R"([{"action": "new_note", "enabled_on_lock_screen": false}])"));
EXPECT_EQ(
std::set<app_runtime::ActionType>{app_runtime::ACTION_TYPE_NEW_NOTE},
GetActionHandlers(enabled_on_lock_screen_false.get()));
EXPECT_TRUE(
GetLockScreenActionHandlers(enabled_on_lock_screen_false.get()).empty());
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
enabled_on_lock_screen_false.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
enabled_on_lock_screen_false.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
scoped_refptr<Extension> enabled_on_lock_screen_true =
LoadAndExpectSuccess(CreateManifest(
R"([{"action": "new_note", "enabled_on_lock_screen": true}])"));
EXPECT_EQ(
std::set<app_runtime::ActionType>{app_runtime::ACTION_TYPE_NEW_NOTE},
GetActionHandlers(enabled_on_lock_screen_true.get()));
EXPECT_EQ(
std::set<app_runtime::ActionType>{app_runtime::ACTION_TYPE_NEW_NOTE},
GetLockScreenActionHandlers(enabled_on_lock_screen_true.get()));
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
enabled_on_lock_screen_true.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
EXPECT_TRUE(ActionHandlersInfo::HasLockScreenActionHandler(
enabled_on_lock_screen_true.get(), app_runtime::ACTION_TYPE_NEW_NOTE));
}
TEST_F(ActionHandlersManifestTest, DuplicateHandlers) {
LoadAndExpectError(CreateManifest(R"(["new_note", {"action": "new_note"}])"),
manifest_errors::kDuplicateActionHandlerFound);
LoadAndExpectError(CreateManifest(
R"(["new_note", {
"action": "new_note",
"enabled_on_lock_screen": true
}])"),
manifest_errors::kDuplicateActionHandlerFound);
LoadAndExpectError(CreateManifest(
R"(["new_note", {
"action": "new_note",
"enabled_on_lock_screen": false
}])"),
manifest_errors::kDuplicateActionHandlerFound);
LoadAndExpectError(CreateManifest(
R"([{
"action": "new_note"
}, {
"action": "new_note",
"enabled_on_lock_screen": false
}])"),
manifest_errors::kDuplicateActionHandlerFound);
LoadAndExpectError(CreateManifest(
R"([{
"action": "new_note",
"enabled_on_lock_screen": true
}, {
"action": "new_note",
"enabled_on_lock_screen": false
}])"),
manifest_errors::kDuplicateActionHandlerFound);
}
} // namespace extensions