| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/utility/extensions/extensions_handler.h" | 5 #include "chrome/utility/extensions/extensions_handler.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "chrome/common/chrome_utility_messages.h" | 12 #include "chrome/common/chrome_utility_messages.h" |
| 13 #include "chrome/common/extensions/chrome_extensions_client.h" | 13 #include "chrome/common/extensions/chrome_extensions_client.h" |
| 14 #include "chrome/common/extensions/chrome_utility_extensions_messages.h" | 14 #include "chrome/common/extensions/chrome_utility_extensions_messages.h" |
| 15 #include "chrome/common/extensions/media_parser.mojom.h" |
| 15 #include "chrome/common/media_galleries/metadata_types.h" | 16 #include "chrome/common/media_galleries/metadata_types.h" |
| 16 #include "chrome/utility/chrome_content_utility_client.h" | 17 #include "chrome/utility/chrome_content_utility_client.h" |
| 17 #include "chrome/utility/media_galleries/ipc_data_source.h" | 18 #include "chrome/utility/media_galleries/ipc_data_source.h" |
| 18 #include "chrome/utility/media_galleries/media_metadata_parser.h" | 19 #include "chrome/utility/media_galleries/media_metadata_parser.h" |
| 19 #include "content/public/common/content_paths.h" | 20 #include "content/public/common/content_paths.h" |
| 20 #include "content/public/utility/utility_thread.h" | 21 #include "content/public/utility/utility_thread.h" |
| 21 #include "extensions/common/extension.h" | 22 #include "extensions/common/extension.h" |
| 22 #include "extensions/common/extension_utility_messages.h" | 23 #include "extensions/common/extension_utility_messages.h" |
| 23 #include "extensions/utility/unpacker.h" | 24 #include "extensions/utility/unpacker.h" |
| 24 #include "media/base/media.h" | 25 #include "media/base/media.h" |
| 26 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 27 #include "services/service_manager/public/cpp/interface_registry.h" |
| 25 #include "ui/base/ui_base_switches.h" | 28 #include "ui/base/ui_base_switches.h" |
| 26 | 29 |
| 27 #if !defined(MEDIA_DISABLE_FFMPEG) | 30 #if !defined(MEDIA_DISABLE_FFMPEG) |
| 28 #include "media/base/media_file_checker.h" | 31 #include "media/base/media_file_checker.h" |
| 29 #endif | 32 #endif |
| 30 | 33 |
| 31 #if defined(OS_WIN) | 34 #if defined(OS_WIN) |
| 32 #include "chrome/utility/media_galleries/itunes_pref_parser_win.h" | 35 #include "chrome/utility/media_galleries/itunes_pref_parser_win.h" |
| 33 #include "components/wifi/wifi_service.h" | 36 #include "components/wifi/wifi_service.h" |
| 34 #endif // defined(OS_WIN) | 37 #endif // defined(OS_WIN) |
| 35 | 38 |
| 36 #if defined(OS_WIN) || defined(OS_MACOSX) | 39 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 37 #include "chrome/utility/media_galleries/iapps_xml_utils.h" | 40 #include "chrome/utility/media_galleries/iapps_xml_utils.h" |
| 38 #include "chrome/utility/media_galleries/itunes_library_parser.h" | 41 #include "chrome/utility/media_galleries/itunes_library_parser.h" |
| 39 #include "chrome/utility/media_galleries/picasa_album_table_reader.h" | 42 #include "chrome/utility/media_galleries/picasa_album_table_reader.h" |
| 40 #include "chrome/utility/media_galleries/picasa_albums_indexer.h" | 43 #include "chrome/utility/media_galleries/picasa_albums_indexer.h" |
| 41 #endif // defined(OS_WIN) || defined(OS_MACOSX) | 44 #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| 42 | 45 |
| 43 namespace extensions { | |
| 44 | |
| 45 namespace { | 46 namespace { |
| 46 | 47 |
| 47 bool Send(IPC::Message* message) { | 48 bool Send(IPC::Message* message) { |
| 48 return content::UtilityThread::Get()->Send(message); | 49 return content::UtilityThread::Get()->Send(message); |
| 49 } | 50 } |
| 50 | 51 |
| 51 void ReleaseProcessIfNeeded() { | 52 void ReleaseProcessIfNeeded() { |
| 52 content::UtilityThread::Get()->ReleaseProcessIfNeeded(); | 53 content::UtilityThread::Get()->ReleaseProcessIfNeeded(); |
| 53 } | 54 } |
| 54 | 55 |
| 55 void FinishParseMediaMetadata( | 56 class MediaParserImpl : public extensions::mojom::MediaParser { |
| 56 metadata::MediaMetadataParser* /* parser */, | 57 public: |
| 57 const extensions::api::media_galleries::MediaMetadata& metadata, | 58 static void Create(ChromeContentUtilityClient* utility_client, |
| 58 const std::vector<metadata::AttachedImage>& attached_images) { | 59 extensions::mojom::MediaParserRequest request) { |
| 59 Send(new ChromeUtilityHostMsg_ParseMediaMetadata_Finished( | 60 mojo::MakeStrongBinding(base::MakeUnique<MediaParserImpl>(utility_client), |
| 60 true, *metadata.ToValue(), attached_images)); | 61 std::move(request)); |
| 61 ReleaseProcessIfNeeded(); | 62 } |
| 62 } | 63 |
| 64 explicit MediaParserImpl(ChromeContentUtilityClient* utility_client) |
| 65 : utility_client_(utility_client) {} |
| 66 |
| 67 ~MediaParserImpl() override = default; |
| 68 |
| 69 private: |
| 70 // extensions::mojom::MediaParser: |
| 71 void ParseMediaMetadata(const std::string& mime_type, |
| 72 int64_t total_size, |
| 73 bool get_attached_images, |
| 74 const ParseMediaMetadataCallback& callback) override { |
| 75 // Only one IPCDataSource may be created and added to the list of handlers. |
| 76 auto source = base::MakeUnique<metadata::IPCDataSource>(total_size); |
| 77 metadata::MediaMetadataParser* parser = new metadata::MediaMetadataParser( |
| 78 source.get(), mime_type, get_attached_images); |
| 79 utility_client_->AddHandler(std::move(source)); |
| 80 parser->Start(base::Bind(&MediaParserImpl::ParseMediaMetadataDone, callback, |
| 81 base::Owned(parser))); |
| 82 } |
| 83 |
| 84 static void ParseMediaMetadataDone( |
| 85 const ParseMediaMetadataCallback& callback, |
| 86 metadata::MediaMetadataParser* /* parser */, |
| 87 const extensions::api::media_galleries::MediaMetadata& metadata, |
| 88 const std::vector<metadata::AttachedImage>& attached_images) { |
| 89 callback.Run(true, metadata.ToValue(), attached_images); |
| 90 ReleaseProcessIfNeeded(); |
| 91 } |
| 92 |
| 93 ChromeContentUtilityClient* const utility_client_; |
| 94 |
| 95 DISALLOW_COPY_AND_ASSIGN(MediaParserImpl); |
| 96 }; |
| 63 | 97 |
| 64 } // namespace | 98 } // namespace |
| 65 | 99 |
| 66 ExtensionsHandler::ExtensionsHandler(ChromeContentUtilityClient* utility_client) | 100 namespace extensions { |
| 67 : utility_client_(utility_client) { | 101 |
| 102 ExtensionsHandler::ExtensionsHandler() { |
| 68 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); | 103 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); |
| 69 } | 104 } |
| 70 | 105 |
| 71 ExtensionsHandler::~ExtensionsHandler() { | 106 ExtensionsHandler::~ExtensionsHandler() { |
| 72 } | 107 } |
| 73 | 108 |
| 74 // static | 109 // static |
| 75 void ExtensionsHandler::PreSandboxStartup() { | 110 void ExtensionsHandler::PreSandboxStartup() { |
| 76 // Initialize media libraries for media file validation. | 111 // Initialize media libraries for media file validation. |
| 77 media::InitializeMediaLibrary(); | 112 media::InitializeMediaLibrary(); |
| 78 } | 113 } |
| 79 | 114 |
| 115 // static |
| 116 void ExtensionsHandler::ExposeInterfacesToBrowser( |
| 117 service_manager::InterfaceRegistry* registry, |
| 118 ChromeContentUtilityClient* utility_client, |
| 119 bool running_elevated) { |
| 120 // If our process runs with elevated privileges, only add elevated |
| 121 // Mojo services to the interface registry. |
| 122 if (running_elevated) |
| 123 return; |
| 124 |
| 125 registry->AddInterface(base::Bind(&MediaParserImpl::Create, utility_client)); |
| 126 } |
| 127 |
| 80 bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) { | 128 bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) { |
| 81 bool handled = true; | 129 bool handled = true; |
| 82 IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message) | 130 IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message) |
| 83 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile) | 131 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile) |
| 84 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseMediaMetadata, | |
| 85 OnParseMediaMetadata) | |
| 86 | 132 |
| 87 #if defined(OS_WIN) | 133 #if defined(OS_WIN) |
| 88 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, | 134 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, |
| 89 OnParseITunesPrefXml) | 135 OnParseITunesPrefXml) |
| 90 #endif // defined(OS_WIN) | 136 #endif // defined(OS_WIN) |
| 91 | 137 |
| 92 #if defined(OS_WIN) || defined(OS_MACOSX) | 138 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 93 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, | 139 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, |
| 94 OnParseITunesLibraryXmlFile) | 140 OnParseITunesLibraryXmlFile) |
| 95 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, | 141 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, |
| 96 OnParsePicasaPMPDatabase) | 142 OnParsePicasaPMPDatabase) |
| 97 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_IndexPicasaAlbumsContents, | 143 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_IndexPicasaAlbumsContents, |
| 98 OnIndexPicasaAlbumsContents) | 144 OnIndexPicasaAlbumsContents) |
| 99 #endif // defined(OS_WIN) || defined(OS_MACOSX) | 145 #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| 100 | 146 |
| 101 #if defined(OS_WIN) | 147 #if defined(OS_WIN) |
| 102 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetWiFiCredentials, | 148 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetWiFiCredentials, |
| 103 OnGetWiFiCredentials) | 149 OnGetWiFiCredentials) |
| 104 #endif // defined(OS_WIN) | 150 #endif // defined(OS_WIN) |
| 105 | 151 |
| 106 IPC_MESSAGE_UNHANDLED(handled = false) | 152 IPC_MESSAGE_UNHANDLED(handled = false) |
| 107 IPC_END_MESSAGE_MAP() | 153 IPC_END_MESSAGE_MAP() |
| 154 |
| 108 return handled || utility_handler_.OnMessageReceived(message); | 155 return handled || utility_handler_.OnMessageReceived(message); |
| 109 } | 156 } |
| 110 | 157 |
| 111 void ExtensionsHandler::OnCheckMediaFile( | 158 void ExtensionsHandler::OnCheckMediaFile( |
| 112 int64_t milliseconds_of_decoding, | 159 int64_t milliseconds_of_decoding, |
| 113 const IPC::PlatformFileForTransit& media_file) { | 160 const IPC::PlatformFileForTransit& media_file) { |
| 114 #if !defined(MEDIA_DISABLE_FFMPEG) | 161 #if !defined(MEDIA_DISABLE_FFMPEG) |
| 115 media::MediaFileChecker checker( | 162 media::MediaFileChecker checker( |
| 116 IPC::PlatformFileForTransitToFile(media_file)); | 163 IPC::PlatformFileForTransitToFile(media_file)); |
| 117 const bool check_success = checker.Start( | 164 const bool check_success = checker.Start( |
| 118 base::TimeDelta::FromMilliseconds(milliseconds_of_decoding)); | 165 base::TimeDelta::FromMilliseconds(milliseconds_of_decoding)); |
| 119 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(check_success)); | 166 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(check_success)); |
| 120 #else | 167 #else |
| 121 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(false)); | 168 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(false)); |
| 122 #endif | 169 #endif |
| 123 ReleaseProcessIfNeeded(); | 170 ReleaseProcessIfNeeded(); |
| 124 } | 171 } |
| 125 | 172 |
| 126 void ExtensionsHandler::OnParseMediaMetadata(const std::string& mime_type, | |
| 127 int64_t total_size, | |
| 128 bool get_attached_images) { | |
| 129 // Only one IPCDataSource may be created and added to the list of handlers. | |
| 130 std::unique_ptr<metadata::IPCDataSource> source( | |
| 131 new metadata::IPCDataSource(total_size)); | |
| 132 metadata::MediaMetadataParser* parser = new metadata::MediaMetadataParser( | |
| 133 source.get(), mime_type, get_attached_images); | |
| 134 utility_client_->AddHandler(std::move(source)); | |
| 135 parser->Start(base::Bind(&FinishParseMediaMetadata, base::Owned(parser))); | |
| 136 } | |
| 137 | |
| 138 #if defined(OS_WIN) | 173 #if defined(OS_WIN) |
| 139 void ExtensionsHandler::OnParseITunesPrefXml( | 174 void ExtensionsHandler::OnParseITunesPrefXml( |
| 140 const std::string& itunes_xml_data) { | 175 const std::string& itunes_xml_data) { |
| 141 base::FilePath library_path( | 176 base::FilePath library_path( |
| 142 itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); | 177 itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); |
| 143 Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); | 178 Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); |
| 144 ReleaseProcessIfNeeded(); | 179 ReleaseProcessIfNeeded(); |
| 145 } | 180 } |
| 146 #endif // defined(OS_WIN) | 181 #endif // defined(OS_WIN) |
| 147 | 182 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 | 234 |
| 200 std::string key_data; | 235 std::string key_data; |
| 201 std::string error; | 236 std::string error; |
| 202 wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); | 237 wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); |
| 203 | 238 |
| 204 Send(new ChromeUtilityHostMsg_GotWiFiCredentials(key_data, error.empty())); | 239 Send(new ChromeUtilityHostMsg_GotWiFiCredentials(key_data, error.empty())); |
| 205 } | 240 } |
| 206 #endif // defined(OS_WIN) | 241 #endif // defined(OS_WIN) |
| 207 | 242 |
| 208 } // namespace extensions | 243 } // namespace extensions |
| OLD | NEW |