Commit 7064311c authored by Jay Civelli's avatar Jay Civelli Committed by Commit Bot

Simplify SafeMediaMetadataParser

Now that it uses a Mojo service, SafeMediaMetadataParser can be
simplified as it does not require thread hops. Which also means it does
not need to be ref counted anymore.
Also changed Bind calls to BindOnce where appropriate.

Bug: 822922
Change-Id: Id684d9e7bb52f11f19d992f0d5dcb80c8d7e4770
Reviewed-on: https://chromium-review.googlesource.com/967364
Commit-Queue: Jay Civelli <jcivelli@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543948}
parent 5e350ca0
...@@ -674,17 +674,19 @@ void MediaGalleriesGetMetadataFunction::GetMetadata( ...@@ -674,17 +674,19 @@ void MediaGalleriesGetMetadataFunction::GetMetadata(
metadata_type == MediaGalleries::GET_METADATA_TYPE_ALL || metadata_type == MediaGalleries::GET_METADATA_TYPE_ALL ||
metadata_type == MediaGalleries::GET_METADATA_TYPE_NONE; metadata_type == MediaGalleries::GET_METADATA_TYPE_NONE;
auto parser = base::MakeRefCounted<SafeMediaMetadataParser>( auto parser = std::make_unique<SafeMediaMetadataParser>(
GetProfile(), blob_uuid, total_blob_length, mime_type, GetProfile(), blob_uuid, total_blob_length, mime_type,
get_attached_images); get_attached_images);
parser->Start( SafeMediaMetadataParser* parser_ptr = parser.get();
parser_ptr->Start(
content::ServiceManagerConnection::GetForProcess()->GetConnector(), content::ServiceManagerConnection::GetForProcess()->GetConnector(),
base::Bind( base::BindOnce(
&MediaGalleriesGetMetadataFunction::OnSafeMediaMetadataParserDone, &MediaGalleriesGetMetadataFunction::OnSafeMediaMetadataParserDone,
this)); this, std::move(parser)));
} }
void MediaGalleriesGetMetadataFunction::OnSafeMediaMetadataParserDone( void MediaGalleriesGetMetadataFunction::OnSafeMediaMetadataParserDone(
std::unique_ptr<SafeMediaMetadataParser> parser_keep_alive,
bool parse_success, bool parse_success,
std::unique_ptr<base::DictionaryValue> metadata_dictionary, std::unique_ptr<base::DictionaryValue> metadata_dictionary,
std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images) { std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images) {
......
...@@ -33,6 +33,8 @@ namespace content { ...@@ -33,6 +33,8 @@ namespace content {
class BlobHandle; class BlobHandle;
} }
class SafeMediaMetadataParser;
namespace extensions { namespace extensions {
// The profile-keyed service that manages the media galleries extension API. // The profile-keyed service that manages the media galleries extension API.
...@@ -177,6 +179,7 @@ class MediaGalleriesGetMetadataFunction : public ChromeAsyncExtensionFunction { ...@@ -177,6 +179,7 @@ class MediaGalleriesGetMetadataFunction : public ChromeAsyncExtensionFunction {
int64_t total_blob_length); int64_t total_blob_length);
void OnSafeMediaMetadataParserDone( void OnSafeMediaMetadataParserDone(
std::unique_ptr<SafeMediaMetadataParser> parser_keep_alive,
bool parse_success, bool parse_success,
std::unique_ptr<base::DictionaryValue> result_dictionary, std::unique_ptr<base::DictionaryValue> result_dictionary,
std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images); std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images);
......
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
#include <utility> #include <utility>
#include "base/callback.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "chrome/services/media_gallery_util/public/mojom/constants.mojom.h" #include "chrome/services/media_gallery_util/public/mojom/constants.mojom.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/blob_reader.h" #include "extensions/browser/blob_reader.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/connector.h"
...@@ -20,9 +20,7 @@ class SafeMediaMetadataParser::MediaDataSourceImpl ...@@ -20,9 +20,7 @@ class SafeMediaMetadataParser::MediaDataSourceImpl
MediaDataSourceImpl(SafeMediaMetadataParser* owner, MediaDataSourceImpl(SafeMediaMetadataParser* owner,
chrome::mojom::MediaDataSourcePtr* interface) chrome::mojom::MediaDataSourcePtr* interface)
: binding_(this, mojo::MakeRequest(interface)), : binding_(this, mojo::MakeRequest(interface)),
safe_media_metadata_parser_(owner) { safe_media_metadata_parser_(owner) {}
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
}
~MediaDataSourceImpl() override = default; ~MediaDataSourceImpl() override = default;
...@@ -51,125 +49,76 @@ SafeMediaMetadataParser::SafeMediaMetadataParser( ...@@ -51,125 +49,76 @@ SafeMediaMetadataParser::SafeMediaMetadataParser(
blob_uuid_(blob_uuid), blob_uuid_(blob_uuid),
blob_size_(blob_size), blob_size_(blob_size),
mime_type_(mime_type), mime_type_(mime_type),
get_attached_images_(get_attached_images) { get_attached_images_(get_attached_images),
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); weak_factory_(this) {}
}
void SafeMediaMetadataParser::Start(service_manager::Connector* connector,
const DoneCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
std::unique_ptr<service_manager::Connector> connector_ptr =
connector->Clone();
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::BindOnce(&SafeMediaMetadataParser::StartOnIOThread, this,
std::move(connector_ptr), callback));
}
SafeMediaMetadataParser::~SafeMediaMetadataParser() = default; SafeMediaMetadataParser::~SafeMediaMetadataParser() = default;
void SafeMediaMetadataParser::StartOnIOThread( void SafeMediaMetadataParser::Start(service_manager::Connector* connector,
std::unique_ptr<service_manager::Connector> connector, DoneCallback callback) {
const DoneCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
DCHECK(!media_parser_ptr_); DCHECK(!media_parser_ptr_);
DCHECK(callback); DCHECK(callback);
callback_ = callback; callback_ = std::move(callback);
connector->BindInterface(chrome::mojom::kMediaGalleryUtilServiceName, connector->BindInterface(chrome::mojom::kMediaGalleryUtilServiceName,
mojo::MakeRequest(&media_parser_ptr_)); mojo::MakeRequest(&media_parser_ptr_));
// It's safe to use Unretained below as |this| owns |media_parser_ptr_|.
media_parser_ptr_.set_connection_error_handler( media_parser_ptr_.set_connection_error_handler(
base::Bind(&SafeMediaMetadataParser::ParseMediaMetadataFailed, this)); base::BindOnce(&SafeMediaMetadataParser::ParseMediaMetadataFailed,
base::Unretained(this)));
chrome::mojom::MediaDataSourcePtr source; chrome::mojom::MediaDataSourcePtr source;
media_data_source_ = std::make_unique<MediaDataSourceImpl>(this, &source); media_data_source_ = std::make_unique<MediaDataSourceImpl>(this, &source);
media_parser_ptr_->ParseMediaMetadata( media_parser_ptr_->ParseMediaMetadata(
mime_type_, blob_size_, get_attached_images_, std::move(source), mime_type_, blob_size_, get_attached_images_, std::move(source),
base::Bind(&SafeMediaMetadataParser::ParseMediaMetadataDone, this)); base::BindOnce(&SafeMediaMetadataParser::ParseMediaMetadataDone,
base::Unretained(this)));
} }
void SafeMediaMetadataParser::ParseMediaMetadataFailed() { void SafeMediaMetadataParser::ParseMediaMetadataFailed() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
media_parser_ptr_.reset(); // Terminate the utility process. media_parser_ptr_.reset(); // Terminate the utility process.
media_data_source_.reset(); media_data_source_.reset();
std::unique_ptr<base::DictionaryValue> metadata_dictionary = auto metadata_dictionary = std::make_unique<base::DictionaryValue>();
std::make_unique<base::DictionaryValue>(); auto attached_images =
std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images =
std::make_unique<std::vector<metadata::AttachedImage>>(); std::make_unique<std::vector<metadata::AttachedImage>>();
content::BrowserThread::PostTask( std::move(callback_).Run(/*parse_success=*/false,
content::BrowserThread::UI, FROM_HERE, std::move(metadata_dictionary),
base::BindOnce(callback_, false, std::move(metadata_dictionary), std::move(attached_images));
std::move(attached_images)));
} }
void SafeMediaMetadataParser::ParseMediaMetadataDone( void SafeMediaMetadataParser::ParseMediaMetadataDone(
bool parse_success, bool parse_success,
std::unique_ptr<base::DictionaryValue> metadata_dictionary, std::unique_ptr<base::DictionaryValue> metadata_dictionary,
const std::vector<metadata::AttachedImage>& attached_images) { const std::vector<metadata::AttachedImage>& attached_images) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
media_parser_ptr_.reset(); // Terminate the utility process. media_parser_ptr_.reset(); // Terminate the utility process.
media_data_source_.reset(); media_data_source_.reset();
// We need to make a scoped copy of this vector since it will be destroyed auto attached_images_copy =
// at the end of the handler.
std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images_copy =
std::make_unique<std::vector<metadata::AttachedImage>>(attached_images); std::make_unique<std::vector<metadata::AttachedImage>>(attached_images);
content::BrowserThread::PostTask( std::move(callback_).Run(parse_success, std::move(metadata_dictionary),
content::BrowserThread::UI, FROM_HERE, std::move(attached_images_copy));
base::BindOnce(callback_, parse_success, std::move(metadata_dictionary),
std::move(attached_images_copy)));
} }
void SafeMediaMetadataParser::StartBlobRequest( void SafeMediaMetadataParser::StartBlobRequest(
chrome::mojom::MediaDataSource::ReadBlobCallback callback, chrome::mojom::MediaDataSource::ReadBlobCallback callback,
int64_t position, int64_t position,
int64_t length) { int64_t length) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::BindOnce(&SafeMediaMetadataParser::StartBlobReaderOnUIThread, this,
std::move(callback), position, length));
}
void SafeMediaMetadataParser::StartBlobReaderOnUIThread(
chrome::mojom::MediaDataSource::ReadBlobCallback callback,
int64_t position,
int64_t length) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
BlobReader* reader = new BlobReader( // BlobReader is self-deleting. BlobReader* reader = new BlobReader( // BlobReader is self-deleting.
browser_context_, blob_uuid_, browser_context_, blob_uuid_,
base::Bind(&SafeMediaMetadataParser::BlobReaderDoneOnUIThread, this, base::Bind(&SafeMediaMetadataParser::BlobReaderDone,
base::Passed(&callback))); weak_factory_.GetWeakPtr(), base::Passed(&callback)));
reader->SetByteRange(position, length); reader->SetByteRange(position, length);
reader->Start(); reader->Start();
} }
void SafeMediaMetadataParser::BlobReaderDoneOnUIThread( void SafeMediaMetadataParser::BlobReaderDone(
chrome::mojom::MediaDataSource::ReadBlobCallback callback, chrome::mojom::MediaDataSource::ReadBlobCallback callback,
std::unique_ptr<std::string> data, std::unique_ptr<std::string> data,
int64_t /* blob_total_size */) { int64_t /* blob_total_size */) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::BindOnce(&SafeMediaMetadataParser::FinishBlobRequest, this,
std::move(callback), std::move(data)));
}
void SafeMediaMetadataParser::FinishBlobRequest(
chrome::mojom::MediaDataSource::ReadBlobCallback callback,
std::unique_ptr<std::string> data) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
if (media_parser_ptr_) if (media_parser_ptr_)
std::move(callback).Run(std::vector<uint8_t>(data->begin(), data->end())); std::move(callback).Run(std::vector<uint8_t>(data->begin(), data->end()));
} }
...@@ -11,10 +11,9 @@ ...@@ -11,10 +11,9 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/callback.h" #include "base/callback_forward.h"
#include "base/compiler_specific.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h"
#include "chrome/common/media_galleries/metadata_types.h" #include "chrome/common/media_galleries/metadata_types.h"
#include "chrome/services/media_gallery_util/public/mojom/media_parser.mojom.h" #include "chrome/services/media_gallery_util/public/mojom/media_parser.mojom.h"
...@@ -29,11 +28,10 @@ class Connector; ...@@ -29,11 +28,10 @@ class Connector;
// Parses the media metadata of a Blob safely in a utility process. This class // Parses the media metadata of a Blob safely in a utility process. This class
// expects the MIME type of the Blob to be already known. It creates a utility // expects the MIME type of the Blob to be already known. It creates a utility
// process to do further MIME-type-specific metadata extraction from the Blob // process to do further MIME-type-specific metadata extraction from the Blob
// data. All public methods and callbacks of this class run on the UI thread. // data.
class SafeMediaMetadataParser class SafeMediaMetadataParser {
: public base::RefCountedThreadSafe<SafeMediaMetadataParser> {
public: public:
typedef base::Callback<void( typedef base::OnceCallback<void(
bool parse_success, bool parse_success,
std::unique_ptr<base::DictionaryValue> metadata_dictionary, std::unique_ptr<base::DictionaryValue> metadata_dictionary,
std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images)> std::unique_ptr<std::vector<metadata::AttachedImage>> attached_images)>
...@@ -44,53 +42,36 @@ class SafeMediaMetadataParser ...@@ -44,53 +42,36 @@ class SafeMediaMetadataParser
int64_t blob_size, int64_t blob_size,
const std::string& mime_type, const std::string& mime_type,
bool get_attached_images); bool get_attached_images);
~SafeMediaMetadataParser();
// Should be called on the UI thread. |callback| also runs on the UI thread. // Should be called on the thread |connector| is associated with. |callback|
void Start(service_manager::Connector* connector, // is invoked on that same thread.
const DoneCallback& callback); void Start(service_manager::Connector* connector, DoneCallback callback);
private: private:
friend class base::RefCountedThreadSafe<SafeMediaMetadataParser>;
class MediaDataSourceImpl; class MediaDataSourceImpl;
~SafeMediaMetadataParser();
// Starts the utility process and sends it a metadata parse request.
// Runs on the IO thread.
void StartOnIOThread(std::unique_ptr<service_manager::Connector> connector,
const DoneCallback& callback);
// Callback if the utility process or metadata parse request fails. // Callback if the utility process or metadata parse request fails.
// Runs on the IO thread.
void ParseMediaMetadataFailed(); void ParseMediaMetadataFailed();
// Callback from utility process when it finishes parsing metadata. // Callback from utility process when it finishes parsing metadata.
// Runs on the IO thread.
void ParseMediaMetadataDone( void ParseMediaMetadataDone(
bool parse_success, bool parse_success,
std::unique_ptr<base::DictionaryValue> metadata_dictionary, std::unique_ptr<base::DictionaryValue> metadata_dictionary,
const std::vector<metadata::AttachedImage>& attached_images); const std::vector<metadata::AttachedImage>& attached_images);
// Sequence of functions that bounces from the IO thread to the UI thread to // Starts to read the blob data and sends the data back to the utility
// read the blob data, then sends the data back to the utility process. // process.
void StartBlobRequest( void StartBlobRequest(
chrome::mojom::MediaDataSource::ReadBlobCallback callback, chrome::mojom::MediaDataSource::ReadBlobCallback callback,
int64_t position, int64_t position,
int64_t length); int64_t length);
void StartBlobReaderOnUIThread(
chrome::mojom::MediaDataSource::ReadBlobCallback callback,
int64_t position,
int64_t length);
void BlobReaderDoneOnUIThread(
chrome::mojom::MediaDataSource::ReadBlobCallback callback,
std::unique_ptr<std::string> data,
int64_t /* blob_total_size */);
void FinishBlobRequest(
chrome::mojom::MediaDataSource::ReadBlobCallback callback,
std::unique_ptr<std::string> data);
// All member variables are only accessed on the IO thread. // Invoked when the full blob content has been read.
void BlobReaderDone(chrome::mojom::MediaDataSource::ReadBlobCallback callback,
std::unique_ptr<std::string> data,
int64_t /* blob_total_size */);
content::BrowserContext* const browser_context_; content::BrowserContext* const browser_context_;
const std::string blob_uuid_; const std::string blob_uuid_;
const int64_t blob_size_; const int64_t blob_size_;
...@@ -102,6 +83,8 @@ class SafeMediaMetadataParser ...@@ -102,6 +83,8 @@ class SafeMediaMetadataParser
std::unique_ptr<MediaDataSourceImpl> media_data_source_; std::unique_ptr<MediaDataSourceImpl> media_data_source_;
base::WeakPtrFactory<SafeMediaMetadataParser> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SafeMediaMetadataParser); DISALLOW_COPY_AND_ASSIGN(SafeMediaMetadataParser);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment