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) { |