[Extensions] Make chrome://extensions use developerPrivate.allowIncognito

Make the chrome://extensions page use chrome.developerPrivate API to toggle
incognito. Also add unit tests for the API function.

BUG=461039

Review URL: https://codereview.chromium.org/953033002

Cr-Commit-Position: refs/heads/master@{#318393}
diff --git a/extensions/browser/test_extension_registry_observer.cc b/extensions/browser/test_extension_registry_observer.cc
index 4d87e94..336c7aa1 100644
--- a/extensions/browser/test_extension_registry_observer.cc
+++ b/extensions/browser/test_extension_registry_observer.cc
@@ -11,33 +11,41 @@
 
 class TestExtensionRegistryObserver::Waiter {
  public:
-  explicit Waiter(const std::string& extension_id) : observed_(false) {}
+  Waiter() : observed_(false), extension_(nullptr) {}
 
   void Wait() {
-    if (observed_)
-      return;
-    run_loop_.Run();
+    if (!observed_)
+      run_loop_.Run();
   }
 
-  void OnObserved() {
+  void OnObserved(const Extension* extension) {
     observed_ = true;
     run_loop_.Quit();
+    extension_ = extension;
   }
 
+  const Extension* extension() const { return extension_; }
+
  private:
   bool observed_;
   base::RunLoop run_loop_;
+  const Extension* extension_;
 
   DISALLOW_COPY_AND_ASSIGN(Waiter);
 };
 
 TestExtensionRegistryObserver::TestExtensionRegistryObserver(
+    ExtensionRegistry* registry)
+    : TestExtensionRegistryObserver(registry, std::string()) {
+}
+
+TestExtensionRegistryObserver::TestExtensionRegistryObserver(
     ExtensionRegistry* registry,
     const std::string& extension_id)
-    : will_be_installed_waiter_(new Waiter(extension_id)),
-      uninstalled_waiter_(new Waiter(extension_id)),
-      loaded_waiter_(new Waiter(extension_id)),
-      unloaded_waiter_(new Waiter(extension_id)),
+    : will_be_installed_waiter_(new Waiter()),
+      uninstalled_waiter_(new Waiter()),
+      loaded_waiter_(new Waiter()),
+      unloaded_waiter_(new Waiter()),
       extension_registry_observer_(this),
       extension_id_(extension_id) {
   extension_registry_observer_.Add(registry);
@@ -46,20 +54,21 @@
 TestExtensionRegistryObserver::~TestExtensionRegistryObserver() {
 }
 
-void TestExtensionRegistryObserver::WaitForExtensionUninstalled() {
-  uninstalled_waiter_->Wait();
+const Extension* TestExtensionRegistryObserver::WaitForExtensionUninstalled() {
+  return Wait(&uninstalled_waiter_);
 }
 
-void TestExtensionRegistryObserver::WaitForExtensionWillBeInstalled() {
-  will_be_installed_waiter_->Wait();
+const Extension*
+TestExtensionRegistryObserver::WaitForExtensionWillBeInstalled() {
+  return Wait(&will_be_installed_waiter_);
 }
 
-void TestExtensionRegistryObserver::WaitForExtensionLoaded() {
-  loaded_waiter_->Wait();
+const Extension* TestExtensionRegistryObserver::WaitForExtensionLoaded() {
+  return Wait(&loaded_waiter_);
 }
 
-void TestExtensionRegistryObserver::WaitForExtensionUnloaded() {
-  unloaded_waiter_->Wait();
+const Extension* TestExtensionRegistryObserver::WaitForExtensionUnloaded() {
+  return Wait(&unloaded_waiter_);
 }
 
 void TestExtensionRegistryObserver::OnExtensionWillBeInstalled(
@@ -68,31 +77,42 @@
     bool is_update,
     bool from_ephemeral,
     const std::string& old_name) {
-  if (extension->id() == extension_id_)
-    will_be_installed_waiter_->OnObserved();
+  if (extension_id_.empty() || extension->id() == extension_id_)
+    will_be_installed_waiter_->OnObserved(extension);
 }
 
 void TestExtensionRegistryObserver::OnExtensionUninstalled(
     content::BrowserContext* browser_context,
     const Extension* extension,
     extensions::UninstallReason reason) {
-  if (extension->id() == extension_id_)
-    uninstalled_waiter_->OnObserved();
+  if (extension_id_.empty() || extension->id() == extension_id_)
+    uninstalled_waiter_->OnObserved(extension);
 }
 
 void TestExtensionRegistryObserver::OnExtensionLoaded(
     content::BrowserContext* browser_context,
     const Extension* extension) {
-  if (extension->id() == extension_id_)
-    loaded_waiter_->OnObserved();
+  if (extension_id_.empty() || extension->id() == extension_id_)
+    loaded_waiter_->OnObserved(extension);
 }
 
 void TestExtensionRegistryObserver::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
     const Extension* extension,
     UnloadedExtensionInfo::Reason reason) {
-  if (extension->id() == extension_id_)
-    unloaded_waiter_->OnObserved();
+  if (extension_id_.empty() || extension->id() == extension_id_)
+    unloaded_waiter_->OnObserved(extension);
+}
+
+const Extension* TestExtensionRegistryObserver::Wait(
+    scoped_ptr<Waiter>* waiter) {
+  waiter->get()->Wait();
+  const Extension* extension = waiter->get()->extension();
+  // Reset the waiter for future uses.
+  // We could have a Waiter::Reset method, but it would reset every field in the
+  // class, so let's just reset the pointer.
+  waiter->reset(new Waiter());
+  return extension;
 }
 
 }  // namespace extensions