1// Copyright 2014 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/ui/toolbar/origin_chip_info.h"
6
7#include "base/command_line.h"
8#include "base/files/file_path.h"
9#include "base/strings/stringprintf.h"
10#include "base/strings/utf_string_conversions.h"
11#include "chrome/browser/extensions/extension_service.h"
12#include "chrome/browser/extensions/test_extension_system.h"
13#include "chrome/browser/ui/toolbar/test_toolbar_model.h"
14#include "chrome/test/base/chrome_render_view_host_test_harness.h"
15#include "chrome/test/base/testing_profile.h"
16#include "content/public/test/test_browser_thread_bundle.h"
17#include "extensions/common/extension_builder.h"
18#include "grit/chromium_strings.h"
19#include "grit/generated_resources.h"
20#include "grit/theme_resources.h"
21#include "ui/base/l10n/l10n_util.h"
22
23#if defined(OS_CHROMEOS)
24#include "chrome/browser/chromeos/login/users/user_manager.h"
25#include "chrome/browser/chromeos/settings/cros_settings.h"
26#include "chrome/browser/chromeos/settings/device_settings_service.h"
27#endif
28
29namespace {
30
31const char kExampleUrl[] = "http://www.example.com/";
32const char kExampleUrlSecure[] = "https://www.example.com/";
33const char kOtherUrl[] = "http://chrome.google.com/";
34
35}  // namespace
36
37class OriginChipInfoTest : public ChromeRenderViewHostTestHarness,
38                           public extensions::IconImage::Observer {
39 public:
40  OriginChipInfoTest() : icon_image_(NULL) {}
41
42  TestToolbarModel* toolbar_model() { return toolbar_model_.get(); }
43  OriginChipInfo* info() { return info_.get(); }
44  const GURL& url() const { return url_; }
45  const extensions::IconImage* icon_image() const { return icon_image_; }
46
47  void SetURL(const std::string& dest_url, bool expect_update) {
48    url_ = GURL(dest_url);
49    NavigateAndCommit(url_);
50    toolbar_model_->set_url(url_);
51
52    EXPECT_EQ(expect_update, info_->Update(web_contents(), toolbar_model()));
53  }
54
55  virtual void SetUp() OVERRIDE {
56    ChromeRenderViewHostTestHarness::SetUp();
57#if defined(OS_CHROMEOS)
58    test_user_manager_.reset(new chromeos::ScopedTestUserManager());
59#endif
60    toolbar_model_.reset(new TestToolbarModel());
61    info_.reset(new OriginChipInfo(this, profile()));
62  }
63
64  virtual void TearDown() OVERRIDE {
65    info_.reset();
66    toolbar_model_.reset();
67#if defined(OS_CHROMEOS)
68    test_user_manager_.reset();
69#endif
70    ChromeRenderViewHostTestHarness::TearDown();
71  }
72
73  virtual void OnExtensionIconImageChanged(
74      extensions::IconImage* image) OVERRIDE {
75    // We keep the value of |image| to check if it's set, but the actual value
76    // is never used.
77    icon_image_ = image;
78  }
79
80 private:
81  scoped_ptr<OriginChipInfo> info_;
82  scoped_ptr<TestToolbarModel> toolbar_model_;
83  GURL url_;
84  extensions::IconImage* icon_image_;
85
86#if defined(OS_CHROMEOS)
87  // OriginChipInfo sometimes calls into the extensions system, which, on CrOS,
88  // requires these services to be initialized.
89  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
90  chromeos::ScopedTestCrosSettings test_cros_settings_;
91  scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_;
92#endif
93
94  DISALLOW_COPY_AND_ASSIGN(OriginChipInfoTest);
95};
96
97TEST_F(OriginChipInfoTest, NoChangeShouldNotUpdate) {
98  SetURL(kExampleUrl, true);
99  SetURL(kExampleUrl, false);
100}
101
102TEST_F(OriginChipInfoTest, ChangeShouldUpdate) {
103  SetURL(kExampleUrl, true);
104  SetURL(kOtherUrl, true);
105}
106
107TEST_F(OriginChipInfoTest, NormalOrigin) {
108  SetURL(kExampleUrl, true);
109
110  EXPECT_EQ(base::ASCIIToUTF16("example.com"), info()->label());
111  EXPECT_EQ(base::ASCIIToUTF16(kExampleUrl), info()->Tooltip());
112  EXPECT_EQ(url(), info()->displayed_url());
113  EXPECT_EQ(ToolbarModel::NONE, info()->security_level());
114}
115
116TEST_F(OriginChipInfoTest, EVSecureOrigin) {
117  toolbar_model()->set_security_level(ToolbarModel::EV_SECURE);
118  toolbar_model()->set_ev_cert_name(base::ASCIIToUTF16("Example [US]"));
119  SetURL(kExampleUrlSecure, true);
120
121  EXPECT_EQ(base::ASCIIToUTF16("Example [US] example.com"), info()->label());
122  EXPECT_EQ(base::ASCIIToUTF16(kExampleUrlSecure), info()->Tooltip());
123  EXPECT_EQ(url(), info()->displayed_url());
124  EXPECT_EQ(ToolbarModel::EV_SECURE, info()->security_level());
125}
126
127TEST_F(OriginChipInfoTest, ChromeOrigin) {
128  const char kChromeOrigin1[] = "chrome://version/";
129  SetURL(kChromeOrigin1, true);
130
131  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_TITLE),
132            info()->label());
133  EXPECT_EQ(base::ASCIIToUTF16(kChromeOrigin1), info()->Tooltip());
134  EXPECT_EQ(url(), info()->displayed_url());
135  EXPECT_EQ(IDR_PRODUCT_LOGO_16, info()->icon());
136
137  // chrome://flags has no title, so the title should be the product name.
138  const char kChromeOrigin2[] = "chrome://flags/";
139  SetURL(kChromeOrigin2, true);
140
141  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME), info()->label());
142  EXPECT_EQ(base::ASCIIToUTF16(kChromeOrigin2), info()->Tooltip());
143  EXPECT_EQ(url(), info()->displayed_url());
144  EXPECT_EQ(IDR_PRODUCT_LOGO_16, info()->icon());
145
146  SetURL(kExampleUrl, true);
147  EXPECT_NE(IDR_PRODUCT_LOGO_16, info()->icon());
148}
149
150TEST_F(OriginChipInfoTest, ExtensionOrigin) {
151  CommandLine command_line(CommandLine::NO_PROGRAM);
152  extensions::TestExtensionSystem* test_extension_system =
153      static_cast<extensions::TestExtensionSystem*>(
154          extensions::ExtensionSystem::Get(profile()));
155
156  // |extension_service| is owned by |profile()|.
157  ExtensionService* extension_service =
158      test_extension_system->CreateExtensionService(&command_line,
159                                                    base::FilePath(),
160                                                    false);
161
162  // Create a dummy extension.
163  const char kFooId[] = "hhgbjpmdppecanaaogonaigmmifgpaph";
164  const char kFooName[] = "Foo";
165  extensions::ExtensionBuilder foo_extension;
166  foo_extension.SetManifest(extensions::DictionaryBuilder()
167                                .Set("name", kFooName)
168                                .Set("version", "1.0.0")
169                                .Set("manifest_version", 2));
170  foo_extension.SetID(kFooId);
171  extension_service->AddExtension(foo_extension.Build().get());
172
173  const extensions::IconImage* null_image = NULL;
174
175  // Navigate to a URL from that extension.
176  const std::string extension_origin =
177      base::StringPrintf("chrome-extension://%s/index.html", kFooId);
178  SetURL(extension_origin, true);
179  EXPECT_NE(null_image, icon_image());
180  EXPECT_EQ(base::ASCIIToUTF16(kFooName), info()->label());
181  EXPECT_EQ(base::ASCIIToUTF16(extension_origin), info()->Tooltip());
182
183  SetURL(kExampleUrl, true);
184  EXPECT_EQ(null_image, icon_image());
185}
186