1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_TEST_BASE_EXTENSION_LOAD_WAITER_ONE_SHOT_H_
6#define CHROME_TEST_BASE_EXTENSION_LOAD_WAITER_ONE_SHOT_H_
7
8#include "base/callback_forward.h"
9#include "content/public/browser/notification_observer.h"
10#include "content/public/browser/notification_registrar.h"
11#include "content/public/test/test_utils.h"
12
13namespace content {
14class BrowserContext;
15}  // namespace content
16
17// A class used to wait for an extension to load. Callers provide a load
18// callback and can block until the extension loads.
19class ExtensionLoadWaiterOneShot : public content::NotificationObserver {
20 public:
21  ExtensionLoadWaiterOneShot();
22  virtual ~ExtensionLoadWaiterOneShot();
23
24  // Waits for extension with |extension_id| to load. The id should be a pointer
25  // to a static char array.
26  void WaitForExtension(const char* extension_id, const base::Closure& load_cb);
27
28  // content::NotificationObserver overrides.
29  virtual void Observe(int type,
30                       const content::NotificationSource& source,
31                       const content::NotificationDetails& details) OVERRIDE;
32
33  // Get the browser context associated with the loaded extension. Returns
34  // NULL if |WaitForExtension| was not previously called.
35  content::BrowserContext* browser_context() { return browser_context_; }
36
37  // Get the id of the loaded extension.
38  const char* extension_id() { return extension_id_; }
39
40 private:
41  content::NotificationRegistrar registrar_;
42  scoped_refptr<content::MessageLoopRunner> load_looper_;
43  const char* extension_id_;
44  content::BrowserContext* browser_context_;
45
46  DISALLOW_COPY_AND_ASSIGN(ExtensionLoadWaiterOneShot);
47};
48
49#endif  // CHROME_TEST_BASE_EXTENSION_LOAD_WAITER_ONE_SHOT_H_
50