Chromium Code Reviews| Index: chrome/browser/extensions/extensions_service.cc |
| =================================================================== |
| --- chrome/browser/extensions/extensions_service.cc (revision 0) |
| +++ chrome/browser/extensions/extensions_service.cc (revision 0) |
| @@ -0,0 +1,130 @@ |
| +// Copyright (c) 2006-2008 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/extensions_service.h" |
| + |
| +#include "base/file_util.h" |
| +#include "base/values.h" |
| +#include "base/string_util.h" |
| +#include "base/thread.h" |
| +#include "chrome/browser/browser_process.h" |
| +#include "chrome/common/json_value_serializer.h" |
| + |
| +// ExtensionsService |
| + |
| +const FilePath::CharType* ExtensionsService::kInstallDirectoryName = |
| + FILE_PATH_LITERAL("Extensions"); |
| + |
| +ExtensionsService::ExtensionsService(const FilePath& profile_directory) |
| + : message_loop_(MessageLoop::current()), |
| + backend_(new ExtensionsServiceBackend), |
| + install_directory_(profile_directory.Append(kInstallDirectoryName)) { |
| +} |
| + |
| +ExtensionsService::~ExtensionsService() { |
| + for (ExtensionList::iterator iter = extensions_.begin(); |
| + iter != extensions_.end(); ++iter) { |
| + delete *iter; |
| + } |
| +} |
| + |
| +bool ExtensionsService::Init() { |
| + // TODO(aa): This message loop should probably come from a backend |
| + // interface, similar to how the message loop for the frontend comes |
| + // from the frontend interface. |
| + g_browser_process->file_thread()->message_loop()->PostTask(FROM_HERE, |
| + NewRunnableMethod(backend_.get(), |
| + &ExtensionsServiceBackend::LoadExtensionsFromDirectory, |
| + install_directory_, |
| + scoped_refptr<ExtensionsServiceFrontendInterface>(this))); |
| + // TODO(aa): Load extensions from other registered directories. |
| + |
| + return true; |
| +} |
| + |
| +MessageLoop* ExtensionsService::GetMessageLoop() { |
| + return message_loop_; |
| +} |
| + |
| +void ExtensionsService::OnExtensionsLoadedFromDirectory( |
| + ExtensionList* extensions) { |
| + extensions_.assign(extensions->begin(), extensions->end()); |
| + delete extensions; |
| + |
| + // TODO(aa): Notify extensions are loaded. |
| +} |
| + |
| +void ExtensionsService::OnExtensionLoadError(const std::wstring& error) { |
| + // TODO(aa): Print the error message out somewhere better. Ideally we would |
| + // use the JavaScript console I think, but that is complicated since these |
| + // errors are not related to any particular page. |
| + LOG(WARNING) << "Error loading extension: " << error; |
| +} |
| + |
| + |
| +// ExtensionsServicesBackend |
| + |
| +bool ExtensionsServiceBackend::LoadExtensionsFromDirectory( |
| + const FilePath& path, |
| + scoped_refptr<ExtensionsServiceFrontendInterface> frontend) { |
| + // Find all child directories in the install directory and load their |
| + // manifests. Post errors and results to the frontend. |
| + scoped_ptr<ExtensionList> extensions(new ExtensionList); |
| + file_util::FileEnumerator enumerator(path.ToWStringHack(), |
| + false, // not recursive |
| + file_util::FileEnumerator::DIRECTORIES); |
| + for (std::wstring child_path = enumerator.Next(); !child_path.empty(); |
| + child_path = enumerator.Next()) { |
| + FilePath manifest_path = FilePath::FromWStringHack(child_path).Append( |
|
Erik does not do reviews
2008/12/04 22:03:06
indent is off
|
| + Extension::kManifestFilename); |
| + if (!file_util::PathExists(manifest_path)) { |
| + ReportExtensionLoadError(frontend.get(), |
| + Extension::kInvalidManifestError); |
| + continue; |
| + } |
| + |
| + JSONFileValueSerializer serializer(manifest_path.ToWStringHack()); |
| + Value* root = NULL; |
| + if (!serializer.Deserialize(&root)) { |
| + ReportExtensionLoadError(frontend.get(), |
| + Extension::kInvalidManifestError); |
| + continue; |
| + } |
| + |
| + if (!root->IsType(Value::TYPE_DICTIONARY)) { |
| + ReportExtensionLoadError(frontend.get(), |
| + Extension::kInvalidManifestError); |
| + continue; |
| + } |
| + |
| + scoped_ptr<Extension> extension(new Extension()); |
| + std::wstring error; |
| + if (!extension->InitFromValue(*static_cast<DictionaryValue*>(root), |
| + &error)) { |
| + ReportExtensionLoadError(frontend.get(), |
| + Extension::kInvalidManifestError); |
| + continue; |
| + } |
| + |
| + extensions->push_back(extension.release()); |
| + } |
| + |
| + ReportExtensionsLoaded(frontend.get(), extensions.release()); |
| + return true; |
| +} |
| + |
| +void ExtensionsServiceBackend::ReportExtensionLoadError( |
| + ExtensionsServiceFrontendInterface *frontend, const std::wstring &error) { |
| + frontend->GetMessageLoop()->PostTask(FROM_HERE, NewRunnableMethod( |
| + frontend, &ExtensionsServiceFrontendInterface::OnExtensionLoadError, |
| + error)); |
| +} |
| + |
| +void ExtensionsServiceBackend::ReportExtensionsLoaded( |
| + ExtensionsServiceFrontendInterface *frontend, ExtensionList* extensions) { |
| + frontend->GetMessageLoop()->PostTask(FROM_HERE, NewRunnableMethod( |
| + frontend, |
| + &ExtensionsServiceFrontendInterface::OnExtensionsLoadedFromDirectory, |
| + extensions)); |
| +} |
|
Erik does not do reviews
2008/12/04 22:03:06
is this file missing a trailing newline?
|