blob: e82d180e93a0ad2d6f4a5d2a87a146eeda0ce435 [file] [log] [blame]
// 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/chromeos/accessibility/accessibility_extension_loader.h"
#include "base/callback.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/extensions/component_loader.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "extensions/browser/extension_system.h"
namespace chromeos {
AccessibilityExtensionLoader::AccessibilityExtensionLoader(
const std::string& extension_id,
const base::FilePath& extension_path,
const base::Closure& unload_callback)
: profile_(nullptr),
extension_id_(extension_id),
extension_path_(extension_path),
loaded_(false),
unload_callback_(unload_callback),
weak_ptr_factory_(this) {}
AccessibilityExtensionLoader::~AccessibilityExtensionLoader() {}
void AccessibilityExtensionLoader::SetProfile(
Profile* profile,
const base::Closure& done_callback) {
profile_ = profile;
if (!loaded_)
return;
// If the extension was already enabled, but not for this profile, add it
// to this profile.
auto* extension_service =
extensions::ExtensionSystem::Get(profile_)->extension_service();
auto* component_loader = extension_service->component_loader();
if (!component_loader->Exists(extension_id_))
LoadExtension(profile_, done_callback);
}
void AccessibilityExtensionLoader::Load(Profile* profile,
const base::Closure& done_cb) {
profile_ = profile;
if (loaded_)
return;
loaded_ = true;
LoadExtension(profile_, done_cb);
}
void AccessibilityExtensionLoader::Unload() {
if (loaded_) {
UnloadExtensionFromProfile(profile_);
UnloadExtensionFromProfile(ProfileHelper::GetSigninProfile());
loaded_ = false;
}
profile_ = nullptr;
if (unload_callback_)
unload_callback_.Run();
}
//
// private
//
void AccessibilityExtensionLoader::UnloadExtensionFromProfile(
Profile* profile) {
extensions::ExtensionService* extension_service =
extensions::ExtensionSystem::Get(profile)->extension_service();
extension_service->component_loader()->Remove(extension_path_);
}
void AccessibilityExtensionLoader::LoadExtension(Profile* profile,
base::Closure done_cb) {
extensions::ExtensionService* extension_service =
extensions::ExtensionSystem::Get(profile)->extension_service();
extension_service->component_loader()->AddComponentFromDir(
extension_path_, extension_id_.c_str(), done_cb);
}
} // namespace chromeos