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