| Index: chrome/utility/extensions/extensions_handler.cc
|
| diff --git a/chrome/utility/extensions/extensions_handler.cc b/chrome/utility/extensions/extensions_handler.cc
|
| index 787a8b9ef20161ec71ea57e28608859ad392c90b..9992d42ec90fe10e797ef4849fae210e8b7ba3ff 100644
|
| --- a/chrome/utility/extensions/extensions_handler.cc
|
| +++ b/chrome/utility/extensions/extensions_handler.cc
|
| @@ -12,6 +12,7 @@
|
| #include "chrome/common/chrome_utility_messages.h"
|
| #include "chrome/common/extensions/chrome_extensions_client.h"
|
| #include "chrome/common/extensions/chrome_utility_extensions_messages.h"
|
| +#include "chrome/common/extensions/media_parser.mojom.h"
|
| #include "chrome/common/media_galleries/metadata_types.h"
|
| #include "chrome/utility/chrome_content_utility_client.h"
|
| #include "chrome/utility/media_galleries/ipc_data_source.h"
|
| @@ -22,6 +23,8 @@
|
| #include "extensions/common/extension_utility_messages.h"
|
| #include "extensions/utility/unpacker.h"
|
| #include "media/base/media.h"
|
| +#include "mojo/public/cpp/bindings/strong_binding.h"
|
| +#include "services/service_manager/public/cpp/interface_registry.h"
|
| #include "ui/base/ui_base_switches.h"
|
|
|
| #if !defined(MEDIA_DISABLE_FFMPEG)
|
| @@ -40,8 +43,6 @@
|
| #include "chrome/utility/media_galleries/picasa_albums_indexer.h"
|
| #endif // defined(OS_WIN) || defined(OS_MACOSX)
|
|
|
| -namespace extensions {
|
| -
|
| namespace {
|
|
|
| bool Send(IPC::Message* message) {
|
| @@ -52,19 +53,53 @@ void ReleaseProcessIfNeeded() {
|
| content::UtilityThread::Get()->ReleaseProcessIfNeeded();
|
| }
|
|
|
| -void FinishParseMediaMetadata(
|
| - metadata::MediaMetadataParser* /* parser */,
|
| - const extensions::api::media_galleries::MediaMetadata& metadata,
|
| - const std::vector<metadata::AttachedImage>& attached_images) {
|
| - Send(new ChromeUtilityHostMsg_ParseMediaMetadata_Finished(
|
| - true, *metadata.ToValue(), attached_images));
|
| - ReleaseProcessIfNeeded();
|
| -}
|
| +class MediaParserImpl : public extensions::mojom::MediaParser {
|
| + public:
|
| + static void Create(ChromeContentUtilityClient* utility_client,
|
| + extensions::mojom::MediaParserRequest request) {
|
| + mojo::MakeStrongBinding(base::MakeUnique<MediaParserImpl>(utility_client),
|
| + std::move(request));
|
| + }
|
| +
|
| + explicit MediaParserImpl(ChromeContentUtilityClient* utility_client)
|
| + : utility_client_(utility_client) {}
|
| +
|
| + ~MediaParserImpl() override = default;
|
| +
|
| + private:
|
| + // extensions::mojom::MediaParser:
|
| + void ParseMediaMetadata(const std::string& mime_type,
|
| + int64_t total_size,
|
| + bool get_attached_images,
|
| + const ParseMediaMetadataCallback& callback) override {
|
| + // Only one IPCDataSource may be created and added to the list of handlers.
|
| + auto source = base::MakeUnique<metadata::IPCDataSource>(total_size);
|
| + metadata::MediaMetadataParser* parser = new metadata::MediaMetadataParser(
|
| + source.get(), mime_type, get_attached_images);
|
| + utility_client_->AddHandler(std::move(source));
|
| + parser->Start(base::Bind(&MediaParserImpl::ParseMediaMetadataDone, callback,
|
| + base::Owned(parser)));
|
| + }
|
| +
|
| + static void ParseMediaMetadataDone(
|
| + const ParseMediaMetadataCallback& callback,
|
| + metadata::MediaMetadataParser* /* parser */,
|
| + const extensions::api::media_galleries::MediaMetadata& metadata,
|
| + const std::vector<metadata::AttachedImage>& attached_images) {
|
| + callback.Run(true, metadata.ToValue(), attached_images);
|
| + ReleaseProcessIfNeeded();
|
| + }
|
| +
|
| + ChromeContentUtilityClient* const utility_client_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MediaParserImpl);
|
| +};
|
|
|
| } // namespace
|
|
|
| -ExtensionsHandler::ExtensionsHandler(ChromeContentUtilityClient* utility_client)
|
| - : utility_client_(utility_client) {
|
| +namespace extensions {
|
| +
|
| +ExtensionsHandler::ExtensionsHandler() {
|
| ExtensionsClient::Set(ChromeExtensionsClient::GetInstance());
|
| }
|
|
|
| @@ -77,12 +112,23 @@ void ExtensionsHandler::PreSandboxStartup() {
|
| media::InitializeMediaLibrary();
|
| }
|
|
|
| +// static
|
| +void ExtensionsHandler::ExposeInterfacesToBrowser(
|
| + service_manager::InterfaceRegistry* registry,
|
| + ChromeContentUtilityClient* utility_client,
|
| + bool running_elevated) {
|
| + // If our process runs with elevated privileges, only add elevated
|
| + // Mojo services to the interface registry.
|
| + if (running_elevated)
|
| + return;
|
| +
|
| + registry->AddInterface(base::Bind(&MediaParserImpl::Create, utility_client));
|
| +}
|
| +
|
| bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message)
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile)
|
| - IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseMediaMetadata,
|
| - OnParseMediaMetadata)
|
|
|
| #if defined(OS_WIN)
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml,
|
| @@ -105,6 +151,7 @@ bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) {
|
|
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| +
|
| return handled || utility_handler_.OnMessageReceived(message);
|
| }
|
|
|
| @@ -123,18 +170,6 @@ void ExtensionsHandler::OnCheckMediaFile(
|
| ReleaseProcessIfNeeded();
|
| }
|
|
|
| -void ExtensionsHandler::OnParseMediaMetadata(const std::string& mime_type,
|
| - int64_t total_size,
|
| - bool get_attached_images) {
|
| - // Only one IPCDataSource may be created and added to the list of handlers.
|
| - std::unique_ptr<metadata::IPCDataSource> source(
|
| - new metadata::IPCDataSource(total_size));
|
| - metadata::MediaMetadataParser* parser = new metadata::MediaMetadataParser(
|
| - source.get(), mime_type, get_attached_images);
|
| - utility_client_->AddHandler(std::move(source));
|
| - parser->Start(base::Bind(&FinishParseMediaMetadata, base::Owned(parser)));
|
| -}
|
| -
|
| #if defined(OS_WIN)
|
| void ExtensionsHandler::OnParseITunesPrefXml(
|
| const std::string& itunes_xml_data) {
|
|
|