blob: 4376497215c3cb03842744036d4779d2691a592b [file] [log] [blame]
[email protected]11d42c82013-02-01 00:14:321// 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/test_extension_environment.h"
6
limasdf3d102542015-12-09 03:58:457#include <utility>
8
[email protected]11d42c82013-02-01 00:14:329#include "base/command_line.h"
10#include "base/json/json_writer.h"
avia2f4804a2015-12-24 23:11:1311#include "base/macros.h"
[email protected]11d42c82013-02-01 00:14:3212#include "base/run_loop.h"
[email protected]e0ec3cb12013-04-03 17:35:3013#include "base/values.h"
avia2f4804a2015-12-24 23:11:1314#include "build/build_config.h"
[email protected]11d42c82013-02-01 00:14:3215#include "chrome/browser/extensions/extension_service.h"
16#include "chrome/browser/extensions/test_extension_system.h"
17#include "chrome/browser/sessions/session_tab_helper.h"
[email protected]e0ec3cb12013-04-03 17:35:3018#include "chrome/test/base/testing_profile.h"
taptedc7bd3ce2015-06-16 02:50:4419#include "content/public/test/test_browser_thread_bundle.h"
[email protected]e375b8a2013-11-14 07:45:0020#include "content/public/test/test_utils.h"
[email protected]11d42c82013-02-01 00:14:3221#include "content/public/test/web_contents_tester.h"
juncaicf523332015-06-04 00:14:0422#include "extensions/browser/extension_prefs.h"
[email protected]e4452d32013-11-15 23:07:4123#include "extensions/common/extension.h"
[email protected]22b7b2c2013-11-05 22:52:4224#include "extensions/common/extension_builder.h"
25#include "extensions/common/value_builder.h"
[email protected]11d42c82013-02-01 00:14:3226#include "testing/gtest/include/gtest/gtest.h"
27
tapteddfd8eda2015-08-04 09:15:2328#if defined(OS_CHROMEOS)
29#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
30#include "chrome/browser/chromeos/settings/cros_settings.h"
31#include "chrome/browser/chromeos/settings/device_settings_service.h"
32#endif
33
[email protected]11d42c82013-02-01 00:14:3234namespace extensions {
35
36using content::BrowserThread;
37
jackhouc587f302015-04-13 08:16:3938namespace {
39
dchengc963c7142016-04-08 03:55:2240std::unique_ptr<base::DictionaryValue> MakeExtensionManifest(
jackhouc587f302015-04-13 08:16:3941 const base::Value& manifest_extra) {
dchengc963c7142016-04-08 03:55:2242 std::unique_ptr<base::DictionaryValue> manifest =
43 DictionaryBuilder()
44 .Set("name", "Extension")
45 .Set("version", "1.0")
46 .Set("manifest_version", 2)
47 .Build();
jackhouc587f302015-04-13 08:16:3948 const base::DictionaryValue* manifest_extra_dict;
49 if (manifest_extra.GetAsDictionary(&manifest_extra_dict)) {
50 manifest->MergeDictionary(manifest_extra_dict);
51 } else {
52 std::string manifest_json;
estade8d046462015-05-16 01:02:3453 base::JSONWriter::Write(manifest_extra, &manifest_json);
jackhouc587f302015-04-13 08:16:3954 ADD_FAILURE() << "Expected dictionary; got \"" << manifest_json << "\"";
55 }
56 return manifest;
57}
58
dchengc963c7142016-04-08 03:55:2259std::unique_ptr<base::DictionaryValue> MakePackagedAppManifest() {
taptedc7bd3ce2015-06-16 02:50:4460 return extensions::DictionaryBuilder()
61 .Set("name", "Test App Name")
62 .Set("version", "2.0")
63 .Set("manifest_version", 2)
dcheng794d2bd2016-02-27 03:51:3264 .Set("app", extensions::DictionaryBuilder()
65 .Set("background",
66 extensions::DictionaryBuilder()
67 .Set("scripts", extensions::ListBuilder()
68 .Append("background.js")
69 .Build())
70 .Build())
71 .Build())
taptedc7bd3ce2015-06-16 02:50:4472 .Build();
73}
74
jackhouc587f302015-04-13 08:16:3975} // namespace
76
tapteddfd8eda2015-08-04 09:15:2377// Extra environment state required for ChromeOS.
78class TestExtensionEnvironment::ChromeOSEnv {
79 public:
80 ChromeOSEnv() {}
81
82 private:
83#if defined(OS_CHROMEOS)
84 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
85 chromeos::ScopedTestCrosSettings test_cros_settings_;
86 chromeos::ScopedTestUserManager test_user_manager_;
87#endif
88
89 DISALLOW_COPY_AND_ASSIGN(ChromeOSEnv);
90};
91
taptedc7bd3ce2015-06-16 02:50:4492// static
93ExtensionService* TestExtensionEnvironment::CreateExtensionServiceForProfile(
94 TestingProfile* profile) {
95 TestExtensionSystem* extension_system =
96 static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile));
97 return extension_system->CreateExtensionService(
98 base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
99}
100
[email protected]11d42c82013-02-01 00:14:32101TestExtensionEnvironment::TestExtensionEnvironment()
taptedc7bd3ce2015-06-16 02:50:44102 : thread_bundle_(new content::TestBrowserThreadBundle),
taptedc7bd3ce2015-06-16 02:50:44103 extension_service_(nullptr) {
tapteddfd8eda2015-08-04 09:15:23104 Init();
taptedc7bd3ce2015-06-16 02:50:44105}
106
107TestExtensionEnvironment::TestExtensionEnvironment(
108 base::MessageLoopForUI* message_loop)
tapteddfd8eda2015-08-04 09:15:23109 : extension_service_(nullptr) {
110 Init();
111}
112
113void TestExtensionEnvironment::Init() {
114 profile_.reset(new TestingProfile);
115#if defined(OS_CHROMEOS)
116 if (!chromeos::DeviceSettingsService::IsInitialized())
117 chromeos_env_.reset(new ChromeOSEnv);
118#endif
[email protected]11d42c82013-02-01 00:14:32119}
120
121TestExtensionEnvironment::~TestExtensionEnvironment() {
[email protected]11d42c82013-02-01 00:14:32122}
123
[email protected]e0ec3cb12013-04-03 17:35:30124TestingProfile* TestExtensionEnvironment::profile() const {
125 return profile_.get();
126}
127
[email protected]94cf31c2013-12-07 03:58:32128TestExtensionSystem* TestExtensionEnvironment::GetExtensionSystem() {
[email protected]5fbbea62014-02-26 20:07:33129 return static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile()));
[email protected]94cf31c2013-12-07 03:58:32130}
131
[email protected]11d42c82013-02-01 00:14:32132ExtensionService* TestExtensionEnvironment::GetExtensionService() {
taptedc7bd3ce2015-06-16 02:50:44133 if (!extension_service_)
134 extension_service_ = CreateExtensionServiceForProfile(profile());
[email protected]11d42c82013-02-01 00:14:32135 return extension_service_;
136}
137
[email protected]94cf31c2013-12-07 03:58:32138ExtensionPrefs* TestExtensionEnvironment::GetExtensionPrefs() {
taptedc7bd3ce2015-06-16 02:50:44139 return ExtensionPrefs::Get(profile_.get());
[email protected]94cf31c2013-12-07 03:58:32140}
141
[email protected]11d42c82013-02-01 00:14:32142const Extension* TestExtensionEnvironment::MakeExtension(
[email protected]e0ec3cb12013-04-03 17:35:30143 const base::Value& manifest_extra) {
dchengc963c7142016-04-08 03:55:22144 std::unique_ptr<base::DictionaryValue> manifest =
jackhouc587f302015-04-13 08:16:39145 MakeExtensionManifest(manifest_extra);
[email protected]11d42c82013-02-01 00:14:32146 scoped_refptr<Extension> result =
dcheng1fc00f12015-12-26 22:18:03147 ExtensionBuilder().SetManifest(std::move(manifest)).Build();
[email protected]dc24976f2013-06-02 21:15:09148 GetExtensionService()->AddExtension(result.get());
[email protected]11d42c82013-02-01 00:14:32149 return result.get();
150}
151
jackhouc587f302015-04-13 08:16:39152const Extension* TestExtensionEnvironment::MakeExtension(
153 const base::Value& manifest_extra,
154 const std::string& id) {
dchengc963c7142016-04-08 03:55:22155 std::unique_ptr<base::DictionaryValue> manifest =
jackhouc587f302015-04-13 08:16:39156 MakeExtensionManifest(manifest_extra);
157 scoped_refptr<Extension> result =
dcheng1fc00f12015-12-26 22:18:03158 ExtensionBuilder().SetManifest(std::move(manifest)).SetID(id).Build();
jackhouc587f302015-04-13 08:16:39159 GetExtensionService()->AddExtension(result.get());
160 return result.get();
161}
162
taptedc7bd3ce2015-06-16 02:50:44163scoped_refptr<Extension> TestExtensionEnvironment::MakePackagedApp(
164 const std::string& id,
165 bool install) {
166 scoped_refptr<Extension> result = ExtensionBuilder()
167 .SetManifest(MakePackagedAppManifest())
tapteddfd8eda2015-08-04 09:15:23168 .AddFlags(Extension::FROM_WEBSTORE)
taptedc7bd3ce2015-06-16 02:50:44169 .SetID(id)
170 .Build();
171 if (install)
172 GetExtensionService()->AddExtension(result.get());
173 return result;
174}
175
dchengc963c7142016-04-08 03:55:22176std::unique_ptr<content::WebContents> TestExtensionEnvironment::MakeTab()
177 const {
178 std::unique_ptr<content::WebContents> contents(
[email protected]11d42c82013-02-01 00:14:32179 content::WebContentsTester::CreateTestWebContents(profile(), NULL));
180 // Create a tab id.
181 SessionTabHelper::CreateForWebContents(contents.get());
dcheng1fc00f12015-12-26 22:18:03182 return contents;
[email protected]11d42c82013-02-01 00:14:32183}
184
taptedc7bd3ce2015-06-16 02:50:44185void TestExtensionEnvironment::DeleteProfile() {
186 profile_.reset();
187 extension_service_ = nullptr;
188}
189
[email protected]11d42c82013-02-01 00:14:32190} // namespace extensions