| Index: chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc
|
| diff --git a/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc b/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc
|
| index 81ea2910fd4cad04b75a37f7c94864699a6d2c1e..8ba34bc502507075cd32439273153e032d619063 100644
|
| --- a/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc
|
| +++ b/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc
|
| @@ -12,31 +12,34 @@
|
|
|
| namespace media_router {
|
|
|
| -SafeDialDeviceDescriptionParser::SafeDialDeviceDescriptionParser() {}
|
| +SafeDialDeviceDescriptionParser::SafeDialDeviceDescriptionParser()
|
| + : pending_parsing_requests_(0) {}
|
|
|
| SafeDialDeviceDescriptionParser::~SafeDialDeviceDescriptionParser() {}
|
|
|
| void SafeDialDeviceDescriptionParser::Start(
|
| const std::string& xml_text,
|
| const DeviceDescriptionCallback& callback) {
|
| + DVLOG(2) << "Start parsing device description...";
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!utility_process_mojo_client_);
|
| - DCHECK(callback);
|
|
|
| - device_description_callback_ = callback;
|
| + DCHECK(callback);
|
|
|
| - utility_process_mojo_client_ =
|
| - base::MakeUnique<content::UtilityProcessMojoClient<
|
| - chrome::mojom::DialDeviceDescriptionParser>>(
|
| - l10n_util::GetStringUTF16(
|
| - IDS_UTILITY_PROCESS_DIAL_DEVICE_DESCRIPTION_PARSER_NAME));
|
| + if (!utility_process_mojo_client_) {
|
| + DVLOG(2) << "Start utility process in background...";
|
| + utility_process_mojo_client_ =
|
| + base::MakeUnique<content::UtilityProcessMojoClient<
|
| + chrome::mojom::DialDeviceDescriptionParser>>(
|
| + l10n_util::GetStringUTF16(
|
| + IDS_UTILITY_PROCESS_DIAL_DEVICE_DESCRIPTION_PARSER_NAME));
|
|
|
| - utility_process_mojo_client_->set_error_callback(base::Bind(
|
| - &SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed,
|
| - base::Unretained(this)));
|
| + utility_process_mojo_client_->set_error_callback(base::Bind(
|
| + &SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed, this,
|
| + callback));
|
|
|
| - // This starts utility process in the background.
|
| - utility_process_mojo_client_->Start();
|
| + // This starts utility process in the background.
|
| + utility_process_mojo_client_->Start();
|
| + }
|
|
|
| // This call is queued up until the Mojo message pipe has been established to
|
| // the service running in the utility process.
|
| @@ -44,26 +47,34 @@ void SafeDialDeviceDescriptionParser::Start(
|
| xml_text,
|
| base::Bind(
|
| &SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionComplete,
|
| - base::Unretained(this)));
|
| + this, callback));
|
| +
|
| + ++pending_parsing_requests_;
|
| }
|
|
|
| void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionComplete(
|
| + const DeviceDescriptionCallback& callback,
|
| chrome::mojom::DialDeviceDescriptionPtr device_description) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(callback);
|
|
|
| - utility_process_mojo_client_.reset(); // Terminate the utility process.
|
| + --pending_parsing_requests_;
|
| + callback.Run(std::move(device_description));
|
|
|
| - DCHECK(device_description_callback_);
|
| - device_description_callback_.Run(std::move(device_description));
|
| + if (!pending_parsing_requests_)
|
| + utility_process_mojo_client_.reset(); // Terminate the utility process.
|
| }
|
|
|
| -void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed() {
|
| +void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed(
|
| + const DeviceDescriptionCallback& callback) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(callback);
|
|
|
| - utility_process_mojo_client_.reset(); // Terminate the utility process.
|
| + --pending_parsing_requests_;
|
| + callback.Run(nullptr);
|
|
|
| - DCHECK(device_description_callback_);
|
| - device_description_callback_.Run(nullptr);
|
| + if (!pending_parsing_requests_)
|
| + utility_process_mojo_client_.reset(); // Terminate the utility process.
|
| }
|
|
|
| } // namespace media_router
|
|
|