| // 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 |