blob: 336c7aa15d3329f77b19c324c20ea5c5da887c70 [file] [log] [blame]
[email protected]eccbbb62014-06-27 21:39:451// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "extensions/browser/test_extension_registry_observer.h"
6
rdevlin.cronin267be092014-10-07 21:18:537#include "base/run_loop.h"
[email protected]eccbbb62014-06-27 21:39:458#include "extensions/browser/extension_registry.h"
9
10namespace extensions {
11
12class TestExtensionRegistryObserver::Waiter {
13 public:
rdevlin.cronin44d31212015-02-27 03:28:2414 Waiter() : observed_(false), extension_(nullptr) {}
[email protected]eccbbb62014-06-27 21:39:4515
16 void Wait() {
rdevlin.cronin44d31212015-02-27 03:28:2417 if (!observed_)
18 run_loop_.Run();
[email protected]eccbbb62014-06-27 21:39:4519 }
20
rdevlin.cronin44d31212015-02-27 03:28:2421 void OnObserved(const Extension* extension) {
[email protected]eccbbb62014-06-27 21:39:4522 observed_ = true;
rdevlin.cronin267be092014-10-07 21:18:5323 run_loop_.Quit();
rdevlin.cronin44d31212015-02-27 03:28:2424 extension_ = extension;
[email protected]eccbbb62014-06-27 21:39:4525 }
26
rdevlin.cronin44d31212015-02-27 03:28:2427 const Extension* extension() const { return extension_; }
28
[email protected]eccbbb62014-06-27 21:39:4529 private:
30 bool observed_;
rdevlin.cronin267be092014-10-07 21:18:5331 base::RunLoop run_loop_;
rdevlin.cronin44d31212015-02-27 03:28:2432 const Extension* extension_;
[email protected]eccbbb62014-06-27 21:39:4533
34 DISALLOW_COPY_AND_ASSIGN(Waiter);
35};
36
37TestExtensionRegistryObserver::TestExtensionRegistryObserver(
rdevlin.cronin44d31212015-02-27 03:28:2438 ExtensionRegistry* registry)
39 : TestExtensionRegistryObserver(registry, std::string()) {
40}
41
42TestExtensionRegistryObserver::TestExtensionRegistryObserver(
[email protected]eccbbb62014-06-27 21:39:4543 ExtensionRegistry* registry,
44 const std::string& extension_id)
rdevlin.cronin44d31212015-02-27 03:28:2445 : will_be_installed_waiter_(new Waiter()),
46 uninstalled_waiter_(new Waiter()),
47 loaded_waiter_(new Waiter()),
48 unloaded_waiter_(new Waiter()),
[email protected]eccbbb62014-06-27 21:39:4549 extension_registry_observer_(this),
50 extension_id_(extension_id) {
51 extension_registry_observer_.Add(registry);
52}
53
54TestExtensionRegistryObserver::~TestExtensionRegistryObserver() {
55}
56
rdevlin.cronin44d31212015-02-27 03:28:2457const Extension* TestExtensionRegistryObserver::WaitForExtensionUninstalled() {
58 return Wait(&uninstalled_waiter_);
[email protected]eccbbb62014-06-27 21:39:4559}
60
rdevlin.cronin44d31212015-02-27 03:28:2461const Extension*
62TestExtensionRegistryObserver::WaitForExtensionWillBeInstalled() {
63 return Wait(&will_be_installed_waiter_);
[email protected]eccbbb62014-06-27 21:39:4564}
65
rdevlin.cronin44d31212015-02-27 03:28:2466const Extension* TestExtensionRegistryObserver::WaitForExtensionLoaded() {
67 return Wait(&loaded_waiter_);
[email protected]eccbbb62014-06-27 21:39:4568}
69
rdevlin.cronin44d31212015-02-27 03:28:2470const Extension* TestExtensionRegistryObserver::WaitForExtensionUnloaded() {
71 return Wait(&unloaded_waiter_);
[email protected]eccbbb62014-06-27 21:39:4572}
73
74void TestExtensionRegistryObserver::OnExtensionWillBeInstalled(
75 content::BrowserContext* browser_context,
76 const Extension* extension,
77 bool is_update,
78 bool from_ephemeral,
79 const std::string& old_name) {
rdevlin.cronin44d31212015-02-27 03:28:2480 if (extension_id_.empty() || extension->id() == extension_id_)
81 will_be_installed_waiter_->OnObserved(extension);
[email protected]eccbbb62014-06-27 21:39:4582}
83
84void TestExtensionRegistryObserver::OnExtensionUninstalled(
85 content::BrowserContext* browser_context,
[email protected]e43c61f2014-07-20 21:46:3486 const Extension* extension,
87 extensions::UninstallReason reason) {
rdevlin.cronin44d31212015-02-27 03:28:2488 if (extension_id_.empty() || extension->id() == extension_id_)
89 uninstalled_waiter_->OnObserved(extension);
[email protected]eccbbb62014-06-27 21:39:4590}
91
92void TestExtensionRegistryObserver::OnExtensionLoaded(
93 content::BrowserContext* browser_context,
94 const Extension* extension) {
rdevlin.cronin44d31212015-02-27 03:28:2495 if (extension_id_.empty() || extension->id() == extension_id_)
96 loaded_waiter_->OnObserved(extension);
[email protected]eccbbb62014-06-27 21:39:4597}
98
99void TestExtensionRegistryObserver::OnExtensionUnloaded(
100 content::BrowserContext* browser_context,
101 const Extension* extension,
102 UnloadedExtensionInfo::Reason reason) {
rdevlin.cronin44d31212015-02-27 03:28:24103 if (extension_id_.empty() || extension->id() == extension_id_)
104 unloaded_waiter_->OnObserved(extension);
105}
106
107const Extension* TestExtensionRegistryObserver::Wait(
108 scoped_ptr<Waiter>* waiter) {
109 waiter->get()->Wait();
110 const Extension* extension = waiter->get()->extension();
111 // Reset the waiter for future uses.
112 // We could have a Waiter::Reset method, but it would reset every field in the
113 // class, so let's just reset the pointer.
114 waiter->reset(new Waiter());
115 return extension;
[email protected]eccbbb62014-06-27 21:39:45116}
117
118} // namespace extensions