extension_web_ui_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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 "base/command_line.h"
6#include "base/message_loop/message_loop.h"
7#include "chrome/browser/extensions/extension_service.h"
8#include "chrome/browser/extensions/extension_web_ui.h"
9#include "chrome/browser/extensions/test_extension_system.h"
10#include "chrome/test/base/testing_profile.h"
11#include "content/public/test/test_browser_thread.h"
12#include "extensions/common/extension.h"
13#include "extensions/common/extension_builder.h"
14#include "extensions/common/manifest_constants.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17#if defined(OS_CHROMEOS)
18#include "chrome/browser/chromeos/login/users/user_manager.h"
19#include "chrome/browser/chromeos/settings/cros_settings.h"
20#include "chrome/browser/chromeos/settings/device_settings_service.h"
21#endif
22
23namespace extensions {
24
25class ExtensionWebUITest : public testing::Test {
26 public:
27  ExtensionWebUITest()
28      : ui_thread_(content::BrowserThread::UI, &message_loop_) {}
29
30 protected:
31  virtual void SetUp() OVERRIDE {
32    profile_.reset(new TestingProfile());
33    TestExtensionSystem* system =
34        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile_.get()));
35    extension_service_ = system->CreateExtensionService(
36        CommandLine::ForCurrentProcess(), base::FilePath(), false);
37  }
38
39  virtual void TearDown() OVERRIDE {
40    profile_.reset();
41    message_loop_.RunUntilIdle();
42  }
43
44  scoped_ptr<TestingProfile> profile_;
45  ExtensionService* extension_service_;
46  base::MessageLoop message_loop_;
47  content::TestBrowserThread ui_thread_;
48
49#if defined OS_CHROMEOS
50  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
51  chromeos::ScopedTestCrosSettings test_cros_settings_;
52  chromeos::ScopedTestUserManager test_user_manager_;
53#endif
54};
55
56// Test that component extension url overrides have lower priority than
57// non-component extension url overrides.
58TEST_F(ExtensionWebUITest, ExtensionURLOverride) {
59  // Register a non-component extension.
60  extensions::DictionaryBuilder manifest;
61  manifest.Set(manifest_keys::kName, "ext1")
62      .Set(manifest_keys::kVersion, "0.1")
63      .Set(std::string(manifest_keys::kChromeURLOverrides),
64           extensions::DictionaryBuilder().Set("bookmarks", "1.html"));
65  scoped_refptr<Extension> ext_unpacked(
66      extensions::ExtensionBuilder()
67          .SetManifest(manifest)
68          .SetLocation(Manifest::UNPACKED)
69          .SetID("abcdefghijabcdefghijabcdefghijaa")
70          .Build());
71  profile_->GetExtensionService()->AddExtension(ext_unpacked.get());
72
73  GURL expected_unpacked_override_url(std::string(ext_unpacked->url().spec()) +
74                                      "1.html");
75  GURL url("chrome://bookmarks");
76  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
77  EXPECT_EQ(url, expected_unpacked_override_url);
78
79  // Register a component extension
80  extensions::DictionaryBuilder manifest2;
81  manifest2.Set(manifest_keys::kName, "ext2")
82      .Set(manifest_keys::kVersion, "0.1")
83      .Set(std::string(manifest_keys::kChromeURLOverrides),
84           extensions::DictionaryBuilder().Set("bookmarks", "2.html"));
85  scoped_refptr<Extension> ext_component(
86      extensions::ExtensionBuilder()
87          .SetManifest(manifest2)
88          .SetLocation(Manifest::COMPONENT)
89          .SetID("bbabcdefghijabcdefghijabcdefghij")
90          .Build());
91  profile_->GetExtensionService()->AddComponentExtension(ext_component.get());
92
93  // Despite being registered more recently, the component extension should
94  // not take precedence over the non-component extension.
95  url = GURL("chrome://bookmarks");
96  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
97  EXPECT_EQ(url, expected_unpacked_override_url);
98
99  GURL expected_component_override_url(
100      std::string(ext_component->url().spec()) + "2.html");
101
102  // Unregister non-component extension. Only component extension remaining.
103  ExtensionWebUI::UnregisterChromeURLOverrides(
104      profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
105  url = GURL("chrome://bookmarks");
106  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
107  EXPECT_EQ(url, expected_component_override_url);
108
109  // This time the non-component extension was registered more recently and
110  // should still take precedence.
111  ExtensionWebUI::RegisterChromeURLOverrides(
112      profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
113  url = GURL("chrome://bookmarks");
114  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
115  EXPECT_EQ(url, expected_unpacked_override_url);
116}
117
118}  // namespace extensions
119