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..c33d4196668438aa6126a5b08eee2e87896f9ba7 100644 |
| --- a/cc/ipc/copy_output_request_struct_traits.cc |
| +++ b/cc/ipc/copy_output_request_struct_traits.cc |
| @@ -4,9 +4,50 @@ |
| #include "cc/ipc/copy_output_request_struct_traits.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) {} |
| + |
| + // mojom::TextureMailboxReleaser implementation: |
| + void SendResult(std::unique_ptr<cc::CopyOutputResult> result) override { |
| + result_callback_.Run(std::move(result)); |
|
danakj
2017/02/15 17:19:57
Can you also make sure this is called only once an
Saman Sami
2017/02/15 17:36:50
Will do. It's hard to test though because I have n
danakj
2017/02/15 17:41:59
Can you instantiate the CopyOutputResultSenderPtr
Saman Sami
2017/02/15 17:51:42
Yeah I think you're actually right.
|
| + } |
| + |
| + 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; |
| + 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 +65,11 @@ bool StructTraits<cc::mojom::CopyOutputRequestDataView, |
| if (!data.ReadTextureMailbox(&request->texture_mailbox_)) |
| return false; |
| + auto result_sender = |
| + data.TakeResultSender<cc::mojom::CopyOutputResultSenderPtr>(); |
| + request->result_callback_ = |
| + base::Bind(SendResult, base::Passed(&result_sender)); |
| + |
| *out_p = std::move(request); |
| return true; |