blob: 71bff599865055d7bd6e897d5a7e75ce70a1ab5c [file] [log] [blame]
[email protected]077ecfd42012-06-21 21:46:261// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/resource_message_test_sink.h"
6
avie029c4132015-12-23 06:45:227#include <stddef.h>
8
tzika0f614d2016-03-08 00:35:159#include <tuple>
10
[email protected]077ecfd42012-06-21 21:46:2611#include "ppapi/proxy/ppapi_messages.h"
12#include "ppapi/proxy/resource_message_params.h"
[email protected]bb92b012013-03-29 02:13:2013#include "ppapi/proxy/serialized_handle.h"
[email protected]077ecfd42012-06-21 21:46:2614
15namespace ppapi {
16namespace proxy {
17
18namespace {
19
[email protected]6a366112014-01-09 15:59:2620// Backend for GetAllResource[Calls|Replies]Matching.
avie029c4132015-12-23 06:45:2221template <class WrapperMessage, class Params>
22std::vector<std::pair<Params, IPC::Message>> GetAllResourceMessagesMatching(
23 const ResourceMessageTestSink& sink,
24 uint32_t id) {
[email protected]6a366112014-01-09 15:59:2625 std::vector<std::pair<Params, IPC::Message> > result;
26 for (size_t i = 0; i < sink.message_count(); i++) {
[email protected]077ecfd42012-06-21 21:46:2627 const IPC::Message* msg = sink.GetMessageAt(i);
28 if (msg->type() == WrapperMessage::ID) {
[email protected]5636d902014-05-13 23:19:1029 typename WrapperMessage::Param params;
30 WrapperMessage::Read(msg, &params);
tzika0f614d2016-03-08 00:35:1531 Params cur_params = std::get<0>(params);
32 IPC::Message cur_msg = std::get<1>(params);
[email protected]077ecfd42012-06-21 21:46:2633 if (cur_msg.type() == id) {
[email protected]6a366112014-01-09 15:59:2634 result.push_back(std::make_pair(cur_params, cur_msg));
[email protected]077ecfd42012-06-21 21:46:2635 }
36 }
37 }
[email protected]6a366112014-01-09 15:59:2638 return result;
[email protected]077ecfd42012-06-21 21:46:2639}
40
41} // namespace
42
[email protected]6a366112014-01-09 15:59:2643ResourceMessageTestSink::ResourceMessageTestSink() {
[email protected]077ecfd42012-06-21 21:46:2644}
45
46ResourceMessageTestSink::~ResourceMessageTestSink() {
47}
48
[email protected]11d0c362012-10-11 02:02:1149bool ResourceMessageTestSink::Send(IPC::Message* msg) {
50 int message_id = 0;
dchengced92242016-04-07 00:00:1251 std::unique_ptr<IPC::MessageReplyDeserializer> reply_deserializer;
[email protected]11d0c362012-10-11 02:02:1152 if (msg->is_sync()) {
53 reply_deserializer.reset(
54 static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer());
55 message_id = IPC::SyncMessage::GetMessageId(*msg);
56 }
57 bool result = IPC::TestSink::Send(msg); // Deletes |msg|.
58 if (sync_reply_msg_.get()) {
59 // |sync_reply_msg_| should always be a reply to the pending sync message.
60 DCHECK(IPC::SyncMessage::IsMessageReplyTo(*sync_reply_msg_.get(),
61 message_id));
62 reply_deserializer->SerializeOutputParameters(*sync_reply_msg_.get());
63 sync_reply_msg_.reset(NULL);
64 }
65 return result;
66}
67
68void ResourceMessageTestSink::SetSyncReplyMessage(IPC::Message* reply_msg) {
69 DCHECK(!sync_reply_msg_.get());
70 sync_reply_msg_.reset(reply_msg);
71}
72
[email protected]077ecfd42012-06-21 21:46:2673bool ResourceMessageTestSink::GetFirstResourceCallMatching(
avie029c4132015-12-23 06:45:2274 uint32_t id,
[email protected]077ecfd42012-06-21 21:46:2675 ResourceMessageCallParams* params,
76 IPC::Message* nested_msg) const {
[email protected]6a366112014-01-09 15:59:2677 ResourceCallVector matching_messages =
78 GetAllResourceMessagesMatching<PpapiHostMsg_ResourceCall,
79 ResourceMessageCallParams>(*this, id);
80 if (matching_messages.empty())
81 return false;
82
83 *params = matching_messages[0].first;
84 *nested_msg = matching_messages[0].second;
85 return true;
[email protected]077ecfd42012-06-21 21:46:2686}
87
88bool ResourceMessageTestSink::GetFirstResourceReplyMatching(
avie029c4132015-12-23 06:45:2289 uint32_t id,
[email protected]077ecfd42012-06-21 21:46:2690 ResourceMessageReplyParams* params,
91 IPC::Message* nested_msg) {
[email protected]6a366112014-01-09 15:59:2692 ResourceReplyVector matching_messages =
93 GetAllResourceMessagesMatching<PpapiPluginMsg_ResourceReply,
94 ResourceMessageReplyParams>(*this, id);
95 if (matching_messages.empty())
96 return false;
97
98 *params = matching_messages[0].first;
99 *nested_msg = matching_messages[0].second;
100 return true;
[email protected]3bc2e3752014-01-03 15:49:37101}
102
[email protected]6a366112014-01-09 15:59:26103ResourceMessageTestSink::ResourceCallVector
avie029c4132015-12-23 06:45:22104ResourceMessageTestSink::GetAllResourceCallsMatching(uint32_t id) {
[email protected]6a366112014-01-09 15:59:26105 return GetAllResourceMessagesMatching<PpapiHostMsg_ResourceCall,
106 ResourceMessageCallParams>(*this, id);
[email protected]3bc2e3752014-01-03 15:49:37107}
108
[email protected]6a366112014-01-09 15:59:26109ResourceMessageTestSink::ResourceReplyVector
avie029c4132015-12-23 06:45:22110ResourceMessageTestSink::GetAllResourceRepliesMatching(uint32_t id) {
[email protected]6a366112014-01-09 15:59:26111 return GetAllResourceMessagesMatching<PpapiPluginMsg_ResourceReply,
112 ResourceMessageReplyParams>(*this, id);
[email protected]077ecfd42012-06-21 21:46:26113}
114
[email protected]11d0c362012-10-11 02:02:11115ResourceSyncCallHandler::ResourceSyncCallHandler(
116 ResourceMessageTestSink* test_sink,
avie029c4132015-12-23 06:45:22117 uint32_t incoming_type,
[email protected]11d0c362012-10-11 02:02:11118 int32_t result,
119 const IPC::Message& reply_msg)
120 : test_sink_(test_sink),
121 incoming_type_(incoming_type),
122 result_(result),
[email protected]bb92b012013-03-29 02:13:20123 serialized_handle_(NULL),
avie029c4132015-12-23 06:45:22124 reply_msg_(reply_msg) {}
[email protected]11d0c362012-10-11 02:02:11125
126ResourceSyncCallHandler::~ResourceSyncCallHandler() {
127}
128
129bool ResourceSyncCallHandler::OnMessageReceived(const IPC::Message& msg) {
130 if (msg.type() != PpapiHostMsg_ResourceSyncCall::ID)
131 return false;
132 PpapiHostMsg_ResourceSyncCall::Schema::SendParam send_params;
133 bool success = PpapiHostMsg_ResourceSyncCall::ReadSendParam(
134 &msg, &send_params);
135 DCHECK(success);
tzika0f614d2016-03-08 00:35:15136 ResourceMessageCallParams call_params = std::get<0>(send_params);
137 IPC::Message call_msg = std::get<1>(send_params);
[email protected]11d0c362012-10-11 02:02:11138 if (call_msg.type() != incoming_type_)
139 return false;
140 IPC::Message* wrapper_reply_msg = IPC::SyncMessage::GenerateReply(&msg);
141 ResourceMessageReplyParams reply_params(call_params.pp_resource(),
142 call_params.sequence());
143 reply_params.set_result(result_);
[email protected]bb92b012013-03-29 02:13:20144 if (serialized_handle_)
145 reply_params.AppendHandle(*serialized_handle_);
[email protected]11d0c362012-10-11 02:02:11146 PpapiHostMsg_ResourceSyncCall::WriteReplyParams(
147 wrapper_reply_msg, reply_params, reply_msg_);
148 test_sink_->SetSyncReplyMessage(wrapper_reply_msg);
149
150 // Stash a copy of the message for inspection later.
151 last_handled_msg_ = call_msg;
152 return true;
153}
154
[email protected]077ecfd42012-06-21 21:46:26155} // namespace proxy
156} // namespace ppapi