Chromium Code Reviews| 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..b9610f0a8391825f5843f7180b78e85039ae2a20 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,54 @@ 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. |
| + std::unique_ptr<metadata::IPCDataSource> source( |
| + new metadata::IPCDataSource(total_size)); |
|
Sam McNally
2017/01/10 06:55:14
This appears to be the source of data to be parsed
Noel Gordon
2017/01/10 22:52:37
Ack.
|
| + 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 +113,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 service_manager::InterfaceRegistry. |
| + 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 +152,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 +171,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) { |