| Index: chrome/browser/extensions/chrome_extension_test_notification_observer.cc
|
| diff --git a/chrome/browser/extensions/extension_test_notification_observer.cc b/chrome/browser/extensions/chrome_extension_test_notification_observer.cc
|
| similarity index 21%
|
| copy from chrome/browser/extensions/extension_test_notification_observer.cc
|
| copy to chrome/browser/extensions/chrome_extension_test_notification_observer.cc
|
| index a9f3d8f2084d5afddb962c7af15634102ca6f833..4c6dc3d7938625e39a4ed8a752b7325e717ab38e 100644
|
| --- a/chrome/browser/extensions/extension_test_notification_observer.cc
|
| +++ b/chrome/browser/extensions/chrome_extension_test_notification_observer.cc
|
| @@ -1,27 +1,17 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/extensions/extension_test_notification_observer.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include "base/callback_list.h"
|
| +#include <chrome/browser/extensions/chrome_extension_test_notification_observer.h>
|
| #include "base/scoped_observer.h"
|
| #include "chrome/browser/extensions/extension_action_test_util.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/extensions/extension_util.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| -#include "content/public/browser/notification_registrar.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/render_view_host.h"
|
| -#include "content/public/test/test_utils.h"
|
| -#include "extensions/browser/extension_system.h"
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "extensions/browser/notification_types.h"
|
| #include "extensions/browser/process_manager.h"
|
| -#include "extensions/browser/process_manager_observer.h"
|
| #include "extensions/common/extension.h"
|
|
|
| using extensions::Extension;
|
| @@ -30,13 +20,14 @@ namespace {
|
|
|
| // A callback that returns true if the condition has been met and takes no
|
| // arguments.
|
| -typedef base::Callback<bool(void)> ConditionCallback;
|
| +using ConditionCallback = base::Callback<bool(void)>;
|
|
|
| bool HasPageActionVisibilityReachedTarget(
|
| - Browser* browser, size_t target_visible_page_action_count) {
|
| + Browser* browser,
|
| + size_t target_visible_page_action_count) {
|
| return extensions::extension_action_test_util::GetVisiblePageActionCount(
|
| - browser->tab_strip_model()->GetActiveWebContents()) ==
|
| - target_visible_page_action_count;
|
| + browser->tab_strip_model()->GetActiveWebContents()) ==
|
| + target_visible_page_action_count;
|
| }
|
|
|
| bool HaveAllExtensionRenderFrameHostsFinishedLoading(
|
| @@ -49,128 +40,44 @@ bool HaveAllExtensionRenderFrameHostsFinishedLoading(
|
| return true;
|
| }
|
|
|
| -bool IsExtensionNotIdle(const std::string& extension_id,
|
| - content::BrowserContext* context) {
|
| - return !extensions::util::IsExtensionIdle(extension_id, context);
|
| -}
|
| -
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| -// ExtensionTestNotificationObserver::NotificationSet
|
| -
|
| -class ExtensionTestNotificationObserver::NotificationSet
|
| - : public content::NotificationObserver,
|
| - public extensions::ProcessManagerObserver {
|
| - public:
|
| - NotificationSet() : process_manager_observer_(this) {}
|
| - ~NotificationSet() override {}
|
| -
|
| - void Add(int type, const content::NotificationSource& source);
|
| - void Add(int type);
|
| - void AddExtensionFrameUnregistration(extensions::ProcessManager* manager);
|
| -
|
| - // Notified any time an Add()ed notification is received.
|
| - // The details of the notification are dropped.
|
| - base::CallbackList<void()>& callback_list() {
|
| - return callback_list_;
|
| - }
|
| -
|
| - private:
|
| - // content::NotificationObserver:
|
| - void Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) override;
|
| -
|
| - // extensions::ProcessManagerObserver:
|
| - void OnExtensionFrameUnregistered(
|
| - const std::string& extension_id,
|
| - content::RenderFrameHost* render_frame_host) override;
|
| -
|
| - content::NotificationRegistrar notification_registrar_;
|
| - base::CallbackList<void()> callback_list_;
|
| - ScopedObserver<extensions::ProcessManager, extensions::ProcessManagerObserver>
|
| - process_manager_observer_;
|
| -};
|
| -
|
| -void ExtensionTestNotificationObserver::NotificationSet::Add(
|
| - int type,
|
| - const content::NotificationSource& source) {
|
| - notification_registrar_.Add(this, type, source);
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::NotificationSet::Add(int type) {
|
| - Add(type, content::NotificationService::AllSources());
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::NotificationSet::
|
| - AddExtensionFrameUnregistration(extensions::ProcessManager* manager) {
|
| - process_manager_observer_.Add(manager);
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::NotificationSet::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - callback_list_.Notify();
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::NotificationSet::
|
| - OnExtensionFrameUnregistered(const std::string& extension_id,
|
| - content::RenderFrameHost* render_frame_host) {
|
| - callback_list_.Notify();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| // ExtensionTestNotificationObserver
|
|
|
| -ExtensionTestNotificationObserver::ExtensionTestNotificationObserver(
|
| - Browser* browser)
|
| - : browser_(browser),
|
| - profile_(NULL),
|
| - extension_installs_observed_(0),
|
| - extension_load_errors_observed_(0),
|
| - crx_installers_done_observed_(0) {
|
| -}
|
| +ChromeExtensionTestNotificationObserver::
|
| + ChromeExtensionTestNotificationObserver(Browser* browser)
|
| + : ExtensionTestNotificationObserver(browser ? browser->profile() : nullptr),
|
| + browser_(browser) {}
|
|
|
| -ExtensionTestNotificationObserver::~ExtensionTestNotificationObserver() {}
|
| +ChromeExtensionTestNotificationObserver::
|
| + ~ChromeExtensionTestNotificationObserver() {}
|
|
|
| -Profile* ExtensionTestNotificationObserver::GetProfile() {
|
| - if (!profile_) {
|
| +content::BrowserContext*
|
| +ChromeExtensionTestNotificationObserver::GetBrowserContext() {
|
| + if (!context_) {
|
| if (browser_)
|
| - profile_ = browser_->profile();
|
| + context_ = browser_->profile();
|
| else
|
| - profile_ = ProfileManager::GetActiveUserProfile();
|
| + context_ = ProfileManager::GetActiveUserProfile();
|
| }
|
| - return profile_;
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::WaitForNotification(
|
| - int notification_type) {
|
| - // TODO(bauerb): Using a WindowedNotificationObserver like this can break
|
| - // easily, if the notification we're waiting for is sent before this method.
|
| - // Change it so that the WindowedNotificationObserver is constructed earlier.
|
| - content::NotificationRegistrar registrar;
|
| - registrar.Add(
|
| - this, notification_type, content::NotificationService::AllSources());
|
| - content::WindowedNotificationObserver(
|
| - notification_type, content::NotificationService::AllSources()).Wait();
|
| + return context_;
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForPageActionVisibilityChangeTo(
|
| - int count) {
|
| - extensions::ExtensionActionAPI::Get(GetProfile())->AddObserver(this);
|
| +bool ChromeExtensionTestNotificationObserver::
|
| + WaitForPageActionVisibilityChangeTo(int count) {
|
| + ScopedObserver<extensions::ExtensionActionAPI,
|
| + extensions::ExtensionActionAPI::Observer>
|
| + observer(this);
|
| + observer.Add(extensions::ExtensionActionAPI::Get(GetBrowserContext()));
|
| WaitForCondition(
|
| - base::Bind(&HasPageActionVisibilityReachedTarget, browser_, count),
|
| - NULL);
|
| - extensions::ExtensionActionAPI::Get(GetProfile())->
|
| - RemoveObserver(this);
|
| + base::Bind(&HasPageActionVisibilityReachedTarget, browser_, count), NULL);
|
| return true;
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionViewsToLoad() {
|
| +bool ChromeExtensionTestNotificationObserver::WaitForExtensionViewsToLoad() {
|
| extensions::ProcessManager* manager =
|
| - extensions::ProcessManager::Get(GetProfile());
|
| + extensions::ProcessManager::Get(GetBrowserContext());
|
| NotificationSet notification_set;
|
| notification_set.Add(content::NOTIFICATION_WEB_CONTENTS_DESTROYED);
|
| notification_set.Add(content::NOTIFICATION_LOAD_STOP);
|
| @@ -181,148 +88,37 @@ bool ExtensionTestNotificationObserver::WaitForExtensionViewsToLoad() {
|
| return true;
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionIdle(
|
| +bool ChromeExtensionTestNotificationObserver::WaitForExtensionIdle(
|
| const std::string& extension_id) {
|
| NotificationSet notification_set;
|
| notification_set.Add(content::NOTIFICATION_RENDERER_PROCESS_TERMINATED);
|
| WaitForCondition(base::Bind(&extensions::util::IsExtensionIdle, extension_id,
|
| - GetProfile()),
|
| + GetBrowserContext()),
|
| ¬ification_set);
|
| return true;
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionNotIdle(
|
| +bool ChromeExtensionTestNotificationObserver::WaitForExtensionNotIdle(
|
| const std::string& extension_id) {
|
| NotificationSet notification_set;
|
| notification_set.Add(content::NOTIFICATION_LOAD_STOP);
|
| - WaitForCondition(base::Bind(&IsExtensionNotIdle, extension_id, GetProfile()),
|
| + WaitForCondition(base::Bind(
|
| + [](const std::string& extension_id,
|
| + content::BrowserContext* context) -> bool {
|
| + return !extensions::util::IsExtensionIdle(extension_id,
|
| + context);
|
| + },
|
| + extension_id, GetBrowserContext()),
|
| ¬ification_set);
|
| return true;
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionInstallError() {
|
| - int before = extension_installs_observed_;
|
| - content::WindowedNotificationObserver(
|
| - extensions::NOTIFICATION_EXTENSION_INSTALL_ERROR,
|
| - content::NotificationService::AllSources()).Wait();
|
| - return extension_installs_observed_ == before;
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::WaitForExtensionLoad() {
|
| - WaitForNotification(extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED);
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::WaitForExtensionAndViewLoad() {
|
| - this->WaitForExtensionLoad();
|
| +void ChromeExtensionTestNotificationObserver::WaitForExtensionAndViewLoad() {
|
| + WaitForExtensionLoad();
|
| WaitForExtensionViewsToLoad();
|
| }
|
|
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionLoadError() {
|
| - int before = extension_load_errors_observed_;
|
| - WaitForNotification(extensions::NOTIFICATION_EXTENSION_LOAD_ERROR);
|
| - return extension_load_errors_observed_ != before;
|
| -}
|
| -
|
| -bool ExtensionTestNotificationObserver::WaitForExtensionCrash(
|
| - const std::string& extension_id) {
|
| - ExtensionService* service = extensions::ExtensionSystem::Get(
|
| - GetProfile())->extension_service();
|
| -
|
| - if (!service->GetExtensionById(extension_id, true)) {
|
| - // The extension is already unloaded, presumably due to a crash.
|
| - return true;
|
| - }
|
| - content::WindowedNotificationObserver(
|
| - extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
|
| - content::NotificationService::AllSources()).Wait();
|
| - return (service->GetExtensionById(extension_id, true) == NULL);
|
| -}
|
| -
|
| -bool ExtensionTestNotificationObserver::WaitForCrxInstallerDone() {
|
| - int before = crx_installers_done_observed_;
|
| - WaitForNotification(extensions::NOTIFICATION_CRX_INSTALLER_DONE);
|
| - return crx_installers_done_observed_ == (before + 1);
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::Watch(
|
| - int type,
|
| - const content::NotificationSource& source) {
|
| - CHECK(!observer_);
|
| - observer_.reset(new content::WindowedNotificationObserver(type, source));
|
| - registrar_.Add(this, type, source);
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::Wait() {
|
| - observer_->Wait();
|
| -
|
| - registrar_.RemoveAll();
|
| - observer_.reset();
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - switch (type) {
|
| - case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED:
|
| - last_loaded_extension_id_ =
|
| - content::Details<const Extension>(details).ptr()->id();
|
| - VLOG(1) << "Got EXTENSION_LOADED notification.";
|
| - break;
|
| -
|
| - case extensions::NOTIFICATION_CRX_INSTALLER_DONE:
|
| - VLOG(1) << "Got CRX_INSTALLER_DONE notification.";
|
| - {
|
| - const Extension* extension =
|
| - content::Details<const Extension>(details).ptr();
|
| - if (extension)
|
| - last_loaded_extension_id_ = extension->id();
|
| - else
|
| - last_loaded_extension_id_.clear();
|
| - }
|
| - ++crx_installers_done_observed_;
|
| - break;
|
| -
|
| - case extensions::NOTIFICATION_EXTENSION_LOAD_ERROR:
|
| - VLOG(1) << "Got EXTENSION_LOAD_ERROR notification.";
|
| - ++extension_load_errors_observed_;
|
| - break;
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::OnPageActionsUpdated(
|
| +void ChromeExtensionTestNotificationObserver::OnPageActionsUpdated(
|
| content::WebContents* web_contents) {
|
| MaybeQuit();
|
| }
|
| -
|
| -void ExtensionTestNotificationObserver::WaitForCondition(
|
| - const ConditionCallback& condition,
|
| - NotificationSet* notification_set) {
|
| - if (condition.Run())
|
| - return;
|
| - condition_ = condition;
|
| -
|
| - scoped_refptr<content::MessageLoopRunner> runner(
|
| - new content::MessageLoopRunner);
|
| - quit_closure_ = runner->QuitClosure();
|
| -
|
| - std::unique_ptr<base::CallbackList<void()>::Subscription> subscription;
|
| - if (notification_set) {
|
| - subscription = notification_set->callback_list().Add(
|
| - base::Bind(&ExtensionTestNotificationObserver::MaybeQuit,
|
| - base::Unretained(this)));
|
| - }
|
| - runner->Run();
|
| -
|
| - condition_.Reset();
|
| - quit_closure_.Reset();
|
| -}
|
| -
|
| -void ExtensionTestNotificationObserver::MaybeQuit() {
|
| - if (condition_.Run())
|
| - quit_closure_.Run();
|
| -}
|
|
|