1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/api/declarative_content/content_action.h" 6 7#include "base/test/values_test_util.h" 8#include "chrome/browser/extensions/extension_action.h" 9#include "chrome/browser/extensions/extension_action_manager.h" 10#include "chrome/browser/extensions/extension_tab_util.h" 11#include "chrome/browser/extensions/test_extension_environment.h" 12#include "chrome/test/base/testing_profile.h" 13#include "content/public/browser/web_contents.h" 14#include "extensions/common/extension_builder.h" 15#include "testing/gmock/include/gmock/gmock.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18namespace extensions { 19namespace { 20 21using base::test::ParseJson; 22using testing::HasSubstr; 23 24TEST(DeclarativeContentActionTest, InvalidCreation) { 25 TestExtensionEnvironment env; 26 std::string error; 27 bool bad_message = false; 28 scoped_refptr<const ContentAction> result; 29 30 // Test wrong data type passed. 31 error.clear(); 32 result = ContentAction::Create(NULL, *ParseJson("[]"), &error, &bad_message); 33 EXPECT_TRUE(bad_message); 34 EXPECT_EQ("", error); 35 EXPECT_FALSE(result.get()); 36 37 // Test missing instanceType element. 38 error.clear(); 39 result = ContentAction::Create(NULL, *ParseJson("{}"), &error, &bad_message); 40 EXPECT_TRUE(bad_message); 41 EXPECT_EQ("", error); 42 EXPECT_FALSE(result.get()); 43 44 // Test wrong instanceType element. 45 error.clear(); 46 result = ContentAction::Create(NULL, *ParseJson( 47 "{\n" 48 " \"instanceType\": \"declarativeContent.UnknownType\",\n" 49 "}"), 50 &error, &bad_message); 51 EXPECT_THAT(error, HasSubstr("invalid instanceType")); 52 EXPECT_FALSE(result.get()); 53} 54 55TEST(DeclarativeContentActionTest, ShowPageActionWithoutPageAction) { 56 TestExtensionEnvironment env; 57 58 const Extension* extension = env.MakeExtension(base::DictionaryValue()); 59 std::string error; 60 bool bad_message = false; 61 scoped_refptr<const ContentAction> result = ContentAction::Create( 62 extension, 63 *ParseJson( 64 "{\n" 65 " \"instanceType\": \"declarativeContent.ShowPageAction\",\n" 66 "}"), 67 &error, 68 &bad_message); 69 EXPECT_THAT(error, testing::HasSubstr("without a page action")); 70 EXPECT_FALSE(bad_message); 71 ASSERT_FALSE(result.get()); 72} 73 74TEST(DeclarativeContentActionTest, ShowPageAction) { 75 TestExtensionEnvironment env; 76 77 const Extension* extension = env.MakeExtension( 78 *ParseJson("{\"page_action\": { \"default_title\": \"Extension\" } }")); 79 std::string error; 80 bool bad_message = false; 81 scoped_refptr<const ContentAction> result = ContentAction::Create( 82 extension, 83 *ParseJson( 84 "{\n" 85 " \"instanceType\": \"declarativeContent.ShowPageAction\",\n" 86 "}"), 87 &error, 88 &bad_message); 89 EXPECT_EQ("", error); 90 EXPECT_FALSE(bad_message); 91 ASSERT_TRUE(result.get()); 92 EXPECT_EQ(ContentAction::ACTION_SHOW_PAGE_ACTION, result->GetType()); 93 94 ExtensionAction* page_action = 95 ExtensionActionManager::Get(env.profile())->GetPageAction(*extension); 96 scoped_ptr<content::WebContents> contents = env.MakeTab(); 97 const int tab_id = ExtensionTabUtil::GetTabId(contents.get()); 98 EXPECT_FALSE(page_action->GetIsVisible(tab_id)); 99 ContentAction::ApplyInfo apply_info = { 100 env.profile(), contents.get() 101 }; 102 result->Apply(extension->id(), base::Time(), &apply_info); 103 EXPECT_TRUE(page_action->GetIsVisible(tab_id)); 104 result->Apply(extension->id(), base::Time(), &apply_info); 105 EXPECT_TRUE(page_action->GetIsVisible(tab_id)); 106 result->Revert(extension->id(), base::Time(), &apply_info); 107 EXPECT_TRUE(page_action->GetIsVisible(tab_id)); 108 result->Revert(extension->id(), base::Time(), &apply_info); 109 EXPECT_FALSE(page_action->GetIsVisible(tab_id)); 110} 111 112} // namespace 113} // namespace extensions 114