Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: chrome/utility/extensions/extensions_handler.cc

Issue 2615423002: Convert utility process ParseMediaMetadata IPC to mojo (Closed)
Patch Set: Security review comments. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « chrome/utility/extensions/extensions_handler.h ('k') | mojo/public/tools/bindings/chromium_bindings_configuration.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698