Home | History | Annotate | Download | only in toolbar
      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 
     29 namespace {
     30 
     31 const char kExampleUrl[] = "http://www.example.com/";
     32 const char kExampleUrlSecure[] = "https://www.example.com/";
     33 const char kOtherUrl[] = "http://chrome.google.com/";
     34 
     35 }  // namespace
     36 
     37 class 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 
     97 TEST_F(OriginChipInfoTest, NoChangeShouldNotUpdate) {
     98   SetURL(kExampleUrl, true);
     99   SetURL(kExampleUrl, false);
    100 }
    101 
    102 TEST_F(OriginChipInfoTest, ChangeShouldUpdate) {
    103   SetURL(kExampleUrl, true);
    104   SetURL(kOtherUrl, true);
    105 }
    106 
    107 TEST_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 
    116 TEST_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 
    127 TEST_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 
    150 TEST_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