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