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 |