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; |