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 |