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