Chromium Code Reviews| 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* 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>(client), |
|
tibell
2017/01/09 03:55:52
Do we know |client| will outlive this impl? We onl
Noel Gordon
2017/01/09 14:54:19
Yes |client| outlives the impl (I retained the sam
| |
| 60 true, *metadata.ToValue(), attached_images)); | 61 std::move(request)); |
| 61 ReleaseProcessIfNeeded(); | 62 } |
| 62 } | 63 |
| 64 explicit MediaParserImpl(ChromeContentUtilityClient* client) | |
| 65 : utility_client_(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 std::unique_ptr<metadata::IPCDataSource> source( | |
| 77 new metadata::IPCDataSource(total_size)); | |
| 78 metadata::MediaMetadataParser* parser = new metadata::MediaMetadataParser( | |
| 79 source.get(), mime_type, get_attached_images); | |
| 80 utility_client_->AddHandler(std::move(source)); | |
| 81 parser->Start(base::Bind(&MediaParserImpl::ParseMediaMetadataDone, | |
| 82 callback, base::Owned(parser))); | |
| 83 } | |
| 84 | |
| 85 static void ParseMediaMetadataDone( | |
| 86 const ParseMediaMetadataCallback& callback, | |
| 87 metadata::MediaMetadataParser* /* parser */, | |
| 88 const extensions::api::media_galleries::MediaMetadata& metadata, | |
| 89 const std::vector<metadata::AttachedImage>& attached_images) { | |
| 90 callback.Run(true, metadata.ToValue(), attached_images); | |
| 91 ReleaseProcessIfNeeded(); | |
| 92 } | |
| 93 | |
| 94 ChromeContentUtilityClient* utility_client_; | |
| 95 | |
| 96 DISALLOW_COPY_AND_ASSIGN(MediaParserImpl); | |
| 97 }; | |
| 63 | 98 |
| 64 } // namespace | 99 } // namespace |
| 65 | 100 |
| 66 ExtensionsHandler::ExtensionsHandler(ChromeContentUtilityClient* utility_client) | 101 namespace extensions { |
| 67 : utility_client_(utility_client) { | 102 |
| 103 ExtensionsHandler::ExtensionsHandler() { | |
| 68 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); | 104 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); |
| 69 } | 105 } |
| 70 | 106 |
| 71 ExtensionsHandler::~ExtensionsHandler() { | 107 ExtensionsHandler::~ExtensionsHandler() { |
| 72 } | 108 } |
| 73 | 109 |
| 74 // static | 110 // static |
| 75 void ExtensionsHandler::PreSandboxStartup() { | 111 void ExtensionsHandler::PreSandboxStartup() { |
| 76 // Initialize media libraries for media file validation. | 112 // Initialize media libraries for media file validation. |
| 77 media::InitializeMediaLibrary(); | 113 media::InitializeMediaLibrary(); |
| 78 } | 114 } |
| 79 | 115 |
| 116 // static | |
| 117 void ExtensionsHandler::ExposeInterfacesToBrowser( | |
| 118 service_manager::InterfaceRegistry* registry, | |
| 119 ChromeContentUtilityClient* client, | |
| 120 bool running_elevated) { | |
| 121 // If our process runs with elevated privileges, only add elevated | |
| 122 // Mojo services to the service_manager::InterfaceRegistry. | |
| 123 if (running_elevated) | |
| 124 return; | |
| 125 | |
| 126 registry->AddInterface(base::Bind(&MediaParserImpl::Create, client)); | |
| 127 } | |
| 128 | |
| 80 bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) { | 129 bool ExtensionsHandler::OnMessageReceived(const IPC::Message& message) { |
| 81 bool handled = true; | 130 bool handled = true; |
| 82 IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message) | 131 IPC_BEGIN_MESSAGE_MAP(ExtensionsHandler, message) |
| 83 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile) | 132 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CheckMediaFile, OnCheckMediaFile) |
| 84 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseMediaMetadata, | |
| 85 OnParseMediaMetadata) | |
| 86 | 133 |
| 87 #if defined(OS_WIN) | 134 #if defined(OS_WIN) |
| 88 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, | 135 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, |
| 89 OnParseITunesPrefXml) | 136 OnParseITunesPrefXml) |
| 90 #endif // defined(OS_WIN) | 137 #endif // defined(OS_WIN) |
| 91 | 138 |
| 92 #if defined(OS_WIN) || defined(OS_MACOSX) | 139 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 93 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, | 140 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, |
| 94 OnParseITunesLibraryXmlFile) | 141 OnParseITunesLibraryXmlFile) |
| 95 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, | 142 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, |
| 96 OnParsePicasaPMPDatabase) | 143 OnParsePicasaPMPDatabase) |
| 97 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_IndexPicasaAlbumsContents, | 144 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_IndexPicasaAlbumsContents, |
| 98 OnIndexPicasaAlbumsContents) | 145 OnIndexPicasaAlbumsContents) |
| 99 #endif // defined(OS_WIN) || defined(OS_MACOSX) | 146 #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| 100 | 147 |
| 101 #if defined(OS_WIN) | 148 #if defined(OS_WIN) |
| 102 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetWiFiCredentials, | 149 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetWiFiCredentials, |
| 103 OnGetWiFiCredentials) | 150 OnGetWiFiCredentials) |
| 104 #endif // defined(OS_WIN) | 151 #endif // defined(OS_WIN) |
| 105 | 152 |
| 106 IPC_MESSAGE_UNHANDLED(handled = false) | 153 IPC_MESSAGE_UNHANDLED(handled = false) |
| 107 IPC_END_MESSAGE_MAP() | 154 IPC_END_MESSAGE_MAP() |
| 155 | |
| 108 return handled || utility_handler_.OnMessageReceived(message); | 156 return handled || utility_handler_.OnMessageReceived(message); |
| 109 } | 157 } |
| 110 | 158 |
| 111 void ExtensionsHandler::OnCheckMediaFile( | 159 void ExtensionsHandler::OnCheckMediaFile( |
| 112 int64_t milliseconds_of_decoding, | 160 int64_t milliseconds_of_decoding, |
| 113 const IPC::PlatformFileForTransit& media_file) { | 161 const IPC::PlatformFileForTransit& media_file) { |
| 114 #if !defined(MEDIA_DISABLE_FFMPEG) | 162 #if !defined(MEDIA_DISABLE_FFMPEG) |
| 115 media::MediaFileChecker checker( | 163 media::MediaFileChecker checker( |
| 116 IPC::PlatformFileForTransitToFile(media_file)); | 164 IPC::PlatformFileForTransitToFile(media_file)); |
| 117 const bool check_success = checker.Start( | 165 const bool check_success = checker.Start( |
| 118 base::TimeDelta::FromMilliseconds(milliseconds_of_decoding)); | 166 base::TimeDelta::FromMilliseconds(milliseconds_of_decoding)); |
| 119 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(check_success)); | 167 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(check_success)); |
| 120 #else | 168 #else |
| 121 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(false)); | 169 Send(new ChromeUtilityHostMsg_CheckMediaFile_Finished(false)); |
| 122 #endif | 170 #endif |
| 123 ReleaseProcessIfNeeded(); | 171 ReleaseProcessIfNeeded(); |
| 124 } | 172 } |
| 125 | 173 |
| 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) | 174 #if defined(OS_WIN) |
| 139 void ExtensionsHandler::OnParseITunesPrefXml( | 175 void ExtensionsHandler::OnParseITunesPrefXml( |
| 140 const std::string& itunes_xml_data) { | 176 const std::string& itunes_xml_data) { |
| 141 base::FilePath library_path( | 177 base::FilePath library_path( |
| 142 itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); | 178 itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); |
| 143 Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); | 179 Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); |
| 144 ReleaseProcessIfNeeded(); | 180 ReleaseProcessIfNeeded(); |
| 145 } | 181 } |
| 146 #endif // defined(OS_WIN) | 182 #endif // defined(OS_WIN) |
| 147 | 183 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 199 | 235 |
| 200 std::string key_data; | 236 std::string key_data; |
| 201 std::string error; | 237 std::string error; |
| 202 wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); | 238 wifi_service->GetKeyFromSystem(network_guid, &key_data, &error); |
| 203 | 239 |
| 204 Send(new ChromeUtilityHostMsg_GotWiFiCredentials(key_data, error.empty())); | 240 Send(new ChromeUtilityHostMsg_GotWiFiCredentials(key_data, error.empty())); |
| 205 } | 241 } |
| 206 #endif // defined(OS_WIN) | 242 #endif // defined(OS_WIN) |
| 207 | 243 |
| 208 } // namespace extensions | 244 } // namespace extensions |
| OLD | NEW |