blob: 0327d41e00c59c5a0bea2e0f17b58b84e3fe12a1 [file] [log] [blame]
// Copyright 2014 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_action_test_util.h"
#include <memory>
#include "base/bind.h"
#include "base/run_loop.h"
#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model_factory.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
namespace extensions {
namespace extension_action_test_util {
namespace {
size_t GetPageActionCount(content::WebContents* web_contents,
bool only_count_visible) {
DCHECK(web_contents);
size_t count = 0u;
SessionID tab_id = SessionTabHelper::IdForTab(web_contents);
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
ToolbarActionsModel* toolbar_model = ToolbarActionsModel::Get(profile);
const std::vector<ToolbarActionsModel::ActionId>& toolbar_action_ids =
toolbar_model->action_ids();
ExtensionActionManager* action_manager =
ExtensionActionManager::Get(web_contents->GetBrowserContext());
const ExtensionSet& enabled_extensions =
ExtensionRegistry::Get(profile)->enabled_extensions();
for (const ToolbarActionsModel::ActionId& action_id : toolbar_action_ids) {
const Extension* extension = enabled_extensions.GetByID(action_id);
ExtensionAction* extension_action =
action_manager->GetPageAction(*extension);
if (extension_action &&
(!only_count_visible || extension_action->GetIsVisible(tab_id.id()))) {
++count;
}
}
return count;
}
// Creates a new ToolbarActionsModel for the given |context|.
std::unique_ptr<KeyedService> BuildToolbarModel(
content::BrowserContext* context) {
return std::make_unique<ToolbarActionsModel>(
Profile::FromBrowserContext(context),
extensions::ExtensionPrefs::Get(context));
}
// Creates a new ToolbarActionsModel for the given profile, optionally
// triggering the extension system's ready signal.
ToolbarActionsModel* CreateToolbarModelImpl(Profile* profile,
bool wait_for_ready) {
ToolbarActionsModel* model = ToolbarActionsModel::Get(profile);
if (model)
return model;
// No existing model means it's a new profile (since we, by default, don't
// create the ToolbarModel in testing).
ToolbarActionsModelFactory::GetInstance()->SetTestingFactory(
profile, base::BindRepeating(&BuildToolbarModel));
model = ToolbarActionsModel::Get(profile);
if (wait_for_ready) {
// Fake the extension system ready signal.
// HACK ALERT! In production, the ready task on ExtensionSystem (and most
// everything else on it, too) is shared between incognito and normal
// profiles, but a TestExtensionSystem doesn't have the concept of "shared".
// Because of this, we have to set any new profile's TestExtensionSystem's
// ready task, too.
static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile))->
SetReady();
// Run tasks posted to TestExtensionSystem.
base::RunLoop().RunUntilIdle();
}
return model;
}
} // namespace
size_t GetVisiblePageActionCount(content::WebContents* web_contents) {
return GetPageActionCount(web_contents, true);
}
size_t GetTotalPageActionCount(content::WebContents* web_contents) {
return GetPageActionCount(web_contents, false);
}
ToolbarActionsModel* CreateToolbarModelForProfile(Profile* profile) {
return CreateToolbarModelImpl(profile, true);
}
ToolbarActionsModel* CreateToolbarModelForProfileWithoutWaitingForReady(
Profile* profile) {
return CreateToolbarModelImpl(profile, false);
}
} // namespace extension_action_test_util
} // namespace extensions