| 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/browser/media_galleries/fileapi/safe_media_metadata_parser.h" | 5 #include "chrome/browser/media_galleries/fileapi/safe_media_metadata_parser.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" | 11 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "chrome/browser/extensions/blob_reader.h" | 12 #include "chrome/browser/extensions/blob_reader.h" |
| 13 #include "chrome/common/extensions/chrome_utility_extensions_messages.h" | 13 #include "chrome/common/extensions/chrome_utility_extensions_messages.h" |
| 14 #include "chrome/grit/generated_resources.h" | 14 #include "chrome/grit/generated_resources.h" |
| 15 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 16 #include "content/public/browser/child_process_data.h" | 16 #include "content/public/browser/child_process_data.h" |
| 17 #include "content/public/browser/utility_process_host.h" | 17 #include "content/public/browser/utility_process_host.h" |
| 18 #include "services/service_manager/public/cpp/interface_provider.h" |
| 18 #include "ui/base/l10n/l10n_util.h" | 19 #include "ui/base/l10n/l10n_util.h" |
| 19 | 20 |
| 20 using content::BrowserThread; | 21 using content::BrowserThread; |
| 21 | 22 |
| 22 namespace metadata { | 23 namespace metadata { |
| 23 | 24 |
| 24 SafeMediaMetadataParser::SafeMediaMetadataParser(Profile* profile, | 25 SafeMediaMetadataParser::SafeMediaMetadataParser(Profile* profile, |
| 25 const std::string& blob_uuid, | 26 const std::string& blob_uuid, |
| 26 int64_t blob_size, | 27 int64_t blob_size, |
| 27 const std::string& mime_type, | 28 const std::string& mime_type, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 53 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 54 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 54 DCHECK_EQ(INITIAL_STATE, parser_state_); | 55 DCHECK_EQ(INITIAL_STATE, parser_state_); |
| 55 DCHECK(!callback.is_null()); | 56 DCHECK(!callback.is_null()); |
| 56 | 57 |
| 57 callback_ = callback; | 58 callback_ = callback; |
| 58 | 59 |
| 59 utility_process_host_ = content::UtilityProcessHost::Create( | 60 utility_process_host_ = content::UtilityProcessHost::Create( |
| 60 this, base::ThreadTaskRunnerHandle::Get())->AsWeakPtr(); | 61 this, base::ThreadTaskRunnerHandle::Get())->AsWeakPtr(); |
| 61 utility_process_host_->SetName(l10n_util::GetStringUTF16( | 62 utility_process_host_->SetName(l10n_util::GetStringUTF16( |
| 62 IDS_UTILITY_PROCESS_MEDIA_FILE_CHECKER_NAME)); | 63 IDS_UTILITY_PROCESS_MEDIA_FILE_CHECKER_NAME)); |
| 63 | 64 utility_process_host_->Start(); |
| 64 utility_process_host_->Send( | |
| 65 new ChromeUtilityMsg_ParseMediaMetadata(mime_type_, blob_size_, | |
| 66 get_attached_images_)); | |
| 67 | 65 |
| 68 parser_state_ = STARTED_PARSING_STATE; | 66 parser_state_ = STARTED_PARSING_STATE; |
| 67 |
| 68 utility_process_host_->GetRemoteInterfaces()->GetInterface(&interface_); |
| 69 |
| 70 interface_.set_connection_error_handler( |
| 71 base::Bind(&SafeMediaMetadataParser::ParseMediaMetadataFailed, this)); |
| 72 |
| 73 interface_->ParseMediaMetadata( |
| 74 mime_type_, blob_size_, get_attached_images_, |
| 75 base::Bind(&SafeMediaMetadataParser::ParseMediaMetadataDone, this)); |
| 69 } | 76 } |
| 70 | 77 |
| 71 void SafeMediaMetadataParser::OnParseMediaMetadataFinished( | 78 void SafeMediaMetadataParser::ParseMediaMetadataFailed() { |
| 72 bool parse_success, const base::DictionaryValue& metadata_dictionary, | 79 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 80 DCHECK_EQ(parser_state_, STARTED_PARSING_STATE); |
| 81 DCHECK(!callback_.is_null()); |
| 82 |
| 83 interface_.reset(); |
| 84 |
| 85 BrowserThread::PostTask( |
| 86 BrowserThread::UI, FROM_HERE, |
| 87 base::Bind(callback_, false, |
| 88 base::Passed(std::unique_ptr<base::DictionaryValue>()), |
| 89 base::Passed(std::unique_ptr<std::vector<AttachedImage>>()))); |
| 90 |
| 91 parser_state_ = FINISHED_PARSING_STATE; |
| 92 } |
| 93 |
| 94 void SafeMediaMetadataParser::ParseMediaMetadataDone( |
| 95 bool parse_success, |
| 96 std::unique_ptr<base::DictionaryValue> metadata_dictionary, |
| 73 const std::vector<AttachedImage>& attached_images) { | 97 const std::vector<AttachedImage>& attached_images) { |
| 74 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 98 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 99 DCHECK_EQ(parser_state_, STARTED_PARSING_STATE); |
| 75 DCHECK(!callback_.is_null()); | 100 DCHECK(!callback_.is_null()); |
| 76 | 101 |
| 77 if (parser_state_ != STARTED_PARSING_STATE) | 102 interface_.reset(); |
| 78 return; | |
| 79 | 103 |
| 80 // We need to make a scoped copy of this vector since it will be destroyed | 104 // We need to make a scoped copy of this vector since it will be destroyed |
| 81 // at the end of the IPC message handler. | 105 // at the end of the handler. |
| 82 std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images_copy = | 106 std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images_copy = |
| 83 base::MakeUnique<std::vector<metadata::AttachedImage>>(attached_images); | 107 base::MakeUnique<std::vector<metadata::AttachedImage>>(attached_images); |
| 84 | 108 |
| 85 BrowserThread::PostTask( | 109 BrowserThread::PostTask( |
| 86 BrowserThread::UI, FROM_HERE, | 110 BrowserThread::UI, FROM_HERE, |
| 87 base::Bind(callback_, parse_success, | 111 base::Bind(callback_, parse_success, base::Passed(&metadata_dictionary), |
| 88 base::Passed(base::WrapUnique(metadata_dictionary.DeepCopy())), | |
| 89 base::Passed(&attached_images_copy))); | 112 base::Passed(&attached_images_copy))); |
| 113 |
| 90 parser_state_ = FINISHED_PARSING_STATE; | 114 parser_state_ = FINISHED_PARSING_STATE; |
| 91 } | 115 } |
| 92 | 116 |
| 93 void SafeMediaMetadataParser::OnUtilityProcessRequestBlobBytes( | 117 void SafeMediaMetadataParser::OnUtilityProcessRequestBlobBytes( |
| 94 int64_t request_id, | 118 int64_t request_id, |
| 95 int64_t byte_start, | 119 int64_t byte_start, |
| 96 int64_t length) { | 120 int64_t length) { |
| 97 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 121 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 98 BrowserThread::PostTask( | 122 BrowserThread::PostTask( |
| 99 BrowserThread::UI, | 123 BrowserThread::UI, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 128 void SafeMediaMetadataParser::FinishRequestBlobBytes( | 152 void SafeMediaMetadataParser::FinishRequestBlobBytes( |
| 129 int64_t request_id, | 153 int64_t request_id, |
| 130 std::unique_ptr<std::string> data) { | 154 std::unique_ptr<std::string> data) { |
| 131 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 155 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 132 if (!utility_process_host_.get()) | 156 if (!utility_process_host_.get()) |
| 133 return; | 157 return; |
| 134 utility_process_host_->Send(new ChromeUtilityMsg_RequestBlobBytes_Finished( | 158 utility_process_host_->Send(new ChromeUtilityMsg_RequestBlobBytes_Finished( |
| 135 request_id, *data)); | 159 request_id, *data)); |
| 136 } | 160 } |
| 137 | 161 |
| 138 void SafeMediaMetadataParser::OnProcessCrashed(int exit_code) { | |
| 139 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 140 DCHECK(!callback_.is_null()); | |
| 141 | |
| 142 BrowserThread::PostTask( | |
| 143 BrowserThread::UI, FROM_HERE, | |
| 144 base::Bind(callback_, false, | |
| 145 base::Passed(std::unique_ptr<base::DictionaryValue>()), | |
| 146 base::Passed(std::unique_ptr<std::vector<AttachedImage>>()))); | |
| 147 parser_state_ = FINISHED_PARSING_STATE; | |
| 148 } | |
| 149 | |
| 150 bool SafeMediaMetadataParser::OnMessageReceived(const IPC::Message& message) { | 162 bool SafeMediaMetadataParser::OnMessageReceived(const IPC::Message& message) { |
| 151 bool handled = true; | 163 bool handled = true; |
| 152 IPC_BEGIN_MESSAGE_MAP(SafeMediaMetadataParser, message) | 164 IPC_BEGIN_MESSAGE_MAP(SafeMediaMetadataParser, message) |
| 153 IPC_MESSAGE_HANDLER( | 165 IPC_MESSAGE_HANDLER( |
| 154 ChromeUtilityHostMsg_ParseMediaMetadata_Finished, | |
| 155 OnParseMediaMetadataFinished) | |
| 156 IPC_MESSAGE_HANDLER( | |
| 157 ChromeUtilityHostMsg_RequestBlobBytes, | 166 ChromeUtilityHostMsg_RequestBlobBytes, |
| 158 OnUtilityProcessRequestBlobBytes) | 167 OnUtilityProcessRequestBlobBytes) |
| 159 IPC_MESSAGE_UNHANDLED(handled = false) | 168 IPC_MESSAGE_UNHANDLED(handled = false) |
| 160 IPC_END_MESSAGE_MAP() | 169 IPC_END_MESSAGE_MAP() |
| 161 return handled; | 170 return handled; |
| 162 } | 171 } |
| 163 | 172 |
| 164 } // namespace metadata | 173 } // namespace metadata |
| OLD | NEW |