Chromium Code Reviews| Index: cc/ipc/copy_output_request_struct_traits.cc |
| diff --git a/cc/ipc/copy_output_request_struct_traits.cc b/cc/ipc/copy_output_request_struct_traits.cc |
| index 3985ba41eb744a7c114458b4bc94e1c8b26ce9b8..59890a99a51fe44ca1b8dec5ab77f7143f353b87 100644 |
| --- a/cc/ipc/copy_output_request_struct_traits.cc |
| +++ b/cc/ipc/copy_output_request_struct_traits.cc |
| @@ -4,9 +4,62 @@ |
| #include "cc/ipc/copy_output_request_struct_traits.h" |
| +#include "base/callback_helpers.h" |
| +#include "mojo/public/cpp/bindings/strong_binding.h" |
| + |
| +namespace { |
| + |
| +// When we're sending a CopyOutputRequest, we keep the result_callback_ in a |
| +// CopyOutputResultSenderImpl and send a CopyOutputResultSenderPtr to the other |
| +// process. When SendResult is called, we run the stored result_callback_. |
| +class CopyOutputResultSenderImpl : public cc::mojom::CopyOutputResultSender { |
| + public: |
| + CopyOutputResultSenderImpl( |
| + cc::CopyOutputRequest::CopyOutputRequestCallback result_callback) |
| + : result_callback_(result_callback) { |
| + DCHECK(result_callback_); |
| + } |
| + |
| + ~CopyOutputResultSenderImpl() override { |
| + if (result_callback_) |
| + result_callback_.Run(cc::CopyOutputResult::CreateEmptyResult()); |
| + } |
| + |
| + // mojom::TextureMailboxReleaser implementation: |
| + void SendResult(std::unique_ptr<cc::CopyOutputResult> result) override { |
| + if (!result_callback_) |
| + return; |
| + base::ResetAndReturn(&result_callback_).Run(std::move(result)); |
| + } |
| + |
| + private: |
| + cc::CopyOutputRequest::CopyOutputRequestCallback result_callback_; |
| +}; |
| + |
| +void SendResult(cc::mojom::CopyOutputResultSenderPtr ptr, |
| + std::unique_ptr<cc::CopyOutputResult> result) { |
| + ptr->SendResult(std::move(result)); |
| +} |
| + |
| +} // namespace |
| + |
| namespace mojo { |
| // static |
| +cc::mojom::CopyOutputResultSenderPtr |
| +StructTraits<cc::mojom::CopyOutputRequestDataView, |
| + std::unique_ptr<cc::CopyOutputRequest>>:: |
| + result_sender(const std::unique_ptr<cc::CopyOutputRequest>& request) { |
| + cc::mojom::CopyOutputResultSenderPtr result_sender; |
| + if (request->result_callback_) { |
|
danakj
2017/02/15 19:48:19
This one shouldn't be needed. As you said cc::Copy
danakj
2017/02/15 19:50:26
Oh. Uh, I guess there is CreateEmptyRequest() whic
Saman Sami
2017/02/15 22:34:21
Right. We won't support empty requests.
|
| + auto impl = base::MakeUnique<CopyOutputResultSenderImpl>( |
| + std::move(request->result_callback_)); |
| + MakeStrongBinding(std::move(impl), MakeRequest(&result_sender)); |
| + } |
| + return result_sender; |
| +} |
| + |
| +// static |
| bool StructTraits<cc::mojom::CopyOutputRequestDataView, |
| std::unique_ptr<cc::CopyOutputRequest>>:: |
| Read(cc::mojom::CopyOutputRequestDataView data, |
| @@ -24,6 +77,13 @@ bool StructTraits<cc::mojom::CopyOutputRequestDataView, |
| if (!data.ReadTextureMailbox(&request->texture_mailbox_)) |
| return false; |
| + auto result_sender = |
| + data.TakeResultSender<cc::mojom::CopyOutputResultSenderPtr>(); |
| + if (result_sender) { |
| + request->result_callback_ = |
| + base::Bind(SendResult, base::Passed(&result_sender)); |
| + } |
| + |
| *out_p = std::move(request); |
| return true; |