Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_service_unittest.cc
1 // Copyright (c) 2013 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 <algorithm>
6 #include <set>
7 #include <vector>
8
9 #include "base/at_exit.h"
10 #include "base/basictypes.h"
11 #include "base/bind.h"
12 #include "base/command_line.h"
13 #include "base/files/file_enumerator.h"
14 #include "base/files/file_util.h"
15 #include "base/files/scoped_temp_dir.h"
16 #include "base/json/json_file_value_serializer.h"
17 #include "base/json/json_reader.h"
18 #include "base/json/json_string_value_serializer.h"
19 #include "base/memory/scoped_ptr.h"
20 #include "base/memory/weak_ptr.h"
21 #include "base/message_loop/message_loop.h"
22 #include "base/prefs/scoped_user_pref_update.h"
23 #include "base/stl_util.h"
24 #include "base/strings/string16.h"
25 #include "base/strings/string_number_conversions.h"
26 #include "base/strings/string_util.h"
27 #include "base/strings/utf_string_conversions.h"
28 #include "base/version.h"
29 #include "chrome/browser/browser_process.h"
30 #include "chrome/browser/chrome_notification_types.h"
31 #include "chrome/browser/extensions/app_sync_data.h"
32 #include "chrome/browser/extensions/blacklist.h"
33 #include "chrome/browser/extensions/chrome_app_sorting.h"
34 #include "chrome/browser/extensions/component_loader.h"
35 #include "chrome/browser/extensions/crx_installer.h"
36 #include "chrome/browser/extensions/default_apps.h"
37 #include "chrome/browser/extensions/extension_creator.h"
38 #include "chrome/browser/extensions/extension_error_reporter.h"
39 #include "chrome/browser/extensions/extension_error_ui.h"
40 #include "chrome/browser/extensions/extension_management_test_util.h"
41 #include "chrome/browser/extensions/extension_notification_observer.h"
42 #include "chrome/browser/extensions/extension_service.h"
43 #include "chrome/browser/extensions/extension_service_test_base.h"
44 #include "chrome/browser/extensions/extension_special_storage_policy.h"
45 #include "chrome/browser/extensions/extension_sync_data.h"
46 #include "chrome/browser/extensions/extension_sync_service.h"
47 #include "chrome/browser/extensions/extension_util.h"
48 #include "chrome/browser/extensions/external_install_error.h"
49 #include "chrome/browser/extensions/external_install_manager.h"
50 #include "chrome/browser/extensions/external_policy_loader.h"
51 #include "chrome/browser/extensions/external_pref_loader.h"
52 #include "chrome/browser/extensions/external_provider_impl.h"
53 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
54 #include "chrome/browser/extensions/installed_loader.h"
55 #include "chrome/browser/extensions/pack_extension_job.h"
56 #include "chrome/browser/extensions/pending_extension_info.h"
57 #include "chrome/browser/extensions/pending_extension_manager.h"
58 #include "chrome/browser/extensions/test_blacklist.h"
59 #include "chrome/browser/extensions/test_extension_system.h"
60 #include "chrome/browser/extensions/unpacked_installer.h"
61 #include "chrome/browser/extensions/updater/extension_updater.h"
62 #include "chrome/browser/prefs/pref_service_syncable.h"
63 #include "chrome/browser/supervised_user/supervised_user_service.h"
64 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
65 #include "chrome/browser/sync/profile_sync_service.h"
66 #include "chrome/browser/sync/profile_sync_service_factory.h"
67 #include "chrome/common/chrome_constants.h"
68 #include "chrome/common/chrome_switches.h"
69 #include "chrome/common/extensions/api/plugins/plugins_handler.h"
70 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
71 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
72 #include "chrome/common/extensions/manifest_url_handler.h"
73 #include "chrome/common/pref_names.h"
74 #include "chrome/common/url_constants.h"
75 #include "chrome/test/base/scoped_browser_locale.h"
76 #include "chrome/test/base/testing_pref_service_syncable.h"
77 #include "chrome/test/base/testing_profile.h"
78 #include "components/crx_file/id_util.h"
79 #include "components/pref_registry/pref_registry_syncable.h"
80 #include "content/public/browser/dom_storage_context.h"
81 #include "content/public/browser/gpu_data_manager.h"
82 #include "content/public/browser/indexed_db_context.h"
83 #include "content/public/browser/notification_registrar.h"
84 #include "content/public/browser/notification_service.h"
85 #include "content/public/browser/plugin_service.h"
86 #include "content/public/browser/render_process_host.h"
87 #include "content/public/browser/storage_partition.h"
88 #include "content/public/common/content_constants.h"
89 #include "content/public/test/test_utils.h"
90 #include "extensions/browser/extension_registry.h"
91 #include "extensions/browser/extension_system.h"
92 #include "extensions/browser/external_provider_interface.h"
93 #include "extensions/browser/install_flag.h"
94 #include "extensions/browser/management_policy.h"
95 #include "extensions/browser/test_management_policy.h"
96 #include "extensions/browser/uninstall_reason.h"
97 #include "extensions/common/constants.h"
98 #include "extensions/common/extension.h"
99 #include "extensions/common/extension_builder.h"
100 #include "extensions/common/extension_l10n_util.h"
101 #include "extensions/common/extension_resource.h"
102 #include "extensions/common/feature_switch.h"
103 #include "extensions/common/manifest_constants.h"
104 #include "extensions/common/manifest_handlers/background_info.h"
105 #include "extensions/common/permissions/permission_set.h"
106 #include "extensions/common/permissions/permissions_data.h"
107 #include "extensions/common/switches.h"
108 #include "extensions/common/url_pattern.h"
109 #include "extensions/common/value_builder.h"
110 #include "gpu/config/gpu_info.h"
111 #include "grit/browser_resources.h"
112 #include "net/cookies/canonical_cookie.h"
113 #include "net/cookies/cookie_monster.h"
114 #include "net/cookies/cookie_options.h"
115 #include "net/url_request/url_request_context.h"
116 #include "net/url_request/url_request_context_getter.h"
117 #include "storage/browser/database/database_tracker.h"
118 #include "storage/browser/quota/quota_manager.h"
119 #include "storage/common/database/database_identifier.h"
120 #include "sync/api/fake_sync_change_processor.h"
121 #include "sync/api/string_ordinal.h"
122 #include "sync/api/sync_data.h"
123 #include "sync/api/sync_error_factory.h"
124 #include "sync/api/sync_error_factory_mock.h"
125 #include "sync/api/syncable_service.h"
126 #include "sync/protocol/app_specifics.pb.h"
127 #include "sync/protocol/extension_specifics.pb.h"
128 #include "sync/protocol/sync.pb.h"
129 #include "testing/gtest/include/gtest/gtest.h"
130 #include "testing/platform_test.h"
131 #include "url/gurl.h"
132
133 #if defined(OS_CHROMEOS)
134 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
135 #include "chrome/browser/chromeos/settings/cros_settings.h"
136 #include "chrome/browser/chromeos/settings/device_settings_service.h"
137 #endif
138
139 // The blacklist tests rely on safe browsing.
140 #if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
141 #define ENABLE_BLACKLIST_TESTS
142 #endif
143
144 using base::DictionaryValue;
145 using base::ListValue;
146 using base::Value;
147 using content::BrowserContext;
148 using content::BrowserThread;
149 using content::DOMStorageContext;
150 using content::IndexedDBContext;
151 using content::PluginService;
152 using extensions::APIPermission;
153 using extensions::APIPermissionSet;
154 using extensions::AppSorting;
155 using extensions::Blacklist;
156 using extensions::CrxInstaller;
157 using extensions::Extension;
158 using extensions::ExtensionCreator;
159 using extensions::ExtensionPrefs;
160 using extensions::ExtensionRegistry;
161 using extensions::ExtensionResource;
162 using extensions::ExtensionSystem;
163 using extensions::FakeSafeBrowsingDatabaseManager;
164 using extensions::FeatureSwitch;
165 using extensions::Manifest;
166 using extensions::PermissionSet;
167 using extensions::TestExtensionSystem;
168 using extensions::UnloadedExtensionInfo;
169 using extensions::URLPatternSet;
170
171 namespace keys = extensions::manifest_keys;
172
173 namespace {
174
175 // Extension ids used during testing.
176 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
177 const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk";
178 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa";
179 const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
180 const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh";
181 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
182 const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi";
183 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln";
184 const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad";
185 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf";
186 const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin";
187 const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk";
188 const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj";
189
190 struct ExtensionsOrder {
191   bool operator()(const scoped_refptr<const Extension>& a,
192                   const scoped_refptr<const Extension>& b) {
193     return a->name() < b->name();
194   }
195 };
196
197 static std::vector<base::string16> GetErrors() {
198   const std::vector<base::string16>* errors =
199       ExtensionErrorReporter::GetInstance()->GetErrors();
200   std::vector<base::string16> ret_val;
201
202   for (std::vector<base::string16>::const_iterator iter = errors->begin();
203        iter != errors->end(); ++iter) {
204     std::string utf8_error = base::UTF16ToUTF8(*iter);
205     if (utf8_error.find(".svn") == std::string::npos) {
206       ret_val.push_back(*iter);
207     }
208   }
209
210   // The tests rely on the errors being in a certain order, which can vary
211   // depending on how filesystem iteration works.
212   std::stable_sort(ret_val.begin(), ret_val.end());
213
214   return ret_val;
215 }
216
217 static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
218   int schemes = URLPattern::SCHEME_ALL;
219   extent->AddPattern(URLPattern(schemes, pattern));
220 }
221
222 base::FilePath GetTemporaryFile() {
223   base::FilePath temp_file;
224   CHECK(base::CreateTemporaryFile(&temp_file));
225   return temp_file;
226 }
227
228 bool WaitForCountNotificationsCallback(int *count) {
229   return --(*count) == 0;
230 }
231
232 }  // namespace
233
234 class MockExtensionProvider : public extensions::ExternalProviderInterface {
235  public:
236   MockExtensionProvider(
237       VisitorInterface* visitor,
238       Manifest::Location location)
239     : location_(location), visitor_(visitor), visit_count_(0) {
240   }
241
242   virtual ~MockExtensionProvider() {}
243
244   void UpdateOrAddExtension(const std::string& id,
245                             const std::string& version,
246                             const base::FilePath& path) {
247     extension_map_[id] = std::make_pair(version, path);
248   }
249
250   void RemoveExtension(const std::string& id) {
251     extension_map_.erase(id);
252   }
253
254   // ExternalProvider implementation:
255   virtual void VisitRegisteredExtension() OVERRIDE {
256     visit_count_++;
257     for (DataMap::const_iterator i = extension_map_.begin();
258          i != extension_map_.end(); ++i) {
259       Version version(i->second.first);
260
261       visitor_->OnExternalExtensionFileFound(
262           i->first, &version, i->second.second, location_,
263           Extension::NO_FLAGS, false);
264     }
265     visitor_->OnExternalProviderReady(this);
266   }
267
268   virtual bool HasExtension(const std::string& id) const OVERRIDE {
269     return extension_map_.find(id) != extension_map_.end();
270   }
271
272   virtual bool GetExtensionDetails(
273       const std::string& id,
274       Manifest::Location* location,
275       scoped_ptr<Version>* version) const OVERRIDE {
276     DataMap::const_iterator it = extension_map_.find(id);
277     if (it == extension_map_.end())
278       return false;
279
280     if (version)
281       version->reset(new Version(it->second.first));
282
283     if (location)
284       *location = location_;
285
286     return true;
287   }
288
289   virtual bool IsReady() const OVERRIDE {
290     return true;
291   }
292
293   virtual void ServiceShutdown() OVERRIDE {
294   }
295
296   int visit_count() const { return visit_count_; }
297   void set_visit_count(int visit_count) {
298     visit_count_ = visit_count;
299   }
300
301  private:
302   typedef std::map< std::string, std::pair<std::string, base::FilePath> >
303       DataMap;
304   DataMap extension_map_;
305   Manifest::Location location_;
306   VisitorInterface* visitor_;
307
308   // visit_count_ tracks the number of calls to VisitRegisteredExtension().
309   // Mutable because it must be incremented on each call to
310   // VisitRegisteredExtension(), which must be a const method to inherit
311   // from the class being mocked.
312   mutable int visit_count_;
313
314   DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider);
315 };
316
317 class MockProviderVisitor
318     : public extensions::ExternalProviderInterface::VisitorInterface {
319  public:
320   // The provider will return |fake_base_path| from
321   // GetBaseCrxFilePath().  User can test the behavior with
322   // and without an empty path using this parameter.
323   explicit MockProviderVisitor(base::FilePath fake_base_path)
324       : ids_found_(0),
325         fake_base_path_(fake_base_path),
326         expected_creation_flags_(Extension::NO_FLAGS) {
327     profile_.reset(new TestingProfile);
328   }
329
330   MockProviderVisitor(base::FilePath fake_base_path,
331                       int expected_creation_flags)
332       : ids_found_(0),
333         fake_base_path_(fake_base_path),
334         expected_creation_flags_(expected_creation_flags) {
335   }
336
337   int Visit(const std::string& json_data) {
338     // Give the test json file to the provider for parsing.
339     provider_.reset(new extensions::ExternalProviderImpl(
340         this,
341         new extensions::ExternalTestingLoader(json_data, fake_base_path_),
342         profile_.get(),
343         Manifest::EXTERNAL_PREF,
344         Manifest::EXTERNAL_PREF_DOWNLOAD,
345         Extension::NO_FLAGS));
346
347     // We also parse the file into a dictionary to compare what we get back
348     // from the provider.
349     JSONStringValueSerializer serializer(json_data);
350     base::Value* json_value = serializer.Deserialize(NULL, NULL);
351
352     if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) {
353       NOTREACHED() << "Unable to deserialize json data";
354       return -1;
355     } else {
356       base::DictionaryValue* external_extensions =
357           static_cast<base::DictionaryValue*>(json_value);
358       prefs_.reset(external_extensions);
359     }
360
361     // Reset our counter.
362     ids_found_ = 0;
363     // Ask the provider to look up all extensions and return them.
364     provider_->VisitRegisteredExtension();
365
366     return ids_found_;
367   }
368
369   virtual bool OnExternalExtensionFileFound(const std::string& id,
370                                             const Version* version,
371                                             const base::FilePath& path,
372                                             Manifest::Location unused,
373                                             int creation_flags,
374                                             bool mark_acknowledged) OVERRIDE {
375     EXPECT_EQ(expected_creation_flags_, creation_flags);
376
377     ++ids_found_;
378     base::DictionaryValue* pref;
379     // This tests is to make sure that the provider only notifies us of the
380     // values we gave it. So if the id we doesn't exist in our internal
381     // dictionary then something is wrong.
382     EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
383        << "Got back ID (" << id.c_str() << ") we weren't expecting";
384
385     EXPECT_TRUE(path.IsAbsolute());
386     if (!fake_base_path_.empty())
387       EXPECT_TRUE(fake_base_path_.IsParent(path));
388
389     if (pref) {
390       EXPECT_TRUE(provider_->HasExtension(id));
391
392       // Ask provider if the extension we got back is registered.
393       Manifest::Location location = Manifest::INVALID_LOCATION;
394       scoped_ptr<Version> v1;
395       base::FilePath crx_path;
396
397       EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1));
398       EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
399
400       scoped_ptr<Version> v2;
401       EXPECT_TRUE(provider_->GetExtensionDetails(id, &location, &v2));
402       EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
403       EXPECT_STREQ(version->GetString().c_str(), v2->GetString().c_str());
404       EXPECT_EQ(Manifest::EXTERNAL_PREF, location);
405
406       // Remove it so we won't count it ever again.
407       prefs_->Remove(id, NULL);
408     }
409     return true;
410   }
411
412   virtual bool OnExternalExtensionUpdateUrlFound(
413       const std::string& id,
414       const std::string& install_parameter,
415       const GURL& update_url,
416       Manifest::Location location,
417       int creation_flags,
418       bool mark_acknowledged) OVERRIDE {
419     ++ids_found_;
420     base::DictionaryValue* pref;
421     // This tests is to make sure that the provider only notifies us of the
422     // values we gave it. So if the id we doesn't exist in our internal
423     // dictionary then something is wrong.
424     EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
425        << L"Got back ID (" << id.c_str() << ") we weren't expecting";
426     EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location);
427
428     if (pref) {
429       EXPECT_TRUE(provider_->HasExtension(id));
430
431       // External extensions with update URLs do not have versions.
432       scoped_ptr<Version> v1;
433       Manifest::Location location1 = Manifest::INVALID_LOCATION;
434       EXPECT_TRUE(provider_->GetExtensionDetails(id, &location1, &v1));
435       EXPECT_FALSE(v1.get());
436       EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location1);
437
438       std::string parsed_install_parameter;
439       pref->GetString("install_parameter", &parsed_install_parameter);
440       EXPECT_EQ(parsed_install_parameter, install_parameter);
441
442       // Remove it so we won't count it again.
443       prefs_->Remove(id, NULL);
444     }
445     return true;
446   }
447
448   virtual void OnExternalProviderReady(
449       const extensions::ExternalProviderInterface* provider) OVERRIDE {
450     EXPECT_EQ(provider, provider_.get());
451     EXPECT_TRUE(provider->IsReady());
452   }
453
454  private:
455   int ids_found_;
456   base::FilePath fake_base_path_;
457   int expected_creation_flags_;
458   scoped_ptr<extensions::ExternalProviderImpl> provider_;
459   scoped_ptr<base::DictionaryValue> prefs_;
460   scoped_ptr<TestingProfile> profile_;
461
462   DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor);
463 };
464
465 class ExtensionServiceTest : public extensions::ExtensionServiceTestBase,
466                              public content::NotificationObserver {
467  public:
468   ExtensionServiceTest()
469       : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED),
470         installed_(NULL),
471         was_update_(false),
472         override_external_install_prompt_(
473             FeatureSwitch::prompt_for_external_extensions(),
474             false),
475         expected_extensions_count_(0) {
476     registrar_.Add(this,
477                    extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
478                    content::NotificationService::AllSources());
479     registrar_.Add(this,
480                    extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
481                    content::NotificationService::AllSources());
482     registrar_.Add(
483         this,
484         extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED,
485         content::NotificationService::AllSources());
486   }
487
488   virtual void Observe(int type,
489                        const content::NotificationSource& source,
490                        const content::NotificationDetails& details) OVERRIDE {
491     switch (type) {
492       case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: {
493         const Extension* extension =
494             content::Details<const Extension>(details).ptr();
495         loaded_.push_back(make_scoped_refptr(extension));
496         // The tests rely on the errors being in a certain order, which can vary
497         // depending on how filesystem iteration works.
498         std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder());
499         break;
500       }
501
502       case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: {
503         UnloadedExtensionInfo* unloaded_info =
504             content::Details<UnloadedExtensionInfo>(details).ptr();
505         const Extension* e = unloaded_info->extension;
506         unloaded_id_ = e->id();
507         unloaded_reason_ = unloaded_info->reason;
508         extensions::ExtensionList::iterator i =
509             std::find(loaded_.begin(), loaded_.end(), e);
510         // TODO(erikkay) fix so this can be an assert.  Right now the tests
511         // are manually calling clear() on loaded_, so this isn't doable.
512         if (i == loaded_.end())
513           return;
514         loaded_.erase(i);
515         break;
516       }
517       case extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED: {
518         const extensions::InstalledExtensionInfo* installed_info =
519             content::Details<const extensions::InstalledExtensionInfo>(details)
520                 .ptr();
521         installed_ = installed_info->extension;
522         was_update_ = installed_info->is_update;
523         old_name_ = installed_info->old_name;
524         break;
525       }
526
527       default:
528         DCHECK(false);
529     }
530   }
531
532   void AddMockExternalProvider(
533       extensions::ExternalProviderInterface* provider) {
534     service()->AddProviderForTesting(provider);
535   }
536
537   void MockSyncStartFlare(bool* was_called,
538                           syncer::ModelType* model_type_passed_in,
539                           syncer::ModelType model_type) {
540     *was_called = true;
541     *model_type_passed_in = model_type;
542   }
543
544  protected:
545   // Paths to some of the fake extensions.
546   base::FilePath good0_path() {
547     return data_dir()
548         .AppendASCII("good")
549         .AppendASCII("Extensions")
550         .AppendASCII(good0)
551         .AppendASCII("1.0.0.0");
552   }
553
554   base::FilePath good1_path() {
555     return data_dir()
556         .AppendASCII("good")
557         .AppendASCII("Extensions")
558         .AppendASCII(good1)
559         .AppendASCII("2");
560   }
561
562   base::FilePath good2_path() {
563     return data_dir()
564         .AppendASCII("good")
565         .AppendASCII("Extensions")
566         .AppendASCII(good2)
567         .AppendASCII("1.0");
568   }
569
570   void TestExternalProvider(MockExtensionProvider* provider,
571                             Manifest::Location location);
572
573   void PackCRX(const base::FilePath& dir_path,
574                const base::FilePath& pem_path,
575                const base::FilePath& crx_path) {
576     // Use the existing pem key, if provided.
577     base::FilePath pem_output_path;
578     if (pem_path.value().empty()) {
579       pem_output_path = crx_path.DirName().AppendASCII("temp.pem");
580     } else {
581       ASSERT_TRUE(base::PathExists(pem_path));
582     }
583
584     ASSERT_TRUE(base::DeleteFile(crx_path, false));
585
586     scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
587     ASSERT_TRUE(creator->Run(dir_path,
588                              crx_path,
589                              pem_path,
590                              pem_output_path,
591                              ExtensionCreator::kOverwriteCRX));
592
593     ASSERT_TRUE(base::PathExists(crx_path));
594   }
595
596   enum InstallState {
597     INSTALL_FAILED,
598     INSTALL_UPDATED,
599     INSTALL_NEW,
600     INSTALL_WITHOUT_LOAD,
601   };
602
603   const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
604                                      const base::FilePath& pem_path,
605                                      InstallState install_state,
606                                      int creation_flags) {
607     base::FilePath crx_path;
608     base::ScopedTempDir temp_dir;
609     EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
610     crx_path = temp_dir.path().AppendASCII("temp.crx");
611
612     PackCRX(dir_path, pem_path, crx_path);
613     return InstallCRX(crx_path, install_state, creation_flags);
614   }
615
616   const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
617                                      const base::FilePath& pem_path,
618                                      InstallState install_state) {
619     return PackAndInstallCRX(dir_path, pem_path, install_state,
620                              Extension::NO_FLAGS);
621   }
622
623   const Extension* PackAndInstallCRX(const base::FilePath& dir_path,
624                                      InstallState install_state) {
625     return PackAndInstallCRX(dir_path, base::FilePath(), install_state,
626                              Extension::NO_FLAGS);
627   }
628
629   // Attempts to install an extension. Use INSTALL_FAILED if the installation
630   // is expected to fail.
631   // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is
632   // non-empty, expects that the existing extension's title was
633   // |expected_old_name|.
634   const Extension* InstallCRX(const base::FilePath& path,
635                               InstallState install_state,
636                               int creation_flags,
637                               const std::string& expected_old_name) {
638     InstallCRXInternal(path, creation_flags);
639     return VerifyCrxInstall(path, install_state, expected_old_name);
640   }
641
642   // Attempts to install an extension. Use INSTALL_FAILED if the installation
643   // is expected to fail.
644   const Extension* InstallCRX(const base::FilePath& path,
645                               InstallState install_state,
646                               int creation_flags) {
647     return InstallCRX(path, install_state, creation_flags, std::string());
648   }
649
650   // Attempts to install an extension. Use INSTALL_FAILED if the installation
651   // is expected to fail.
652   const Extension* InstallCRX(const base::FilePath& path,
653                               InstallState install_state) {
654     return InstallCRX(path, install_state, Extension::NO_FLAGS);
655   }
656
657   const Extension* InstallCRXFromWebStore(const base::FilePath& path,
658                                           InstallState install_state) {
659     InstallCRXInternal(path, Extension::FROM_WEBSTORE);
660     return VerifyCrxInstall(path, install_state);
661   }
662
663   const Extension* InstallCRXWithLocation(const base::FilePath& crx_path,
664                                           Manifest::Location install_location,
665                                           InstallState install_state) {
666     EXPECT_TRUE(base::PathExists(crx_path))
667         << "Path does not exist: "<< crx_path.value().c_str();
668     // no client (silent install)
669     scoped_refptr<CrxInstaller> installer(
670         CrxInstaller::CreateSilent(service()));
671     installer->set_install_source(install_location);
672
673     content::WindowedNotificationObserver observer(
674         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
675         content::NotificationService::AllSources());
676     installer->InstallCrx(crx_path);
677     observer.Wait();
678
679     return VerifyCrxInstall(crx_path, install_state);
680   }
681
682   // Verifies the result of a CRX installation. Used by InstallCRX. Set the
683   // |install_state| to INSTALL_FAILED if the installation is expected to fail.
684   // Returns an Extension pointer if the install succeeded, NULL otherwise.
685   const Extension* VerifyCrxInstall(const base::FilePath& path,
686                                     InstallState install_state) {
687     return VerifyCrxInstall(path, install_state, std::string());
688   }
689
690   // Verifies the result of a CRX installation. Used by InstallCRX. Set the
691   // |install_state| to INSTALL_FAILED if the installation is expected to fail.
692   // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is
693   // non-empty, expects that the existing extension's title was
694   // |expected_old_name|.
695   // Returns an Extension pointer if the install succeeded, NULL otherwise.
696   const Extension* VerifyCrxInstall(const base::FilePath& path,
697                                     InstallState install_state,
698                                     const std::string& expected_old_name) {
699     std::vector<base::string16> errors = GetErrors();
700     const Extension* extension = NULL;
701     if (install_state != INSTALL_FAILED) {
702       if (install_state == INSTALL_NEW)
703         ++expected_extensions_count_;
704
705       EXPECT_TRUE(installed_) << path.value();
706       // If and only if INSTALL_UPDATED, it should have the is_update flag.
707       EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_)
708           << path.value();
709       // If INSTALL_UPDATED, old_name_ should match the given string.
710       if (install_state == INSTALL_UPDATED && !expected_old_name.empty())
711         EXPECT_EQ(expected_old_name, old_name_);
712       EXPECT_EQ(0u, errors.size()) << path.value();
713
714       if (install_state == INSTALL_WITHOUT_LOAD) {
715         EXPECT_EQ(0u, loaded_.size()) << path.value();
716       } else {
717         EXPECT_EQ(1u, loaded_.size()) << path.value();
718         size_t actual_extension_count =
719             registry()->enabled_extensions().size() +
720             registry()->disabled_extensions().size();
721         EXPECT_EQ(expected_extensions_count_, actual_extension_count) <<
722             path.value();
723         extension = loaded_[0].get();
724         EXPECT_TRUE(service()->GetExtensionById(extension->id(), false))
725             << path.value();
726       }
727
728       for (std::vector<base::string16>::iterator err = errors.begin();
729         err != errors.end(); ++err) {
730         LOG(ERROR) << *err;
731       }
732     } else {
733       EXPECT_FALSE(installed_) << path.value();
734       EXPECT_EQ(0u, loaded_.size()) << path.value();
735       EXPECT_EQ(1u, errors.size()) << path.value();
736     }
737
738     installed_ = NULL;
739     was_update_ = false;
740     old_name_ = "";
741     loaded_.clear();
742     ExtensionErrorReporter::GetInstance()->ClearErrors();
743     return extension;
744   }
745
746   enum UpdateState {
747     FAILED_SILENTLY,
748     FAILED,
749     UPDATED,
750     INSTALLED,
751     DISABLED,
752     ENABLED
753   };
754
755   void BlackListWebGL() {
756     static const std::string json_blacklist =
757       "{\n"
758       "  \"name\": \"gpu blacklist\",\n"
759       "  \"version\": \"1.0\",\n"
760       "  \"entries\": [\n"
761       "    {\n"
762       "      \"id\": 1,\n"
763       "      \"features\": [\"webgl\"]\n"
764       "    }\n"
765       "  ]\n"
766       "}";
767     gpu::GPUInfo gpu_info;
768     content::GpuDataManager::GetInstance()->InitializeForTesting(
769         json_blacklist, gpu_info);
770   }
771
772   // Helper method to set up a WindowedNotificationObserver to wait for a
773   // specific CrxInstaller to finish if we don't know the value of the
774   // |installer| yet.
775   static bool IsCrxInstallerDone(extensions::CrxInstaller** installer,
776                                  const content::NotificationSource& source,
777                                  const content::NotificationDetails& details) {
778     return content::Source<extensions::CrxInstaller>(source).ptr() ==
779            *installer;
780   }
781
782   void PackCRXAndUpdateExtension(const std::string& id,
783                                  const base::FilePath& dir_path,
784                                  const base::FilePath& pem_path,
785                                  UpdateState expected_state) {
786     base::ScopedTempDir temp_dir;
787     EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
788     base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx");
789
790     PackCRX(dir_path, pem_path, crx_path);
791     UpdateExtension(id, crx_path, expected_state);
792   }
793
794   void UpdateExtension(const std::string& id,
795                        const base::FilePath& in_path,
796                        UpdateState expected_state) {
797     ASSERT_TRUE(base::PathExists(in_path));
798
799     // We need to copy this to a temporary location because Update() will delete
800     // it.
801     base::FilePath path = temp_dir().path();
802     path = path.Append(in_path.BaseName());
803     ASSERT_TRUE(base::CopyFile(in_path, path));
804
805     int previous_enabled_extension_count =
806         registry()->enabled_extensions().size();
807     int previous_installed_extension_count =
808         previous_enabled_extension_count +
809         registry()->disabled_extensions().size();
810
811     extensions::CrxInstaller* installer = NULL;
812     content::WindowedNotificationObserver observer(
813         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
814         base::Bind(&IsCrxInstallerDone, &installer));
815     service()->UpdateExtension(id, path, true, &installer);
816
817     if (installer)
818       observer.Wait();
819     else
820       base::RunLoop().RunUntilIdle();
821
822     std::vector<base::string16> errors = GetErrors();
823     int error_count = errors.size();
824     int enabled_extension_count = registry()->enabled_extensions().size();
825     int installed_extension_count =
826         enabled_extension_count + registry()->disabled_extensions().size();
827
828     int expected_error_count = (expected_state == FAILED) ? 1 : 0;
829     EXPECT_EQ(expected_error_count, error_count) << path.value();
830
831     if (expected_state <= FAILED) {
832       EXPECT_EQ(previous_enabled_extension_count,
833                 enabled_extension_count);
834       EXPECT_EQ(previous_installed_extension_count,
835                 installed_extension_count);
836     } else {
837       int expected_installed_extension_count =
838           (expected_state >= INSTALLED) ? 1 : 0;
839       int expected_enabled_extension_count =
840           (expected_state >= ENABLED) ? 1 : 0;
841       EXPECT_EQ(expected_installed_extension_count,
842                 installed_extension_count);
843       EXPECT_EQ(expected_enabled_extension_count,
844                 enabled_extension_count);
845     }
846
847     // Update() should the temporary input file.
848     EXPECT_FALSE(base::PathExists(path));
849   }
850
851   void TerminateExtension(const std::string& id) {
852     const Extension* extension = service()->GetInstalledExtension(id);
853     if (!extension) {
854       ADD_FAILURE();
855       return;
856     }
857     service()->TrackTerminatedExtensionForTest(extension);
858   }
859
860   size_t GetPrefKeyCount() {
861     const base::DictionaryValue* dict =
862         profile()->GetPrefs()->GetDictionary("extensions.settings");
863     if (!dict) {
864       ADD_FAILURE();
865       return 0;
866     }
867     return dict->size();
868   }
869
870   void UninstallExtension(const std::string& id, bool use_helper) {
871     // Verify that the extension is installed.
872     base::FilePath extension_path = extensions_install_dir().AppendASCII(id);
873     EXPECT_TRUE(base::PathExists(extension_path));
874     size_t pref_key_count = GetPrefKeyCount();
875     EXPECT_GT(pref_key_count, 0u);
876     ValidateIntegerPref(id, "state", Extension::ENABLED);
877
878     // Uninstall it.
879     if (use_helper) {
880       EXPECT_TRUE(ExtensionService::UninstallExtensionHelper(
881           service(), id, extensions::UNINSTALL_REASON_FOR_TESTING));
882     } else {
883       EXPECT_TRUE(service()->UninstallExtension(
884           id,
885           extensions::UNINSTALL_REASON_FOR_TESTING,
886           base::Bind(&base::DoNothing),
887           NULL));
888     }
889     --expected_extensions_count_;
890
891     // We should get an unload notification.
892     EXPECT_FALSE(unloaded_id_.empty());
893     EXPECT_EQ(id, unloaded_id_);
894
895     // Verify uninstalled state.
896     size_t new_pref_key_count = GetPrefKeyCount();
897     if (new_pref_key_count == pref_key_count) {
898       ValidateIntegerPref(id, "state",
899                           Extension::EXTERNAL_EXTENSION_UNINSTALLED);
900     } else {
901       EXPECT_EQ(new_pref_key_count, pref_key_count - 1);
902     }
903
904     // The extension should not be in the service anymore.
905     EXPECT_FALSE(service()->GetInstalledExtension(id));
906     base::RunLoop().RunUntilIdle();
907
908     // The directory should be gone.
909     EXPECT_FALSE(base::PathExists(extension_path));
910   }
911
912   void ValidatePrefKeyCount(size_t count) {
913     EXPECT_EQ(count, GetPrefKeyCount());
914   }
915
916   testing::AssertionResult ValidateBooleanPref(
917       const std::string& extension_id,
918       const std::string& pref_path,
919       bool expected_val) {
920     std::string msg = "while checking: ";
921     msg += extension_id;
922     msg += " ";
923     msg += pref_path;
924     msg += " == ";
925     msg += expected_val ? "true" : "false";
926
927     PrefService* prefs = profile()->GetPrefs();
928     const base::DictionaryValue* dict =
929         prefs->GetDictionary("extensions.settings");
930     if (!dict) {
931       return testing::AssertionFailure()
932           << "extension.settings does not exist " << msg;
933     }
934
935     const base::DictionaryValue* pref = NULL;
936     if (!dict->GetDictionary(extension_id, &pref)) {
937       return testing::AssertionFailure()
938           << "extension pref does not exist " << msg;
939     }
940
941     bool val;
942     if (!pref->GetBoolean(pref_path, &val)) {
943       return testing::AssertionFailure()
944           << pref_path << " pref not found " << msg;
945     }
946
947     return expected_val == val
948         ? testing::AssertionSuccess()
949         : testing::AssertionFailure() << "base::Value is incorrect " << msg;
950   }
951
952   bool IsPrefExist(const std::string& extension_id,
953                    const std::string& pref_path) {
954     const base::DictionaryValue* dict =
955         profile()->GetPrefs()->GetDictionary("extensions.settings");
956     if (dict == NULL) return false;
957     const base::DictionaryValue* pref = NULL;
958     if (!dict->GetDictionary(extension_id, &pref)) {
959       return false;
960     }
961     if (pref == NULL) {
962       return false;
963     }
964     bool val;
965     if (!pref->GetBoolean(pref_path, &val)) {
966       return false;
967     }
968     return true;
969   }
970
971   void ValidateIntegerPref(const std::string& extension_id,
972                            const std::string& pref_path,
973                            int expected_val) {
974     std::string msg = " while checking: ";
975     msg += extension_id;
976     msg += " ";
977     msg += pref_path;
978     msg += " == ";
979     msg += base::IntToString(expected_val);
980
981     PrefService* prefs = profile()->GetPrefs();
982     const base::DictionaryValue* dict =
983         prefs->GetDictionary("extensions.settings");
984     ASSERT_TRUE(dict != NULL) << msg;
985     const base::DictionaryValue* pref = NULL;
986     ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
987     EXPECT_TRUE(pref != NULL) << msg;
988     int val;
989     ASSERT_TRUE(pref->GetInteger(pref_path, &val)) << msg;
990     EXPECT_EQ(expected_val, val) << msg;
991   }
992
993   void ValidateStringPref(const std::string& extension_id,
994                           const std::string& pref_path,
995                           const std::string& expected_val) {
996     std::string msg = " while checking: ";
997     msg += extension_id;
998     msg += ".manifest.";
999     msg += pref_path;
1000     msg += " == ";
1001     msg += expected_val;
1002
1003     const base::DictionaryValue* dict =
1004         profile()->GetPrefs()->GetDictionary("extensions.settings");
1005     ASSERT_TRUE(dict != NULL) << msg;
1006     const base::DictionaryValue* pref = NULL;
1007     std::string manifest_path = extension_id + ".manifest";
1008     ASSERT_TRUE(dict->GetDictionary(manifest_path, &pref)) << msg;
1009     EXPECT_TRUE(pref != NULL) << msg;
1010     std::string val;
1011     ASSERT_TRUE(pref->GetString(pref_path, &val)) << msg;
1012     EXPECT_EQ(expected_val, val) << msg;
1013   }
1014
1015   void SetPref(const std::string& extension_id,
1016                const std::string& pref_path,
1017                base::Value* value,
1018                const std::string& msg) {
1019     DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings");
1020     base::DictionaryValue* dict = update.Get();
1021     ASSERT_TRUE(dict != NULL) << msg;
1022     base::DictionaryValue* pref = NULL;
1023     ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
1024     EXPECT_TRUE(pref != NULL) << msg;
1025     pref->Set(pref_path, value);
1026   }
1027
1028   void SetPrefInteg(const std::string& extension_id,
1029                     const std::string& pref_path,
1030                     int value) {
1031     std::string msg = " while setting: ";
1032     msg += extension_id;
1033     msg += " ";
1034     msg += pref_path;
1035     msg += " = ";
1036     msg += base::IntToString(value);
1037
1038     SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg);
1039   }
1040
1041   void SetPrefBool(const std::string& extension_id,
1042                    const std::string& pref_path,
1043                    bool value) {
1044     std::string msg = " while setting: ";
1045     msg += extension_id + " " + pref_path;
1046     msg += " = ";
1047     msg += (value ? "true" : "false");
1048
1049     SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg);
1050   }
1051
1052   void ClearPref(const std::string& extension_id,
1053                  const std::string& pref_path) {
1054     std::string msg = " while clearing: ";
1055     msg += extension_id + " " + pref_path;
1056
1057     DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings");
1058     base::DictionaryValue* dict = update.Get();
1059     ASSERT_TRUE(dict != NULL) << msg;
1060     base::DictionaryValue* pref = NULL;
1061     ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg;
1062     EXPECT_TRUE(pref != NULL) << msg;
1063     pref->Remove(pref_path, NULL);
1064   }
1065
1066   void SetPrefStringSet(const std::string& extension_id,
1067                         const std::string& pref_path,
1068                         const std::set<std::string>& value) {
1069     std::string msg = " while setting: ";
1070     msg += extension_id + " " + pref_path;
1071
1072     base::ListValue* list_value = new base::ListValue();
1073     for (std::set<std::string>::const_iterator iter = value.begin();
1074          iter != value.end(); ++iter)
1075       list_value->Append(new base::StringValue(*iter));
1076
1077     SetPref(extension_id, pref_path, list_value, msg);
1078   }
1079
1080   void InitPluginService() {
1081 #if defined(ENABLE_PLUGINS)
1082     PluginService::GetInstance()->Init();
1083 #endif
1084   }
1085
1086   void InitializeExtensionSyncService() {
1087     extension_sync_service_.reset(new ExtensionSyncService(
1088         profile(), ExtensionPrefs::Get(browser_context()), service()));
1089   }
1090
1091   void InitializeEmptyExtensionServiceWithTestingPrefs() {
1092     ExtensionServiceTestBase::ExtensionServiceInitParams params =
1093         CreateDefaultInitParams();
1094     params.pref_file = base::FilePath();
1095     InitializeExtensionService(params);
1096   }
1097
1098   extensions::ManagementPolicy* GetManagementPolicy() {
1099     return ExtensionSystem::Get(browser_context())->management_policy();
1100   }
1101
1102   ExtensionSyncService* extension_sync_service() {
1103     return extension_sync_service_.get();
1104   }
1105
1106  protected:
1107   typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable>
1108       ManagementPrefUpdater;
1109   scoped_ptr<ExtensionSyncService> extension_sync_service_;
1110   extensions::ExtensionList loaded_;
1111   std::string unloaded_id_;
1112   UnloadedExtensionInfo::Reason unloaded_reason_;
1113   const Extension* installed_;
1114   bool was_update_;
1115   std::string old_name_;
1116   FeatureSwitch::ScopedOverride override_external_install_prompt_;
1117
1118  private:
1119   // Create a CrxInstaller and install the CRX file.
1120   // Instead of calling this method yourself, use InstallCRX(), which does extra
1121   // error checking.
1122   void InstallCRXInternal(const base::FilePath& crx_path) {
1123     InstallCRXInternal(crx_path, Extension::NO_FLAGS);
1124   }
1125
1126   void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) {
1127     ASSERT_TRUE(base::PathExists(crx_path))
1128         << "Path does not exist: "<< crx_path.value().c_str();
1129     scoped_refptr<CrxInstaller> installer(
1130         CrxInstaller::CreateSilent(service()));
1131     installer->set_creation_flags(creation_flags);
1132     if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT))
1133       installer->set_allow_silent_install(true);
1134
1135     content::WindowedNotificationObserver observer(
1136         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1137         content::Source<extensions::CrxInstaller>(installer.get()));
1138
1139     installer->InstallCrx(crx_path);
1140
1141     observer.Wait();
1142   }
1143
1144   size_t expected_extensions_count_;
1145   content::NotificationRegistrar registrar_;
1146 };
1147
1148 // Receives notifications from a PackExtensionJob, indicating either that
1149 // packing succeeded or that there was some error.
1150 class PackExtensionTestClient : public extensions::PackExtensionJob::Client {
1151  public:
1152   PackExtensionTestClient(const base::FilePath& expected_crx_path,
1153                           const base::FilePath& expected_private_key_path);
1154   virtual void OnPackSuccess(const base::FilePath& crx_path,
1155                              const base::FilePath& private_key_path) OVERRIDE;
1156   virtual void OnPackFailure(const std::string& error_message,
1157                              ExtensionCreator::ErrorType type) OVERRIDE;
1158
1159  private:
1160   const base::FilePath expected_crx_path_;
1161   const base::FilePath expected_private_key_path_;
1162   DISALLOW_COPY_AND_ASSIGN(PackExtensionTestClient);
1163 };
1164
1165 PackExtensionTestClient::PackExtensionTestClient(
1166     const base::FilePath& expected_crx_path,
1167     const base::FilePath& expected_private_key_path)
1168     : expected_crx_path_(expected_crx_path),
1169       expected_private_key_path_(expected_private_key_path) {}
1170
1171 // If packing succeeded, we make sure that the package names match our
1172 // expectations.
1173 void PackExtensionTestClient::OnPackSuccess(
1174     const base::FilePath& crx_path,
1175     const base::FilePath& private_key_path) {
1176   // We got the notification and processed it; we don't expect any further tasks
1177   // to be posted to the current thread, so we should stop blocking and continue
1178   // on with the rest of the test.
1179   // This call to |Quit()| matches the call to |Run()| in the
1180   // |PackPunctuatedExtension| test.
1181   base::MessageLoop::current()->Quit();
1182   EXPECT_EQ(expected_crx_path_.value(), crx_path.value());
1183   EXPECT_EQ(expected_private_key_path_.value(), private_key_path.value());
1184   ASSERT_TRUE(base::PathExists(private_key_path));
1185 }
1186
1187 // The tests are designed so that we never expect to see a packing error.
1188 void PackExtensionTestClient::OnPackFailure(const std::string& error_message,
1189                                             ExtensionCreator::ErrorType type) {
1190   if (type == ExtensionCreator::kCRXExists)
1191      FAIL() << "Packing should not fail.";
1192   else
1193      FAIL() << "Existing CRX should have been overwritten.";
1194 }
1195
1196 // Test loading good extensions from the profile directory.
1197 TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectorySuccess) {
1198   InitPluginService();
1199   InitializeGoodInstalledExtensionService();
1200   service()->Init();
1201
1202   uint32 expected_num_extensions = 3u;
1203   ASSERT_EQ(expected_num_extensions, loaded_.size());
1204
1205   EXPECT_EQ(std::string(good0), loaded_[0]->id());
1206   EXPECT_EQ(std::string("My extension 1"),
1207             loaded_[0]->name());
1208   EXPECT_EQ(std::string("The first extension that I made."),
1209             loaded_[0]->description());
1210   EXPECT_EQ(Manifest::INTERNAL, loaded_[0]->location());
1211   EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false));
1212   EXPECT_EQ(expected_num_extensions, registry()->enabled_extensions().size());
1213
1214   ValidatePrefKeyCount(3);
1215   ValidateIntegerPref(good0, "state", Extension::ENABLED);
1216   ValidateIntegerPref(good0, "location", Manifest::INTERNAL);
1217   ValidateIntegerPref(good1, "state", Extension::ENABLED);
1218   ValidateIntegerPref(good1, "location", Manifest::INTERNAL);
1219   ValidateIntegerPref(good2, "state", Extension::ENABLED);
1220   ValidateIntegerPref(good2, "location", Manifest::INTERNAL);
1221
1222   URLPatternSet expected_patterns;
1223   AddPattern(&expected_patterns, "file:///*");
1224   AddPattern(&expected_patterns, "http://*.google.com/*");
1225   AddPattern(&expected_patterns, "https://*.google.com/*");
1226   const Extension* extension = loaded_[0].get();
1227   const extensions::UserScriptList& scripts =
1228       extensions::ContentScriptsInfo::GetContentScripts(extension);
1229   ASSERT_EQ(2u, scripts.size());
1230   EXPECT_EQ(expected_patterns, scripts[0].url_patterns());
1231   EXPECT_EQ(2u, scripts[0].js_scripts().size());
1232   ExtensionResource resource00(extension->id(),
1233                                scripts[0].js_scripts()[0].extension_root(),
1234                                scripts[0].js_scripts()[0].relative_path());
1235   base::FilePath expected_path =
1236       base::MakeAbsoluteFilePath(extension->path().AppendASCII("script1.js"));
1237   EXPECT_TRUE(resource00.ComparePathWithDefault(expected_path));
1238   ExtensionResource resource01(extension->id(),
1239                                scripts[0].js_scripts()[1].extension_root(),
1240                                scripts[0].js_scripts()[1].relative_path());
1241   expected_path =
1242       base::MakeAbsoluteFilePath(extension->path().AppendASCII("script2.js"));
1243   EXPECT_TRUE(resource01.ComparePathWithDefault(expected_path));
1244   EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(extension));
1245   EXPECT_EQ(1u, scripts[1].url_patterns().patterns().size());
1246   EXPECT_EQ("http://*.news.com/*",
1247             scripts[1].url_patterns().begin()->GetAsString());
1248   ExtensionResource resource10(extension->id(),
1249                                scripts[1].js_scripts()[0].extension_root(),
1250                                scripts[1].js_scripts()[0].relative_path());
1251   expected_path =
1252       extension->path().AppendASCII("js_files").AppendASCII("script3.js");
1253   expected_path = base::MakeAbsoluteFilePath(expected_path);
1254   EXPECT_TRUE(resource10.ComparePathWithDefault(expected_path));
1255
1256   expected_patterns.ClearPatterns();
1257   AddPattern(&expected_patterns, "http://*.google.com/*");
1258   AddPattern(&expected_patterns, "https://*.google.com/*");
1259   EXPECT_EQ(
1260       expected_patterns,
1261       extension->permissions_data()->active_permissions()->explicit_hosts());
1262
1263   EXPECT_EQ(std::string(good1), loaded_[1]->id());
1264   EXPECT_EQ(std::string("My extension 2"), loaded_[1]->name());
1265   EXPECT_EQ(std::string(), loaded_[1]->description());
1266   EXPECT_EQ(loaded_[1]->GetResourceURL("background.html"),
1267             extensions::BackgroundInfo::GetBackgroundURL(loaded_[1].get()));
1268   EXPECT_EQ(0u,
1269             extensions::ContentScriptsInfo::GetContentScripts(loaded_[1].get())
1270                 .size());
1271
1272   // We don't parse the plugins section on Chrome OS.
1273 #if defined(OS_CHROMEOS)
1274   EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(loaded_[1].get()));
1275 #else
1276   ASSERT_TRUE(extensions::PluginInfo::HasPlugins(loaded_[1].get()));
1277   const std::vector<extensions::PluginInfo>* plugins =
1278       extensions::PluginInfo::GetPlugins(loaded_[1].get());
1279   ASSERT_TRUE(plugins);
1280   ASSERT_EQ(2u, plugins->size());
1281   EXPECT_EQ(loaded_[1]->path().AppendASCII("content_plugin.dll").value(),
1282             plugins->at(0).path.value());
1283   EXPECT_TRUE(plugins->at(0).is_public);
1284   EXPECT_EQ(loaded_[1]->path().AppendASCII("extension_plugin.dll").value(),
1285             plugins->at(1).path.value());
1286   EXPECT_FALSE(plugins->at(1).is_public);
1287 #endif
1288
1289   EXPECT_EQ(Manifest::INTERNAL, loaded_[1]->location());
1290
1291   int index = expected_num_extensions - 1;
1292   EXPECT_EQ(std::string(good2), loaded_[index]->id());
1293   EXPECT_EQ(std::string("My extension 3"), loaded_[index]->name());
1294   EXPECT_EQ(std::string(), loaded_[index]->description());
1295   EXPECT_EQ(0u,
1296             extensions::ContentScriptsInfo::GetContentScripts(
1297                 loaded_[index].get()).size());
1298   EXPECT_EQ(Manifest::INTERNAL, loaded_[index]->location());
1299 };
1300
1301 // Test loading bad extensions from the profile directory.
1302 TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectoryFail) {
1303   // Initialize the test dir with a bad Preferences/extensions.
1304   base::FilePath source_install_dir =
1305       data_dir().AppendASCII("bad").AppendASCII("Extensions");
1306   base::FilePath pref_path =
1307       source_install_dir.DirName().Append(chrome::kPreferencesFilename);
1308
1309   InitializeInstalledExtensionService(pref_path, source_install_dir);
1310
1311   service()->Init();
1312
1313   ASSERT_EQ(4u, GetErrors().size());
1314   ASSERT_EQ(0u, loaded_.size());
1315
1316   EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[0]),
1317       std::string("Could not load extension from '*'. ") +
1318       extensions::manifest_errors::kManifestUnreadable)) <<
1319       base::UTF16ToUTF8(GetErrors()[0]);
1320
1321   EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[1]),
1322       std::string("Could not load extension from '*'. ") +
1323       extensions::manifest_errors::kManifestUnreadable)) <<
1324       base::UTF16ToUTF8(GetErrors()[1]);
1325
1326   EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[2]),
1327       std::string("Could not load extension from '*'. ") +
1328       extensions::manifest_errors::kMissingFile)) <<
1329       base::UTF16ToUTF8(GetErrors()[2]);
1330
1331   EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[3]),
1332       std::string("Could not load extension from '*'. ") +
1333       extensions::manifest_errors::kManifestUnreadable)) <<
1334       base::UTF16ToUTF8(GetErrors()[3]);
1335 };
1336
1337 // Test various cases for delayed install because of missing imports.
1338 TEST_F(ExtensionServiceTest, PendingImports) {
1339   InitPluginService();
1340
1341   base::FilePath source_install_dir =
1342       data_dir().AppendASCII("pending_updates_with_imports").AppendASCII(
1343           "Extensions");
1344   base::FilePath pref_path =
1345       source_install_dir.DirName().Append(chrome::kPreferencesFilename);
1346
1347   InitializeInstalledExtensionService(pref_path, source_install_dir);
1348
1349   // Verify there are no pending extensions initially.
1350   EXPECT_FALSE(service()->pending_extension_manager()->HasPendingExtensions());
1351
1352   service()->Init();
1353   // Wait for GarbageCollectExtensions task to complete.
1354   base::RunLoop().RunUntilIdle();
1355
1356   // These extensions are used by the extensions we test below, they must be
1357   // installed.
1358   EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII(
1359       "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0")));
1360   EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII(
1361       "hpiknbiabeeppbpihjehijgoemciehgk/2")));
1362
1363   // Each of these extensions should have been rejected because of dependencies
1364   // that cannot be satisfied.
1365   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1366   EXPECT_FALSE(
1367       prefs->GetDelayedInstallInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1368   EXPECT_FALSE(
1369       prefs->GetInstalledExtensionInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1370   EXPECT_FALSE(
1371       prefs->GetDelayedInstallInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
1372   EXPECT_FALSE(
1373       prefs->GetInstalledExtensionInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
1374   EXPECT_FALSE(
1375       prefs->GetDelayedInstallInfo("cccccccccccccccccccccccccccccccc"));
1376   EXPECT_FALSE(
1377       prefs->GetInstalledExtensionInfo("cccccccccccccccccccccccccccccccc"));
1378
1379   // Make sure the import started for the extension with a dependency.
1380   EXPECT_TRUE(
1381       prefs->GetDelayedInstallInfo("behllobkkfkfnphdnhnkndlbkcpglgmj"));
1382   EXPECT_EQ(ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS,
1383       prefs->GetDelayedInstallReason("behllobkkfkfnphdnhnkndlbkcpglgmj"));
1384
1385   EXPECT_FALSE(base::PathExists(extensions_install_dir().AppendASCII(
1386       "behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0")));
1387
1388   EXPECT_TRUE(service()->pending_extension_manager()->HasPendingExtensions());
1389   std::string pending_id("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
1390   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(pending_id));
1391   // Remove it because we are not testing the pending extension manager's
1392   // ability to download and install extensions.
1393   EXPECT_TRUE(service()->pending_extension_manager()->Remove(pending_id));
1394 }
1395
1396 // Test installing extensions. This test tries to install few extensions using
1397 // crx files. If you need to change those crx files, feel free to repackage
1398 // them, throw away the key used and change the id's above.
1399 TEST_F(ExtensionServiceTest, InstallExtension) {
1400   InitializeEmptyExtensionService();
1401
1402   // Extensions not enabled.
1403   service()->set_extensions_enabled(false);
1404   base::FilePath path = data_dir().AppendASCII("good.crx");
1405   InstallCRX(path, INSTALL_FAILED);
1406   service()->set_extensions_enabled(true);
1407
1408   ValidatePrefKeyCount(0);
1409
1410   // A simple extension that should install without error.
1411   path = data_dir().AppendASCII("good.crx");
1412   InstallCRX(path, INSTALL_NEW);
1413   // TODO(erikkay): verify the contents of the installed extension.
1414
1415   int pref_count = 0;
1416   ValidatePrefKeyCount(++pref_count);
1417   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
1418   ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
1419
1420   // An extension with page actions.
1421   path = data_dir().AppendASCII("page_action.crx");
1422   InstallCRX(path, INSTALL_NEW);
1423   ValidatePrefKeyCount(++pref_count);
1424   ValidateIntegerPref(page_action, "state", Extension::ENABLED);
1425   ValidateIntegerPref(page_action, "location", Manifest::INTERNAL);
1426
1427   // Bad signature.
1428   path = data_dir().AppendASCII("bad_signature.crx");
1429   InstallCRX(path, INSTALL_FAILED);
1430   ValidatePrefKeyCount(pref_count);
1431
1432   // 0-length extension file.
1433   path = data_dir().AppendASCII("not_an_extension.crx");
1434   InstallCRX(path, INSTALL_FAILED);
1435   ValidatePrefKeyCount(pref_count);
1436
1437   // Bad magic number.
1438   path = data_dir().AppendASCII("bad_magic.crx");
1439   InstallCRX(path, INSTALL_FAILED);
1440   ValidatePrefKeyCount(pref_count);
1441
1442   // Packed extensions may have folders or files that have underscores.
1443   // This will only cause a warning, rather than a fatal error.
1444   path = data_dir().AppendASCII("bad_underscore.crx");
1445   InstallCRX(path, INSTALL_NEW);
1446   ValidatePrefKeyCount(++pref_count);
1447
1448   // A test for an extension with a 2048-bit public key.
1449   path = data_dir().AppendASCII("good2048.crx");
1450   InstallCRX(path, INSTALL_NEW);
1451   ValidatePrefKeyCount(++pref_count);
1452   ValidateIntegerPref(good2048, "state", Extension::ENABLED);
1453   ValidateIntegerPref(good2048, "location", Manifest::INTERNAL);
1454
1455   // TODO(erikkay): add more tests for many of the failure cases.
1456   // TODO(erikkay): add tests for upgrade cases.
1457 }
1458
1459 struct MockExtensionRegistryObserver
1460     : public extensions::ExtensionRegistryObserver {
1461   virtual void OnExtensionWillBeInstalled(
1462       content::BrowserContext* browser_context,
1463       const Extension* extension,
1464       bool is_update,
1465       bool from_ephemeral,
1466       const std::string& old_name) OVERRIDE {
1467     last_extension_installed = extension->id();
1468   }
1469
1470   virtual void OnExtensionUninstalled(
1471       content::BrowserContext* browser_context,
1472       const Extension* extension,
1473       extensions::UninstallReason reason) OVERRIDE {
1474     last_extension_uninstalled = extension->id();
1475   }
1476
1477   std::string last_extension_installed;
1478   std::string last_extension_uninstalled;
1479 };
1480
1481 // Test that correct notifications are sent to ExtensionRegistryObserver on
1482 // extension install and uninstall.
1483 TEST_F(ExtensionServiceTest, InstallObserverNotified) {
1484   InitializeEmptyExtensionService();
1485
1486   extensions::ExtensionRegistry* registry(
1487       extensions::ExtensionRegistry::Get(profile()));
1488   MockExtensionRegistryObserver observer;
1489   registry->AddObserver(&observer);
1490
1491   // A simple extension that should install without error.
1492   ASSERT_TRUE(observer.last_extension_installed.empty());
1493   base::FilePath path = data_dir().AppendASCII("good.crx");
1494   InstallCRX(path, INSTALL_NEW);
1495   ASSERT_EQ(good_crx, observer.last_extension_installed);
1496
1497   // Uninstall the extension.
1498   ASSERT_TRUE(observer.last_extension_uninstalled.empty());
1499   UninstallExtension(good_crx, false);
1500   ASSERT_EQ(good_crx, observer.last_extension_uninstalled);
1501
1502   registry->RemoveObserver(&observer);
1503 }
1504
1505 // Tests that flags passed to OnExternalExtensionFileFound() make it to the
1506 // extension object.
1507 TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) {
1508   const char kPrefFromBookmark[] = "from_bookmark";
1509
1510   InitializeEmptyExtensionService();
1511
1512   base::FilePath path = data_dir().AppendASCII("good.crx");
1513   service()->set_extensions_enabled(true);
1514
1515   // Register and install an external extension.
1516   Version version("1.0.0.0");
1517   content::WindowedNotificationObserver observer(
1518       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1519       content::NotificationService::AllSources());
1520   if (service()->OnExternalExtensionFileFound(good_crx,
1521                                               &version,
1522                                               path,
1523                                               Manifest::EXTERNAL_PREF,
1524                                               Extension::FROM_BOOKMARK,
1525                                               false /* mark_acknowledged */)) {
1526     observer.Wait();
1527   }
1528
1529   const Extension* extension = service()->GetExtensionById(good_crx, false);
1530   ASSERT_TRUE(extension);
1531   ASSERT_TRUE(extension->from_bookmark());
1532   ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true));
1533
1534   // Upgrade to version 2.0, the flag should be preserved.
1535   path = data_dir().AppendASCII("good2.crx");
1536   UpdateExtension(good_crx, path, ENABLED);
1537   ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true));
1538   extension = service()->GetExtensionById(good_crx, false);
1539   ASSERT_TRUE(extension);
1540   ASSERT_TRUE(extension->from_bookmark());
1541 }
1542
1543 // Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED
1544 TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) {
1545   InitializeEmptyExtensionService();
1546
1547   base::FilePath path = data_dir().AppendASCII("good.crx");
1548   service()->set_extensions_enabled(true);
1549
1550   // Install an external extension.
1551   Version version("1.0.0.0");
1552   content::WindowedNotificationObserver observer(
1553       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1554       content::NotificationService::AllSources());
1555   if (service()->OnExternalExtensionFileFound(good_crx,
1556                                               &version,
1557                                               path,
1558                                               Manifest::EXTERNAL_PREF,
1559                                               Extension::NO_FLAGS,
1560                                               false)) {
1561     observer.Wait();
1562   }
1563
1564   ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
1565
1566   // Uninstall it and check that its killbit gets set.
1567   UninstallExtension(good_crx, false);
1568   ValidateIntegerPref(good_crx, "state",
1569                       Extension::EXTERNAL_EXTENSION_UNINSTALLED);
1570
1571   // Try to re-install it externally. This should fail because of the killbit.
1572   service()->OnExternalExtensionFileFound(good_crx,
1573                                           &version,
1574                                           path,
1575                                           Manifest::EXTERNAL_PREF,
1576                                           Extension::NO_FLAGS,
1577                                           false);
1578   base::RunLoop().RunUntilIdle();
1579   ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
1580   ValidateIntegerPref(good_crx, "state",
1581                       Extension::EXTERNAL_EXTENSION_UNINSTALLED);
1582
1583   version = Version("1.0.0.1");
1584   // Repeat the same thing with a newer version of the extension.
1585   path = data_dir().AppendASCII("good2.crx");
1586   service()->OnExternalExtensionFileFound(good_crx,
1587                                           &version,
1588                                           path,
1589                                           Manifest::EXTERNAL_PREF,
1590                                           Extension::NO_FLAGS,
1591                                           false);
1592   base::RunLoop().RunUntilIdle();
1593   ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
1594   ValidateIntegerPref(good_crx, "state",
1595                       Extension::EXTERNAL_EXTENSION_UNINSTALLED);
1596
1597   // Try adding the same extension from an external update URL.
1598   ASSERT_FALSE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
1599       good_crx,
1600       std::string(),
1601       GURL("http:://fake.update/url"),
1602       Manifest::EXTERNAL_PREF_DOWNLOAD,
1603       Extension::NO_FLAGS,
1604       false));
1605
1606   ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
1607 }
1608
1609 // Test that uninstalling an external extension does not crash when
1610 // the extension could not be loaded.
1611 // This extension shown in preferences file requires an experimental permission.
1612 // It could not be loaded without such permission.
1613 TEST_F(ExtensionServiceTest, UninstallingNotLoadedExtension) {
1614   base::FilePath source_install_dir =
1615       data_dir().AppendASCII("good").AppendASCII("Extensions");
1616   // The preference contains an external extension
1617   // that requires 'experimental' permission.
1618   base::FilePath pref_path = source_install_dir
1619       .DirName()
1620       .AppendASCII("PreferencesExperimental");
1621
1622   // Aforementioned extension will not be loaded if
1623   // there is no '--enable-experimental-extension-apis' command line flag.
1624   InitializeInstalledExtensionService(pref_path, source_install_dir);
1625
1626   service()->Init();
1627
1628   // Check and try to uninstall it.
1629   // If we don't check whether the extension is loaded before we uninstall it
1630   // in CheckExternalUninstall, a crash will happen here because we will get or
1631   // dereference a NULL pointer (extension) inside UninstallExtension.
1632   MockExtensionProvider provider(NULL, Manifest::EXTERNAL_REGISTRY);
1633   service()->OnExternalProviderReady(&provider);
1634 }
1635
1636 // Test that external extensions with incorrect IDs are not installed.
1637 TEST_F(ExtensionServiceTest, FailOnWrongId) {
1638   InitializeEmptyExtensionService();
1639   base::FilePath path = data_dir().AppendASCII("good.crx");
1640   service()->set_extensions_enabled(true);
1641
1642   Version version("1.0.0.0");
1643
1644   const std::string wrong_id = all_zero;
1645   const std::string correct_id = good_crx;
1646   ASSERT_NE(correct_id, wrong_id);
1647
1648   // Install an external extension with an ID from the external
1649   // source that is not equal to the ID in the extension manifest.
1650   content::WindowedNotificationObserver observer(
1651       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1652       content::NotificationService::AllSources());
1653   service()->OnExternalExtensionFileFound(wrong_id,
1654                                           &version,
1655                                           path,
1656                                           Manifest::EXTERNAL_PREF,
1657                                           Extension::NO_FLAGS,
1658                                           false);
1659
1660   observer.Wait();
1661   ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
1662
1663   // Try again with the right ID. Expect success.
1664   content::WindowedNotificationObserver observer2(
1665       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1666       content::NotificationService::AllSources());
1667   if (service()->OnExternalExtensionFileFound(correct_id,
1668                                               &version,
1669                                               path,
1670                                               Manifest::EXTERNAL_PREF,
1671                                               Extension::NO_FLAGS,
1672                                               false)) {
1673     observer2.Wait();
1674   }
1675   ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
1676 }
1677
1678 // Test that external extensions with incorrect versions are not installed.
1679 TEST_F(ExtensionServiceTest, FailOnWrongVersion) {
1680   InitializeEmptyExtensionService();
1681   base::FilePath path = data_dir().AppendASCII("good.crx");
1682   service()->set_extensions_enabled(true);
1683
1684   // Install an external extension with a version from the external
1685   // source that is not equal to the version in the extension manifest.
1686   Version wrong_version("1.2.3.4");
1687   content::WindowedNotificationObserver observer(
1688       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1689       content::NotificationService::AllSources());
1690   service()->OnExternalExtensionFileFound(good_crx,
1691                                           &wrong_version,
1692                                           path,
1693                                           Manifest::EXTERNAL_PREF,
1694                                           Extension::NO_FLAGS,
1695                                           false);
1696
1697   observer.Wait();
1698   ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
1699
1700   // Try again with the right version. Expect success.
1701   service()->pending_extension_manager()->Remove(good_crx);
1702   Version correct_version("1.0.0.0");
1703   content::WindowedNotificationObserver observer2(
1704       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
1705       content::NotificationService::AllSources());
1706   if (service()->OnExternalExtensionFileFound(good_crx,
1707                                               &correct_version,
1708                                               path,
1709                                               Manifest::EXTERNAL_PREF,
1710                                               Extension::NO_FLAGS,
1711                                               false)) {
1712     observer2.Wait();
1713   }
1714   ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
1715 }
1716
1717 // Install a user script (they get converted automatically to an extension)
1718 TEST_F(ExtensionServiceTest, InstallUserScript) {
1719   // The details of script conversion are tested elsewhere, this just tests
1720   // integration with ExtensionService.
1721   InitializeEmptyExtensionService();
1722
1723   base::FilePath path = data_dir().AppendASCII("user_script_basic.user.js");
1724
1725   ASSERT_TRUE(base::PathExists(path));
1726   scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service()));
1727   installer->set_allow_silent_install(true);
1728   installer->InstallUserScript(
1729       path,
1730       GURL("http://www.aaronboodman.com/scripts/user_script_basic.user.js"));
1731
1732   base::RunLoop().RunUntilIdle();
1733   std::vector<base::string16> errors = GetErrors();
1734   EXPECT_TRUE(installed_) << "Nothing was installed.";
1735   EXPECT_FALSE(was_update_) << path.value();
1736   ASSERT_EQ(1u, loaded_.size()) << "Nothing was loaded.";
1737   EXPECT_EQ(0u, errors.size()) << "There were errors: "
1738                                << JoinString(errors, ',');
1739   EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false))
1740       << path.value();
1741
1742   installed_ = NULL;
1743   was_update_ = false;
1744   loaded_.clear();
1745   ExtensionErrorReporter::GetInstance()->ClearErrors();
1746 }
1747
1748 // Extensions don't install during shutdown.
1749 TEST_F(ExtensionServiceTest, InstallExtensionDuringShutdown) {
1750   InitializeEmptyExtensionService();
1751
1752   // Simulate shutdown.
1753   service()->set_browser_terminating_for_test(true);
1754
1755   base::FilePath path = data_dir().AppendASCII("good.crx");
1756   scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service()));
1757   installer->set_allow_silent_install(true);
1758   installer->InstallCrx(path);
1759   base::RunLoop().RunUntilIdle();
1760
1761   EXPECT_FALSE(installed_) << "Extension installed during shutdown.";
1762   ASSERT_EQ(0u, loaded_.size()) << "Extension loaded during shutdown.";
1763 }
1764
1765 // This tests that the granted permissions preferences are correctly set when
1766 // installing an extension.
1767 TEST_F(ExtensionServiceTest, GrantedPermissions) {
1768   InitializeEmptyExtensionService();
1769   base::FilePath path = data_dir().AppendASCII("permissions");
1770
1771   base::FilePath pem_path = path.AppendASCII("unknown.pem");
1772   path = path.AppendASCII("unknown");
1773
1774   ASSERT_TRUE(base::PathExists(pem_path));
1775   ASSERT_TRUE(base::PathExists(path));
1776
1777   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1778
1779   APIPermissionSet expected_api_perms;
1780   URLPatternSet expected_host_perms;
1781
1782   // Make sure there aren't any granted permissions before the
1783   // extension is installed.
1784   scoped_refptr<PermissionSet> known_perms(
1785       prefs->GetGrantedPermissions(permissions_crx));
1786   EXPECT_FALSE(known_perms.get());
1787
1788   const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW);
1789
1790   EXPECT_EQ(0u, GetErrors().size());
1791   ASSERT_EQ(1u, registry()->enabled_extensions().size());
1792   EXPECT_EQ(permissions_crx, extension->id());
1793
1794   // Verify that the valid API permissions have been recognized.
1795   expected_api_perms.insert(APIPermission::kTab);
1796
1797   AddPattern(&expected_host_perms, "http://*.google.com/*");
1798   AddPattern(&expected_host_perms, "https://*.google.com/*");
1799   AddPattern(&expected_host_perms, "http://*.google.com.hk/*");
1800   AddPattern(&expected_host_perms, "http://www.example.com/*");
1801
1802   known_perms = prefs->GetGrantedPermissions(extension->id());
1803   EXPECT_TRUE(known_perms.get());
1804   EXPECT_FALSE(known_perms->IsEmpty());
1805   EXPECT_EQ(expected_api_perms, known_perms->apis());
1806   EXPECT_FALSE(known_perms->HasEffectiveFullAccess());
1807   EXPECT_EQ(expected_host_perms, known_perms->effective_hosts());
1808 }
1809
1810
1811 #if !defined(OS_CHROMEOS)
1812 // This tests that the granted permissions preferences are correctly set for
1813 // default apps.
1814 TEST_F(ExtensionServiceTest, DefaultAppsGrantedPermissions) {
1815   InitializeEmptyExtensionService();
1816   base::FilePath path = data_dir().AppendASCII("permissions");
1817
1818   base::FilePath pem_path = path.AppendASCII("unknown.pem");
1819   path = path.AppendASCII("unknown");
1820
1821   ASSERT_TRUE(base::PathExists(pem_path));
1822   ASSERT_TRUE(base::PathExists(path));
1823
1824   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1825
1826   APIPermissionSet expected_api_perms;
1827   URLPatternSet expected_host_perms;
1828
1829   // Make sure there aren't any granted permissions before the
1830   // extension is installed.
1831   scoped_refptr<PermissionSet> known_perms(
1832       prefs->GetGrantedPermissions(permissions_crx));
1833   EXPECT_FALSE(known_perms.get());
1834
1835   const Extension* extension = PackAndInstallCRX(
1836       path, pem_path, INSTALL_NEW, Extension::WAS_INSTALLED_BY_DEFAULT);
1837
1838   EXPECT_EQ(0u, GetErrors().size());
1839   ASSERT_EQ(1u, registry()->enabled_extensions().size());
1840   EXPECT_EQ(permissions_crx, extension->id());
1841
1842   // Verify that the valid API permissions have been recognized.
1843   expected_api_perms.insert(APIPermission::kTab);
1844
1845   known_perms = prefs->GetGrantedPermissions(extension->id());
1846   EXPECT_TRUE(known_perms.get());
1847   EXPECT_FALSE(known_perms->IsEmpty());
1848   EXPECT_EQ(expected_api_perms, known_perms->apis());
1849   EXPECT_FALSE(known_perms->HasEffectiveFullAccess());
1850 }
1851 #endif
1852
1853 #if !defined(OS_POSIX) || defined(OS_MACOSX)
1854 // Tests that the granted permissions full_access bit gets set correctly when
1855 // an extension contains an NPAPI plugin.
1856 // Only run this on platforms that support NPAPI plugins.
1857 TEST_F(ExtensionServiceTest, GrantedFullAccessPermissions) {
1858   InitPluginService();
1859
1860   InitializeEmptyExtensionService();
1861
1862   ASSERT_TRUE(base::PathExists(good1_path()));
1863   const Extension* extension = PackAndInstallCRX(good1_path(), INSTALL_NEW);
1864   EXPECT_EQ(0u, GetErrors().size());
1865   EXPECT_EQ(1u, registry()->enabled_extensions().size());
1866   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1867
1868   scoped_refptr<PermissionSet> permissions(
1869       prefs->GetGrantedPermissions(extension->id()));
1870   EXPECT_FALSE(permissions->IsEmpty());
1871   EXPECT_TRUE(permissions->HasEffectiveFullAccess());
1872   EXPECT_FALSE(permissions->apis().empty());
1873   EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin));
1874
1875   // Full access implies full host access too...
1876   EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts());
1877 }
1878 #endif
1879
1880 // Tests that the extension is disabled when permissions are missing from
1881 // the extension's granted permissions preferences. (This simulates updating
1882 // the browser to a version which recognizes more permissions).
1883 TEST_F(ExtensionServiceTest, GrantedAPIAndHostPermissions) {
1884   InitializeEmptyExtensionService();
1885
1886   base::FilePath path =
1887       data_dir().AppendASCII("permissions").AppendASCII("unknown");
1888
1889   ASSERT_TRUE(base::PathExists(path));
1890
1891   const Extension* extension = PackAndInstallCRX(path, INSTALL_NEW);
1892
1893   EXPECT_EQ(0u, GetErrors().size());
1894   EXPECT_EQ(1u, registry()->enabled_extensions().size());
1895   std::string extension_id = extension->id();
1896
1897   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
1898
1899   APIPermissionSet expected_api_permissions;
1900   URLPatternSet expected_host_permissions;
1901
1902   expected_api_permissions.insert(APIPermission::kTab);
1903   AddPattern(&expected_host_permissions, "http://*.google.com/*");
1904   AddPattern(&expected_host_permissions, "https://*.google.com/*");
1905   AddPattern(&expected_host_permissions, "http://*.google.com.hk/*");
1906   AddPattern(&expected_host_permissions, "http://www.example.com/*");
1907
1908   std::set<std::string> host_permissions;
1909
1910   // Test that the extension is disabled when an API permission is missing from
1911   // the extension's granted api permissions preference. (This simulates
1912   // updating the browser to a version which recognizes a new API permission).
1913   SetPref(extension_id, "granted_permissions.api",
1914           new base::ListValue(), "granted_permissions.api");
1915   service()->ReloadExtensionsForTest();
1916
1917   EXPECT_EQ(1u, registry()->disabled_extensions().size());
1918   extension = registry()->disabled_extensions().begin()->get();
1919
1920   ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id));
1921   ASSERT_FALSE(service()->IsExtensionEnabled(extension_id));
1922   ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id));
1923
1924   // Now grant and re-enable the extension, making sure the prefs are updated.
1925   service()->GrantPermissionsAndEnableExtension(extension);
1926
1927   ASSERT_FALSE(prefs->IsExtensionDisabled(extension_id));
1928   ASSERT_TRUE(service()->IsExtensionEnabled(extension_id));
1929   ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id));
1930
1931   scoped_refptr<PermissionSet> current_perms(
1932       prefs->GetGrantedPermissions(extension_id));
1933   ASSERT_TRUE(current_perms.get());
1934   ASSERT_FALSE(current_perms->IsEmpty());
1935   ASSERT_FALSE(current_perms->HasEffectiveFullAccess());
1936   ASSERT_EQ(expected_api_permissions, current_perms->apis());
1937   ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts());
1938
1939   // Tests that the extension is disabled when a host permission is missing from
1940   // the extension's granted host permissions preference. (This simulates
1941   // updating the browser to a version which recognizes additional host
1942   // permissions).
1943   host_permissions.clear();
1944   current_perms = NULL;
1945
1946   host_permissions.insert("http://*.google.com/*");
1947   host_permissions.insert("https://*.google.com/*");
1948   host_permissions.insert("http://*.google.com.hk/*");
1949
1950   base::ListValue* api_permissions = new base::ListValue();
1951   api_permissions->Append(
1952       new base::StringValue("tabs"));
1953   SetPref(extension_id, "granted_permissions.api",
1954           api_permissions, "granted_permissions.api");
1955   SetPrefStringSet(
1956       extension_id, "granted_permissions.scriptable_host", host_permissions);
1957
1958   service()->ReloadExtensionsForTest();
1959
1960   EXPECT_EQ(1u, registry()->disabled_extensions().size());
1961   extension = registry()->disabled_extensions().begin()->get();
1962
1963   ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id));
1964   ASSERT_FALSE(service()->IsExtensionEnabled(extension_id));
1965   ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id));
1966
1967   // Now grant and re-enable the extension, making sure the prefs are updated.
1968   service()->GrantPermissionsAndEnableExtension(extension);
1969
1970   ASSERT_TRUE(service()->IsExtensionEnabled(extension_id));
1971   ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id));
1972
1973   current_perms = prefs->GetGrantedPermissions(extension_id);
1974   ASSERT_TRUE(current_perms.get());
1975   ASSERT_FALSE(current_perms->IsEmpty());
1976   ASSERT_FALSE(current_perms->HasEffectiveFullAccess());
1977   ASSERT_EQ(expected_api_permissions, current_perms->apis());
1978   ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts());
1979 }
1980
1981 // Test Packaging and installing an extension.
1982 TEST_F(ExtensionServiceTest, PackExtension) {
1983   InitializeEmptyExtensionService();
1984   base::FilePath input_directory =
1985       data_dir()
1986           .AppendASCII("good")
1987           .AppendASCII("Extensions")
1988           .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1989           .AppendASCII("1.0.0.0");
1990
1991   base::ScopedTempDir temp_dir;
1992   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
1993   base::FilePath output_directory = temp_dir.path();
1994
1995   base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
1996   base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem"));
1997
1998   scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
1999   ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
2000       privkey_path, ExtensionCreator::kNoRunFlags));
2001   ASSERT_TRUE(base::PathExists(crx_path));
2002   ASSERT_TRUE(base::PathExists(privkey_path));
2003
2004   // Repeat the run with the pem file gone, and no special flags
2005   // Should refuse to overwrite the existing crx.
2006   base::DeleteFile(privkey_path, false);
2007   ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
2008       privkey_path, ExtensionCreator::kNoRunFlags));
2009
2010   // OK, now try it with a flag to overwrite existing crx.  Should work.
2011   ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
2012       privkey_path, ExtensionCreator::kOverwriteCRX));
2013
2014   // Repeat the run allowing existing crx, but the existing pem is still
2015   // an error.  Should fail.
2016   ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
2017       privkey_path, ExtensionCreator::kOverwriteCRX));
2018
2019   ASSERT_TRUE(base::PathExists(privkey_path));
2020   InstallCRX(crx_path, INSTALL_NEW);
2021
2022   // Try packing with invalid paths.
2023   creator.reset(new ExtensionCreator());
2024   ASSERT_FALSE(
2025       creator->Run(base::FilePath(), base::FilePath(), base::FilePath(),
2026                    base::FilePath(), ExtensionCreator::kOverwriteCRX));
2027
2028   // Try packing an empty directory. Should fail because an empty directory is
2029   // not a valid extension.
2030   base::ScopedTempDir temp_dir2;
2031   ASSERT_TRUE(temp_dir2.CreateUniqueTempDir());
2032   creator.reset(new ExtensionCreator());
2033   ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path,
2034                             base::FilePath(), ExtensionCreator::kOverwriteCRX));
2035
2036   // Try packing with an invalid manifest.
2037   std::string invalid_manifest_content = "I am not a manifest.";
2038   ASSERT_TRUE(base::WriteFile(
2039       temp_dir2.path().Append(extensions::kManifestFilename),
2040       invalid_manifest_content.c_str(), invalid_manifest_content.size()));
2041   creator.reset(new ExtensionCreator());
2042   ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path,
2043                             base::FilePath(), ExtensionCreator::kOverwriteCRX));
2044
2045   // Try packing with a private key that is a valid key, but invalid for the
2046   // extension.
2047   base::FilePath bad_private_key_dir =
2048       data_dir().AppendASCII("bad_private_key");
2049   crx_path = output_directory.AppendASCII("bad_private_key.crx");
2050   privkey_path = data_dir().AppendASCII("bad_private_key.pem");
2051   ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(),
2052       privkey_path, ExtensionCreator::kOverwriteCRX));
2053 }
2054
2055 // Test Packaging and installing an extension whose name contains punctuation.
2056 TEST_F(ExtensionServiceTest, PackPunctuatedExtension) {
2057   InitializeEmptyExtensionService();
2058   base::FilePath input_directory = data_dir()
2059                                        .AppendASCII("good")
2060                                        .AppendASCII("Extensions")
2061                                        .AppendASCII(good0)
2062                                        .AppendASCII("1.0.0.0");
2063
2064   base::ScopedTempDir temp_dir;
2065   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2066
2067   // Extension names containing punctuation, and the expected names for the
2068   // packed extensions.
2069   const base::FilePath punctuated_names[] = {
2070     base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods")),
2071     base::FilePath(FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod")),
2072     base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname/")).
2073         NormalizePathSeparators(),
2074   };
2075   const base::FilePath expected_crx_names[] = {
2076     base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.crx")),
2077     base::FilePath(
2078         FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.crx")),
2079     base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.crx")),
2080   };
2081   const base::FilePath expected_private_key_names[] = {
2082     base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")),
2083     base::FilePath(
2084         FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")),
2085     base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")),
2086   };
2087
2088   for (size_t i = 0; i < arraysize(punctuated_names); ++i) {
2089     SCOPED_TRACE(punctuated_names[i].value().c_str());
2090     base::FilePath output_dir = temp_dir.path().Append(punctuated_names[i]);
2091
2092     // Copy the extension into the output directory, as PackExtensionJob doesn't
2093     // let us choose where to output the packed extension.
2094     ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true));
2095
2096     base::FilePath expected_crx_path =
2097         temp_dir.path().Append(expected_crx_names[i]);
2098     base::FilePath expected_private_key_path =
2099         temp_dir.path().Append(expected_private_key_names[i]);
2100     PackExtensionTestClient pack_client(expected_crx_path,
2101                                         expected_private_key_path);
2102     scoped_refptr<extensions::PackExtensionJob> packer(
2103         new extensions::PackExtensionJob(&pack_client, output_dir,
2104                                          base::FilePath(),
2105                                          ExtensionCreator::kOverwriteCRX));
2106     packer->Start();
2107
2108     // The packer will post a notification task to the current thread's message
2109     // loop when it is finished.  We manually run the loop here so that we
2110     // block and catch the notification; otherwise, the process would exit.
2111     // This call to |Run()| is matched by a call to |Quit()| in the
2112     // |PackExtensionTestClient|'s notification handling code.
2113     base::MessageLoop::current()->Run();
2114
2115     if (HasFatalFailure())
2116       return;
2117
2118     InstallCRX(expected_crx_path, INSTALL_NEW);
2119   }
2120 }
2121
2122 TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) {
2123   InitializeEmptyExtensionService();
2124
2125   base::ScopedTempDir extension_temp_dir;
2126   ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir());
2127   base::FilePath input_directory = extension_temp_dir.path().AppendASCII("ext");
2128   ASSERT_TRUE(
2129       base::CopyDirectory(data_dir()
2130                               .AppendASCII("good")
2131                               .AppendASCII("Extensions")
2132                               .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2133                               .AppendASCII("1.0.0.0"),
2134                           input_directory,
2135                           /*recursive=*/true));
2136
2137   base::ScopedTempDir output_temp_dir;
2138   ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir());
2139   base::FilePath output_directory = output_temp_dir.path();
2140
2141   base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
2142   base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem"));
2143
2144   // Pack the extension once to get a private key.
2145   scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
2146   ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(),
2147       privkey_path, ExtensionCreator::kNoRunFlags))
2148       << creator->error_message();
2149   ASSERT_TRUE(base::PathExists(crx_path));
2150   ASSERT_TRUE(base::PathExists(privkey_path));
2151
2152   base::DeleteFile(crx_path, false);
2153   // Move the pem file into the extension.
2154   base::Move(privkey_path,
2155                   input_directory.AppendASCII("privkey.pem"));
2156
2157   // This pack should fail because of the contained private key.
2158   EXPECT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(),
2159       privkey_path, ExtensionCreator::kNoRunFlags));
2160   EXPECT_THAT(creator->error_message(),
2161               testing::ContainsRegex(
2162                   "extension includes the key file.*privkey.pem"));
2163 }
2164
2165 // Test Packaging and installing an extension using an openssl generated key.
2166 // The openssl is generated with the following:
2167 // > openssl genrsa -out privkey.pem 1024
2168 // > openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_asn1.pem
2169 // The privkey.pem is a PrivateKey, and the pcks8 -topk8 creates a
2170 // PrivateKeyInfo ASN.1 structure, we our RSAPrivateKey expects.
2171 TEST_F(ExtensionServiceTest, PackExtensionOpenSSLKey) {
2172   InitializeEmptyExtensionService();
2173   base::FilePath input_directory =
2174       data_dir()
2175           .AppendASCII("good")
2176           .AppendASCII("Extensions")
2177           .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2178           .AppendASCII("1.0.0.0");
2179   base::FilePath privkey_path(
2180       data_dir().AppendASCII("openssl_privkey_asn1.pem"));
2181   ASSERT_TRUE(base::PathExists(privkey_path));
2182
2183   base::ScopedTempDir temp_dir;
2184   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2185   base::FilePath output_directory = temp_dir.path();
2186
2187   base::FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
2188
2189   scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
2190   ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path,
2191       base::FilePath(), ExtensionCreator::kOverwriteCRX));
2192
2193   InstallCRX(crx_path, INSTALL_NEW);
2194 }
2195
2196 #if defined(THREAD_SANITIZER)
2197 // Flaky under Tsan. http://crbug.com/377702
2198 #define MAYBE_InstallTheme DISABLED_InstallTheme
2199 #else
2200 #define MAYBE_InstallTheme InstallTheme
2201 #endif
2202
2203 TEST_F(ExtensionServiceTest, MAYBE_InstallTheme) {
2204   InitializeEmptyExtensionService();
2205   service()->Init();
2206
2207   // A theme.
2208   base::FilePath path = data_dir().AppendASCII("theme.crx");
2209   InstallCRX(path, INSTALL_NEW);
2210   int pref_count = 0;
2211   ValidatePrefKeyCount(++pref_count);
2212   ValidateIntegerPref(theme_crx, "state", Extension::ENABLED);
2213   ValidateIntegerPref(theme_crx, "location", Manifest::INTERNAL);
2214
2215   // A theme when extensions are disabled. Themes can be installed, even when
2216   // extensions are disabled.
2217   service()->set_extensions_enabled(false);
2218   path = data_dir().AppendASCII("theme2.crx");
2219   InstallCRX(path, INSTALL_NEW);
2220   ValidatePrefKeyCount(++pref_count);
2221   ValidateIntegerPref(theme2_crx, "state", Extension::ENABLED);
2222   ValidateIntegerPref(theme2_crx, "location", Manifest::INTERNAL);
2223
2224   // A theme with extension elements. Themes cannot have extension elements,
2225   // so any such elements (like content scripts) should be ignored.
2226   service()->set_extensions_enabled(true);
2227   {
2228     path = data_dir().AppendASCII("theme_with_extension.crx");
2229     const Extension* extension = InstallCRX(path, INSTALL_NEW);
2230     ValidatePrefKeyCount(++pref_count);
2231     ASSERT_TRUE(extension);
2232     EXPECT_TRUE(extension->is_theme());
2233     EXPECT_EQ(
2234         0u,
2235         extensions::ContentScriptsInfo::GetContentScripts(extension).size());
2236   }
2237
2238   // A theme with image resources missing (misspelt path).
2239   path = data_dir().AppendASCII("theme_missing_image.crx");
2240   InstallCRX(path, INSTALL_FAILED);
2241   ValidatePrefKeyCount(pref_count);
2242 }
2243
2244 TEST_F(ExtensionServiceTest, LoadLocalizedTheme) {
2245   // Load.
2246   InitializeEmptyExtensionService();
2247   service()->Init();
2248
2249   base::FilePath extension_path = data_dir().AppendASCII("theme_i18n");
2250
2251   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2252   base::RunLoop().RunUntilIdle();
2253   EXPECT_EQ(0u, GetErrors().size());
2254   ASSERT_EQ(1u, loaded_.size());
2255   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2256   const Extension* theme = registry()->enabled_extensions().begin()->get();
2257   EXPECT_EQ("name", theme->name());
2258   EXPECT_EQ("description", theme->description());
2259
2260   // Cleanup the "Cached Theme.pak" file. Ideally, this would be installed in a
2261   // temporary directory, but it automatically installs to the extension's
2262   // directory, and we don't want to copy the whole extension for a unittest.
2263   base::FilePath theme_file = extension_path.Append(chrome::kThemePackFilename);
2264   ASSERT_TRUE(base::PathExists(theme_file));
2265   ASSERT_TRUE(base::DeleteFile(theme_file, false));  // Not recursive.
2266 }
2267
2268 // Tests that we can change the ID of an unpacked extension by adding a key
2269 // to its manifest.
2270 TEST_F(ExtensionServiceTest, UnpackedExtensionCanChangeID) {
2271   InitializeEmptyExtensionService();
2272
2273   base::ScopedTempDir temp;
2274   ASSERT_TRUE(temp.CreateUniqueTempDir());
2275
2276   base::FilePath extension_path = temp.path();
2277   base::FilePath manifest_path =
2278       extension_path.Append(extensions::kManifestFilename);
2279   base::FilePath manifest_no_key =
2280       data_dir().AppendASCII("unpacked").AppendASCII("manifest_no_key.json");
2281
2282   base::FilePath manifest_with_key =
2283       data_dir().AppendASCII("unpacked").AppendASCII("manifest_with_key.json");
2284
2285   ASSERT_TRUE(base::PathExists(manifest_no_key));
2286   ASSERT_TRUE(base::PathExists(manifest_with_key));
2287
2288   // Load the unpacked extension with no key.
2289   base::CopyFile(manifest_no_key, manifest_path);
2290   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2291
2292   base::RunLoop().RunUntilIdle();
2293   EXPECT_EQ(0u, GetErrors().size());
2294   ASSERT_EQ(1u, loaded_.size());
2295   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2296
2297   // Add the key to the manifest.
2298   base::CopyFile(manifest_with_key, manifest_path);
2299   loaded_.clear();
2300
2301   // Reload the extensions.
2302   service()->ReloadExtensionsForTest();
2303   const Extension* extension = service()->GetExtensionById(unpacked, false);
2304   EXPECT_EQ(unpacked, extension->id());
2305   ASSERT_EQ(1u, loaded_.size());
2306
2307   // TODO(jstritar): Right now this just makes sure we don't crash and burn, but
2308   // we should also test that preferences are preserved.
2309 }
2310
2311 #if defined(OS_POSIX)
2312 TEST_F(ExtensionServiceTest, UnpackedExtensionMayContainSymlinkedFiles) {
2313   base::FilePath source_data_dir =
2314       data_dir().AppendASCII("unpacked").AppendASCII("symlinks_allowed");
2315
2316   // Paths to test data files.
2317   base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json");
2318   ASSERT_TRUE(base::PathExists(source_manifest));
2319   base::FilePath source_icon = source_data_dir.AppendASCII("icon.png");
2320   ASSERT_TRUE(base::PathExists(source_icon));
2321
2322   // Set up the temporary extension directory.
2323   base::ScopedTempDir temp;
2324   ASSERT_TRUE(temp.CreateUniqueTempDir());
2325   base::FilePath extension_path = temp.path();
2326   base::FilePath manifest = extension_path.Append(
2327       extensions::kManifestFilename);
2328   base::FilePath icon_symlink = extension_path.AppendASCII("icon.png");
2329   base::CopyFile(source_manifest, manifest);
2330   base::CreateSymbolicLink(source_icon, icon_symlink);
2331
2332   // Load extension.
2333   InitializeEmptyExtensionService();
2334   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2335   base::RunLoop().RunUntilIdle();
2336
2337   EXPECT_TRUE(GetErrors().empty());
2338   ASSERT_EQ(1u, loaded_.size());
2339   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2340 }
2341 #endif
2342
2343 TEST_F(ExtensionServiceTest, UnpackedExtensionMayNotHaveUnderscore) {
2344   InitializeEmptyExtensionService();
2345   base::FilePath extension_path = data_dir().AppendASCII("underscore_name");
2346   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2347   base::RunLoop().RunUntilIdle();
2348   EXPECT_EQ(1u, GetErrors().size());
2349   EXPECT_EQ(0u, registry()->enabled_extensions().size());
2350 }
2351
2352 TEST_F(ExtensionServiceTest, InstallLocalizedTheme) {
2353   InitializeEmptyExtensionService();
2354   service()->Init();
2355
2356   base::FilePath theme_path = data_dir().AppendASCII("theme_i18n");
2357
2358   const Extension* theme = PackAndInstallCRX(theme_path, INSTALL_NEW);
2359
2360   EXPECT_EQ(0u, GetErrors().size());
2361   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2362   EXPECT_EQ("name", theme->name());
2363   EXPECT_EQ("description", theme->description());
2364 }
2365
2366 TEST_F(ExtensionServiceTest, InstallApps) {
2367   InitializeEmptyExtensionService();
2368
2369   // An empty app.
2370   const Extension* app =
2371       PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
2372   int pref_count = 0;
2373   ValidatePrefKeyCount(++pref_count);
2374   ASSERT_EQ(1u, registry()->enabled_extensions().size());
2375   ValidateIntegerPref(app->id(), "state", Extension::ENABLED);
2376   ValidateIntegerPref(app->id(), "location", Manifest::INTERNAL);
2377
2378   // Another app with non-overlapping extent. Should succeed.
2379   PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
2380   ValidatePrefKeyCount(++pref_count);
2381
2382   // A third app whose extent overlaps the first. Should fail.
2383   PackAndInstallCRX(data_dir().AppendASCII("app3"), INSTALL_FAILED);
2384   ValidatePrefKeyCount(pref_count);
2385 }
2386
2387 // Tests that file access is OFF by default.
2388 TEST_F(ExtensionServiceTest, DefaultFileAccess) {
2389   InitializeEmptyExtensionService();
2390   const Extension* extension = PackAndInstallCRX(
2391       data_dir().AppendASCII("permissions").AppendASCII("files"), INSTALL_NEW);
2392   EXPECT_EQ(0u, GetErrors().size());
2393   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2394   EXPECT_FALSE(
2395       ExtensionPrefs::Get(profile())->AllowFileAccess(extension->id()));
2396 }
2397
2398 TEST_F(ExtensionServiceTest, UpdateApps) {
2399   InitializeEmptyExtensionService();
2400   base::FilePath extensions_path = data_dir().AppendASCII("app_update");
2401
2402   // First install v1 of a hosted app.
2403   const Extension* extension =
2404       InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW);
2405   ASSERT_EQ(1u, registry()->enabled_extensions().size());
2406   std::string id = extension->id();
2407   ASSERT_EQ(std::string("1"), extension->version()->GetString());
2408
2409   // Now try updating to v2.
2410   UpdateExtension(id,
2411                   extensions_path.AppendASCII("v2.crx"),
2412                   ENABLED);
2413   ASSERT_EQ(std::string("2"),
2414             service()->GetExtensionById(id, false)->version()->GetString());
2415 }
2416
2417 // Verifies that the NTP page and launch ordinals are kept when updating apps.
2418 TEST_F(ExtensionServiceTest, UpdateAppsRetainOrdinals) {
2419   InitializeEmptyExtensionService();
2420   AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
2421   base::FilePath extensions_path = data_dir().AppendASCII("app_update");
2422
2423   // First install v1 of a hosted app.
2424   const Extension* extension =
2425       InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW);
2426   ASSERT_EQ(1u, registry()->enabled_extensions().size());
2427   std::string id = extension->id();
2428   ASSERT_EQ(std::string("1"), extension->version()->GetString());
2429
2430   // Modify the ordinals so we can distinguish them from the defaults.
2431   syncer::StringOrdinal new_page_ordinal =
2432       sorting->GetPageOrdinal(id).CreateAfter();
2433   syncer::StringOrdinal new_launch_ordinal =
2434       sorting->GetAppLaunchOrdinal(id).CreateBefore();
2435
2436   sorting->SetPageOrdinal(id, new_page_ordinal);
2437   sorting->SetAppLaunchOrdinal(id, new_launch_ordinal);
2438
2439   // Now try updating to v2.
2440   UpdateExtension(id, extensions_path.AppendASCII("v2.crx"), ENABLED);
2441   ASSERT_EQ(std::string("2"),
2442             service()->GetExtensionById(id, false)->version()->GetString());
2443
2444   // Verify that the ordinals match.
2445   ASSERT_TRUE(new_page_ordinal.Equals(sorting->GetPageOrdinal(id)));
2446   ASSERT_TRUE(new_launch_ordinal.Equals(sorting->GetAppLaunchOrdinal(id)));
2447 }
2448
2449 // Ensures that the CWS has properly initialized ordinals.
2450 TEST_F(ExtensionServiceTest, EnsureCWSOrdinalsInitialized) {
2451   InitializeEmptyExtensionService();
2452   service()->component_loader()->Add(
2453       IDR_WEBSTORE_MANIFEST, base::FilePath(FILE_PATH_LITERAL("web_store")));
2454   service()->Init();
2455
2456   AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
2457   EXPECT_TRUE(
2458       sorting->GetPageOrdinal(extensions::kWebStoreAppId).IsValid());
2459   EXPECT_TRUE(
2460       sorting->GetAppLaunchOrdinal(extensions::kWebStoreAppId).IsValid());
2461 }
2462
2463 TEST_F(ExtensionServiceTest, InstallAppsWithUnlimitedStorage) {
2464   InitializeEmptyExtensionService();
2465   EXPECT_TRUE(registry()->enabled_extensions().is_empty());
2466
2467   int pref_count = 0;
2468
2469   // Install app1 with unlimited storage.
2470   const Extension* extension =
2471       PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
2472   ValidatePrefKeyCount(++pref_count);
2473   ASSERT_EQ(1u, registry()->enabled_extensions().size());
2474   const std::string id1 = extension->id();
2475   EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
2476       APIPermission::kUnlimitedStorage));
2477   EXPECT_TRUE(extension->web_extent().MatchesURL(
2478       extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
2479   const GURL origin1(
2480       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2481   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2482       origin1));
2483
2484   // Install app2 from the same origin with unlimited storage.
2485   extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
2486   ValidatePrefKeyCount(++pref_count);
2487   ASSERT_EQ(2u, registry()->enabled_extensions().size());
2488   const std::string id2 = extension->id();
2489   EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
2490       APIPermission::kUnlimitedStorage));
2491   EXPECT_TRUE(extension->web_extent().MatchesURL(
2492       extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
2493   const GURL origin2(
2494       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2495   EXPECT_EQ(origin1, origin2);
2496   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2497       origin2));
2498
2499   // Uninstall one of them, unlimited storage should still be granted
2500   // to the origin.
2501   UninstallExtension(id1, false);
2502   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2503   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2504       origin1));
2505
2506   // Uninstall the other, unlimited storage should be revoked.
2507   UninstallExtension(id2, false);
2508   EXPECT_EQ(0u, registry()->enabled_extensions().size());
2509   EXPECT_FALSE(
2510       profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
2511           origin2));
2512 }
2513
2514 TEST_F(ExtensionServiceTest, InstallAppsAndCheckStorageProtection) {
2515   InitializeEmptyExtensionService();
2516   EXPECT_TRUE(registry()->enabled_extensions().is_empty());
2517
2518   int pref_count = 0;
2519
2520   const Extension* extension =
2521       PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
2522   ValidatePrefKeyCount(++pref_count);
2523   ASSERT_EQ(1u, registry()->enabled_extensions().size());
2524   EXPECT_TRUE(extension->is_app());
2525   const std::string id1 = extension->id();
2526   const GURL origin1(
2527       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2528   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2529       origin1));
2530
2531   // App 4 has a different origin (maps.google.com).
2532   extension = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW);
2533   ValidatePrefKeyCount(++pref_count);
2534   ASSERT_EQ(2u, registry()->enabled_extensions().size());
2535   const std::string id2 = extension->id();
2536   const GURL origin2(
2537       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
2538   ASSERT_NE(origin1, origin2);
2539   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2540       origin2));
2541
2542   UninstallExtension(id1, false);
2543   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2544
2545   UninstallExtension(id2, false);
2546
2547   EXPECT_TRUE(registry()->enabled_extensions().is_empty());
2548   EXPECT_FALSE(
2549       profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2550           origin1));
2551   EXPECT_FALSE(
2552       profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected(
2553           origin2));
2554 }
2555
2556 // Test that when an extension version is reinstalled, nothing happens.
2557 TEST_F(ExtensionServiceTest, Reinstall) {
2558   InitializeEmptyExtensionService();
2559
2560   // A simple extension that should install without error.
2561   base::FilePath path = data_dir().AppendASCII("good.crx");
2562   InstallCRX(path, INSTALL_NEW);
2563
2564   ValidatePrefKeyCount(1);
2565   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
2566   ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
2567
2568   // Reinstall the same version, it should overwrite the previous one.
2569   InstallCRX(path, INSTALL_UPDATED);
2570
2571   ValidatePrefKeyCount(1);
2572   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
2573   ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
2574 }
2575
2576 // Test that we can determine if extensions came from the
2577 // Chrome web store.
2578 TEST_F(ExtensionServiceTest, FromWebStore) {
2579   InitializeEmptyExtensionService();
2580
2581   // A simple extension that should install without error.
2582   base::FilePath path = data_dir().AppendASCII("good.crx");
2583   // Not from web store.
2584   const Extension* extension = InstallCRX(path, INSTALL_NEW);
2585   std::string id = extension->id();
2586
2587   ValidatePrefKeyCount(1);
2588   ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", false));
2589   ASSERT_FALSE(extension->from_webstore());
2590
2591   // Test install from web store.
2592   InstallCRXFromWebStore(path, INSTALL_UPDATED);  // From web store.
2593
2594   ValidatePrefKeyCount(1);
2595   ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true));
2596
2597   // Reload so extension gets reinitialized with new value.
2598   service()->ReloadExtensionsForTest();
2599   extension = service()->GetExtensionById(id, false);
2600   ASSERT_TRUE(extension->from_webstore());
2601
2602   // Upgrade to version 2.0
2603   path = data_dir().AppendASCII("good2.crx");
2604   UpdateExtension(good_crx, path, ENABLED);
2605   ValidatePrefKeyCount(1);
2606   ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true));
2607 }
2608
2609 // Test upgrading a signed extension.
2610 TEST_F(ExtensionServiceTest, UpgradeSignedGood) {
2611   InitializeEmptyExtensionService();
2612
2613   base::FilePath path = data_dir().AppendASCII("good.crx");
2614   const Extension* extension = InstallCRX(path, INSTALL_NEW);
2615   std::string id = extension->id();
2616
2617   ASSERT_EQ("1.0.0.0", extension->version()->GetString());
2618   ASSERT_EQ(0u, GetErrors().size());
2619
2620   // Upgrade to version 1.0.0.1.
2621   // Also test that the extension's old and new title are correctly retrieved.
2622   path = data_dir().AppendASCII("good2.crx");
2623   InstallCRX(path, INSTALL_UPDATED, Extension::NO_FLAGS, "My extension 1");
2624   extension = service()->GetExtensionById(id, false);
2625
2626   ASSERT_EQ("1.0.0.1", extension->version()->GetString());
2627   ASSERT_EQ("My updated extension 1", extension->name());
2628   ASSERT_EQ(0u, GetErrors().size());
2629 }
2630
2631 // Test upgrading a signed extension with a bad signature.
2632 TEST_F(ExtensionServiceTest, UpgradeSignedBad) {
2633   InitializeEmptyExtensionService();
2634
2635   base::FilePath path = data_dir().AppendASCII("good.crx");
2636   InstallCRX(path, INSTALL_NEW);
2637
2638   // Try upgrading with a bad signature. This should fail during the unpack,
2639   // because the key will not match the signature.
2640   path = data_dir().AppendASCII("bad_signature.crx");
2641   InstallCRX(path, INSTALL_FAILED);
2642 }
2643
2644 // Test a normal update via the UpdateExtension API
2645 TEST_F(ExtensionServiceTest, UpdateExtension) {
2646   InitializeEmptyExtensionService();
2647
2648   base::FilePath path = data_dir().AppendASCII("good.crx");
2649
2650   const Extension* good = InstallCRX(path, INSTALL_NEW);
2651   ASSERT_EQ("1.0.0.0", good->VersionString());
2652   ASSERT_EQ(good_crx, good->id());
2653
2654   path = data_dir().AppendASCII("good2.crx");
2655   UpdateExtension(good_crx, path, ENABLED);
2656   ASSERT_EQ(
2657       "1.0.0.1",
2658       service()->GetExtensionById(good_crx, false)->version()->GetString());
2659 }
2660
2661 // Extensions should not be updated during browser shutdown.
2662 TEST_F(ExtensionServiceTest, UpdateExtensionDuringShutdown) {
2663   InitializeEmptyExtensionService();
2664
2665   // Install an extension.
2666   base::FilePath path = data_dir().AppendASCII("good.crx");
2667   const Extension* good = InstallCRX(path, INSTALL_NEW);
2668   ASSERT_EQ(good_crx, good->id());
2669
2670   // Simulate shutdown.
2671   service()->set_browser_terminating_for_test(true);
2672
2673   // Update should fail and extension should not be updated.
2674   path = data_dir().AppendASCII("good2.crx");
2675   bool updated = service()->UpdateExtension(good_crx, path, true, NULL);
2676   ASSERT_FALSE(updated);
2677   ASSERT_EQ(
2678       "1.0.0.0",
2679       service()->GetExtensionById(good_crx, false)->version()->GetString());
2680 }
2681
2682 // Test updating a not-already-installed extension - this should fail
2683 TEST_F(ExtensionServiceTest, UpdateNotInstalledExtension) {
2684   InitializeEmptyExtensionService();
2685
2686   base::FilePath path = data_dir().AppendASCII("good.crx");
2687   UpdateExtension(good_crx, path, UPDATED);
2688   base::RunLoop().RunUntilIdle();
2689
2690   ASSERT_EQ(0u, registry()->enabled_extensions().size());
2691   ASSERT_FALSE(installed_);
2692   ASSERT_EQ(0u, loaded_.size());
2693 }
2694
2695 // Makes sure you can't downgrade an extension via UpdateExtension
2696 TEST_F(ExtensionServiceTest, UpdateWillNotDowngrade) {
2697   InitializeEmptyExtensionService();
2698
2699   base::FilePath path = data_dir().AppendASCII("good2.crx");
2700
2701   const Extension* good = InstallCRX(path, INSTALL_NEW);
2702   ASSERT_EQ("1.0.0.1", good->VersionString());
2703   ASSERT_EQ(good_crx, good->id());
2704
2705   // Change path from good2.crx -> good.crx
2706   path = data_dir().AppendASCII("good.crx");
2707   UpdateExtension(good_crx, path, FAILED);
2708   ASSERT_EQ(
2709       "1.0.0.1",
2710       service()->GetExtensionById(good_crx, false)->version()->GetString());
2711 }
2712
2713 // Make sure calling update with an identical version does nothing
2714 TEST_F(ExtensionServiceTest, UpdateToSameVersionIsNoop) {
2715   InitializeEmptyExtensionService();
2716
2717   base::FilePath path = data_dir().AppendASCII("good.crx");
2718
2719   const Extension* good = InstallCRX(path, INSTALL_NEW);
2720   ASSERT_EQ(good_crx, good->id());
2721   UpdateExtension(good_crx, path, FAILED_SILENTLY);
2722 }
2723
2724 // Tests that updating an extension does not clobber old state.
2725 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesState) {
2726   InitializeEmptyExtensionService();
2727
2728   base::FilePath path = data_dir().AppendASCII("good.crx");
2729
2730   const Extension* good = InstallCRX(path, INSTALL_NEW);
2731   ASSERT_EQ("1.0.0.0", good->VersionString());
2732   ASSERT_EQ(good_crx, good->id());
2733
2734   // Disable it and allow it to run in incognito. These settings should carry
2735   // over to the updated version.
2736   service()->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION);
2737   extensions::util::SetIsIncognitoEnabled(good->id(), profile(), true);
2738   ExtensionPrefs::Get(profile())
2739       ->SetDidExtensionEscalatePermissions(good, true);
2740
2741   path = data_dir().AppendASCII("good2.crx");
2742   UpdateExtension(good_crx, path, INSTALLED);
2743   ASSERT_EQ(1u, registry()->disabled_extensions().size());
2744   const Extension* good2 = service()->GetExtensionById(good_crx, true);
2745   ASSERT_EQ("1.0.0.1", good2->version()->GetString());
2746   EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good2->id(), profile()));
2747   EXPECT_TRUE(ExtensionPrefs::Get(profile())
2748                   ->DidExtensionEscalatePermissions(good2->id()));
2749 }
2750
2751 // Tests that updating preserves extension location.
2752 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) {
2753   InitializeEmptyExtensionService();
2754
2755   base::FilePath path = data_dir().AppendASCII("good.crx");
2756
2757   const Extension* good =
2758       InstallCRXWithLocation(path, Manifest::EXTERNAL_PREF, INSTALL_NEW);
2759
2760   ASSERT_EQ("1.0.0.0", good->VersionString());
2761   ASSERT_EQ(good_crx, good->id());
2762
2763   path = data_dir().AppendASCII("good2.crx");
2764   UpdateExtension(good_crx, path, ENABLED);
2765   const Extension* good2 = service()->GetExtensionById(good_crx, false);
2766   ASSERT_EQ("1.0.0.1", good2->version()->GetString());
2767   EXPECT_EQ(good2->location(), Manifest::EXTERNAL_PREF);
2768 }
2769
2770 // Makes sure that LOAD extension types can downgrade.
2771 TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) {
2772   InitializeEmptyExtensionService();
2773
2774   base::ScopedTempDir temp;
2775   ASSERT_TRUE(temp.CreateUniqueTempDir());
2776
2777   // We'll write the extension manifest dynamically to a temporary path
2778   // to make it easier to change the version number.
2779   base::FilePath extension_path = temp.path();
2780   base::FilePath manifest_path =
2781       extension_path.Append(extensions::kManifestFilename);
2782   ASSERT_FALSE(base::PathExists(manifest_path));
2783
2784   // Start with version 2.0.
2785   base::DictionaryValue manifest;
2786   manifest.SetString("version", "2.0");
2787   manifest.SetString("name", "LOAD Downgrade Test");
2788   manifest.SetInteger("manifest_version", 2);
2789
2790   JSONFileValueSerializer serializer(manifest_path);
2791   ASSERT_TRUE(serializer.Serialize(manifest));
2792
2793   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2794   base::RunLoop().RunUntilIdle();
2795
2796   EXPECT_EQ(0u, GetErrors().size());
2797   ASSERT_EQ(1u, loaded_.size());
2798   EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
2799   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2800   EXPECT_EQ("2.0", loaded_[0]->VersionString());
2801
2802   // Now set the version number to 1.0, reload the extensions and verify that
2803   // the downgrade was accepted.
2804   manifest.SetString("version", "1.0");
2805   ASSERT_TRUE(serializer.Serialize(manifest));
2806
2807   extensions::UnpackedInstaller::Create(service())->Load(extension_path);
2808   base::RunLoop().RunUntilIdle();
2809
2810   EXPECT_EQ(0u, GetErrors().size());
2811   ASSERT_EQ(1u, loaded_.size());
2812   EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
2813   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2814   EXPECT_EQ("1.0", loaded_[0]->VersionString());
2815 }
2816
2817 #if !defined(OS_POSIX) || defined(OS_MACOSX)
2818 // LOAD extensions with plugins require approval.
2819 // Only run this on platforms that support NPAPI plugins.
2820 TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) {
2821   base::FilePath extension_with_plugin_path = good1_path();
2822   base::FilePath extension_no_plugin_path = good2_path();
2823
2824   InitPluginService();
2825   InitializeEmptyExtensionService();
2826   InitializeProcessManager();
2827   service()->set_show_extensions_prompts(true);
2828
2829   // Start by canceling any install prompts.
2830   ExtensionInstallPrompt::g_auto_confirm_for_tests =
2831       ExtensionInstallPrompt::CANCEL;
2832
2833   // The extension that has a plugin should not install.
2834   extensions::UnpackedInstaller::Create(service())
2835       ->Load(extension_with_plugin_path);
2836   base::RunLoop().RunUntilIdle();
2837   EXPECT_EQ(0u, GetErrors().size());
2838   EXPECT_EQ(0u, loaded_.size());
2839   EXPECT_EQ(0u, registry()->enabled_extensions().size());
2840   EXPECT_EQ(0u, registry()->disabled_extensions().size());
2841
2842   // But the extension with no plugin should since there's no prompt.
2843   ExtensionErrorReporter::GetInstance()->ClearErrors();
2844   extensions::UnpackedInstaller::Create(service())
2845       ->Load(extension_no_plugin_path);
2846   base::RunLoop().RunUntilIdle();
2847   EXPECT_EQ(0u, GetErrors().size());
2848   EXPECT_EQ(1u, loaded_.size());
2849   EXPECT_EQ(1u, registry()->enabled_extensions().size());
2850   EXPECT_EQ(0u, registry()->disabled_extensions().size());
2851   EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
2852
2853   // The plugin extension should install if we accept the dialog.
2854   ExtensionInstallPrompt::g_auto_confirm_for_tests =
2855       ExtensionInstallPrompt::ACCEPT;
2856
2857   ExtensionErrorReporter::GetInstance()->ClearErrors();
2858   extensions::UnpackedInstaller::Create(service())
2859       ->Load(extension_with_plugin_path);
2860   base::RunLoop().RunUntilIdle();
2861   EXPECT_EQ(0u, GetErrors().size());
2862   EXPECT_EQ(2u, loaded_.size());
2863   EXPECT_EQ(2u, registry()->enabled_extensions().size());
2864   EXPECT_EQ(0u, registry()->disabled_extensions().size());
2865   EXPECT_TRUE(registry()->enabled_extensions().Contains(good1));
2866   EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
2867
2868   // Make sure the granted permissions have been setup.
2869   scoped_refptr<PermissionSet> permissions(
2870       ExtensionPrefs::Get(profile())->GetGrantedPermissions(good1));
2871   EXPECT_FALSE(permissions->IsEmpty());
2872   EXPECT_TRUE(permissions->HasEffectiveFullAccess());
2873   EXPECT_FALSE(permissions->apis().empty());
2874   EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin));
2875
2876   // We should be able to reload the extension without getting another prompt.
2877   loaded_.clear();
2878   ExtensionInstallPrompt::g_auto_confirm_for_tests =
2879       ExtensionInstallPrompt::CANCEL;
2880
2881   service()->ReloadExtension(good1);
2882   base::RunLoop().RunUntilIdle();
2883   EXPECT_EQ(1u, loaded_.size());
2884   EXPECT_EQ(2u, registry()->enabled_extensions().size());
2885   EXPECT_EQ(0u, registry()->disabled_extensions().size());
2886 }
2887 #endif  // !defined(OS_POSIX) || defined(OS_MACOSX)
2888
2889 namespace {
2890
2891 bool IsExtension(const Extension* extension) {
2892   return extension->GetType() == Manifest::TYPE_EXTENSION;
2893 }
2894
2895 #if defined(ENABLE_BLACKLIST_TESTS)
2896 std::set<std::string> StringSet(const std::string& s) {
2897   std::set<std::string> set;
2898   set.insert(s);
2899   return set;
2900 }
2901 std::set<std::string> StringSet(const std::string& s1, const std::string& s2) {
2902   std::set<std::string> set = StringSet(s1);
2903   set.insert(s2);
2904   return set;
2905 }
2906 #endif  // defined(ENABLE_BLACKLIST_TESTS)
2907
2908 }  // namespace
2909
2910 // Test adding a pending extension.
2911 TEST_F(ExtensionServiceTest, AddPendingExtensionFromSync) {
2912   InitializeEmptyExtensionService();
2913
2914   const std::string kFakeId(all_zero);
2915   const GURL kFakeUpdateURL("http:://fake.update/url");
2916   const bool kFakeInstallSilently(true);
2917   const bool kFakeRemoteInstall(false);
2918   const bool kFakeInstalledByCustodian(false);
2919
2920   EXPECT_TRUE(
2921       service()->pending_extension_manager()->AddFromSync(
2922           kFakeId,
2923           kFakeUpdateURL,
2924           &IsExtension,
2925           kFakeInstallSilently,
2926           kFakeRemoteInstall,
2927           kFakeInstalledByCustodian));
2928
2929   const extensions::PendingExtensionInfo* pending_extension_info;
2930   ASSERT_TRUE((pending_extension_info =
2931                    service()->pending_extension_manager()->GetById(kFakeId)));
2932   EXPECT_EQ(kFakeUpdateURL, pending_extension_info->update_url());
2933   EXPECT_EQ(&IsExtension, pending_extension_info->should_allow_install_);
2934   EXPECT_EQ(kFakeInstallSilently, pending_extension_info->install_silently());
2935   // Use
2936   // EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install())
2937   // instead of
2938   // EXPECT_EQ(kFakeRemoteInstall, pending_extension_info->remote_install())
2939   // as gcc 4.7 issues the following warning on EXPECT_EQ(false, x), which is
2940   // turned into an error with -Werror=conversion-null:
2941   //   converting 'false' to pointer type for argument 1 of
2942   //   'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)'
2943   // https://code.google.com/p/googletest/issues/detail?id=458
2944   EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install());
2945 }
2946
2947 namespace {
2948 const char kGoodId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
2949 const char kGoodUpdateURL[] = "http://good.update/url";
2950 const bool kGoodIsFromSync = true;
2951 const bool kGoodInstallSilently = true;
2952 const bool kGoodRemoteInstall = false;
2953 const bool kGoodInstalledByCustodian = false;
2954 }  // namespace
2955
2956 // Test updating a pending extension.
2957 TEST_F(ExtensionServiceTest, UpdatePendingExtension) {
2958   InitializeEmptyExtensionService();
2959   EXPECT_TRUE(
2960       service()->pending_extension_manager()->AddFromSync(
2961           kGoodId,
2962           GURL(kGoodUpdateURL),
2963           &IsExtension,
2964           kGoodInstallSilently,
2965           kGoodRemoteInstall,
2966           kGoodInstalledByCustodian));
2967   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId));
2968
2969   base::FilePath path = data_dir().AppendASCII("good.crx");
2970   UpdateExtension(kGoodId, path, ENABLED);
2971
2972   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
2973
2974   const Extension* extension = service()->GetExtensionById(kGoodId, true);
2975   ASSERT_TRUE(extension);
2976 }
2977
2978 namespace {
2979
2980 bool IsTheme(const Extension* extension) {
2981   return extension->is_theme();
2982 }
2983
2984 }  // namespace
2985
2986 // Test updating a pending theme.
2987 // Disabled due to ASAN failure. http://crbug.com/108320
2988 TEST_F(ExtensionServiceTest, DISABLED_UpdatePendingTheme) {
2989   InitializeEmptyExtensionService();
2990   EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync(
2991       theme_crx, GURL(), &IsTheme, false, false, false));
2992   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
2993
2994   base::FilePath path = data_dir().AppendASCII("theme.crx");
2995   UpdateExtension(theme_crx, path, ENABLED);
2996
2997   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
2998
2999   const Extension* extension = service()->GetExtensionById(theme_crx, true);
3000   ASSERT_TRUE(extension);
3001
3002   EXPECT_FALSE(
3003       ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id()));
3004   EXPECT_TRUE(service()->IsExtensionEnabled(theme_crx));
3005 }
3006
3007 #if defined(OS_CHROMEOS)
3008 // Always fails on ChromeOS: http://crbug.com/79737
3009 #define MAYBE_UpdatePendingExternalCrx DISABLED_UpdatePendingExternalCrx
3010 #else
3011 #define MAYBE_UpdatePendingExternalCrx UpdatePendingExternalCrx
3012 #endif
3013 // Test updating a pending CRX as if the source is an external extension
3014 // with an update URL.  In this case we don't know if the CRX is a theme
3015 // or not.
3016 TEST_F(ExtensionServiceTest, MAYBE_UpdatePendingExternalCrx) {
3017   InitializeEmptyExtensionService();
3018   EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
3019       theme_crx,
3020       std::string(),
3021       GURL(),
3022       Manifest::EXTERNAL_PREF_DOWNLOAD,
3023       Extension::NO_FLAGS,
3024       false));
3025
3026   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
3027
3028   base::FilePath path = data_dir().AppendASCII("theme.crx");
3029   UpdateExtension(theme_crx, path, ENABLED);
3030
3031   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
3032
3033   const Extension* extension = service()->GetExtensionById(theme_crx, true);
3034   ASSERT_TRUE(extension);
3035
3036   EXPECT_FALSE(
3037       ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id()));
3038   EXPECT_TRUE(service()->IsExtensionEnabled(extension->id()));
3039   EXPECT_FALSE(
3040       extensions::util::IsIncognitoEnabled(extension->id(), profile()));
3041 }
3042
3043 // Test updating a pending CRX as if the source is an external extension
3044 // with an update URL.  The external update should overwrite a sync update,
3045 // but a sync update should not overwrite a non-sync update.
3046 TEST_F(ExtensionServiceTest, UpdatePendingExternalCrxWinsOverSync) {
3047   InitializeEmptyExtensionService();
3048
3049   // Add a crx to be installed from the update mechanism.
3050   EXPECT_TRUE(
3051       service()->pending_extension_manager()->AddFromSync(
3052           kGoodId,
3053           GURL(kGoodUpdateURL),
3054           &IsExtension,
3055           kGoodInstallSilently,
3056           kGoodRemoteInstall,
3057           kGoodInstalledByCustodian));
3058
3059   // Check that there is a pending crx, with is_from_sync set to true.
3060   const extensions::PendingExtensionInfo* pending_extension_info;
3061   ASSERT_TRUE((pending_extension_info =
3062                    service()->pending_extension_manager()->GetById(kGoodId)));
3063   EXPECT_TRUE(pending_extension_info->is_from_sync());
3064
3065   // Add a crx to be updated, with the same ID, from a non-sync source.
3066   EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl(
3067       kGoodId,
3068       std::string(),
3069       GURL(kGoodUpdateURL),
3070       Manifest::EXTERNAL_PREF_DOWNLOAD,
3071       Extension::NO_FLAGS,
3072       false));
3073
3074   // Check that there is a pending crx, with is_from_sync set to false.
3075   ASSERT_TRUE((pending_extension_info =
3076                    service()->pending_extension_manager()->GetById(kGoodId)));
3077   EXPECT_FALSE(pending_extension_info->is_from_sync());
3078   EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD,
3079             pending_extension_info->install_source());
3080
3081   // Add a crx to be installed from the update mechanism.
3082   EXPECT_FALSE(
3083       service()->pending_extension_manager()->AddFromSync(
3084           kGoodId,
3085           GURL(kGoodUpdateURL),
3086           &IsExtension,
3087           kGoodInstallSilently,
3088           kGoodRemoteInstall,
3089           kGoodInstalledByCustodian));
3090
3091   // Check that the external, non-sync update was not overridden.
3092   ASSERT_TRUE((pending_extension_info =
3093                    service()->pending_extension_manager()->GetById(kGoodId)));
3094   EXPECT_FALSE(pending_extension_info->is_from_sync());
3095   EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD,
3096             pending_extension_info->install_source());
3097 }
3098
3099 // Updating a theme should fail if the updater is explicitly told that
3100 // the CRX is not a theme.
3101 TEST_F(ExtensionServiceTest, UpdatePendingCrxThemeMismatch) {
3102   InitializeEmptyExtensionService();
3103   EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync(
3104       theme_crx, GURL(), &IsExtension, true, false, false));
3105
3106   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx));
3107
3108   base::FilePath path = data_dir().AppendASCII("theme.crx");
3109   UpdateExtension(theme_crx, path, FAILED_SILENTLY);
3110
3111   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx));
3112
3113   const Extension* extension = service()->GetExtensionById(theme_crx, true);
3114   ASSERT_FALSE(extension);
3115 }
3116
3117 // TODO(akalin): Test updating a pending extension non-silently once
3118 // we can mock out ExtensionInstallUI and inject our version into
3119 // UpdateExtension().
3120
3121 // Test updating a pending extension which fails the should-install test.
3122 TEST_F(ExtensionServiceTest, UpdatePendingExtensionFailedShouldInstallTest) {
3123   InitializeEmptyExtensionService();
3124   // Add pending extension with a flipped is_theme.
3125   EXPECT_TRUE(
3126       service()->pending_extension_manager()->AddFromSync(
3127           kGoodId,
3128           GURL(kGoodUpdateURL),
3129           &IsTheme,
3130           kGoodInstallSilently,
3131           kGoodRemoteInstall,
3132           kGoodInstalledByCustodian));
3133   EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId));
3134
3135   base::FilePath path = data_dir().AppendASCII("good.crx");
3136   UpdateExtension(kGoodId, path, UPDATED);
3137
3138   // TODO(akalin): Figure out how to check that the extensions
3139   // directory is cleaned up properly in OnExtensionInstalled().
3140
3141   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
3142 }
3143
3144 // TODO(akalin): Figure out how to test that installs of pending
3145 // unsyncable extensions are blocked.
3146
3147 // Test updating a pending extension for one that is not pending.
3148 TEST_F(ExtensionServiceTest, UpdatePendingExtensionNotPending) {
3149   InitializeEmptyExtensionService();
3150
3151   base::FilePath path = data_dir().AppendASCII("good.crx");
3152   UpdateExtension(kGoodId, path, UPDATED);
3153
3154   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
3155 }
3156
3157 // Test updating a pending extension for one that is already
3158 // installed.
3159 TEST_F(ExtensionServiceTest, UpdatePendingExtensionAlreadyInstalled) {
3160   InitializeEmptyExtensionService();
3161
3162   base::FilePath path = data_dir().AppendASCII("good.crx");
3163   const Extension* good = InstallCRX(path, INSTALL_NEW);
3164   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3165
3166   EXPECT_FALSE(good->is_theme());
3167
3168   // Use AddExtensionImpl() as AddFrom*() would balk.
3169   service()->pending_extension_manager()->AddExtensionImpl(
3170       good->id(),
3171       std::string(),
3172       extensions::ManifestURL::GetUpdateURL(good),
3173       Version(),
3174       &IsExtension,
3175       kGoodIsFromSync,
3176       kGoodInstallSilently,
3177       Manifest::INTERNAL,
3178       Extension::NO_FLAGS,
3179       false,
3180       kGoodRemoteInstall);
3181   UpdateExtension(good->id(), path, ENABLED);
3182
3183   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId));
3184 }
3185
3186 #if defined(ENABLE_BLACKLIST_TESTS)
3187 // Tests blacklisting then unblacklisting extensions after the service has been
3188 // initialized.
3189 TEST_F(ExtensionServiceTest, SetUnsetBlacklistInPrefs) {
3190   extensions::TestBlacklist test_blacklist;
3191   // A profile with 3 extensions installed: good0, good1, and good2.
3192   InitializeGoodInstalledExtensionService();
3193   test_blacklist.Attach(service()->blacklist_);
3194   service()->Init();
3195
3196   const extensions::ExtensionSet& enabled_extensions =
3197       registry()->enabled_extensions();
3198   const extensions::ExtensionSet& blacklisted_extensions =
3199       registry()->blacklisted_extensions();
3200
3201   EXPECT_TRUE(enabled_extensions.Contains(good0) &&
3202               !blacklisted_extensions.Contains(good0));
3203   EXPECT_TRUE(enabled_extensions.Contains(good1) &&
3204               !blacklisted_extensions.Contains(good1));
3205   EXPECT_TRUE(enabled_extensions.Contains(good2) &&
3206               !blacklisted_extensions.Contains(good2));
3207
3208   EXPECT_FALSE(IsPrefExist(good0, "blacklist"));
3209   EXPECT_FALSE(IsPrefExist(good1, "blacklist"));
3210   EXPECT_FALSE(IsPrefExist(good2, "blacklist"));
3211   EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
3212
3213   // Blacklist good0 and good1 (and an invalid extension ID).
3214   test_blacklist.SetBlacklistState(
3215       good0, extensions::BLACKLISTED_MALWARE, true);
3216   test_blacklist.SetBlacklistState(
3217       good1, extensions::BLACKLISTED_MALWARE, true);
3218   test_blacklist.SetBlacklistState(
3219       "invalid_id", extensions::BLACKLISTED_MALWARE, true);
3220   base::RunLoop().RunUntilIdle();
3221
3222   EXPECT_TRUE(!enabled_extensions.Contains(good0) &&
3223               blacklisted_extensions.Contains(good0));
3224   EXPECT_TRUE(!enabled_extensions.Contains(good1) &&
3225               blacklisted_extensions.Contains(good1));
3226   EXPECT_TRUE(enabled_extensions.Contains(good2) &&
3227               !blacklisted_extensions.Contains(good2));
3228
3229   EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true));
3230   EXPECT_TRUE(ValidateBooleanPref(good1, "blacklist", true));
3231   EXPECT_FALSE(IsPrefExist(good2, "blacklist"));
3232   EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
3233
3234   // Un-blacklist good1 and blacklist good2.
3235   test_blacklist.Clear(false);
3236   test_blacklist.SetBlacklistState(
3237       good0, extensions::BLACKLISTED_MALWARE, true);
3238   test_blacklist.SetBlacklistState(
3239       good2, extensions::BLACKLISTED_MALWARE, true);
3240   test_blacklist.SetBlacklistState(
3241       "invalid_id", extensions::BLACKLISTED_MALWARE, true);
3242   base::RunLoop().RunUntilIdle();
3243
3244   EXPECT_TRUE(!enabled_extensions.Contains(good0) &&
3245               blacklisted_extensions.Contains(good0));
3246   EXPECT_TRUE(enabled_extensions.Contains(good1) &&
3247               !blacklisted_extensions.Contains(good1));
3248   EXPECT_TRUE(!enabled_extensions.Contains(good2) &&
3249               blacklisted_extensions.Contains(good2));
3250
3251   EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true));
3252   EXPECT_FALSE(IsPrefExist(good1, "blacklist"));
3253   EXPECT_TRUE(ValidateBooleanPref(good2, "blacklist", true));
3254   EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist"));
3255 }
3256 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3257
3258 #if defined(ENABLE_BLACKLIST_TESTS)
3259 // Tests trying to install a blacklisted extension.
3260 TEST_F(ExtensionServiceTest, BlacklistedExtensionWillNotInstall) {
3261   scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db(
3262       new FakeSafeBrowsingDatabaseManager(true));
3263   Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db);
3264
3265   InitializeEmptyExtensionService();
3266   service()->Init();
3267
3268   // After blacklisting good_crx, we cannot install it.
3269   blacklist_db->SetUnsafe(good_crx).NotifyUpdate();
3270   base::RunLoop().RunUntilIdle();
3271
3272   base::FilePath path = data_dir().AppendASCII("good.crx");
3273   // HACK: specify WAS_INSTALLED_BY_DEFAULT so that test machinery doesn't
3274   // decide to install this silently. Somebody should fix these tests, all
3275   // 6,000 lines of them. Hah!
3276   InstallCRX(path, INSTALL_FAILED, Extension::WAS_INSTALLED_BY_DEFAULT);
3277   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3278 }
3279 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3280
3281 #if defined(ENABLE_BLACKLIST_TESTS)
3282 // Unload blacklisted extension on policy change.
3283 TEST_F(ExtensionServiceTest, UnloadBlacklistedExtensionPolicy) {
3284   extensions::TestBlacklist test_blacklist;
3285
3286   // A profile with no extensions installed.
3287   InitializeEmptyExtensionServiceWithTestingPrefs();
3288   test_blacklist.Attach(service()->blacklist_);
3289
3290   base::FilePath path = data_dir().AppendASCII("good.crx");
3291
3292   const Extension* good = InstallCRX(path, INSTALL_NEW);
3293   EXPECT_EQ(good_crx, good->id());
3294   UpdateExtension(good_crx, path, FAILED_SILENTLY);
3295   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3296
3297   {
3298     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3299     pref.SetIndividualExtensionInstallationAllowed(good_crx, true);
3300   }
3301
3302   test_blacklist.SetBlacklistState(
3303       good_crx, extensions::BLACKLISTED_MALWARE, true);
3304   base::RunLoop().RunUntilIdle();
3305
3306   // The good_crx is blacklisted and the whitelist doesn't negate it.
3307   ASSERT_TRUE(ValidateBooleanPref(good_crx, "blacklist", true));
3308   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3309 }
3310 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3311
3312 #if defined(ENABLE_BLACKLIST_TESTS)
3313 // Tests that a blacklisted extension is eventually unloaded on startup, if it
3314 // wasn't already.
3315 TEST_F(ExtensionServiceTest, WillNotLoadBlacklistedExtensionsFromDirectory) {
3316   extensions::TestBlacklist test_blacklist;
3317
3318   // A profile with 3 extensions installed: good0, good1, and good2.
3319   InitializeGoodInstalledExtensionService();
3320   test_blacklist.Attach(service()->blacklist_);
3321
3322   // Blacklist good1 before the service initializes.
3323   test_blacklist.SetBlacklistState(
3324       good1, extensions::BLACKLISTED_MALWARE, false);
3325
3326   // Load extensions.
3327   service()->Init();
3328   ASSERT_EQ(3u, loaded_.size());  // hasn't had time to blacklist yet
3329
3330   base::RunLoop().RunUntilIdle();
3331
3332   ASSERT_EQ(1u, registry()->blacklisted_extensions().size());
3333   ASSERT_EQ(2u, registry()->enabled_extensions().size());
3334
3335   ASSERT_TRUE(registry()->enabled_extensions().Contains(good0));
3336   ASSERT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3337   ASSERT_TRUE(registry()->enabled_extensions().Contains(good2));
3338 }
3339 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3340
3341 #if defined(ENABLE_BLACKLIST_TESTS)
3342 // Tests extensions blacklisted in prefs on startup; one still blacklisted by
3343 // safe browsing, the other not. The not-blacklisted one should recover.
3344 TEST_F(ExtensionServiceTest, BlacklistedInPrefsFromStartup) {
3345   extensions::TestBlacklist test_blacklist;
3346
3347   InitializeGoodInstalledExtensionService();
3348   test_blacklist.Attach(service()->blacklist_);
3349   ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good0, true);
3350   ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good1, true);
3351
3352   test_blacklist.SetBlacklistState(
3353       good1, extensions::BLACKLISTED_MALWARE, false);
3354
3355   // Extension service hasn't loaded yet, but IsExtensionEnabled reads out of
3356   // prefs. Ensure it takes into account the blacklist state (crbug.com/373842).
3357   EXPECT_FALSE(service()->IsExtensionEnabled(good0));
3358   EXPECT_FALSE(service()->IsExtensionEnabled(good1));
3359   EXPECT_TRUE(service()->IsExtensionEnabled(good2));
3360
3361   service()->Init();
3362
3363   EXPECT_EQ(2u, registry()->blacklisted_extensions().size());
3364   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3365
3366   EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good0));
3367   EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3368   EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
3369
3370   // Give time for the blacklist to update.
3371   base::RunLoop().RunUntilIdle();
3372
3373   EXPECT_EQ(1u, registry()->blacklisted_extensions().size());
3374   EXPECT_EQ(2u, registry()->enabled_extensions().size());
3375
3376   EXPECT_TRUE(registry()->enabled_extensions().Contains(good0));
3377   EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1));
3378   EXPECT_TRUE(registry()->enabled_extensions().Contains(good2));
3379 }
3380 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3381
3382 #if defined(ENABLE_BLACKLIST_TESTS)
3383 // Extension is added to blacklist with BLACKLISTED_POTENTIALLY_UNWANTED state
3384 // after it is installed. It is then successfully re-enabled by the user.
3385 TEST_F(ExtensionServiceTest, GreylistedExtensionDisabled) {
3386   extensions::TestBlacklist test_blacklist;
3387   // A profile with 3 extensions installed: good0, good1, and good2.
3388   InitializeGoodInstalledExtensionService();
3389   test_blacklist.Attach(service()->blacklist_);
3390   service()->Init();
3391
3392   const extensions::ExtensionSet& enabled_extensions =
3393       registry()->enabled_extensions();
3394   const extensions::ExtensionSet& disabled_extensions =
3395       registry()->disabled_extensions();
3396
3397   EXPECT_TRUE(enabled_extensions.Contains(good0));
3398   EXPECT_TRUE(enabled_extensions.Contains(good1));
3399   EXPECT_TRUE(enabled_extensions.Contains(good2));
3400
3401   // Blacklist good0 and good1 (and an invalid extension ID).
3402   test_blacklist.SetBlacklistState(
3403       good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
3404   test_blacklist.SetBlacklistState(
3405       good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
3406   test_blacklist.SetBlacklistState(
3407       "invalid_id", extensions::BLACKLISTED_MALWARE, true);
3408   base::RunLoop().RunUntilIdle();
3409
3410   EXPECT_FALSE(enabled_extensions.Contains(good0));
3411   EXPECT_TRUE(disabled_extensions.Contains(good0));
3412   EXPECT_FALSE(enabled_extensions.Contains(good1));
3413   EXPECT_TRUE(disabled_extensions.Contains(good1));
3414   EXPECT_TRUE(enabled_extensions.Contains(good2));
3415   EXPECT_FALSE(disabled_extensions.Contains(good2));
3416
3417   ValidateIntegerPref(
3418       good0, "blacklist_state", extensions::BLACKLISTED_CWS_POLICY_VIOLATION);
3419   ValidateIntegerPref(
3420       good1, "blacklist_state", extensions::BLACKLISTED_POTENTIALLY_UNWANTED);
3421
3422   // Now user enables good0.
3423   service()->EnableExtension(good0);
3424
3425   EXPECT_TRUE(enabled_extensions.Contains(good0));
3426   EXPECT_FALSE(disabled_extensions.Contains(good0));
3427   EXPECT_FALSE(enabled_extensions.Contains(good1));
3428   EXPECT_TRUE(disabled_extensions.Contains(good1));
3429
3430   // Remove extensions from blacklist.
3431   test_blacklist.SetBlacklistState(
3432       good0, extensions::NOT_BLACKLISTED, true);
3433   test_blacklist.SetBlacklistState(
3434       good1, extensions::NOT_BLACKLISTED, true);
3435   base::RunLoop().RunUntilIdle();
3436
3437   // All extensions are enabled.
3438   EXPECT_TRUE(enabled_extensions.Contains(good0));
3439   EXPECT_FALSE(disabled_extensions.Contains(good0));
3440   EXPECT_TRUE(enabled_extensions.Contains(good1));
3441   EXPECT_FALSE(disabled_extensions.Contains(good1));
3442   EXPECT_TRUE(enabled_extensions.Contains(good2));
3443   EXPECT_FALSE(disabled_extensions.Contains(good2));
3444 }
3445 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3446
3447 #if defined(ENABLE_BLACKLIST_TESTS)
3448 // When extension is removed from greylist, do not re-enable it if it is
3449 // disabled by user.
3450 TEST_F(ExtensionServiceTest, GreylistDontEnableManuallyDisabled) {
3451   extensions::TestBlacklist test_blacklist;
3452   // A profile with 3 extensions installed: good0, good1, and good2.
3453   InitializeGoodInstalledExtensionService();
3454   test_blacklist.Attach(service()->blacklist_);
3455   service()->Init();
3456
3457   const extensions::ExtensionSet& enabled_extensions =
3458       registry()->enabled_extensions();
3459   const extensions::ExtensionSet& disabled_extensions =
3460       registry()->disabled_extensions();
3461
3462   // Manually disable.
3463   service()->DisableExtension(good0,
3464                               extensions::Extension::DISABLE_USER_ACTION);
3465
3466   test_blacklist.SetBlacklistState(
3467       good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
3468   test_blacklist.SetBlacklistState(
3469       good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
3470   test_blacklist.SetBlacklistState(
3471       good2, extensions::BLACKLISTED_SECURITY_VULNERABILITY, true);
3472   base::RunLoop().RunUntilIdle();
3473
3474   // All extensions disabled.
3475   EXPECT_FALSE(enabled_extensions.Contains(good0));
3476   EXPECT_TRUE(disabled_extensions.Contains(good0));
3477   EXPECT_FALSE(enabled_extensions.Contains(good1));
3478   EXPECT_TRUE(disabled_extensions.Contains(good1));
3479   EXPECT_FALSE(enabled_extensions.Contains(good2));
3480   EXPECT_TRUE(disabled_extensions.Contains(good2));
3481
3482   // Greylisted extension can be enabled.
3483   service()->EnableExtension(good1);
3484   EXPECT_TRUE(enabled_extensions.Contains(good1));
3485   EXPECT_FALSE(disabled_extensions.Contains(good1));
3486
3487   // good1 is now manually disabled.
3488   service()->DisableExtension(good1,
3489                               extensions::Extension::DISABLE_USER_ACTION);
3490   EXPECT_FALSE(enabled_extensions.Contains(good1));
3491   EXPECT_TRUE(disabled_extensions.Contains(good1));
3492
3493   // Remove extensions from blacklist.
3494   test_blacklist.SetBlacklistState(
3495       good0, extensions::NOT_BLACKLISTED, true);
3496   test_blacklist.SetBlacklistState(
3497       good1, extensions::NOT_BLACKLISTED, true);
3498   test_blacklist.SetBlacklistState(
3499       good2, extensions::NOT_BLACKLISTED, true);
3500   base::RunLoop().RunUntilIdle();
3501
3502   // good0 and good1 remain disabled.
3503   EXPECT_FALSE(enabled_extensions.Contains(good0));
3504   EXPECT_TRUE(disabled_extensions.Contains(good0));
3505   EXPECT_FALSE(enabled_extensions.Contains(good1));
3506   EXPECT_TRUE(disabled_extensions.Contains(good1));
3507   EXPECT_TRUE(enabled_extensions.Contains(good2));
3508   EXPECT_FALSE(disabled_extensions.Contains(good2));
3509 }
3510 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3511
3512 #if defined(ENABLE_BLACKLIST_TESTS)
3513 // Blacklisted extension with unknown state are not enabled/disabled.
3514 TEST_F(ExtensionServiceTest, GreylistUnknownDontChange) {
3515   extensions::TestBlacklist test_blacklist;
3516   // A profile with 3 extensions installed: good0, good1, and good2.
3517   InitializeGoodInstalledExtensionService();
3518   test_blacklist.Attach(service()->blacklist_);
3519   service()->Init();
3520
3521   const extensions::ExtensionSet& enabled_extensions =
3522       registry()->enabled_extensions();
3523   const extensions::ExtensionSet& disabled_extensions =
3524       registry()->disabled_extensions();
3525
3526   test_blacklist.SetBlacklistState(
3527       good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true);
3528   test_blacklist.SetBlacklistState(
3529       good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true);
3530   base::RunLoop().RunUntilIdle();
3531
3532   EXPECT_FALSE(enabled_extensions.Contains(good0));
3533   EXPECT_TRUE(disabled_extensions.Contains(good0));
3534   EXPECT_FALSE(enabled_extensions.Contains(good1));
3535   EXPECT_TRUE(disabled_extensions.Contains(good1));
3536   EXPECT_TRUE(enabled_extensions.Contains(good2));
3537   EXPECT_FALSE(disabled_extensions.Contains(good2));
3538
3539   test_blacklist.SetBlacklistState(
3540       good0, extensions::NOT_BLACKLISTED, true);
3541   test_blacklist.SetBlacklistState(
3542       good1, extensions::BLACKLISTED_UNKNOWN, true);
3543   test_blacklist.SetBlacklistState(
3544       good2, extensions::BLACKLISTED_UNKNOWN, true);
3545   base::RunLoop().RunUntilIdle();
3546
3547   // good0 re-enabled, other remain as they were.
3548   EXPECT_TRUE(enabled_extensions.Contains(good0));
3549   EXPECT_FALSE(disabled_extensions.Contains(good0));
3550   EXPECT_FALSE(enabled_extensions.Contains(good1));
3551   EXPECT_TRUE(disabled_extensions.Contains(good1));
3552   EXPECT_TRUE(enabled_extensions.Contains(good2));
3553   EXPECT_FALSE(disabled_extensions.Contains(good2));
3554 }
3555
3556 // Tests that blacklisted extensions cannot be reloaded, both those loaded
3557 // before and after extension service startup.
3558 TEST_F(ExtensionServiceTest, ReloadBlacklistedExtension) {
3559   extensions::TestBlacklist test_blacklist;
3560
3561   InitializeGoodInstalledExtensionService();
3562   test_blacklist.Attach(service()->blacklist_);
3563
3564   test_blacklist.SetBlacklistState(
3565       good1, extensions::BLACKLISTED_MALWARE, false);
3566   service()->Init();
3567   test_blacklist.SetBlacklistState(
3568       good2, extensions::BLACKLISTED_MALWARE, false);
3569   base::RunLoop().RunUntilIdle();
3570
3571   EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs());
3572   EXPECT_EQ(StringSet(good1, good2),
3573             registry()->blacklisted_extensions().GetIDs());
3574
3575   service()->ReloadExtension(good1);
3576   service()->ReloadExtension(good2);
3577   base::RunLoop().RunUntilIdle();
3578
3579   EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs());
3580   EXPECT_EQ(StringSet(good1, good2),
3581             registry()->blacklisted_extensions().GetIDs());
3582 }
3583
3584 #endif  // defined(ENABLE_BLACKLIST_TESTS)
3585
3586 // Will not install extension blacklisted by policy.
3587 TEST_F(ExtensionServiceTest, BlacklistedByPolicyWillNotInstall) {
3588   InitializeEmptyExtensionServiceWithTestingPrefs();
3589
3590   // Blacklist everything.
3591   {
3592     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3593     pref.SetBlacklistedByDefault(true);
3594   }
3595
3596   // Blacklist prevents us from installing good_crx.
3597   base::FilePath path = data_dir().AppendASCII("good.crx");
3598   InstallCRX(path, INSTALL_FAILED);
3599   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3600
3601   // Now whitelist this particular extension.
3602   {
3603     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3604     pref.SetIndividualExtensionInstallationAllowed(good_crx, true);
3605   }
3606
3607   // Ensure we can now install good_crx.
3608   InstallCRX(path, INSTALL_NEW);
3609   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3610 }
3611
3612 // Extension blacklisted by policy get unloaded after installing.
3613 TEST_F(ExtensionServiceTest, BlacklistedByPolicyRemovedIfRunning) {
3614   InitializeEmptyExtensionServiceWithTestingPrefs();
3615
3616   // Install good_crx.
3617   base::FilePath path = data_dir().AppendASCII("good.crx");
3618   InstallCRX(path, INSTALL_NEW);
3619   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3620
3621   {
3622     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3623     // Blacklist this extension.
3624     pref.SetIndividualExtensionInstallationAllowed(good_crx, false);
3625   }
3626
3627   // Extension should not be running now.
3628   base::RunLoop().RunUntilIdle();
3629   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3630 }
3631
3632 // Tests that component extensions are not blacklisted by policy.
3633 TEST_F(ExtensionServiceTest, ComponentExtensionWhitelisted) {
3634   InitializeEmptyExtensionServiceWithTestingPrefs();
3635
3636   // Blacklist everything.
3637   {
3638     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3639     pref.SetBlacklistedByDefault(true);
3640   }
3641
3642   // Install a component extension.
3643   base::FilePath path = data_dir()
3644                             .AppendASCII("good")
3645                             .AppendASCII("Extensions")
3646                             .AppendASCII(good0)
3647                             .AppendASCII("1.0.0.0");
3648   std::string manifest;
3649   ASSERT_TRUE(base::ReadFileToString(
3650       path.Append(extensions::kManifestFilename), &manifest));
3651   service()->component_loader()->Add(manifest, path);
3652   service()->Init();
3653
3654   // Extension should be installed despite blacklist.
3655   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3656   EXPECT_TRUE(service()->GetExtensionById(good0, false));
3657
3658   // Poke external providers and make sure the extension is still present.
3659   service()->CheckForExternalUpdates();
3660   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3661   EXPECT_TRUE(service()->GetExtensionById(good0, false));
3662
3663   // Extension should not be uninstalled on blacklist changes.
3664   {
3665     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3666     pref.SetIndividualExtensionInstallationAllowed(good0, false);
3667   }
3668   base::RunLoop().RunUntilIdle();
3669   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3670   EXPECT_TRUE(service()->GetExtensionById(good0, false));
3671 }
3672
3673 // Tests that policy-installed extensions are not blacklisted by policy.
3674 TEST_F(ExtensionServiceTest, PolicyInstalledExtensionsWhitelisted) {
3675   InitializeEmptyExtensionServiceWithTestingPrefs();
3676
3677   {
3678     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3679     // Blacklist everything.
3680     pref.SetBlacklistedByDefault(true);
3681     // Mark good.crx for force-installation.
3682     pref.SetIndividualExtensionAutoInstalled(
3683         good_crx, "http://example.com/update_url", true);
3684   }
3685
3686   // Have policy force-install an extension.
3687   MockExtensionProvider* provider =
3688       new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
3689   AddMockExternalProvider(provider);
3690   provider->UpdateOrAddExtension(
3691       good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
3692
3693   // Reloading extensions should find our externally registered extension
3694   // and install it.
3695   content::WindowedNotificationObserver observer(
3696       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3697       content::NotificationService::AllSources());
3698   service()->CheckForExternalUpdates();
3699   observer.Wait();
3700
3701   // Extension should be installed despite blacklist.
3702   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3703   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3704
3705   // Blacklist update should not uninstall the extension.
3706   {
3707     ManagementPrefUpdater pref(profile_->GetTestingPrefService());
3708     pref.SetIndividualExtensionInstallationAllowed(good0, false);
3709   }
3710   base::RunLoop().RunUntilIdle();
3711   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3712   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3713 }
3714
3715 // Tests that extensions cannot be installed if the policy provider prohibits
3716 // it. This functionality is implemented in CrxInstaller::ConfirmInstall().
3717 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) {
3718   InitializeEmptyExtensionService();
3719
3720   GetManagementPolicy()->UnregisterAllProviders();
3721   extensions::TestManagementPolicyProvider provider_(
3722       extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3723   GetManagementPolicy()->RegisterProvider(&provider_);
3724
3725   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_FAILED);
3726   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3727 }
3728
3729 // Tests that extensions cannot be loaded from prefs if the policy provider
3730 // prohibits it. This functionality is implemented in InstalledLoader::Load().
3731 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsLoadFromPrefs) {
3732   InitializeEmptyExtensionService();
3733
3734   // Create a fake extension to be loaded as though it were read from prefs.
3735   base::FilePath path =
3736       data_dir().AppendASCII("management").AppendASCII("simple_extension");
3737   base::DictionaryValue manifest;
3738   manifest.SetString(keys::kName, "simple_extension");
3739   manifest.SetString(keys::kVersion, "1");
3740   // UNPACKED is for extensions loaded from a directory. We use it here, even
3741   // though we're testing loading from prefs, so that we don't need to provide
3742   // an extension key.
3743   extensions::ExtensionInfo extension_info(
3744       &manifest, std::string(), path, Manifest::UNPACKED);
3745
3746   // Ensure we can load it with no management policy in place.
3747   GetManagementPolicy()->UnregisterAllProviders();
3748   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3749   extensions::InstalledLoader(service()).Load(extension_info, false);
3750   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3751
3752   const Extension* extension =
3753       (registry()->enabled_extensions().begin())->get();
3754   EXPECT_TRUE(
3755       service()->UninstallExtension(extension->id(),
3756                                     extensions::UNINSTALL_REASON_FOR_TESTING,
3757                                     base::Bind(&base::DoNothing),
3758                                     NULL));
3759   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3760
3761   // Ensure we cannot load it if management policy prohibits installation.
3762   extensions::TestManagementPolicyProvider provider_(
3763       extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3764   GetManagementPolicy()->RegisterProvider(&provider_);
3765
3766   extensions::InstalledLoader(service()).Load(extension_info, false);
3767   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3768 }
3769
3770 // Tests disabling an extension when prohibited by the ManagementPolicy.
3771 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsDisable) {
3772   InitializeEmptyExtensionService();
3773
3774   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3775   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3776   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3777
3778   GetManagementPolicy()->UnregisterAllProviders();
3779   extensions::TestManagementPolicyProvider provider(
3780       extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
3781   GetManagementPolicy()->RegisterProvider(&provider);
3782
3783   // Attempt to disable it.
3784   service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
3785
3786   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3787   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3788   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3789 }
3790
3791 // Tests uninstalling an extension when prohibited by the ManagementPolicy.
3792 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsUninstall) {
3793   InitializeEmptyExtensionService();
3794
3795   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3796   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3797   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3798
3799   GetManagementPolicy()->UnregisterAllProviders();
3800   extensions::TestManagementPolicyProvider provider(
3801       extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
3802   GetManagementPolicy()->RegisterProvider(&provider);
3803
3804   // Attempt to uninstall it.
3805   EXPECT_FALSE(
3806       service()->UninstallExtension(good_crx,
3807                                     extensions::UNINSTALL_REASON_FOR_TESTING,
3808                                     base::Bind(&base::DoNothing),
3809                                     NULL));
3810
3811   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3812   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3813 }
3814
3815 // Tests that previously installed extensions that are now prohibited from
3816 // being installed are removed.
3817 TEST_F(ExtensionServiceTest, ManagementPolicyUnloadsAllProhibited) {
3818   InitializeEmptyExtensionService();
3819
3820   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3821   InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW);
3822   EXPECT_EQ(2u, registry()->enabled_extensions().size());
3823   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3824
3825   GetManagementPolicy()->UnregisterAllProviders();
3826   extensions::TestManagementPolicyProvider provider(
3827       extensions::TestManagementPolicyProvider::PROHIBIT_LOAD);
3828   GetManagementPolicy()->RegisterProvider(&provider);
3829
3830   // Run the policy check.
3831   service()->CheckManagementPolicy();
3832   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3833   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3834 }
3835
3836 // Tests that previously disabled extensions that are now required to be
3837 // enabled are re-enabled on reinstall.
3838 TEST_F(ExtensionServiceTest, ManagementPolicyRequiresEnable) {
3839   InitializeEmptyExtensionService();
3840
3841   // Install, then disable, an extension.
3842   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3843   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3844   service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
3845   EXPECT_EQ(1u, registry()->disabled_extensions().size());
3846
3847   // Register an ExtensionMnagementPolicy that requires the extension to remain
3848   // enabled.
3849   GetManagementPolicy()->UnregisterAllProviders();
3850   extensions::TestManagementPolicyProvider provider(
3851       extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED);
3852   GetManagementPolicy()->RegisterProvider(&provider);
3853
3854   // Reinstall the extension.
3855   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED);
3856   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3857   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3858 }
3859
3860 // Flaky on windows; http://crbug.com/309833
3861 #if defined(OS_WIN)
3862 #define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAutoAcknowledgement
3863 #else
3864 #define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowledgement
3865 #endif
3866 TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) {
3867   InitializeEmptyExtensionService();
3868   service()->set_extensions_enabled(true);
3869
3870   {
3871     // Register and install an external extension.
3872     MockExtensionProvider* provider =
3873         new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
3874     AddMockExternalProvider(provider);
3875     provider->UpdateOrAddExtension(
3876         good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
3877   }
3878   {
3879     // Have policy force-install an extension.
3880     MockExtensionProvider* provider = new MockExtensionProvider(
3881         service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
3882     AddMockExternalProvider(provider);
3883     provider->UpdateOrAddExtension(
3884         page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
3885   }
3886
3887   // Providers are set up. Let them run.
3888   int count = 2;
3889   content::WindowedNotificationObserver observer(
3890       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3891       base::Bind(&WaitForCountNotificationsCallback, &count));
3892   service()->CheckForExternalUpdates();
3893
3894   observer.Wait();
3895
3896   ASSERT_EQ(2u, registry()->enabled_extensions().size());
3897   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3898   EXPECT_TRUE(service()->GetExtensionById(page_action, false));
3899   ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
3900   ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx));
3901   ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action));
3902 }
3903
3904 #if !defined(OS_CHROMEOS)
3905 // This tests if default apps are installed correctly.
3906 TEST_F(ExtensionServiceTest, DefaultAppsInstall) {
3907   InitializeEmptyExtensionService();
3908   service()->set_extensions_enabled(true);
3909
3910   {
3911     std::string json_data =
3912         "{"
3913         "  \"ldnnhddmnhbkjipkidpdiheffobcpfmf\" : {"
3914         "    \"external_crx\": \"good.crx\","
3915         "    \"external_version\": \"1.0.0.0\","
3916         "    \"is_bookmark_app\": false"
3917         "  }"
3918         "}";
3919     default_apps::Provider* provider = new default_apps::Provider(
3920         profile(),
3921         service(),
3922         new extensions::ExternalTestingLoader(json_data, data_dir()),
3923         Manifest::INTERNAL,
3924         Manifest::INVALID_LOCATION,
3925         Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT);
3926
3927     AddMockExternalProvider(provider);
3928   }
3929
3930   ASSERT_EQ(0u, registry()->enabled_extensions().size());
3931   content::WindowedNotificationObserver observer(
3932       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
3933       content::NotificationService::AllSources());
3934   service()->CheckForExternalUpdates();
3935   observer.Wait();
3936
3937   ASSERT_EQ(1u, registry()->enabled_extensions().size());
3938   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3939   const Extension* extension = service()->GetExtensionById(good_crx, false);
3940   EXPECT_TRUE(extension->from_webstore());
3941   EXPECT_TRUE(extension->was_installed_by_default());
3942 }
3943 #endif
3944
3945 // Tests disabling extensions
3946 TEST_F(ExtensionServiceTest, DisableExtension) {
3947   InitializeEmptyExtensionService();
3948
3949   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3950   EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
3951   EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
3952
3953   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3954   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3955   EXPECT_EQ(0u, registry()->terminated_extensions().size());
3956   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
3957
3958   // Disable it.
3959   service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
3960
3961   EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
3962   EXPECT_FALSE(service()->GetExtensionById(good_crx, false));
3963   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3964   EXPECT_EQ(1u, registry()->disabled_extensions().size());
3965   EXPECT_EQ(0u, registry()->terminated_extensions().size());
3966   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
3967 }
3968
3969 TEST_F(ExtensionServiceTest, TerminateExtension) {
3970   InitializeEmptyExtensionService();
3971
3972   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3973   EXPECT_EQ(1u, registry()->enabled_extensions().size());
3974   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3975   EXPECT_EQ(0u, registry()->terminated_extensions().size());
3976   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
3977
3978   TerminateExtension(good_crx);
3979
3980   EXPECT_EQ(0u, registry()->enabled_extensions().size());
3981   EXPECT_EQ(0u, registry()->disabled_extensions().size());
3982   EXPECT_EQ(1u, registry()->terminated_extensions().size());
3983   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
3984 }
3985
3986 TEST_F(ExtensionServiceTest, DisableTerminatedExtension) {
3987   InitializeEmptyExtensionService();
3988
3989   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
3990   TerminateExtension(good_crx);
3991   EXPECT_TRUE(registry()->GetExtensionById(
3992       good_crx, extensions::ExtensionRegistry::TERMINATED));
3993
3994   // Disable it.
3995   service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
3996
3997   EXPECT_FALSE(registry()->GetExtensionById(
3998       good_crx, extensions::ExtensionRegistry::TERMINATED));
3999   EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
4000
4001   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4002   EXPECT_EQ(1u, registry()->disabled_extensions().size());
4003   EXPECT_EQ(0u, registry()->terminated_extensions().size());
4004   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
4005 }
4006
4007 // Tests disabling all extensions (simulating --disable-extensions flag).
4008 TEST_F(ExtensionServiceTest, DisableAllExtensions) {
4009   InitializeEmptyExtensionService();
4010
4011   base::FilePath path = data_dir().AppendASCII("good.crx");
4012   InstallCRX(path, INSTALL_NEW);
4013
4014   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4015   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4016
4017   // Disable extensions.
4018   service()->set_extensions_enabled(false);
4019   service()->ReloadExtensionsForTest();
4020
4021   // There shouldn't be extensions in either list.
4022   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4023   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4024
4025   // This shouldn't do anything when all extensions are disabled.
4026   service()->EnableExtension(good_crx);
4027   service()->ReloadExtensionsForTest();
4028
4029   // There still shouldn't be extensions in either list.
4030   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4031   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4032
4033   // And then re-enable the extensions.
4034   service()->set_extensions_enabled(true);
4035   service()->ReloadExtensionsForTest();
4036
4037   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4038   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4039 }
4040
4041 // Tests reloading extensions.
4042 TEST_F(ExtensionServiceTest, ReloadExtensions) {
4043   InitializeEmptyExtensionService();
4044
4045   // Simple extension that should install without error.
4046   base::FilePath path = data_dir().AppendASCII("good.crx");
4047   InstallCRX(path, INSTALL_NEW,
4048              Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT);
4049   const char* extension_id = good_crx;
4050   service()->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION);
4051
4052   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4053   EXPECT_EQ(1u, registry()->disabled_extensions().size());
4054
4055   service()->ReloadExtensionsForTest();
4056
4057   // The creation flags should not change when reloading the extension.
4058   const Extension* extension = service()->GetExtensionById(good_crx, true);
4059   EXPECT_TRUE(extension->from_webstore());
4060   EXPECT_TRUE(extension->was_installed_by_default());
4061   EXPECT_FALSE(extension->from_bookmark());
4062
4063   // Extension counts shouldn't change.
4064   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4065   EXPECT_EQ(1u, registry()->disabled_extensions().size());
4066
4067   service()->EnableExtension(extension_id);
4068
4069   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4070   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4071
4072   // Need to clear |loaded_| manually before reloading as the
4073   // EnableExtension() call above inserted into it and
4074   // UnloadAllExtensions() doesn't send out notifications.
4075   loaded_.clear();
4076   service()->ReloadExtensionsForTest();
4077
4078   // Extension counts shouldn't change.
4079   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4080   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4081 }
4082
4083 // Tests reloading an extension.
4084 TEST_F(ExtensionServiceTest, ReloadExtension) {
4085   InitializeEmptyExtensionService();
4086   InitializeProcessManager();
4087
4088   // Simple extension that should install without error.
4089   const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj";
4090   base::FilePath ext = data_dir()
4091                            .AppendASCII("good")
4092                            .AppendASCII("Extensions")
4093                            .AppendASCII(extension_id)
4094                            .AppendASCII("1.0.0.0");
4095   extensions::UnpackedInstaller::Create(service())->Load(ext);
4096   base::RunLoop().RunUntilIdle();
4097
4098   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4099   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4100
4101   service()->ReloadExtension(extension_id);
4102
4103   // Extension should be disabled now, waiting to be reloaded.
4104   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4105   EXPECT_EQ(1u, registry()->disabled_extensions().size());
4106   EXPECT_EQ(Extension::DISABLE_RELOAD,
4107             ExtensionPrefs::Get(profile())->GetDisableReasons(extension_id));
4108
4109   // Reloading again should not crash.
4110   service()->ReloadExtension(extension_id);
4111
4112   // Finish reloading
4113   base::RunLoop().RunUntilIdle();
4114
4115   // Extension should be enabled again.
4116   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4117   EXPECT_EQ(0u, registry()->disabled_extensions().size());
4118 }
4119
4120 TEST_F(ExtensionServiceTest, UninstallExtension) {
4121   InitializeEmptyExtensionService();
4122   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
4123   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4124   UninstallExtension(good_crx, false);
4125   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4126   EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_);
4127 }
4128
4129 TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) {
4130   InitializeEmptyExtensionService();
4131   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
4132   TerminateExtension(good_crx);
4133   UninstallExtension(good_crx, false);
4134   EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_);
4135 }
4136
4137 // Tests the uninstaller helper.
4138 TEST_F(ExtensionServiceTest, UninstallExtensionHelper) {
4139   InitializeEmptyExtensionService();
4140   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
4141   UninstallExtension(good_crx, true);
4142   EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_);
4143 }
4144
4145 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) {
4146   InitializeEmptyExtensionService();
4147   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
4148   TerminateExtension(good_crx);
4149   UninstallExtension(good_crx, true);
4150   EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_);
4151 }
4152
4153 // An extension disabled because of unsupported requirements should re-enabled
4154 // if updated to a version with supported requirements as long as there are no
4155 // other disable reasons.
4156 TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) {
4157   InitializeEmptyExtensionService();
4158   BlackListWebGL();
4159
4160   base::FilePath path = data_dir().AppendASCII("requirements");
4161   base::FilePath pem_path =
4162       data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
4163   const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
4164                                                     pem_path,
4165                                                     INSTALL_NEW);
4166   std::string id = extension_v1->id();
4167   EXPECT_TRUE(service()->IsExtensionEnabled(id));
4168
4169   base::FilePath v2_bad_requirements_crx = GetTemporaryFile();
4170
4171   PackCRX(path.AppendASCII("v2_bad_requirements"),
4172           pem_path,
4173           v2_bad_requirements_crx);
4174   UpdateExtension(id, v2_bad_requirements_crx, INSTALLED);
4175   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4176
4177   base::FilePath v3_good_crx = GetTemporaryFile();
4178
4179   PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx);
4180   UpdateExtension(id, v3_good_crx, ENABLED);
4181   EXPECT_TRUE(service()->IsExtensionEnabled(id));
4182 }
4183
4184 // Extensions disabled through user action should stay disabled.
4185 TEST_F(ExtensionServiceTest, UpgradingRequirementsDisabled) {
4186   InitializeEmptyExtensionService();
4187   BlackListWebGL();
4188
4189   base::FilePath path = data_dir().AppendASCII("requirements");
4190   base::FilePath pem_path =
4191       data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
4192   const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
4193                                                     pem_path,
4194                                                     INSTALL_NEW);
4195   std::string id = extension_v1->id();
4196   service()->DisableExtension(id, Extension::DISABLE_USER_ACTION);
4197   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4198
4199   base::FilePath v2_bad_requirements_crx = GetTemporaryFile();
4200
4201   PackCRX(path.AppendASCII("v2_bad_requirements"),
4202           pem_path,
4203           v2_bad_requirements_crx);
4204   UpdateExtension(id, v2_bad_requirements_crx, INSTALLED);
4205   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4206
4207   base::FilePath v3_good_crx = GetTemporaryFile();
4208
4209   PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx);
4210   UpdateExtension(id, v3_good_crx, INSTALLED);
4211   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4212 }
4213
4214 // The extension should not re-enabled because it was disabled from a
4215 // permission increase.
4216 TEST_F(ExtensionServiceTest, UpgradingRequirementsPermissions) {
4217   InitializeEmptyExtensionService();
4218   BlackListWebGL();
4219
4220   base::FilePath path = data_dir().AppendASCII("requirements");
4221   base::FilePath pem_path =
4222       data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem");
4223   const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"),
4224                                                     pem_path,
4225                                                     INSTALL_NEW);
4226   std::string id = extension_v1->id();
4227   EXPECT_TRUE(service()->IsExtensionEnabled(id));
4228
4229   base::FilePath v2_bad_requirements_and_permissions_crx = GetTemporaryFile();
4230
4231   PackCRX(path.AppendASCII("v2_bad_requirements_and_permissions"),
4232           pem_path,
4233           v2_bad_requirements_and_permissions_crx);
4234   UpdateExtension(id, v2_bad_requirements_and_permissions_crx, INSTALLED);
4235   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4236
4237   base::FilePath v3_bad_permissions_crx = GetTemporaryFile();
4238
4239   PackCRX(path.AppendASCII("v3_bad_permissions"),
4240           pem_path,
4241           v3_bad_permissions_crx);
4242   UpdateExtension(id, v3_bad_permissions_crx, INSTALLED);
4243   EXPECT_FALSE(service()->IsExtensionEnabled(id));
4244 }
4245
4246 // Unpacked extensions are not allowed to be installed if they have unsupported
4247 // requirements.
4248 TEST_F(ExtensionServiceTest, UnpackedRequirements) {
4249   InitializeEmptyExtensionService();
4250   BlackListWebGL();
4251
4252   base::FilePath path =
4253       data_dir().AppendASCII("requirements").AppendASCII("v2_bad_requirements");
4254   extensions::UnpackedInstaller::Create(service())->Load(path);
4255   base::RunLoop().RunUntilIdle();
4256   EXPECT_EQ(1u, GetErrors().size());
4257   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4258 }
4259
4260 class ExtensionCookieCallback {
4261  public:
4262   ExtensionCookieCallback()
4263     : result_(false),
4264       weak_factory_(base::MessageLoop::current()) {}
4265
4266   void SetCookieCallback(bool result) {
4267     base::MessageLoop::current()->PostTask(FROM_HERE,
4268         base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr()));
4269     result_ = result;
4270   }
4271
4272   void GetAllCookiesCallback(const net::CookieList& list) {
4273     base::MessageLoop::current()->PostTask(FROM_HERE,
4274         base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr()));
4275     list_ = list;
4276   }
4277   net::CookieList list_;
4278   bool result_;
4279   base::WeakPtrFactory<base::MessageLoop> weak_factory_;
4280 };
4281
4282 // Verifies extension state is removed upon uninstall.
4283 TEST_F(ExtensionServiceTest, ClearExtensionData) {
4284   InitializeEmptyExtensionService();
4285   ExtensionCookieCallback callback;
4286
4287   // Load a test extension.
4288   base::FilePath path = data_dir();
4289   path = path.AppendASCII("good.crx");
4290   const Extension* extension = InstallCRX(path, INSTALL_NEW);
4291   ASSERT_TRUE(extension);
4292   GURL ext_url(extension->url());
4293   std::string origin_id = storage::GetIdentifierFromOrigin(ext_url);
4294
4295   // Set a cookie for the extension.
4296   net::CookieMonster* cookie_monster = profile()
4297                                            ->GetRequestContextForExtensions()
4298                                            ->GetURLRequestContext()
4299                                            ->cookie_store()
4300                                            ->GetCookieMonster();
4301   ASSERT_TRUE(cookie_monster);
4302   net::CookieOptions options;
4303   cookie_monster->SetCookieWithOptionsAsync(
4304        ext_url, "dummy=value", options,
4305        base::Bind(&ExtensionCookieCallback::SetCookieCallback,
4306                   base::Unretained(&callback)));
4307   base::RunLoop().RunUntilIdle();
4308   EXPECT_TRUE(callback.result_);
4309
4310   cookie_monster->GetAllCookiesForURLAsync(
4311       ext_url,
4312       base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
4313                  base::Unretained(&callback)));
4314   base::RunLoop().RunUntilIdle();
4315   EXPECT_EQ(1U, callback.list_.size());
4316
4317   // Open a database.
4318   storage::DatabaseTracker* db_tracker =
4319       BrowserContext::GetDefaultStoragePartition(profile())
4320           ->GetDatabaseTracker();
4321   base::string16 db_name = base::UTF8ToUTF16("db");
4322   base::string16 description = base::UTF8ToUTF16("db_description");
4323   int64 size;
4324   db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
4325   db_tracker->DatabaseClosed(origin_id, db_name);
4326   std::vector<storage::OriginInfo> origins;
4327   db_tracker->GetAllOriginsInfo(&origins);
4328   EXPECT_EQ(1U, origins.size());
4329   EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
4330
4331   // Create local storage. We only simulate this by creating the backing files.
4332   // Note: This test depends on details of how the dom_storage library
4333   // stores data in the host file system.
4334   base::FilePath lso_dir_path =
4335       profile()->GetPath().AppendASCII("Local Storage");
4336   base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id)
4337       .AddExtension(FILE_PATH_LITERAL(".localstorage"));
4338   EXPECT_TRUE(base::CreateDirectory(lso_dir_path));
4339   EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0));
4340   EXPECT_TRUE(base::PathExists(lso_file_path));
4341
4342   // Create indexed db. Similarly, it is enough to only simulate this by
4343   // creating the directory on the disk.
4344   IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition(
4345                                       profile())->GetIndexedDBContext();
4346   idb_context->SetTaskRunnerForTesting(
4347       base::MessageLoop::current()->message_loop_proxy().get());
4348   base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id);
4349   EXPECT_TRUE(base::CreateDirectory(idb_path));
4350   EXPECT_TRUE(base::DirectoryExists(idb_path));
4351
4352   // Uninstall the extension.
4353   base::RunLoop run_loop;
4354   ASSERT_TRUE(
4355       service()->UninstallExtension(good_crx,
4356                                     extensions::UNINSTALL_REASON_FOR_TESTING,
4357                                     run_loop.QuitClosure(),
4358                                     NULL));
4359   // The data deletion happens on the IO thread.
4360   run_loop.Run();
4361
4362   // Check that the cookie is gone.
4363   cookie_monster->GetAllCookiesForURLAsync(
4364        ext_url,
4365        base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
4366                   base::Unretained(&callback)));
4367   base::RunLoop().RunUntilIdle();
4368   EXPECT_EQ(0U, callback.list_.size());
4369
4370   // The database should have vanished as well.
4371   origins.clear();
4372   db_tracker->GetAllOriginsInfo(&origins);
4373   EXPECT_EQ(0U, origins.size());
4374
4375   // Check that the LSO file has been removed.
4376   EXPECT_FALSE(base::PathExists(lso_file_path));
4377
4378   // Check if the indexed db has disappeared too.
4379   EXPECT_FALSE(base::DirectoryExists(idb_path));
4380 }
4381
4382 // Verifies app state is removed upon uninstall.
4383 TEST_F(ExtensionServiceTest, ClearAppData) {
4384   InitializeEmptyExtensionService();
4385   ExtensionCookieCallback callback;
4386
4387   int pref_count = 0;
4388
4389   // Install app1 with unlimited storage.
4390   const Extension* extension =
4391       PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
4392   ValidatePrefKeyCount(++pref_count);
4393   ASSERT_EQ(1u, registry()->enabled_extensions().size());
4394   const std::string id1 = extension->id();
4395   EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
4396       APIPermission::kUnlimitedStorage));
4397   const GURL origin1(
4398       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
4399   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4400       origin1));
4401   std::string origin_id = storage::GetIdentifierFromOrigin(origin1);
4402
4403   // Install app2 from the same origin with unlimited storage.
4404   extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
4405   ValidatePrefKeyCount(++pref_count);
4406   ASSERT_EQ(2u, registry()->enabled_extensions().size());
4407   const std::string id2 = extension->id();
4408   EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
4409       APIPermission::kUnlimitedStorage));
4410   EXPECT_TRUE(extension->web_extent().MatchesURL(
4411       extensions::AppLaunchInfo::GetFullLaunchURL(extension)));
4412   const GURL origin2(
4413       extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin());
4414   EXPECT_EQ(origin1, origin2);
4415   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4416       origin2));
4417
4418   // Set a cookie for the extension.
4419   net::CookieMonster* cookie_monster = profile()
4420                                            ->GetRequestContext()
4421                                            ->GetURLRequestContext()
4422                                            ->cookie_store()
4423                                            ->GetCookieMonster();
4424   ASSERT_TRUE(cookie_monster);
4425   net::CookieOptions options;
4426   cookie_monster->SetCookieWithOptionsAsync(
4427        origin1, "dummy=value", options,
4428        base::Bind(&ExtensionCookieCallback::SetCookieCallback,
4429                   base::Unretained(&callback)));
4430   base::RunLoop().RunUntilIdle();
4431   EXPECT_TRUE(callback.result_);
4432
4433   cookie_monster->GetAllCookiesForURLAsync(
4434       origin1,
4435       base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
4436                  base::Unretained(&callback)));
4437   base::RunLoop().RunUntilIdle();
4438   EXPECT_EQ(1U, callback.list_.size());
4439
4440   // Open a database.
4441   storage::DatabaseTracker* db_tracker =
4442       BrowserContext::GetDefaultStoragePartition(profile())
4443           ->GetDatabaseTracker();
4444   base::string16 db_name = base::UTF8ToUTF16("db");
4445   base::string16 description = base::UTF8ToUTF16("db_description");
4446   int64 size;
4447   db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size);
4448   db_tracker->DatabaseClosed(origin_id, db_name);
4449   std::vector<storage::OriginInfo> origins;
4450   db_tracker->GetAllOriginsInfo(&origins);
4451   EXPECT_EQ(1U, origins.size());
4452   EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier());
4453
4454   // Create local storage. We only simulate this by creating the backing files.
4455   // Note: This test depends on details of how the dom_storage library
4456   // stores data in the host file system.
4457   base::FilePath lso_dir_path =
4458       profile()->GetPath().AppendASCII("Local Storage");
4459   base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id)
4460       .AddExtension(FILE_PATH_LITERAL(".localstorage"));
4461   EXPECT_TRUE(base::CreateDirectory(lso_dir_path));
4462   EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0));
4463   EXPECT_TRUE(base::PathExists(lso_file_path));
4464
4465   // Create indexed db. Similarly, it is enough to only simulate this by
4466   // creating the directory on the disk.
4467   IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition(
4468                                       profile())->GetIndexedDBContext();
4469   idb_context->SetTaskRunnerForTesting(
4470       base::MessageLoop::current()->message_loop_proxy().get());
4471   base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id);
4472   EXPECT_TRUE(base::CreateDirectory(idb_path));
4473   EXPECT_TRUE(base::DirectoryExists(idb_path));
4474
4475   // Uninstall one of them, unlimited storage should still be granted
4476   // to the origin.
4477   UninstallExtension(id1, false);
4478   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4479   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4480       origin1));
4481
4482   // Check that the cookie is still there.
4483   cookie_monster->GetAllCookiesForURLAsync(
4484        origin1,
4485        base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
4486                   base::Unretained(&callback)));
4487   base::RunLoop().RunUntilIdle();
4488   EXPECT_EQ(1U, callback.list_.size());
4489
4490   // Now uninstall the other. Storage should be cleared for the apps.
4491   UninstallExtension(id2, false);
4492   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4493   EXPECT_FALSE(
4494       profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
4495           origin1));
4496
4497   // Check that the cookie is gone.
4498   cookie_monster->GetAllCookiesForURLAsync(
4499        origin1,
4500        base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback,
4501                   base::Unretained(&callback)));
4502   base::RunLoop().RunUntilIdle();
4503   EXPECT_EQ(0U, callback.list_.size());
4504
4505   // The database should have vanished as well.
4506   origins.clear();
4507   db_tracker->GetAllOriginsInfo(&origins);
4508   EXPECT_EQ(0U, origins.size());
4509
4510   // Check that the LSO file has been removed.
4511   EXPECT_FALSE(base::PathExists(lso_file_path));
4512
4513   // Check if the indexed db has disappeared too.
4514   EXPECT_FALSE(base::DirectoryExists(idb_path));
4515 }
4516
4517 // Tests loading single extensions (like --load-extension)
4518 // Flaky crashes. http://crbug.com/231806
4519 TEST_F(ExtensionServiceTest, DISABLED_LoadExtension) {
4520   InitializeEmptyExtensionService();
4521
4522   base::FilePath ext1 = data_dir()
4523                             .AppendASCII("good")
4524                             .AppendASCII("Extensions")
4525                             .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
4526                             .AppendASCII("1.0.0.0");
4527   extensions::UnpackedInstaller::Create(service())->Load(ext1);
4528   base::RunLoop().RunUntilIdle();
4529   EXPECT_EQ(0u, GetErrors().size());
4530   ASSERT_EQ(1u, loaded_.size());
4531   EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location());
4532   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4533
4534   ValidatePrefKeyCount(1);
4535
4536   base::FilePath no_manifest =
4537       data_dir()
4538           .AppendASCII("bad")
4539           // .AppendASCII("Extensions")
4540           .AppendASCII("cccccccccccccccccccccccccccccccc")
4541           .AppendASCII("1");
4542   extensions::UnpackedInstaller::Create(service())->Load(no_manifest);
4543   base::RunLoop().RunUntilIdle();
4544   EXPECT_EQ(1u, GetErrors().size());
4545   ASSERT_EQ(1u, loaded_.size());
4546   EXPECT_EQ(1u, registry()->enabled_extensions().size());
4547
4548   // Test uninstall.
4549   std::string id = loaded_[0]->id();
4550   EXPECT_FALSE(unloaded_id_.length());
4551   service()->UninstallExtension(id,
4552                                 extensions::UNINSTALL_REASON_FOR_TESTING,
4553                                 base::Bind(&base::DoNothing),
4554                                 NULL);
4555   base::RunLoop().RunUntilIdle();
4556   EXPECT_EQ(id, unloaded_id_);
4557   ASSERT_EQ(0u, loaded_.size());
4558   EXPECT_EQ(0u, registry()->enabled_extensions().size());
4559 }
4560
4561 // Tests that we generate IDs when they are not specified in the manifest for
4562 // --load-extension.
4563 TEST_F(ExtensionServiceTest, GenerateID) {
4564   InitializeEmptyExtensionService();
4565
4566   base::FilePath no_id_ext = data_dir().AppendASCII("no_id");
4567   extensions::UnpackedInstaller::Create(service())->Load(no_id_ext);
4568   base::RunLoop().RunUntilIdle();
4569   EXPECT_EQ(0u, GetErrors().size());
4570   ASSERT_EQ(1u, loaded_.size());
4571   ASSERT_TRUE(crx_file::id_util::IdIsValid(loaded_[0]->id()));
4572   EXPECT_EQ(loaded_[0]->location(), Manifest::UNPACKED);
4573
4574   ValidatePrefKeyCount(1);
4575
4576   std::string previous_id = loaded_[0]->id();
4577
4578   // If we reload the same path, we should get the same extension ID.
4579   extensions::UnpackedInstaller::Create(service())->Load(no_id_ext);
4580   base::RunLoop().RunUntilIdle();
4581   ASSERT_EQ(1u, loaded_.size());
4582   ASSERT_EQ(previous_id, loaded_[0]->id());
4583 }
4584
4585 TEST_F(ExtensionServiceTest, UnpackedValidatesLocales) {
4586   InitializeEmptyExtensionService();
4587
4588   base::FilePath bad_locale =
4589       data_dir().AppendASCII("unpacked").AppendASCII("bad_messages_file");
4590   extensions::UnpackedInstaller::Create(service())->Load(bad_locale);
4591   base::RunLoop().RunUntilIdle();
4592   EXPECT_EQ(1u, GetErrors().size());
4593   base::FilePath ms_messages_file = bad_locale.AppendASCII("_locales")
4594                                               .AppendASCII("ms")
4595                                               .AppendASCII("messages.json");
4596   EXPECT_THAT(base::UTF16ToUTF8(GetErrors()[0]), testing::AllOf(
4597        testing::HasSubstr(
4598            base::UTF16ToUTF8(ms_messages_file.LossyDisplayName())),
4599        testing::HasSubstr("Dictionary keys must be quoted.")));
4600   ASSERT_EQ(0u, loaded_.size());
4601 }
4602
4603 void ExtensionServiceTest::TestExternalProvider(
4604     MockExtensionProvider* provider, Manifest::Location location) {
4605   // Verify that starting with no providers loads no extensions.
4606   service()->Init();
4607   ASSERT_EQ(0u, loaded_.size());
4608
4609   provider->set_visit_count(0);
4610
4611   // Register a test extension externally using the mock registry provider.
4612   base::FilePath source_path = data_dir().AppendASCII("good.crx");
4613
4614   // Add the extension.
4615   provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path);
4616
4617   // Reloading extensions should find our externally registered extension
4618   // and install it.
4619   content::WindowedNotificationObserver observer(
4620       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4621       content::NotificationService::AllSources());
4622   service()->CheckForExternalUpdates();
4623   observer.Wait();
4624
4625   ASSERT_EQ(0u, GetErrors().size());
4626   ASSERT_EQ(1u, loaded_.size());
4627   ASSERT_EQ(location, loaded_[0]->location());
4628   ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString());
4629   ValidatePrefKeyCount(1);
4630   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
4631   ValidateIntegerPref(good_crx, "location", location);
4632
4633   // Reload extensions without changing anything. The extension should be
4634   // loaded again.
4635   loaded_.clear();
4636   service()->ReloadExtensionsForTest();
4637   base::RunLoop().RunUntilIdle();
4638   ASSERT_EQ(0u, GetErrors().size());
4639   ASSERT_EQ(1u, loaded_.size());
4640   ValidatePrefKeyCount(1);
4641   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
4642   ValidateIntegerPref(good_crx, "location", location);
4643
4644   // Now update the extension with a new version. We should get upgraded.
4645   source_path = source_path.DirName().AppendASCII("good2.crx");
4646   provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path);
4647
4648   loaded_.clear();
4649   content::WindowedNotificationObserver observer_2(
4650       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4651       content::NotificationService::AllSources());
4652   service()->CheckForExternalUpdates();
4653   observer_2.Wait();
4654   ASSERT_EQ(0u, GetErrors().size());
4655   ASSERT_EQ(1u, loaded_.size());
4656   ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString());
4657   ValidatePrefKeyCount(1);
4658   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
4659   ValidateIntegerPref(good_crx, "location", location);
4660
4661   // Uninstall the extension and reload. Nothing should happen because the
4662   // preference should prevent us from reinstalling.
4663   std::string id = loaded_[0]->id();
4664   bool no_uninstall =
4665       GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL);
4666   service()->UninstallExtension(id,
4667                                 extensions::UNINSTALL_REASON_FOR_TESTING,
4668                                 base::Bind(&base::DoNothing),
4669                                 NULL);
4670   base::RunLoop().RunUntilIdle();
4671
4672   base::FilePath install_path = extensions_install_dir().AppendASCII(id);
4673   if (no_uninstall) {
4674     // Policy controlled extensions should not have been touched by uninstall.
4675     ASSERT_TRUE(base::PathExists(install_path));
4676   } else {
4677     // The extension should also be gone from the install directory.
4678     ASSERT_FALSE(base::PathExists(install_path));
4679     loaded_.clear();
4680     service()->CheckForExternalUpdates();
4681     base::RunLoop().RunUntilIdle();
4682     ASSERT_EQ(0u, loaded_.size());
4683     ValidatePrefKeyCount(1);
4684     ValidateIntegerPref(good_crx, "state",
4685                         Extension::EXTERNAL_EXTENSION_UNINSTALLED);
4686     ValidateIntegerPref(good_crx, "location", location);
4687
4688     // Now clear the preference and reinstall.
4689     SetPrefInteg(good_crx, "state", Extension::ENABLED);
4690
4691     loaded_.clear();
4692     content::WindowedNotificationObserver observer(
4693         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4694         content::NotificationService::AllSources());
4695     service()->CheckForExternalUpdates();
4696     observer.Wait();
4697     ASSERT_EQ(1u, loaded_.size());
4698   }
4699   ValidatePrefKeyCount(1);
4700   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
4701   ValidateIntegerPref(good_crx, "location", location);
4702
4703   if (GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL)) {
4704     EXPECT_EQ(2, provider->visit_count());
4705   } else {
4706     // Now test an externally triggered uninstall (deleting the registry key or
4707     // the pref entry).
4708     provider->RemoveExtension(good_crx);
4709
4710     loaded_.clear();
4711     service()->OnExternalProviderReady(provider);
4712     base::RunLoop().RunUntilIdle();
4713     ASSERT_EQ(0u, loaded_.size());
4714     ValidatePrefKeyCount(0);
4715
4716     // The extension should also be gone from the install directory.
4717     ASSERT_FALSE(base::PathExists(install_path));
4718
4719     // Now test the case where user uninstalls and then the extension is removed
4720     // from the external provider.
4721     content::WindowedNotificationObserver observer(
4722         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4723         content::NotificationService::AllSources());
4724     provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path);
4725     service()->CheckForExternalUpdates();
4726     observer.Wait();
4727
4728     ASSERT_EQ(1u, loaded_.size());
4729     ASSERT_EQ(0u, GetErrors().size());
4730
4731     // User uninstalls.
4732     loaded_.clear();
4733     service()->UninstallExtension(id,
4734                                   extensions::UNINSTALL_REASON_FOR_TESTING,
4735                                   base::Bind(&base::DoNothing),
4736                                   NULL);
4737     base::RunLoop().RunUntilIdle();
4738     ASSERT_EQ(0u, loaded_.size());
4739
4740     // Then remove the extension from the extension provider.
4741     provider->RemoveExtension(good_crx);
4742
4743     // Should still be at 0.
4744     loaded_.clear();
4745     extensions::InstalledLoader(service()).LoadAllExtensions();
4746     base::RunLoop().RunUntilIdle();
4747     ASSERT_EQ(0u, loaded_.size());
4748     ValidatePrefKeyCount(1);
4749
4750     EXPECT_EQ(5, provider->visit_count());
4751   }
4752 }
4753
4754 // Tests the external installation feature
4755 #if defined(OS_WIN)
4756 TEST_F(ExtensionServiceTest, ExternalInstallRegistry) {
4757   // This should all work, even when normal extension installation is disabled.
4758   InitializeEmptyExtensionService();
4759   service()->set_extensions_enabled(false);
4760
4761   // Now add providers. Extension system takes ownership of the objects.
4762   MockExtensionProvider* reg_provider =
4763       new MockExtensionProvider(service(), Manifest::EXTERNAL_REGISTRY);
4764   AddMockExternalProvider(reg_provider);
4765   TestExternalProvider(reg_provider, Manifest::EXTERNAL_REGISTRY);
4766 }
4767 #endif
4768
4769 TEST_F(ExtensionServiceTest, ExternalInstallPref) {
4770   InitializeEmptyExtensionService();
4771
4772   // Now add providers. Extension system takes ownership of the objects.
4773   MockExtensionProvider* pref_provider =
4774       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
4775
4776   AddMockExternalProvider(pref_provider);
4777   TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF);
4778 }
4779
4780 TEST_F(ExtensionServiceTest, ExternalInstallPrefUpdateUrl) {
4781   // This should all work, even when normal extension installation is disabled.
4782   InitializeEmptyExtensionService();
4783   service()->set_extensions_enabled(false);
4784
4785   // TODO(skerner): The mock provider is not a good model of a provider
4786   // that works with update URLs, because it adds file and version info.
4787   // Extend the mock to work with update URLs.  This test checks the
4788   // behavior that is common to all external extension visitors.  The
4789   // browser test ExtensionManagementTest.ExternalUrlUpdate tests that
4790   // what the visitor does results in an extension being downloaded and
4791   // installed.
4792   MockExtensionProvider* pref_provider =
4793       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF_DOWNLOAD);
4794   AddMockExternalProvider(pref_provider);
4795   TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF_DOWNLOAD);
4796 }
4797
4798 TEST_F(ExtensionServiceTest, ExternalInstallPolicyUpdateUrl) {
4799   // This should all work, even when normal extension installation is disabled.
4800   InitializeEmptyExtensionService();
4801   service()->set_extensions_enabled(false);
4802
4803   // TODO(skerner): The mock provider is not a good model of a provider
4804   // that works with update URLs, because it adds file and version info.
4805   // Extend the mock to work with update URLs. This test checks the
4806   // behavior that is common to all external extension visitors. The
4807   // browser test ExtensionManagementTest.ExternalUrlUpdate tests that
4808   // what the visitor does results in an extension being downloaded and
4809   // installed.
4810   MockExtensionProvider* pref_provider =
4811       new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
4812   AddMockExternalProvider(pref_provider);
4813   TestExternalProvider(pref_provider, Manifest::EXTERNAL_POLICY_DOWNLOAD);
4814 }
4815
4816 // Tests that external extensions get uninstalled when the external extension
4817 // providers can't account for them.
4818 TEST_F(ExtensionServiceTest, ExternalUninstall) {
4819   // Start the extensions service with one external extension already installed.
4820   base::FilePath source_install_dir =
4821       data_dir().AppendASCII("good").AppendASCII("Extensions");
4822   base::FilePath pref_path = source_install_dir
4823       .DirName()
4824       .AppendASCII("PreferencesExternal");
4825
4826   // This initializes the extensions service with no ExternalProviders.
4827   InitializeInstalledExtensionService(pref_path, source_install_dir);
4828   service()->set_extensions_enabled(false);
4829
4830   service()->Init();
4831
4832   ASSERT_EQ(0u, GetErrors().size());
4833   ASSERT_EQ(0u, loaded_.size());
4834
4835   // Verify that it's not the disabled extensions flag causing it not to load.
4836   service()->set_extensions_enabled(true);
4837   service()->ReloadExtensionsForTest();
4838   base::RunLoop().RunUntilIdle();
4839
4840   ASSERT_EQ(0u, GetErrors().size());
4841   ASSERT_EQ(0u, loaded_.size());
4842 }
4843
4844 // Test that running multiple update checks simultaneously does not
4845 // keep the update from succeeding.
4846 TEST_F(ExtensionServiceTest, MultipleExternalUpdateCheck) {
4847   InitializeEmptyExtensionService();
4848
4849   MockExtensionProvider* provider =
4850       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
4851   AddMockExternalProvider(provider);
4852
4853   // Verify that starting with no providers loads no extensions.
4854   service()->Init();
4855   ASSERT_EQ(0u, loaded_.size());
4856
4857   // Start two checks for updates.
4858   provider->set_visit_count(0);
4859   service()->CheckForExternalUpdates();
4860   service()->CheckForExternalUpdates();
4861   base::RunLoop().RunUntilIdle();
4862
4863   // Two calls should cause two checks for external extensions.
4864   EXPECT_EQ(2, provider->visit_count());
4865   EXPECT_EQ(0u, GetErrors().size());
4866   EXPECT_EQ(0u, loaded_.size());
4867
4868   // Register a test extension externally using the mock registry provider.
4869   base::FilePath source_path = data_dir().AppendASCII("good.crx");
4870   provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path);
4871
4872   // Two checks for external updates should find the extension, and install it
4873   // once.
4874   content::WindowedNotificationObserver observer(
4875       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
4876       content::NotificationService::AllSources());
4877   provider->set_visit_count(0);
4878   service()->CheckForExternalUpdates();
4879   service()->CheckForExternalUpdates();
4880   observer.Wait();
4881   EXPECT_EQ(2, provider->visit_count());
4882   ASSERT_EQ(0u, GetErrors().size());
4883   ASSERT_EQ(1u, loaded_.size());
4884   ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location());
4885   ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString());
4886   ValidatePrefKeyCount(1);
4887   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
4888   ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF);
4889
4890   provider->RemoveExtension(good_crx);
4891   provider->set_visit_count(0);
4892   service()->CheckForExternalUpdates();
4893   service()->CheckForExternalUpdates();
4894   base::RunLoop().RunUntilIdle();
4895
4896   // Two calls should cause two checks for external extensions.
4897   // Because the external source no longer includes good_crx,
4898   // good_crx will be uninstalled.  So, expect that no extensions
4899   // are loaded.
4900   EXPECT_EQ(2, provider->visit_count());
4901   EXPECT_EQ(0u, GetErrors().size());
4902   EXPECT_EQ(0u, loaded_.size());
4903 }
4904
4905 TEST_F(ExtensionServiceTest, ExternalPrefProvider) {
4906   InitializeEmptyExtensionService();
4907
4908   // Test some valid extension records.
4909   // Set a base path to avoid erroring out on relative paths.
4910   // Paths starting with // are absolute on every platform we support.
4911   base::FilePath base_path(FILE_PATH_LITERAL("//base/path"));
4912   ASSERT_TRUE(base_path.IsAbsolute());
4913   MockProviderVisitor visitor(base_path);
4914   std::string json_data =
4915       "{"
4916       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
4917       "    \"external_crx\": \"RandomExtension.crx\","
4918       "    \"external_version\": \"1.0\""
4919       "  },"
4920       "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
4921       "    \"external_crx\": \"RandomExtension2.crx\","
4922       "    \"external_version\": \"2.0\""
4923       "  },"
4924       "  \"cccccccccccccccccccccccccccccccc\": {"
4925       "    \"external_update_url\": \"http:\\\\foo.com/update\","
4926       "    \"install_parameter\": \"id\""
4927       "  }"
4928       "}";
4929   EXPECT_EQ(3, visitor.Visit(json_data));
4930
4931   // Simulate an external_extensions.json file that contains seven invalid
4932   // records:
4933   // - One that is missing the 'external_crx' key.
4934   // - One that is missing the 'external_version' key.
4935   // - One that is specifying .. in the path.
4936   // - One that specifies both a file and update URL.
4937   // - One that specifies no file or update URL.
4938   // - One that has an update URL that is not well formed.
4939   // - One that contains a malformed version.
4940   // - One that has an invalid id.
4941   // - One that has a non-dictionary value.
4942   // - One that has an integer 'external_version' instead of a string.
4943   // The final extension is valid, and we check that it is read to make sure
4944   // failures don't stop valid records from being read.
4945   json_data =
4946       "{"
4947       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
4948       "    \"external_version\": \"1.0\""
4949       "  },"
4950       "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
4951       "    \"external_crx\": \"RandomExtension.crx\""
4952       "  },"
4953       "  \"cccccccccccccccccccccccccccccccc\": {"
4954       "    \"external_crx\": \"..\\\\foo\\\\RandomExtension2.crx\","
4955       "    \"external_version\": \"2.0\""
4956       "  },"
4957       "  \"dddddddddddddddddddddddddddddddd\": {"
4958       "    \"external_crx\": \"RandomExtension2.crx\","
4959       "    \"external_version\": \"2.0\","
4960       "    \"external_update_url\": \"http:\\\\foo.com/update\""
4961       "  },"
4962       "  \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\": {"
4963       "  },"
4964       "  \"ffffffffffffffffffffffffffffffff\": {"
4965       "    \"external_update_url\": \"This string is not a valid URL\""
4966       "  },"
4967       "  \"gggggggggggggggggggggggggggggggg\": {"
4968       "    \"external_crx\": \"RandomExtension3.crx\","
4969       "    \"external_version\": \"This is not a valid version!\""
4970       "  },"
4971       "  \"This is not a valid id!\": {},"
4972       "  \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true,"
4973       "  \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\": {"
4974       "    \"external_crx\": \"RandomExtension4.crx\","
4975       "    \"external_version\": 1.0"
4976       "  },"
4977       "  \"pppppppppppppppppppppppppppppppp\": {"
4978       "    \"external_crx\": \"RandomValidExtension.crx\","
4979       "    \"external_version\": \"1.0\""
4980       "  }"
4981       "}";
4982   EXPECT_EQ(1, visitor.Visit(json_data));
4983
4984   // Check that if a base path is not provided, use of a relative
4985   // path fails.
4986   base::FilePath empty;
4987   MockProviderVisitor visitor_no_relative_paths(empty);
4988
4989   // Use absolute paths.  Expect success.
4990   json_data =
4991       "{"
4992       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
4993       "    \"external_crx\": \"//RandomExtension1.crx\","
4994       "    \"external_version\": \"3.0\""
4995       "  },"
4996       "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
4997       "    \"external_crx\": \"//path/to/RandomExtension2.crx\","
4998       "    \"external_version\": \"3.0\""
4999       "  }"
5000       "}";
5001   EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data));
5002
5003   // Use a relative path.  Expect that it will error out.
5004   json_data =
5005       "{"
5006       "  \"cccccccccccccccccccccccccccccccc\": {"
5007       "    \"external_crx\": \"RandomExtension2.crx\","
5008       "    \"external_version\": \"3.0\""
5009       "  }"
5010       "}";
5011   EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data));
5012
5013   // Test supported_locales.
5014   json_data =
5015       "{"
5016       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5017       "    \"external_crx\": \"RandomExtension.crx\","
5018       "    \"external_version\": \"1.0\","
5019       "    \"supported_locales\": [ \"en\" ]"
5020       "  },"
5021       "  \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
5022       "    \"external_crx\": \"RandomExtension2.crx\","
5023       "    \"external_version\": \"2.0\","
5024       "    \"supported_locales\": [ \"en-GB\" ]"
5025       "  },"
5026       "  \"cccccccccccccccccccccccccccccccc\": {"
5027       "    \"external_crx\": \"RandomExtension2.crx\","
5028       "    \"external_version\": \"3.0\","
5029       "    \"supported_locales\": [ \"en_US\", \"fr\" ]"
5030       "  }"
5031       "}";
5032   {
5033     ScopedBrowserLocale guard("en-US");
5034     EXPECT_EQ(2, visitor.Visit(json_data));
5035   }
5036
5037   // Test keep_if_present.
5038   json_data =
5039       "{"
5040       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5041       "    \"external_crx\": \"RandomExtension.crx\","
5042       "    \"external_version\": \"1.0\","
5043       "    \"keep_if_present\": true"
5044       "  }"
5045       "}";
5046   {
5047     EXPECT_EQ(0, visitor.Visit(json_data));
5048   }
5049
5050   // Test is_bookmark_app.
5051   MockProviderVisitor from_bookmark_visitor(
5052       base_path, Extension::FROM_BOOKMARK);
5053   json_data =
5054       "{"
5055       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5056       "    \"external_crx\": \"RandomExtension.crx\","
5057       "    \"external_version\": \"1.0\","
5058       "    \"is_bookmark_app\": true"
5059       "  }"
5060       "}";
5061   EXPECT_EQ(1, from_bookmark_visitor.Visit(json_data));
5062
5063   // Test is_from_webstore.
5064   MockProviderVisitor from_webstore_visitor(
5065       base_path, Extension::FROM_WEBSTORE);
5066   json_data =
5067       "{"
5068       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5069       "    \"external_crx\": \"RandomExtension.crx\","
5070       "    \"external_version\": \"1.0\","
5071       "    \"is_from_webstore\": true"
5072       "  }"
5073       "}";
5074   EXPECT_EQ(1, from_webstore_visitor.Visit(json_data));
5075
5076   // Test was_installed_by_eom.
5077   MockProviderVisitor was_installed_by_eom_visitor(
5078       base_path, Extension::WAS_INSTALLED_BY_OEM);
5079   json_data =
5080       "{"
5081       "  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
5082       "    \"external_crx\": \"RandomExtension.crx\","
5083       "    \"external_version\": \"1.0\","
5084       "    \"was_installed_by_oem\": true"
5085       "  }"
5086       "}";
5087   EXPECT_EQ(1, was_installed_by_eom_visitor.Visit(json_data));
5088 }
5089
5090 // Test loading good extensions from the profile directory.
5091 TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) {
5092   // Ensure we're testing in "en" and leave global state untouched.
5093   extension_l10n_util::ScopedLocaleForTest testLocale("en");
5094
5095   // Initialize the test dir with a good Preferences/extensions.
5096   base::FilePath source_install_dir = data_dir().AppendASCII("l10n");
5097   base::FilePath pref_path =
5098       source_install_dir.Append(chrome::kPreferencesFilename);
5099   InitializeInstalledExtensionService(pref_path, source_install_dir);
5100
5101   service()->Init();
5102
5103   ASSERT_EQ(3u, loaded_.size());
5104
5105   // This was equal to "sr" on load.
5106   ValidateStringPref(loaded_[0]->id(), keys::kCurrentLocale, "en");
5107
5108   // These are untouched by re-localization.
5109   ValidateStringPref(loaded_[1]->id(), keys::kCurrentLocale, "en");
5110   EXPECT_FALSE(IsPrefExist(loaded_[1]->id(), keys::kCurrentLocale));
5111
5112   // This one starts with Serbian name, and gets re-localized into English.
5113   EXPECT_EQ("My name is simple.", loaded_[0]->name());
5114
5115   // These are untouched by re-localization.
5116   EXPECT_EQ("My name is simple.", loaded_[1]->name());
5117   EXPECT_EQ("no l10n", loaded_[2]->name());
5118 }
5119
5120 class ExtensionsReadyRecorder : public content::NotificationObserver {
5121  public:
5122   ExtensionsReadyRecorder() : ready_(false) {
5123     registrar_.Add(this,
5124                    extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED,
5125                    content::NotificationService::AllSources());
5126   }
5127
5128   void set_ready(bool value) { ready_ = value; }
5129   bool ready() { return ready_; }
5130
5131  private:
5132   virtual void Observe(int type,
5133                        const content::NotificationSource& source,
5134                        const content::NotificationDetails& details) OVERRIDE {
5135     switch (type) {
5136       case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED:
5137         ready_ = true;
5138         break;
5139       default:
5140         NOTREACHED();
5141     }
5142   }
5143
5144   content::NotificationRegistrar registrar_;
5145   bool ready_;
5146 };
5147
5148 // Test that we get enabled/disabled correctly for all the pref/command-line
5149 // combinations. We don't want to derive from the ExtensionServiceTest class
5150 // for this test, so we use ExtensionServiceTestSimple.
5151 //
5152 // Also tests that we always fire EXTENSIONS_READY, no matter whether we are
5153 // enabled or not.
5154 TEST(ExtensionServiceTestSimple, Enabledness) {
5155   // Make sure the PluginService singleton is destroyed at the end of the test.
5156   base::ShadowingAtExitManager at_exit_manager;
5157 #if defined(ENABLE_PLUGINS)
5158   content::PluginService::GetInstance()->Init();
5159   content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting();
5160 #endif
5161
5162   ExtensionErrorReporter::Init(false);  // no noisy errors
5163   ExtensionsReadyRecorder recorder;
5164   scoped_ptr<TestingProfile> profile(new TestingProfile());
5165   content::TestBrowserThreadBundle thread_bundle_;
5166 #if defined OS_CHROMEOS
5167   chromeos::ScopedTestDeviceSettingsService device_settings_service;
5168   chromeos::ScopedTestCrosSettings cros_settings;
5169   scoped_ptr<chromeos::ScopedTestUserManager> user_manager(
5170       new chromeos::ScopedTestUserManager);
5171 #endif
5172   scoped_ptr<CommandLine> command_line;
5173   base::FilePath install_dir = profile->GetPath()
5174       .AppendASCII(extensions::kInstallDirectoryName);
5175
5176   // By default, we are enabled.
5177   command_line.reset(new CommandLine(CommandLine::NO_PROGRAM));
5178   ExtensionService* service = static_cast<extensions::TestExtensionSystem*>(
5179       ExtensionSystem::Get(profile.get()))->
5180       CreateExtensionService(
5181           command_line.get(),
5182           install_dir,
5183           false);
5184   EXPECT_TRUE(service->extensions_enabled());
5185   service->Init();
5186   base::RunLoop().RunUntilIdle();
5187   EXPECT_TRUE(recorder.ready());
5188 #if defined OS_CHROMEOS
5189   user_manager.reset();
5190 #endif
5191
5192   // If either the command line or pref is set, we are disabled.
5193   recorder.set_ready(false);
5194   profile.reset(new TestingProfile());
5195   command_line->AppendSwitch(switches::kDisableExtensions);
5196   service = static_cast<extensions::TestExtensionSystem*>(
5197       ExtensionSystem::Get(profile.get()))->
5198       CreateExtensionService(
5199           command_line.get(),
5200           install_dir,
5201           false);
5202   EXPECT_FALSE(service->extensions_enabled());
5203   service->Init();
5204   base::RunLoop().RunUntilIdle();
5205   EXPECT_TRUE(recorder.ready());
5206
5207   recorder.set_ready(false);
5208   profile.reset(new TestingProfile());
5209   profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
5210   service = static_cast<extensions::TestExtensionSystem*>(
5211       ExtensionSystem::Get(profile.get()))->
5212       CreateExtensionService(
5213           command_line.get(),
5214           install_dir,
5215           false);
5216   EXPECT_FALSE(service->extensions_enabled());
5217   service->Init();
5218   base::RunLoop().RunUntilIdle();
5219   EXPECT_TRUE(recorder.ready());
5220
5221   recorder.set_ready(false);
5222   profile.reset(new TestingProfile());
5223   profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
5224   command_line.reset(new CommandLine(CommandLine::NO_PROGRAM));
5225   service = static_cast<extensions::TestExtensionSystem*>(
5226       ExtensionSystem::Get(profile.get()))->
5227       CreateExtensionService(
5228           command_line.get(),
5229           install_dir,
5230           false);
5231   EXPECT_FALSE(service->extensions_enabled());
5232   service->Init();
5233   base::RunLoop().RunUntilIdle();
5234   EXPECT_TRUE(recorder.ready());
5235
5236   // Explicitly delete all the resources used in this test.
5237   profile.reset();
5238   service = NULL;
5239   // Execute any pending deletion tasks.
5240   base::RunLoop().RunUntilIdle();
5241 }
5242
5243 // Test loading extensions that require limited and unlimited storage quotas.
5244 TEST_F(ExtensionServiceTest, StorageQuota) {
5245   InitializeEmptyExtensionService();
5246
5247   base::FilePath extensions_path = data_dir().AppendASCII("storage_quota");
5248
5249   base::FilePath limited_quota_ext =
5250       extensions_path.AppendASCII("limited_quota")
5251       .AppendASCII("1.0");
5252
5253   // The old permission name for unlimited quota was "unlimited_storage", but
5254   // we changed it to "unlimitedStorage". This tests both versions.
5255   base::FilePath unlimited_quota_ext =
5256       extensions_path.AppendASCII("unlimited_quota")
5257       .AppendASCII("1.0");
5258   base::FilePath unlimited_quota_ext2 =
5259       extensions_path.AppendASCII("unlimited_quota")
5260       .AppendASCII("2.0");
5261   extensions::UnpackedInstaller::Create(service())->Load(limited_quota_ext);
5262   extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext);
5263   extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext2);
5264   base::RunLoop().RunUntilIdle();
5265
5266   ASSERT_EQ(3u, loaded_.size());
5267   EXPECT_TRUE(profile());
5268   EXPECT_FALSE(profile()->IsOffTheRecord());
5269   EXPECT_FALSE(
5270       profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
5271           loaded_[0]->url()));
5272   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
5273       loaded_[1]->url()));
5274   EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited(
5275       loaded_[2]->url()));
5276 }
5277
5278 // Tests ComponentLoader::Add().
5279 TEST_F(ExtensionServiceTest, ComponentExtensions) {
5280   InitializeEmptyExtensionService();
5281
5282   // Component extensions should work even when extensions are disabled.
5283   service()->set_extensions_enabled(false);
5284
5285   base::FilePath path = data_dir()
5286                             .AppendASCII("good")
5287                             .AppendASCII("Extensions")
5288                             .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
5289                             .AppendASCII("1.0.0.0");
5290
5291   std::string manifest;
5292   ASSERT_TRUE(base::ReadFileToString(
5293       path.Append(extensions::kManifestFilename), &manifest));
5294
5295   service()->component_loader()->Add(manifest, path);
5296   service()->Init();
5297
5298   // Note that we do not pump messages -- the extension should be loaded
5299   // immediately.
5300
5301   EXPECT_EQ(0u, GetErrors().size());
5302   ASSERT_EQ(1u, loaded_.size());
5303   EXPECT_EQ(Manifest::COMPONENT, loaded_[0]->location());
5304   EXPECT_EQ(1u, registry()->enabled_extensions().size());
5305
5306   // Component extensions get a prefs entry on first install.
5307   ValidatePrefKeyCount(1);
5308
5309   // Reload all extensions, and make sure it comes back.
5310   std::string extension_id = (*registry()->enabled_extensions().begin())->id();
5311   loaded_.clear();
5312   service()->ReloadExtensionsForTest();
5313   ASSERT_EQ(1u, registry()->enabled_extensions().size());
5314   EXPECT_EQ(extension_id, (*registry()->enabled_extensions().begin())->id());
5315 }
5316
5317 TEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledComponent) {
5318   InitializeEmptyExtensionService();
5319   InitializeExtensionSyncService();
5320
5321   bool flare_was_called = false;
5322   syncer::ModelType triggered_type(syncer::UNSPECIFIED);
5323   base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5324   extension_sync_service()->SetSyncStartFlare(
5325       base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
5326                  factory.GetWeakPtr(),
5327                  &flare_was_called,  // Safe due to WeakPtrFactory scope.
5328                  &triggered_type));  // Safe due to WeakPtrFactory scope.
5329
5330   // Install a component extension.
5331   std::string manifest;
5332   ASSERT_TRUE(base::ReadFileToString(
5333       good0_path().Append(extensions::kManifestFilename), &manifest));
5334   service()->component_loader()->Add(manifest, good0_path());
5335   ASSERT_FALSE(service()->is_ready());
5336   service()->Init();
5337   ASSERT_TRUE(service()->is_ready());
5338
5339   // Extensions added before service is_ready() don't trigger sync startup.
5340   EXPECT_FALSE(flare_was_called);
5341   ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
5342 }
5343
5344 TEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledNormal) {
5345   InitializeGoodInstalledExtensionService();
5346   InitializeExtensionSyncService();
5347
5348   bool flare_was_called = false;
5349   syncer::ModelType triggered_type(syncer::UNSPECIFIED);
5350   base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5351   extension_sync_service()->SetSyncStartFlare(
5352       base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
5353                  factory.GetWeakPtr(),
5354                  &flare_was_called,  // Safe due to WeakPtrFactory scope.
5355                  &triggered_type));  // Safe due to WeakPtrFactory scope.
5356
5357   ASSERT_FALSE(service()->is_ready());
5358   service()->Init();
5359   ASSERT_EQ(3u, loaded_.size());
5360   ASSERT_TRUE(service()->is_ready());
5361
5362   // Extensions added before service is_ready() don't trigger sync startup.
5363   EXPECT_FALSE(flare_was_called);
5364   ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
5365 }
5366
5367 TEST_F(ExtensionServiceTest, DeferredSyncStartupOnInstall) {
5368   InitializeEmptyExtensionService();
5369   InitializeExtensionSyncService();
5370   service()->Init();
5371   ASSERT_TRUE(service()->is_ready());
5372
5373   bool flare_was_called = false;
5374   syncer::ModelType triggered_type(syncer::UNSPECIFIED);
5375   base::WeakPtrFactory<ExtensionServiceTest> factory(this);
5376   extension_sync_service()->SetSyncStartFlare(
5377       base::Bind(&ExtensionServiceTest::MockSyncStartFlare,
5378                  factory.GetWeakPtr(),
5379                  &flare_was_called,  // Safe due to WeakPtrFactory scope.
5380                  &triggered_type));  // Safe due to WeakPtrFactory scope.
5381
5382   base::FilePath path = data_dir().AppendASCII("good.crx");
5383   InstallCRX(path, INSTALL_NEW);
5384
5385   EXPECT_TRUE(flare_was_called);
5386   EXPECT_EQ(syncer::EXTENSIONS, triggered_type);
5387
5388   // Reset.
5389   flare_was_called = false;
5390   triggered_type = syncer::UNSPECIFIED;
5391
5392   // Once sync starts, flare should no longer be invoked.
5393   extension_sync_service()->MergeDataAndStartSyncing(
5394       syncer::EXTENSIONS,
5395       syncer::SyncDataList(),
5396       scoped_ptr<syncer::SyncChangeProcessor>(
5397           new syncer::FakeSyncChangeProcessor),
5398       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5399   path = data_dir().AppendASCII("page_action.crx");
5400   InstallCRX(path, INSTALL_NEW);
5401   EXPECT_FALSE(flare_was_called);
5402   ASSERT_EQ(syncer::UNSPECIFIED, triggered_type);
5403 }
5404
5405 TEST_F(ExtensionServiceTest, DisableExtensionFromSync) {
5406   // Start the extensions service with one external extension already installed.
5407   base::FilePath source_install_dir =
5408       data_dir().AppendASCII("good").AppendASCII("Extensions");
5409   base::FilePath pref_path =
5410       source_install_dir.DirName().Append(chrome::kPreferencesFilename);
5411
5412   InitializeInstalledExtensionService(pref_path, source_install_dir);
5413   InitializeExtensionSyncService();
5414
5415   // The user has enabled sync.
5416   ProfileSyncService* sync_service =
5417       ProfileSyncServiceFactory::GetForProfile(profile());
5418   sync_service->SetSyncSetupCompleted();
5419
5420   service()->Init();
5421   ASSERT_TRUE(service()->is_ready());
5422
5423   ASSERT_EQ(3u, loaded_.size());
5424
5425   // We start enabled.
5426   const Extension* extension = service()->GetExtensionById(good0, true);
5427   ASSERT_TRUE(extension);
5428   ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5429   extensions::ExtensionSyncData disable_good_crx(
5430       *extension, false, false, false);
5431
5432   // Then sync data arrives telling us to disable |good0|.
5433   syncer::SyncDataList sync_data;
5434   sync_data.push_back(disable_good_crx.GetSyncData());
5435   extension_sync_service()->MergeDataAndStartSyncing(
5436       syncer::EXTENSIONS,
5437       sync_data,
5438       scoped_ptr<syncer::SyncChangeProcessor>(
5439           new syncer::FakeSyncChangeProcessor),
5440       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5441   ASSERT_FALSE(service()->IsExtensionEnabled(good0));
5442 }
5443
5444 TEST_F(ExtensionServiceTest, DontDisableExtensionWithPendingEnableFromSync) {
5445   // Start the extensions service with one external extension already installed.
5446   base::FilePath source_install_dir =
5447       data_dir().AppendASCII("good").AppendASCII("Extensions");
5448   base::FilePath pref_path =
5449       source_install_dir.DirName().Append(chrome::kPreferencesFilename);
5450
5451   InitializeInstalledExtensionService(pref_path, source_install_dir);
5452   InitializeExtensionSyncService();
5453
5454   // The user has enabled sync.
5455   ProfileSyncService* sync_service =
5456       ProfileSyncServiceFactory::GetForProfile(profile());
5457   sync_service->SetSyncSetupCompleted();
5458
5459   service()->Init();
5460   ASSERT_TRUE(service()->is_ready());
5461   ASSERT_EQ(3u, loaded_.size());
5462
5463   const Extension* extension = service()->GetExtensionById(good0, true);
5464   ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5465
5466   // Disable extension before first sync data arrives.
5467   service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION);
5468   ASSERT_FALSE(service()->IsExtensionEnabled(good0));
5469
5470   // Enable extension - this is now the most recent state.
5471   service()->EnableExtension(good0);
5472   ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5473
5474   // Now sync data comes in that says to disable good0. This should be
5475   // ignored.
5476   extensions::ExtensionSyncData disable_good_crx(
5477       *extension, false, false, false);
5478   syncer::SyncDataList sync_data;
5479   sync_data.push_back(disable_good_crx.GetSyncData());
5480   extension_sync_service()->MergeDataAndStartSyncing(
5481       syncer::EXTENSIONS,
5482       sync_data,
5483       scoped_ptr<syncer::SyncChangeProcessor>(
5484           new syncer::FakeSyncChangeProcessor),
5485       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5486
5487   // The extension was enabled locally before the sync data arrived, so it
5488   // should still be enabled now.
5489   ASSERT_TRUE(service()->IsExtensionEnabled(good0));
5490 }
5491
5492 TEST_F(ExtensionServiceTest, GetSyncData) {
5493   InitializeEmptyExtensionService();
5494   InitializeExtensionSyncService();
5495   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5496   const Extension* extension = service()->GetInstalledExtension(good_crx);
5497   ASSERT_TRUE(extension);
5498
5499   extension_sync_service()->MergeDataAndStartSyncing(
5500       syncer::EXTENSIONS,
5501       syncer::SyncDataList(),
5502       scoped_ptr<syncer::SyncChangeProcessor>(
5503           new syncer::FakeSyncChangeProcessor),
5504       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5505
5506   syncer::SyncDataList list =
5507       extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5508   ASSERT_EQ(list.size(), 1U);
5509   extensions::ExtensionSyncData data(list[0]);
5510   EXPECT_EQ(extension->id(), data.id());
5511   EXPECT_FALSE(data.uninstalled());
5512   EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled());
5513   EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()),
5514             data.incognito_enabled());
5515   EXPECT_TRUE(data.version().Equals(*extension->version()));
5516   EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension),
5517             data.update_url());
5518   EXPECT_EQ(extension->name(), data.name());
5519 }
5520
5521 TEST_F(ExtensionServiceTest, GetSyncDataTerminated) {
5522   InitializeEmptyExtensionService();
5523   InitializeExtensionSyncService();
5524   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5525   TerminateExtension(good_crx);
5526   const Extension* extension = service()->GetInstalledExtension(good_crx);
5527   ASSERT_TRUE(extension);
5528
5529   syncer::FakeSyncChangeProcessor processor;
5530   extension_sync_service()->MergeDataAndStartSyncing(
5531       syncer::EXTENSIONS,
5532       syncer::SyncDataList(),
5533       scoped_ptr<syncer::SyncChangeProcessor>(
5534           new syncer::FakeSyncChangeProcessor),
5535       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5536
5537   syncer::SyncDataList list =
5538       extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5539   ASSERT_EQ(list.size(), 1U);
5540   extensions::ExtensionSyncData data(list[0]);
5541   EXPECT_EQ(extension->id(), data.id());
5542   EXPECT_FALSE(data.uninstalled());
5543   EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled());
5544   EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()),
5545             data.incognito_enabled());
5546   EXPECT_TRUE(data.version().Equals(*extension->version()));
5547   EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension),
5548             data.update_url());
5549   EXPECT_EQ(extension->name(), data.name());
5550 }
5551
5552 TEST_F(ExtensionServiceTest, GetSyncDataFilter) {
5553   InitializeEmptyExtensionService();
5554   InitializeExtensionSyncService();
5555   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5556   const Extension* extension = service()->GetInstalledExtension(good_crx);
5557   ASSERT_TRUE(extension);
5558
5559   syncer::FakeSyncChangeProcessor processor;
5560   extension_sync_service()->MergeDataAndStartSyncing(
5561       syncer::APPS,
5562       syncer::SyncDataList(),
5563       scoped_ptr<syncer::SyncChangeProcessor>(
5564           new syncer::FakeSyncChangeProcessor),
5565       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5566
5567   syncer::SyncDataList list =
5568       extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5569   ASSERT_EQ(list.size(), 0U);
5570 }
5571
5572 TEST_F(ExtensionServiceTest, GetSyncExtensionDataUserSettings) {
5573   InitializeEmptyExtensionService();
5574   InitializeProcessManager();
5575   InitializeExtensionSyncService();
5576   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5577   const Extension* extension = service()->GetInstalledExtension(good_crx);
5578   ASSERT_TRUE(extension);
5579
5580   syncer::FakeSyncChangeProcessor processor;
5581   extension_sync_service()->MergeDataAndStartSyncing(
5582       syncer::EXTENSIONS,
5583       syncer::SyncDataList(),
5584       scoped_ptr<syncer::SyncChangeProcessor>(
5585           new syncer::FakeSyncChangeProcessor),
5586       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5587
5588   {
5589     syncer::SyncDataList list =
5590         extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5591     ASSERT_EQ(list.size(), 1U);
5592     extensions::ExtensionSyncData data(list[0]);
5593     EXPECT_TRUE(data.enabled());
5594     EXPECT_FALSE(data.incognito_enabled());
5595   }
5596
5597   service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION);
5598   {
5599     syncer::SyncDataList list =
5600         extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5601     ASSERT_EQ(list.size(), 1U);
5602     extensions::ExtensionSyncData data(list[0]);
5603     EXPECT_FALSE(data.enabled());
5604     EXPECT_FALSE(data.incognito_enabled());
5605   }
5606
5607   extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true);
5608   {
5609     syncer::SyncDataList list =
5610         extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5611     ASSERT_EQ(list.size(), 1U);
5612     extensions::ExtensionSyncData data(list[0]);
5613     EXPECT_FALSE(data.enabled());
5614     EXPECT_TRUE(data.incognito_enabled());
5615   }
5616
5617   service()->EnableExtension(good_crx);
5618   {
5619     syncer::SyncDataList list =
5620         extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
5621     ASSERT_EQ(list.size(), 1U);
5622     extensions::ExtensionSyncData data(list[0]);
5623     EXPECT_TRUE(data.enabled());
5624     EXPECT_TRUE(data.incognito_enabled());
5625   }
5626 }
5627
5628 TEST_F(ExtensionServiceTest, SyncForUninstalledExternalExtension) {
5629   InitializeEmptyExtensionService();
5630   InitializeExtensionSyncService();
5631   InstallCRXWithLocation(
5632       data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW);
5633   const Extension* extension = service()->GetInstalledExtension(good_crx);
5634   ASSERT_TRUE(extension);
5635
5636   syncer::FakeSyncChangeProcessor processor;
5637   extension_sync_service()->MergeDataAndStartSyncing(
5638       syncer::EXTENSIONS,
5639       syncer::SyncDataList(),
5640       scoped_ptr<syncer::SyncChangeProcessor>(
5641           new syncer::FakeSyncChangeProcessor),
5642       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5643
5644   UninstallExtension(good_crx, false);
5645   EXPECT_TRUE(
5646       ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx));
5647
5648   sync_pb::EntitySpecifics specifics;
5649   sync_pb::AppSpecifics* app_specifics = specifics.mutable_app();
5650   sync_pb::ExtensionSpecifics* extension_specifics =
5651       app_specifics->mutable_extension();
5652   extension_specifics->set_id(good_crx);
5653   extension_specifics->set_version("1.0");
5654   extension_specifics->set_enabled(true);
5655
5656   syncer::SyncData sync_data =
5657       syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5658   syncer::SyncChange sync_change(FROM_HERE,
5659                                  syncer::SyncChange::ACTION_UPDATE,
5660                                  sync_data);
5661   syncer::SyncChangeList list(1);
5662   list[0] = sync_change;
5663
5664   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5665   EXPECT_TRUE(
5666       ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx));
5667 }
5668
5669 TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettings) {
5670   InitializeEmptyExtensionService();
5671   InitializeExtensionSyncService();
5672   const Extension* app =
5673       PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW);
5674   ASSERT_TRUE(app);
5675   ASSERT_TRUE(app->is_app());
5676
5677   syncer::FakeSyncChangeProcessor processor;
5678   extension_sync_service()->MergeDataAndStartSyncing(
5679       syncer::APPS,
5680       syncer::SyncDataList(),
5681       scoped_ptr<syncer::SyncChangeProcessor>(
5682           new syncer::FakeSyncChangeProcessor),
5683       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5684
5685   syncer::StringOrdinal initial_ordinal =
5686       syncer::StringOrdinal::CreateInitialOrdinal();
5687   {
5688     syncer::SyncDataList list =
5689         extension_sync_service()->GetAllSyncData(syncer::APPS);
5690     ASSERT_EQ(list.size(), 1U);
5691
5692     extensions::AppSyncData app_sync_data(list[0]);
5693     EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.app_launch_ordinal()));
5694     EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal()));
5695   }
5696
5697   AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting();
5698   sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter());
5699   {
5700     syncer::SyncDataList list =
5701         extension_sync_service()->GetAllSyncData(syncer::APPS);
5702     ASSERT_EQ(list.size(), 1U);
5703
5704     extensions::AppSyncData app_sync_data(list[0]);
5705     EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal()));
5706     EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal()));
5707   }
5708
5709   sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter());
5710   {
5711     syncer::SyncDataList list =
5712         extension_sync_service()->GetAllSyncData(syncer::APPS);
5713     ASSERT_EQ(list.size(), 1U);
5714
5715     extensions::AppSyncData app_sync_data(list[0]);
5716     EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal()));
5717     EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.page_ordinal()));
5718   }
5719 }
5720
5721 // TODO (rdevlin.cronin): The OnExtensionMoved() method has been removed from
5722 // ExtensionService, so this test probably needs a new home. Unfortunately, it
5723 // relies pretty heavily on things like InitializeExtension[Sync]Service() and
5724 // PackAndInstallCRX(). When we clean up a bit more, this should move out.
5725 TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettingsOnExtensionMoved) {
5726   InitializeEmptyExtensionService();
5727   InitializeExtensionSyncService();
5728   const size_t kAppCount = 3;
5729   const Extension* apps[kAppCount];
5730   apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW);
5731   apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW);
5732   apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW);
5733   for (size_t i = 0; i < kAppCount; ++i) {
5734     ASSERT_TRUE(apps[i]);
5735     ASSERT_TRUE(apps[i]->is_app());
5736   }
5737
5738   syncer::FakeSyncChangeProcessor processor;
5739   extension_sync_service()->MergeDataAndStartSyncing(
5740       syncer::APPS,
5741       syncer::SyncDataList(),
5742       scoped_ptr<syncer::SyncChangeProcessor>(
5743           new syncer::FakeSyncChangeProcessor),
5744       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5745
5746   ExtensionPrefs::Get(service()->GetBrowserContext())
5747       ->app_sorting()
5748       ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id());
5749   {
5750     syncer::SyncDataList list =
5751         extension_sync_service()->GetAllSyncData(syncer::APPS);
5752     ASSERT_EQ(list.size(), 3U);
5753
5754     extensions::AppSyncData data[kAppCount];
5755     for (size_t i = 0; i < kAppCount; ++i) {
5756       data[i] = extensions::AppSyncData(list[i]);
5757     }
5758
5759     // The sync data is not always in the same order our apps were installed in,
5760     // so we do that sorting here so we can make sure the values are changed as
5761     // expected.
5762     syncer::StringOrdinal app_launch_ordinals[kAppCount];
5763     for (size_t i = 0; i < kAppCount; ++i) {
5764       for (size_t j = 0; j < kAppCount; ++j) {
5765         if (apps[i]->id() == data[j].id())
5766           app_launch_ordinals[i] = data[j].app_launch_ordinal();
5767       }
5768     }
5769
5770     EXPECT_TRUE(app_launch_ordinals[1].LessThan(app_launch_ordinals[0]));
5771     EXPECT_TRUE(app_launch_ordinals[0].LessThan(app_launch_ordinals[2]));
5772   }
5773 }
5774
5775 TEST_F(ExtensionServiceTest, GetSyncDataList) {
5776   InitializeEmptyExtensionService();
5777   InitializeExtensionSyncService();
5778   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5779   InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW);
5780   InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW);
5781   InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW);
5782
5783   syncer::FakeSyncChangeProcessor processor;
5784   extension_sync_service()->MergeDataAndStartSyncing(
5785       syncer::APPS,
5786       syncer::SyncDataList(),
5787       scoped_ptr<syncer::SyncChangeProcessor>(
5788           new syncer::FakeSyncChangeProcessor),
5789       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5790   extension_sync_service()->MergeDataAndStartSyncing(
5791       syncer::EXTENSIONS,
5792       syncer::SyncDataList(),
5793       scoped_ptr<syncer::SyncChangeProcessor>(
5794           new syncer::FakeSyncChangeProcessor),
5795       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5796
5797   service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION);
5798   TerminateExtension(theme2_crx);
5799
5800   EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size());
5801   EXPECT_EQ(
5802       2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size());
5803 }
5804
5805 TEST_F(ExtensionServiceTest, ProcessSyncDataUninstall) {
5806   InitializeEmptyExtensionService();
5807   InitializeExtensionSyncService();
5808   syncer::FakeSyncChangeProcessor processor;
5809   extension_sync_service()->MergeDataAndStartSyncing(
5810       syncer::EXTENSIONS,
5811       syncer::SyncDataList(),
5812       scoped_ptr<syncer::SyncChangeProcessor>(
5813           new syncer::FakeSyncChangeProcessor),
5814       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5815
5816   sync_pb::EntitySpecifics specifics;
5817   sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
5818   ext_specifics->set_id(good_crx);
5819   ext_specifics->set_version("1.0");
5820   syncer::SyncData sync_data =
5821       syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5822   syncer::SyncChange sync_change(FROM_HERE,
5823                                  syncer::SyncChange::ACTION_DELETE,
5824                                  sync_data);
5825   syncer::SyncChangeList list(1);
5826   list[0] = sync_change;
5827
5828   // Should do nothing.
5829   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5830   EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
5831
5832   // Install the extension.
5833   base::FilePath extension_path = data_dir().AppendASCII("good.crx");
5834   InstallCRX(extension_path, INSTALL_NEW);
5835   EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
5836
5837   // Should uninstall the extension.
5838   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5839   EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
5840
5841   // Should again do nothing.
5842   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5843   EXPECT_FALSE(service()->GetExtensionById(good_crx, true));
5844 }
5845
5846 TEST_F(ExtensionServiceTest, ProcessSyncDataWrongType) {
5847   InitializeEmptyExtensionService();
5848   InitializeExtensionSyncService();
5849
5850   // Install the extension.
5851   base::FilePath extension_path = data_dir().AppendASCII("good.crx");
5852   InstallCRX(extension_path, INSTALL_NEW);
5853   EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
5854
5855   sync_pb::EntitySpecifics specifics;
5856   sync_pb::AppSpecifics* app_specifics = specifics.mutable_app();
5857   sync_pb::ExtensionSpecifics* extension_specifics =
5858       app_specifics->mutable_extension();
5859   extension_specifics->set_id(good_crx);
5860   extension_specifics->set_version(
5861       service()->GetInstalledExtension(good_crx)->version()->GetString());
5862
5863   {
5864     extension_specifics->set_enabled(true);
5865     syncer::SyncData sync_data =
5866         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5867     syncer::SyncChange sync_change(FROM_HERE,
5868                                    syncer::SyncChange::ACTION_DELETE,
5869                                    sync_data);
5870     syncer::SyncChangeList list(1);
5871     list[0] = sync_change;
5872
5873     // Should do nothing
5874     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5875     EXPECT_TRUE(service()->GetExtensionById(good_crx, true));
5876   }
5877
5878   {
5879     extension_specifics->set_enabled(false);
5880     syncer::SyncData sync_data =
5881         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5882     syncer::SyncChange sync_change(FROM_HERE,
5883                                    syncer::SyncChange::ACTION_UPDATE,
5884                                    sync_data);
5885     syncer::SyncChangeList list(1);
5886     list[0] = sync_change;
5887
5888     // Should again do nothing.
5889     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5890     EXPECT_TRUE(service()->GetExtensionById(good_crx, false));
5891   }
5892 }
5893
5894 TEST_F(ExtensionServiceTest, ProcessSyncDataSettings) {
5895   InitializeEmptyExtensionService();
5896   InitializeProcessManager();
5897   InitializeExtensionSyncService();
5898   syncer::FakeSyncChangeProcessor processor;
5899   extension_sync_service()->MergeDataAndStartSyncing(
5900       syncer::EXTENSIONS,
5901       syncer::SyncDataList(),
5902       scoped_ptr<syncer::SyncChangeProcessor>(
5903           new syncer::FakeSyncChangeProcessor),
5904       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5905
5906   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5907   EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5908   EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5909
5910   sync_pb::EntitySpecifics specifics;
5911   sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
5912   ext_specifics->set_id(good_crx);
5913   ext_specifics->set_version(
5914       service()->GetInstalledExtension(good_crx)->version()->GetString());
5915   ext_specifics->set_enabled(false);
5916
5917   {
5918     syncer::SyncData sync_data =
5919         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5920     syncer::SyncChange sync_change(FROM_HERE,
5921                                    syncer::SyncChange::ACTION_UPDATE,
5922                                    sync_data);
5923     syncer::SyncChangeList list(1);
5924     list[0] = sync_change;
5925     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5926     EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5927     EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5928   }
5929
5930   {
5931     ext_specifics->set_enabled(true);
5932     ext_specifics->set_incognito_enabled(true);
5933     syncer::SyncData sync_data =
5934         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5935     syncer::SyncChange sync_change(FROM_HERE,
5936                                    syncer::SyncChange::ACTION_UPDATE,
5937                                    sync_data);
5938     syncer::SyncChangeList list(1);
5939     list[0] = sync_change;
5940     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5941     EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5942     EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5943   }
5944
5945   {
5946     ext_specifics->set_enabled(false);
5947     ext_specifics->set_incognito_enabled(true);
5948     syncer::SyncData sync_data =
5949         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5950     syncer::SyncChange sync_change(FROM_HERE,
5951                                    syncer::SyncChange::ACTION_UPDATE,
5952                                    sync_data);
5953     syncer::SyncChangeList list(1);
5954     list[0] = sync_change;
5955     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5956     EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5957     EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5958   }
5959
5960   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
5961 }
5962
5963 TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) {
5964   InitializeExtensionServiceWithUpdater();
5965   InitializeExtensionSyncService();
5966   syncer::FakeSyncChangeProcessor processor;
5967   extension_sync_service()->MergeDataAndStartSyncing(
5968       syncer::EXTENSIONS,
5969       syncer::SyncDataList(),
5970       scoped_ptr<syncer::SyncChangeProcessor>(
5971           new syncer::FakeSyncChangeProcessor),
5972       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
5973
5974   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
5975   TerminateExtension(good_crx);
5976   EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
5977   EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5978
5979   sync_pb::EntitySpecifics specifics;
5980   sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
5981   ext_specifics->set_id(good_crx);
5982   ext_specifics->set_version(
5983       service()->GetInstalledExtension(good_crx)->version()->GetString());
5984   ext_specifics->set_enabled(false);
5985   ext_specifics->set_incognito_enabled(true);
5986   syncer::SyncData sync_data =
5987       syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
5988   syncer::SyncChange sync_change(FROM_HERE,
5989                                  syncer::SyncChange::ACTION_UPDATE,
5990                                  sync_data);
5991   syncer::SyncChangeList list(1);
5992   list[0] = sync_change;
5993
5994   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
5995   EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
5996   EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
5997
5998   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
5999 }
6000
6001 TEST_F(ExtensionServiceTest, ProcessSyncDataVersionCheck) {
6002   InitializeExtensionServiceWithUpdater();
6003   InitializeExtensionSyncService();
6004   syncer::FakeSyncChangeProcessor processor;
6005   extension_sync_service()->MergeDataAndStartSyncing(
6006       syncer::EXTENSIONS,
6007       syncer::SyncDataList(),
6008       scoped_ptr<syncer::SyncChangeProcessor>(
6009           new syncer::FakeSyncChangeProcessor),
6010       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
6011
6012   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
6013   EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
6014   EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
6015
6016   sync_pb::EntitySpecifics specifics;
6017   sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
6018   ext_specifics->set_id(good_crx);
6019   ext_specifics->set_enabled(true);
6020
6021   {
6022     ext_specifics->set_version(
6023         service()->GetInstalledExtension(good_crx)->version()->GetString());
6024     syncer::SyncData sync_data =
6025         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
6026     syncer::SyncChange sync_change(FROM_HERE,
6027                                    syncer::SyncChange::ACTION_UPDATE,
6028                                    sync_data);
6029     syncer::SyncChangeList list(1);
6030     list[0] = sync_change;
6031
6032     // Should do nothing if extension version == sync version.
6033     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6034     EXPECT_FALSE(service()->updater()->WillCheckSoon());
6035   }
6036
6037   // Should do nothing if extension version > sync version (but see
6038   // the TODO in ProcessExtensionSyncData).
6039   {
6040     ext_specifics->set_version("0.0.0.0");
6041     syncer::SyncData sync_data =
6042         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
6043     syncer::SyncChange sync_change(FROM_HERE,
6044                                    syncer::SyncChange::ACTION_UPDATE,
6045                                    sync_data);
6046     syncer::SyncChangeList list(1);
6047     list[0] = sync_change;
6048
6049     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6050     EXPECT_FALSE(service()->updater()->WillCheckSoon());
6051   }
6052
6053   // Should kick off an update if extension version < sync version.
6054   {
6055     ext_specifics->set_version("9.9.9.9");
6056     syncer::SyncData sync_data =
6057         syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
6058     syncer::SyncChange sync_change(FROM_HERE,
6059                                    syncer::SyncChange::ACTION_UPDATE,
6060                                    sync_data);
6061     syncer::SyncChangeList list(1);
6062     list[0] = sync_change;
6063
6064     extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6065     EXPECT_TRUE(service()->updater()->WillCheckSoon());
6066   }
6067
6068   EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx));
6069 }
6070
6071 TEST_F(ExtensionServiceTest, ProcessSyncDataNotInstalled) {
6072   InitializeExtensionServiceWithUpdater();
6073   InitializeExtensionSyncService();
6074   syncer::FakeSyncChangeProcessor processor;
6075   extension_sync_service()->MergeDataAndStartSyncing(
6076       syncer::EXTENSIONS,
6077       syncer::SyncDataList(),
6078       scoped_ptr<syncer::SyncChangeProcessor>(
6079           new syncer::FakeSyncChangeProcessor),
6080       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
6081
6082   sync_pb::EntitySpecifics specifics;
6083   sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
6084   ext_specifics->set_id(good_crx);
6085   ext_specifics->set_enabled(false);
6086   ext_specifics->set_incognito_enabled(true);
6087   ext_specifics->set_update_url("http://www.google.com/");
6088   ext_specifics->set_version("1.2.3.4");
6089   syncer::SyncData sync_data =
6090       syncer::SyncData::CreateLocalData(good_crx, "Name", specifics);
6091   syncer::SyncChange sync_change(FROM_HERE,
6092                                  syncer::SyncChange::ACTION_UPDATE,
6093                                  sync_data);
6094   syncer::SyncChangeList list(1);
6095   list[0] = sync_change;
6096
6097   EXPECT_TRUE(service()->IsExtensionEnabled(good_crx));
6098   EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
6099   extension_sync_service()->ProcessSyncChanges(FROM_HERE, list);
6100   EXPECT_TRUE(service()->updater()->WillCheckSoon());
6101   EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
6102   EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile()));
6103
6104   const extensions::PendingExtensionInfo* info;
6105   EXPECT_TRUE(
6106       (info = service()->pending_extension_manager()->GetById(good_crx)));
6107   EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec());
6108   EXPECT_TRUE(info->is_from_sync());
6109   EXPECT_TRUE(info->install_silently());
6110   EXPECT_EQ(Manifest::INTERNAL, info->install_source());
6111   // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|.
6112 }
6113
6114 TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) {
6115   ExtensionServiceInitParams params = CreateDefaultInitParams();
6116   params.profile_is_supervised = true;
6117   InitializeExtensionService(params);
6118
6119   SupervisedUserService* supervised_user_service =
6120       SupervisedUserServiceFactory::GetForProfile(profile());
6121   GetManagementPolicy()->RegisterProvider(supervised_user_service);
6122
6123   base::FilePath path1 = data_dir().AppendASCII("good.crx");
6124   base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
6125   const Extension* extensions[] = {
6126     InstallCRX(path1, INSTALL_FAILED),
6127     InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
6128   };
6129
6130   // Only the extension with the "installed by custodian" flag should have been
6131   // installed and enabled.
6132   EXPECT_FALSE(extensions[0]);
6133   ASSERT_TRUE(extensions[1]);
6134   EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id()));
6135 }
6136
6137 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) {
6138   ExtensionServiceInitParams params = CreateDefaultInitParams();
6139   params.profile_is_supervised = true;
6140   InitializeExtensionService(params);
6141
6142   SupervisedUserService* supervised_user_service =
6143       SupervisedUserServiceFactory::GetForProfile(profile());
6144   GetManagementPolicy()->RegisterProvider(supervised_user_service);
6145
6146   base::FilePath base_path = data_dir().AppendASCII("autoupdate");
6147   base::FilePath pem_path = base_path.AppendASCII("key.pem");
6148
6149   base::FilePath path = base_path.AppendASCII("v1");
6150   const Extension* extension =
6151       PackAndInstallCRX(path, pem_path, INSTALL_NEW,
6152                         Extension::WAS_INSTALLED_BY_CUSTODIAN);
6153   // The extension must now be installed and enabled.
6154   ASSERT_TRUE(extension);
6155   ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
6156
6157   // Save the id, as the extension object will be destroyed during updating.
6158   std::string id = extension->id();
6159
6160   std::string old_version = extension->VersionString();
6161
6162   // Update to a new version.
6163   path = base_path.AppendASCII("v2");
6164   PackCRXAndUpdateExtension(id, path, pem_path, ENABLED);
6165
6166   // The extension should still be there and enabled.
6167   extension = registry()->enabled_extensions().GetByID(id);
6168   ASSERT_TRUE(extension);
6169   // The version should have changed.
6170   EXPECT_NE(extension->VersionString(), old_version);
6171 }
6172
6173 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) {
6174   ExtensionServiceInitParams params = CreateDefaultInitParams();
6175   params.profile_is_supervised = true;
6176   InitializeExtensionService(params);
6177
6178   SupervisedUserService* supervised_user_service =
6179       SupervisedUserServiceFactory::GetForProfile(profile());
6180   GetManagementPolicy()->RegisterProvider(supervised_user_service);
6181
6182   base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
6183   base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
6184
6185   base::FilePath path = base_path.AppendASCII("v1");
6186   const Extension* extension =
6187       PackAndInstallCRX(path, pem_path, INSTALL_NEW,
6188                         Extension::WAS_INSTALLED_BY_CUSTODIAN);
6189   // The extension must now be installed and enabled.
6190   ASSERT_TRUE(extension);
6191   ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id()));
6192
6193   // Save the id, as the extension object will be destroyed during updating.
6194   std::string id = extension->id();
6195
6196   std::string old_version = extension->VersionString();
6197
6198   // Update to a new version with increased permissions.
6199   path = base_path.AppendASCII("v2");
6200   PackCRXAndUpdateExtension(id, path, pem_path, DISABLED);
6201
6202   // The extension should still be there, but disabled.
6203   EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
6204   extension = registry()->disabled_extensions().GetByID(id);
6205   ASSERT_TRUE(extension);
6206   // The version should have changed.
6207   EXPECT_NE(extension->VersionString(), old_version);
6208 }
6209
6210 TEST_F(ExtensionServiceTest,
6211        SupervisedUser_SyncUninstallByCustodianSkipsPolicy) {
6212   InitializeEmptyExtensionService();
6213   InitializeExtensionSyncService();
6214   extension_sync_service()->MergeDataAndStartSyncing(
6215       syncer::EXTENSIONS,
6216       syncer::SyncDataList(),
6217       scoped_ptr<syncer::SyncChangeProcessor>(
6218           new syncer::FakeSyncChangeProcessor),
6219       scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock()));
6220
6221   // Install two extensions.
6222   base::FilePath path1 = data_dir().AppendASCII("good.crx");
6223   base::FilePath path2 = data_dir().AppendASCII("good2048.crx");
6224   const Extension* extensions[] = {
6225     InstallCRX(path1, INSTALL_NEW),
6226     InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN)
6227   };
6228
6229   // Add a policy provider that will disallow any changes.
6230   extensions::TestManagementPolicyProvider provider(
6231       extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
6232   GetManagementPolicy()->RegisterProvider(&provider);
6233
6234   // Create a sync deletion for each extension.
6235   syncer::SyncChangeList change_list;
6236   for (size_t i = 0; i < arraysize(extensions); i++) {
6237     const std::string& id = extensions[i]->id();
6238     sync_pb::EntitySpecifics specifics;
6239     sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension();
6240     ext_specifics->set_id(id);
6241     ext_specifics->set_version("1.0");
6242     ext_specifics->set_installed_by_custodian(
6243         extensions[i]->was_installed_by_custodian());
6244     syncer::SyncData sync_data =
6245         syncer::SyncData::CreateLocalData(id, "Name", specifics);
6246     change_list.push_back(syncer::SyncChange(FROM_HERE,
6247                                              syncer::SyncChange::ACTION_DELETE,
6248                                              sync_data));
6249   }
6250
6251   // Save the extension ids, as uninstalling destroys the Extension instance.
6252   std::string extension_ids[] = {
6253     extensions[0]->id(),
6254     extensions[1]->id()
6255   };
6256
6257   // Now apply the uninstallations.
6258   extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list);
6259
6260   // Uninstalling the extension without installed_by_custodian should have been
6261   // blocked by policy, so it should still be there.
6262   EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0]));
6263
6264   // But installed_by_custodian should result in bypassing the policy check.
6265   EXPECT_FALSE(
6266       registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1]));
6267 }
6268
6269 TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) {
6270   InitializeEmptyExtensionService();
6271
6272   base::FilePath path = data_dir().AppendASCII("good.crx");
6273   InstallCRX(path, INSTALL_NEW);
6274   ValidatePrefKeyCount(1u);
6275   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
6276   ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
6277
6278   extensions::PendingExtensionManager* pending =
6279       service()->pending_extension_manager();
6280   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6281
6282   // Skip install when the location is the same.
6283   EXPECT_FALSE(
6284       service()->OnExternalExtensionUpdateUrlFound(kGoodId,
6285                                                    std::string(),
6286                                                    GURL(kGoodUpdateURL),
6287                                                    Manifest::INTERNAL,
6288                                                    Extension::NO_FLAGS,
6289                                                    false));
6290   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6291
6292   // Install when the location has higher priority.
6293   EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
6294       kGoodId,
6295       std::string(),
6296       GURL(kGoodUpdateURL),
6297       Manifest::EXTERNAL_POLICY_DOWNLOAD,
6298       Extension::NO_FLAGS,
6299       false));
6300   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6301
6302   // Try the low priority again.  Should be rejected.
6303   EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(
6304       kGoodId,
6305       std::string(),
6306       GURL(kGoodUpdateURL),
6307       Manifest::EXTERNAL_PREF_DOWNLOAD,
6308       Extension::NO_FLAGS,
6309       false));
6310   // The existing record should still be present in the pending extension
6311   // manager.
6312   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6313
6314   pending->Remove(kGoodId);
6315
6316   // Skip install when the location has the same priority as the installed
6317   // location.
6318   EXPECT_FALSE(
6319       service()->OnExternalExtensionUpdateUrlFound(kGoodId,
6320                                                    std::string(),
6321                                                    GURL(kGoodUpdateURL),
6322                                                    Manifest::INTERNAL,
6323                                                    Extension::NO_FLAGS,
6324                                                    false));
6325
6326   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6327 }
6328
6329 TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
6330   Version older_version("0.1.0.0");
6331   Version newer_version("2.0.0.0");
6332
6333   // We don't want the extension to be installed.  A path that doesn't
6334   // point to a valid CRX ensures this.
6335   const base::FilePath kInvalidPathToCrx = base::FilePath();
6336
6337   const int kCreationFlags = 0;
6338   const bool kDontMarkAcknowledged = false;
6339
6340   InitializeEmptyExtensionService();
6341
6342   // The test below uses install source constants to test that
6343   // priority is enforced.  It assumes a specific ranking of install
6344   // sources: Registry (EXTERNAL_REGISTRY) overrides external pref
6345   // (EXTERNAL_PREF), and external pref overrides user install (INTERNAL).
6346   // The following assertions verify these assumptions:
6347   ASSERT_EQ(Manifest::EXTERNAL_REGISTRY,
6348             Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY,
6349                                                  Manifest::EXTERNAL_PREF));
6350   ASSERT_EQ(Manifest::EXTERNAL_REGISTRY,
6351             Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY,
6352                                                  Manifest::INTERNAL));
6353   ASSERT_EQ(Manifest::EXTERNAL_PREF,
6354             Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_PREF,
6355                                                  Manifest::INTERNAL));
6356
6357   extensions::PendingExtensionManager* pending =
6358       service()->pending_extension_manager();
6359   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6360
6361   {
6362     // Simulate an external source adding the extension as INTERNAL.
6363     content::WindowedNotificationObserver observer(
6364         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6365         content::NotificationService::AllSources());
6366     EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6367                                                         &older_version,
6368                                                         kInvalidPathToCrx,
6369                                                         Manifest::INTERNAL,
6370                                                         kCreationFlags,
6371                                                         kDontMarkAcknowledged));
6372     EXPECT_TRUE(pending->IsIdPending(kGoodId));
6373     observer.Wait();
6374     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6375   }
6376
6377   {
6378     // Simulate an external source adding the extension as EXTERNAL_PREF.
6379     content::WindowedNotificationObserver observer(
6380         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6381         content::NotificationService::AllSources());
6382     EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6383                                                         &older_version,
6384                                                         kInvalidPathToCrx,
6385                                                         Manifest::EXTERNAL_PREF,
6386                                                         kCreationFlags,
6387                                                         kDontMarkAcknowledged));
6388     EXPECT_TRUE(pending->IsIdPending(kGoodId));
6389     observer.Wait();
6390     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6391   }
6392
6393   // Simulate an external source adding as EXTERNAL_PREF again.
6394   // This is rejected because the version and the location are the same as
6395   // the previous installation, which is still pending.
6396   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6397                                                        &older_version,
6398                                                        kInvalidPathToCrx,
6399                                                        Manifest::EXTERNAL_PREF,
6400                                                        kCreationFlags,
6401                                                        kDontMarkAcknowledged));
6402   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6403
6404   // Try INTERNAL again.  Should fail.
6405   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6406                                                        &older_version,
6407                                                        kInvalidPathToCrx,
6408                                                        Manifest::INTERNAL,
6409                                                        kCreationFlags,
6410                                                        kDontMarkAcknowledged));
6411   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6412
6413   {
6414     // Now the registry adds the extension.
6415     content::WindowedNotificationObserver observer(
6416         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6417         content::NotificationService::AllSources());
6418     EXPECT_TRUE(
6419         service()->OnExternalExtensionFileFound(kGoodId,
6420                                                 &older_version,
6421                                                 kInvalidPathToCrx,
6422                                                 Manifest::EXTERNAL_REGISTRY,
6423                                                 kCreationFlags,
6424                                                 kDontMarkAcknowledged));
6425     EXPECT_TRUE(pending->IsIdPending(kGoodId));
6426     observer.Wait();
6427     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
6428   }
6429
6430   // Registry outranks both external pref and internal, so both fail.
6431   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6432                                                        &older_version,
6433                                                        kInvalidPathToCrx,
6434                                                        Manifest::EXTERNAL_PREF,
6435                                                        kCreationFlags,
6436                                                        kDontMarkAcknowledged));
6437   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6438
6439   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6440                                                        &older_version,
6441                                                        kInvalidPathToCrx,
6442                                                        Manifest::INTERNAL,
6443                                                        kCreationFlags,
6444                                                        kDontMarkAcknowledged));
6445   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6446
6447   pending->Remove(kGoodId);
6448
6449   // Install the extension.
6450   base::FilePath path = data_dir().AppendASCII("good.crx");
6451   const Extension* ext = InstallCRX(path, INSTALL_NEW);
6452   ValidatePrefKeyCount(1u);
6453   ValidateIntegerPref(good_crx, "state", Extension::ENABLED);
6454   ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL);
6455
6456   // Now test the logic of OnExternalExtensionFileFound() when the extension
6457   // being added is already installed.
6458
6459   // Tests assume |older_version| is less than the installed version, and
6460   // |newer_version| is greater.  Verify this:
6461   ASSERT_TRUE(older_version.IsOlderThan(ext->VersionString()));
6462   ASSERT_TRUE(ext->version()->IsOlderThan(newer_version.GetString()));
6463
6464   // An external install for the same location should fail if the version is
6465   // older, or the same, and succeed if the version is newer.
6466
6467   // Older than the installed version...
6468   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6469                                                        &older_version,
6470                                                        kInvalidPathToCrx,
6471                                                        Manifest::INTERNAL,
6472                                                        kCreationFlags,
6473                                                        kDontMarkAcknowledged));
6474   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6475
6476   // Same version as the installed version...
6477   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6478                                                        ext->version(),
6479                                                        kInvalidPathToCrx,
6480                                                        Manifest::INTERNAL,
6481                                                        kCreationFlags,
6482                                                        kDontMarkAcknowledged));
6483   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6484
6485   // Newer than the installed version...
6486   EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6487                                                       &newer_version,
6488                                                       kInvalidPathToCrx,
6489                                                       Manifest::INTERNAL,
6490                                                       kCreationFlags,
6491                                                       kDontMarkAcknowledged));
6492   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6493
6494   // An external install for a higher priority install source should succeed
6495   // if the version is greater.  |older_version| is not...
6496   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6497                                                        &older_version,
6498                                                        kInvalidPathToCrx,
6499                                                        Manifest::EXTERNAL_PREF,
6500                                                        kCreationFlags,
6501                                                        kDontMarkAcknowledged));
6502   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6503
6504   // |newer_version| is newer.
6505   EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6506                                                       &newer_version,
6507                                                       kInvalidPathToCrx,
6508                                                       Manifest::EXTERNAL_PREF,
6509                                                       kCreationFlags,
6510                                                       kDontMarkAcknowledged));
6511   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6512
6513   // An external install for an even higher priority install source should
6514   // succeed if the version is greater.
6515   EXPECT_TRUE(
6516       service()->OnExternalExtensionFileFound(kGoodId,
6517                                               &newer_version,
6518                                               kInvalidPathToCrx,
6519                                               Manifest::EXTERNAL_REGISTRY,
6520                                               kCreationFlags,
6521                                               kDontMarkAcknowledged));
6522   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6523
6524   // Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY,
6525   // adding from external pref will now fail.
6526   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6527                                                        &newer_version,
6528                                                        kInvalidPathToCrx,
6529                                                        Manifest::EXTERNAL_PREF,
6530                                                        kCreationFlags,
6531                                                        kDontMarkAcknowledged));
6532   EXPECT_TRUE(pending->IsIdPending(kGoodId));
6533 }
6534
6535 TEST_F(ExtensionServiceTest, ConcurrentExternalLocalFile) {
6536   Version kVersion123("1.2.3");
6537   Version kVersion124("1.2.4");
6538   Version kVersion125("1.2.5");
6539   const base::FilePath kInvalidPathToCrx = base::FilePath();
6540   const int kCreationFlags = 0;
6541   const bool kDontMarkAcknowledged = false;
6542
6543   InitializeEmptyExtensionService();
6544
6545   extensions::PendingExtensionManager* pending =
6546       service()->pending_extension_manager();
6547   EXPECT_FALSE(pending->IsIdPending(kGoodId));
6548
6549   // An external provider starts installing from a local crx.
6550   EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6551                                                       &kVersion123,
6552                                                       kInvalidPathToCrx,
6553                                                       Manifest::EXTERNAL_PREF,
6554                                                       kCreationFlags,
6555                                                       kDontMarkAcknowledged));
6556   const extensions::PendingExtensionInfo* info;
6557   EXPECT_TRUE((info = pending->GetById(kGoodId)));
6558   EXPECT_TRUE(info->version().IsValid());
6559   EXPECT_TRUE(info->version().Equals(kVersion123));
6560
6561   // Adding a newer version overrides the currently pending version.
6562   EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
6563                                                       &kVersion124,
6564                                                       kInvalidPathToCrx,
6565                                                       Manifest::EXTERNAL_PREF,
6566                                                       kCreationFlags,
6567                                                       kDontMarkAcknowledged));
6568   EXPECT_TRUE((info = pending->GetById(kGoodId)));
6569   EXPECT_TRUE(info->version().IsValid());
6570   EXPECT_TRUE(info->version().Equals(kVersion124));
6571
6572   // Adding an older version fails.
6573   EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
6574                                                        &kVersion123,
6575                                                        kInvalidPathToCrx,
6576                                                        Manifest::EXTERNAL_PREF,
6577                                                        kCreationFlags,
6578                                                        kDontMarkAcknowledged));
6579   EXPECT_TRUE((info = pending->GetById(kGoodId)));
6580   EXPECT_TRUE(info->version().IsValid());
6581   EXPECT_TRUE(info->version().Equals(kVersion124));
6582
6583   // Adding an older version fails even when coming from a higher-priority
6584   // location.
6585   EXPECT_FALSE(
6586       service()->OnExternalExtensionFileFound(kGoodId,
6587                                               &kVersion123,
6588                                               kInvalidPathToCrx,
6589                                               Manifest::EXTERNAL_REGISTRY,
6590                                               kCreationFlags,
6591                                               kDontMarkAcknowledged));
6592   EXPECT_TRUE((info = pending->GetById(kGoodId)));
6593   EXPECT_TRUE(info->version().IsValid());
6594   EXPECT_TRUE(info->version().Equals(kVersion124));
6595
6596   // Adding the latest version from the webstore overrides a specific version.
6597   GURL kUpdateUrl("http://example.com/update");
6598   EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
6599       kGoodId,
6600       std::string(),
6601       kUpdateUrl,
6602       Manifest::EXTERNAL_POLICY_DOWNLOAD,
6603       Extension::NO_FLAGS,
6604       false));
6605   EXPECT_TRUE((info = pending->GetById(kGoodId)));
6606   EXPECT_FALSE(info->version().IsValid());
6607 }
6608
6609 // This makes sure we can package and install CRX files that use whitelisted
6610 // permissions.
6611 TEST_F(ExtensionServiceTest, InstallWhitelistedExtension) {
6612   std::string test_id = "hdkklepkcpckhnpgjnmbdfhehckloojk";
6613   CommandLine::ForCurrentProcess()->AppendSwitchASCII(
6614       extensions::switches::kWhitelistedExtensionID, test_id);
6615
6616   InitializeEmptyExtensionService();
6617   base::FilePath path = data_dir().AppendASCII("permissions");
6618   base::FilePath pem_path = path
6619       .AppendASCII("whitelist.pem");
6620   path = path
6621       .AppendASCII("whitelist");
6622
6623   const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW);
6624   EXPECT_EQ(0u, GetErrors().size());
6625   ASSERT_EQ(1u, registry()->enabled_extensions().size());
6626   EXPECT_EQ(test_id, extension->id());
6627 }
6628
6629 // Test that when multiple sources try to install an extension,
6630 // we consistently choose the right one. To make tests easy to read,
6631 // methods that fake requests to install crx files in several ways
6632 // are provided.
6633 class ExtensionSourcePriorityTest : public ExtensionServiceTest {
6634  public:
6635   virtual void SetUp() {
6636     ExtensionServiceTest::SetUp();
6637
6638     // All tests use a single extension.  Put the id and path in member vars
6639     // that all methods can read.
6640     crx_id_ = kGoodId;
6641     crx_path_ = data_dir().AppendASCII("good.crx");
6642   }
6643
6644   // Fake an external source adding a URL to fetch an extension from.
6645   bool AddPendingExternalPrefUrl() {
6646     return service()->pending_extension_manager()->AddFromExternalUpdateUrl(
6647         crx_id_,
6648         std::string(),
6649         GURL(),
6650         Manifest::EXTERNAL_PREF_DOWNLOAD,
6651         Extension::NO_FLAGS,
6652         false);
6653   }
6654
6655   // Fake an external file from external_extensions.json.
6656   bool AddPendingExternalPrefFileInstall() {
6657     Version version("1.0.0.0");
6658
6659     return service()->OnExternalExtensionFileFound(crx_id_,
6660                                                    &version,
6661                                                    crx_path_,
6662                                                    Manifest::EXTERNAL_PREF,
6663                                                    Extension::NO_FLAGS,
6664                                                    false);
6665   }
6666
6667   // Fake a request from sync to install an extension.
6668   bool AddPendingSyncInstall() {
6669     return service()->pending_extension_manager()->AddFromSync(
6670         crx_id_,
6671         GURL(kGoodUpdateURL),
6672         &IsExtension,
6673         kGoodInstallSilently,
6674         kGoodRemoteInstall,
6675         kGoodInstalledByCustodian);
6676   }
6677
6678   // Fake a policy install.
6679   bool AddPendingPolicyInstall() {
6680     // Get path to the CRX with id |kGoodId|.
6681     return service()->OnExternalExtensionUpdateUrlFound(
6682         crx_id_,
6683         std::string(),
6684         GURL(),
6685         Manifest::EXTERNAL_POLICY_DOWNLOAD,
6686         Extension::NO_FLAGS,
6687         false);
6688   }
6689
6690   // Get the install source of a pending extension.
6691   Manifest::Location GetPendingLocation() {
6692     const extensions::PendingExtensionInfo* info;
6693     EXPECT_TRUE(
6694         (info = service()->pending_extension_manager()->GetById(crx_id_)));
6695     return info->install_source();
6696   }
6697
6698   // Is an extension pending from a sync request?
6699   bool GetPendingIsFromSync() {
6700     const extensions::PendingExtensionInfo* info;
6701     EXPECT_TRUE(
6702         (info = service()->pending_extension_manager()->GetById(crx_id_)));
6703     return info->is_from_sync();
6704   }
6705
6706   // Is the CRX id these tests use pending?
6707   bool IsCrxPending() {
6708     return service()->pending_extension_manager()->IsIdPending(crx_id_);
6709   }
6710
6711   // Is an extension installed?
6712   bool IsCrxInstalled() {
6713     return (service()->GetExtensionById(crx_id_, true) != NULL);
6714   }
6715
6716  protected:
6717   // All tests use a single extension.  Making the id and path member
6718   // vars avoids pasing the same argument to every method.
6719   std::string crx_id_;
6720   base::FilePath crx_path_;
6721 };
6722
6723 // Test that a pending request for installation of an external CRX from
6724 // an update URL overrides a pending request to install the same extension
6725 // from sync.
6726 TEST_F(ExtensionSourcePriorityTest, PendingExternalFileOverSync) {
6727   InitializeEmptyExtensionService();
6728
6729   ASSERT_FALSE(IsCrxInstalled());
6730
6731   // Install pending extension from sync.
6732   content::WindowedNotificationObserver observer(
6733       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6734       content::NotificationService::AllSources());
6735   EXPECT_TRUE(AddPendingSyncInstall());
6736   ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation());
6737   EXPECT_TRUE(GetPendingIsFromSync());
6738   ASSERT_FALSE(IsCrxInstalled());
6739
6740   // Install pending as external prefs json would.
6741   AddPendingExternalPrefFileInstall();
6742   ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation());
6743   ASSERT_FALSE(IsCrxInstalled());
6744
6745   // Another request from sync should be ignored.
6746   EXPECT_FALSE(AddPendingSyncInstall());
6747   ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation());
6748   ASSERT_FALSE(IsCrxInstalled());
6749
6750   observer.Wait();
6751   VerifyCrxInstall(crx_path_, INSTALL_NEW);
6752   ASSERT_TRUE(IsCrxInstalled());
6753 }
6754
6755 // Test that an install of an external CRX from an update overrides
6756 // an install of the same extension from sync.
6757 TEST_F(ExtensionSourcePriorityTest, PendingExternalUrlOverSync) {
6758   InitializeEmptyExtensionService();
6759   ASSERT_FALSE(IsCrxInstalled());
6760
6761   EXPECT_TRUE(AddPendingSyncInstall());
6762   ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation());
6763   EXPECT_TRUE(GetPendingIsFromSync());
6764   ASSERT_FALSE(IsCrxInstalled());
6765
6766   ASSERT_TRUE(AddPendingExternalPrefUrl());
6767   ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation());
6768   EXPECT_FALSE(GetPendingIsFromSync());
6769   ASSERT_FALSE(IsCrxInstalled());
6770
6771   EXPECT_FALSE(AddPendingSyncInstall());
6772   ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation());
6773   EXPECT_FALSE(GetPendingIsFromSync());
6774   ASSERT_FALSE(IsCrxInstalled());
6775 }
6776
6777 // Test that an external install request stops sync from installing
6778 // the same extension.
6779 TEST_F(ExtensionSourcePriorityTest, InstallExternalBlocksSyncRequest) {
6780   InitializeEmptyExtensionService();
6781   ASSERT_FALSE(IsCrxInstalled());
6782
6783   // External prefs starts an install.
6784   AddPendingExternalPrefFileInstall();
6785
6786   // Crx installer was made, but has not yet run.
6787   ASSERT_FALSE(IsCrxInstalled());
6788
6789   // Before the CRX installer runs, Sync requests that the same extension
6790   // be installed. Should fail, because an external source is pending.
6791   content::WindowedNotificationObserver observer(
6792       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6793       content::NotificationService::AllSources());
6794   ASSERT_FALSE(AddPendingSyncInstall());
6795
6796   // Wait for the external source to install.
6797   observer.Wait();
6798   VerifyCrxInstall(crx_path_, INSTALL_NEW);
6799   ASSERT_TRUE(IsCrxInstalled());
6800
6801   // Now that the extension is installed, sync request should fail
6802   // because the extension is already installed.
6803   ASSERT_FALSE(AddPendingSyncInstall());
6804 }
6805
6806 // Test that installing an external extension displays a GlobalError.
6807 TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) {
6808   FeatureSwitch::ScopedOverride prompt(
6809       FeatureSwitch::prompt_for_external_extensions(), true);
6810
6811   InitializeEmptyExtensionService();
6812   MockExtensionProvider* provider =
6813       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6814   AddMockExternalProvider(provider);
6815
6816   service()->external_install_manager()->UpdateExternalExtensionAlert();
6817   // Should return false, meaning there aren't any extensions that the user
6818   // needs to know about.
6819   EXPECT_FALSE(
6820       service()->external_install_manager()->HasExternalInstallError());
6821
6822   // This is a normal extension, installed normally.
6823   // This should NOT trigger an alert.
6824   service()->set_extensions_enabled(true);
6825   base::FilePath path = data_dir().AppendASCII("good.crx");
6826   InstallCRX(path, INSTALL_NEW);
6827
6828   service()->CheckForExternalUpdates();
6829   base::RunLoop().RunUntilIdle();
6830   EXPECT_FALSE(
6831       service()->external_install_manager()->HasExternalInstallError());
6832
6833   // A hosted app, installed externally.
6834   // This should NOT trigger an alert.
6835   provider->UpdateOrAddExtension(
6836       hosted_app, "1.0.0.0", data_dir().AppendASCII("hosted_app.crx"));
6837
6838   content::WindowedNotificationObserver observer(
6839       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6840       content::NotificationService::AllSources());
6841   service()->CheckForExternalUpdates();
6842   observer.Wait();
6843   EXPECT_FALSE(
6844       service()->external_install_manager()->HasExternalInstallError());
6845
6846   // Another normal extension, but installed externally.
6847   // This SHOULD trigger an alert.
6848   provider->UpdateOrAddExtension(
6849       page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
6850
6851   content::WindowedNotificationObserver observer2(
6852       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6853       content::NotificationService::AllSources());
6854   service()->CheckForExternalUpdates();
6855   observer2.Wait();
6856   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6857 }
6858
6859 // Test that external extensions are initially disabled, and that enabling
6860 // them clears the prompt.
6861 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) {
6862   FeatureSwitch::ScopedOverride prompt(
6863       FeatureSwitch::prompt_for_external_extensions(), true);
6864
6865   InitializeEmptyExtensionService();
6866   MockExtensionProvider* provider =
6867       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6868   AddMockExternalProvider(provider);
6869
6870   provider->UpdateOrAddExtension(
6871       page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
6872
6873   content::WindowedNotificationObserver observer(
6874       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6875       content::NotificationService::AllSources());
6876   service()->CheckForExternalUpdates();
6877   observer.Wait();
6878   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6879   EXPECT_FALSE(service()->IsExtensionEnabled(page_action));
6880
6881   const Extension* extension =
6882       registry()->disabled_extensions().GetByID(page_action);
6883   EXPECT_TRUE(extension);
6884   EXPECT_EQ(page_action, extension->id());
6885
6886   service()->EnableExtension(page_action);
6887   EXPECT_FALSE(
6888       service()->external_install_manager()->HasExternalInstallError());
6889   EXPECT_TRUE(service()->IsExtensionEnabled(page_action));
6890 }
6891
6892 // Test that installing multiple external extensions works.
6893 // Flaky on windows; http://crbug.com/295757 .
6894 #if defined(OS_WIN)
6895 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple
6896 #else
6897 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple
6898 #endif
6899 TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) {
6900   FeatureSwitch::ScopedOverride prompt(
6901       FeatureSwitch::prompt_for_external_extensions(), true);
6902
6903   InitializeEmptyExtensionService();
6904   MockExtensionProvider* provider =
6905       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6906   AddMockExternalProvider(provider);
6907
6908   provider->UpdateOrAddExtension(
6909       page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx"));
6910   provider->UpdateOrAddExtension(
6911       good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx"));
6912   provider->UpdateOrAddExtension(
6913       theme_crx, "2.0", data_dir().AppendASCII("theme.crx"));
6914
6915   int count = 3;
6916   content::WindowedNotificationObserver observer(
6917       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6918       base::Bind(&WaitForCountNotificationsCallback, &count));
6919   service()->CheckForExternalUpdates();
6920   observer.Wait();
6921   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6922   EXPECT_FALSE(service()->IsExtensionEnabled(page_action));
6923   EXPECT_FALSE(service()->IsExtensionEnabled(good_crx));
6924   EXPECT_FALSE(service()->IsExtensionEnabled(theme_crx));
6925
6926   service()->EnableExtension(page_action);
6927   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6928   EXPECT_FALSE(service()
6929                    ->external_install_manager()
6930                    ->HasExternalInstallBubbleForTesting());
6931
6932   service()->EnableExtension(theme_crx);
6933   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6934   EXPECT_FALSE(service()
6935                    ->external_install_manager()
6936                    ->HasExternalInstallBubbleForTesting());
6937
6938   service()->EnableExtension(good_crx);
6939   EXPECT_FALSE(
6940       service()->external_install_manager()->HasExternalInstallError());
6941   EXPECT_FALSE(service()
6942                    ->external_install_manager()
6943                    ->HasExternalInstallBubbleForTesting());
6944 }
6945
6946 // Test that there is a bubble for external extensions that update
6947 // from the webstore if the profile is not new.
6948 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) {
6949   FeatureSwitch::ScopedOverride prompt(
6950       FeatureSwitch::prompt_for_external_extensions(), true);
6951
6952   // This sets up the ExtensionPrefs used by our ExtensionService to be
6953   // post-first run.
6954   ExtensionServiceInitParams params = CreateDefaultInitParams();
6955   params.is_first_run = false;
6956   InitializeExtensionService(params);
6957
6958   base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
6959   PackCRX(data_dir().AppendASCII("update_from_webstore"),
6960           data_dir().AppendASCII("update_from_webstore.pem"),
6961           crx_path);
6962
6963   MockExtensionProvider* provider =
6964       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6965   AddMockExternalProvider(provider);
6966   provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
6967
6968   content::WindowedNotificationObserver observer(
6969       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6970       content::NotificationService::AllSources());
6971   service()->CheckForExternalUpdates();
6972   observer.Wait();
6973   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
6974   EXPECT_TRUE(service()
6975                   ->external_install_manager()
6976                   ->HasExternalInstallBubbleForTesting());
6977   EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore));
6978 }
6979
6980 // Test that there is no bubble for external extensions if the profile is new.
6981 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) {
6982   FeatureSwitch::ScopedOverride prompt(
6983       FeatureSwitch::prompt_for_external_extensions(), true);
6984
6985   InitializeEmptyExtensionService();
6986
6987   base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
6988   PackCRX(data_dir().AppendASCII("update_from_webstore"),
6989           data_dir().AppendASCII("update_from_webstore.pem"),
6990           crx_path);
6991
6992   MockExtensionProvider* provider =
6993       new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF);
6994   AddMockExternalProvider(provider);
6995   provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
6996
6997   content::WindowedNotificationObserver observer(
6998       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
6999       content::NotificationService::AllSources());
7000   service()->CheckForExternalUpdates();
7001   observer.Wait();
7002   EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError());
7003   EXPECT_FALSE(service()
7004                    ->external_install_manager()
7005                    ->HasExternalInstallBubbleForTesting());
7006   EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore));
7007 }
7008
7009 // Test that clicking to remove the extension on an external install warning
7010 // uninstalls the extension.
7011 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) {
7012   FeatureSwitch::ScopedOverride prompt(
7013       FeatureSwitch::prompt_for_external_extensions(), true);
7014
7015   ExtensionServiceInitParams params = CreateDefaultInitParams();
7016   params.is_first_run = false;
7017   InitializeExtensionService(params);
7018
7019   base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
7020   PackCRX(data_dir().AppendASCII("update_from_webstore"),
7021           data_dir().AppendASCII("update_from_webstore.pem"),
7022           crx_path);
7023
7024   MockExtensionProvider* provider =
7025       new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF);
7026   AddMockExternalProvider(provider);
7027   provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
7028
7029   content::WindowedNotificationObserver observer(
7030       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
7031       content::NotificationService::AllSources());
7032   service_->CheckForExternalUpdates();
7033   observer.Wait();
7034   EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError());
7035
7036   // We check both enabled and disabled, since these are "eventually exclusive"
7037   // sets.
7038   EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore));
7039   EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7040
7041   // Click the negative response.
7042   service_->external_install_manager()->error_for_testing()->InstallUIAbort(
7043       true);
7044   // The Extension should be uninstalled.
7045   EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore,
7046                                             ExtensionRegistry::EVERYTHING));
7047   // The error should be removed.
7048   EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError());
7049 }
7050
7051 // Test that clicking to keep the extension on an external install warning
7052 // re-enables the extension.
7053 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) {
7054   FeatureSwitch::ScopedOverride prompt(
7055       FeatureSwitch::prompt_for_external_extensions(), true);
7056
7057   ExtensionServiceInitParams params = CreateDefaultInitParams();
7058   params.is_first_run = false;
7059   InitializeExtensionService(params);
7060
7061   base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx");
7062   PackCRX(data_dir().AppendASCII("update_from_webstore"),
7063           data_dir().AppendASCII("update_from_webstore.pem"),
7064           crx_path);
7065
7066   MockExtensionProvider* provider =
7067       new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF);
7068   AddMockExternalProvider(provider);
7069   provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path);
7070
7071   content::WindowedNotificationObserver observer(
7072       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
7073       content::NotificationService::AllSources());
7074   service_->CheckForExternalUpdates();
7075   observer.Wait();
7076   EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError());
7077
7078   // We check both enabled and disabled, since these are "eventually exclusive"
7079   // sets.
7080   EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore));
7081   EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7082
7083   // Accept the extension.
7084   service_->external_install_manager()->error_for_testing()->InstallUIProceed();
7085
7086   // It should be enabled again.
7087   EXPECT_TRUE(registry()->enabled_extensions().GetByID(updates_from_webstore));
7088   EXPECT_FALSE(
7089       registry()->disabled_extensions().GetByID(updates_from_webstore));
7090
7091   // The error should be removed.
7092   EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError());
7093 }
7094
7095 TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) {
7096   InitializeEmptyExtensionService();
7097
7098   scoped_refptr<Extension> extension = extensions::ExtensionBuilder()
7099       .SetManifest(extensions::DictionaryBuilder()
7100           .Set("name", "extension")
7101           .Set("version", "1.0")
7102           .Set("manifest_version", 2).Build())
7103       .Build();
7104   ASSERT_TRUE(extension.get());
7105   const std::string& id = extension->id();
7106
7107   std::set<std::string> id_set;
7108   id_set.insert(id);
7109   extensions::ExtensionNotificationObserver notifications(
7110       content::NotificationService::AllSources(), id_set);
7111
7112   // Installation should be allowed but the extension should never have been
7113   // loaded and it should be blacklisted in prefs.
7114   service()->OnExtensionInstalled(
7115       extension.get(),
7116       syncer::StringOrdinal(),
7117       (extensions::kInstallFlagIsBlacklistedForMalware |
7118        extensions::kInstallFlagInstallImmediately));
7119   base::RunLoop().RunUntilIdle();
7120
7121   // Extension was installed but not loaded.
7122   EXPECT_TRUE(notifications.CheckNotifications(
7123       extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED));
7124   EXPECT_TRUE(service()->GetInstalledExtension(id));
7125
7126   EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
7127   EXPECT_TRUE(registry()->blacklisted_extensions().Contains(id));
7128
7129   EXPECT_TRUE(ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(id));
7130   EXPECT_TRUE(
7131       ExtensionPrefs::Get(profile())->IsBlacklistedExtensionAcknowledged(id));
7132 }
7133
7134 // Tests a profile being destroyed correctly disables extensions.
7135 TEST_F(ExtensionServiceTest, DestroyingProfileClearsExtensions) {
7136   InitializeEmptyExtensionService();
7137
7138   InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW);
7139   EXPECT_NE(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_);
7140   EXPECT_EQ(1u, registry()->enabled_extensions().size());
7141   EXPECT_EQ(0u, registry()->disabled_extensions().size());
7142   EXPECT_EQ(0u, registry()->terminated_extensions().size());
7143   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
7144
7145   service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED,
7146                      content::Source<Profile>(profile()),
7147                      content::NotificationService::NoDetails());
7148   EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_);
7149   EXPECT_EQ(0u, registry()->enabled_extensions().size());
7150   EXPECT_EQ(0u, registry()->disabled_extensions().size());
7151   EXPECT_EQ(0u, registry()->terminated_extensions().size());
7152   EXPECT_EQ(0u, registry()->blacklisted_extensions().size());
7153 }