blob: a2920e3f122fc4c254e4abb593b58d2cbb520ea2 [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
7#include "ppapi/proxy/ppapi_messages.h"
8#include "ppapi/proxy/resource_message_params.h"
9
10namespace ppapi {
11namespace proxy {
12
13namespace {
14
15// Backend for GetFirstResource[Call|Reply]Matching.
16template<class WrapperMessage, class Params>
17bool GetFirstResourceMessageMatching(const ResourceMessageTestSink& sink,
18 uint32 id,
19 Params* params,
20 IPC::Message* nested_msg) {
21 for (size_t i = 0; i < sink.message_count(); i++) {
22 const IPC::Message* msg = sink.GetMessageAt(i);
23 if (msg->type() == WrapperMessage::ID) {
24 Params cur_params;
25 IPC::Message cur_msg;
26 WrapperMessage::Read(msg, &cur_params, &cur_msg);
27 if (cur_msg.type() == id) {
28 *params = cur_params;
29 *nested_msg = cur_msg;
30 return true;
31 }
32 }
33 }
34 return false;
35}
36
37} // namespace
38
39ResourceMessageTestSink::ResourceMessageTestSink() {
40}
41
42ResourceMessageTestSink::~ResourceMessageTestSink() {
43}
44
[email protected]11d0c362012-10-11 02:02:1145bool ResourceMessageTestSink::Send(IPC::Message* msg) {
46 int message_id = 0;
47 scoped_ptr<IPC::MessageReplyDeserializer> reply_deserializer;
48 if (msg->is_sync()) {
49 reply_deserializer.reset(
50 static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer());
51 message_id = IPC::SyncMessage::GetMessageId(*msg);
52 }
53 bool result = IPC::TestSink::Send(msg); // Deletes |msg|.
54 if (sync_reply_msg_.get()) {
55 // |sync_reply_msg_| should always be a reply to the pending sync message.
56 DCHECK(IPC::SyncMessage::IsMessageReplyTo(*sync_reply_msg_.get(),
57 message_id));
58 reply_deserializer->SerializeOutputParameters(*sync_reply_msg_.get());
59 sync_reply_msg_.reset(NULL);
60 }
61 return result;
62}
63
64void ResourceMessageTestSink::SetSyncReplyMessage(IPC::Message* reply_msg) {
65 DCHECK(!sync_reply_msg_.get());
66 sync_reply_msg_.reset(reply_msg);
67}
68
[email protected]077ecfd42012-06-21 21:46:2669bool ResourceMessageTestSink::GetFirstResourceCallMatching(
70 uint32 id,
71 ResourceMessageCallParams* params,
72 IPC::Message* nested_msg) const {
73 return GetFirstResourceMessageMatching<PpapiHostMsg_ResourceCall,
74 ResourceMessageCallParams>(
75 *this, id, params, nested_msg);
76}
77
78bool ResourceMessageTestSink::GetFirstResourceReplyMatching(
79 uint32 id,
80 ResourceMessageReplyParams* params,
81 IPC::Message* nested_msg) {
82 return GetFirstResourceMessageMatching<PpapiPluginMsg_ResourceReply,
83 ResourceMessageReplyParams>(
84 *this, id, params, nested_msg);
85}
86
[email protected]11d0c362012-10-11 02:02:1187ResourceSyncCallHandler::ResourceSyncCallHandler(
88 ResourceMessageTestSink* test_sink,
89 uint32 incoming_type,
90 int32_t result,
91 const IPC::Message& reply_msg)
92 : test_sink_(test_sink),
93 incoming_type_(incoming_type),
94 result_(result),
95 reply_msg_(reply_msg) {
96}
97
98ResourceSyncCallHandler::~ResourceSyncCallHandler() {
99}
100
101bool ResourceSyncCallHandler::OnMessageReceived(const IPC::Message& msg) {
102 if (msg.type() != PpapiHostMsg_ResourceSyncCall::ID)
103 return false;
104 PpapiHostMsg_ResourceSyncCall::Schema::SendParam send_params;
105 bool success = PpapiHostMsg_ResourceSyncCall::ReadSendParam(
106 &msg, &send_params);
107 DCHECK(success);
108 ResourceMessageCallParams call_params = send_params.a;
109 IPC::Message call_msg = send_params.b;
110 if (call_msg.type() != incoming_type_)
111 return false;
112 IPC::Message* wrapper_reply_msg = IPC::SyncMessage::GenerateReply(&msg);
113 ResourceMessageReplyParams reply_params(call_params.pp_resource(),
114 call_params.sequence());
115 reply_params.set_result(result_);
116 PpapiHostMsg_ResourceSyncCall::WriteReplyParams(
117 wrapper_reply_msg, reply_params, reply_msg_);
118 test_sink_->SetSyncReplyMessage(wrapper_reply_msg);
119
120 // Stash a copy of the message for inspection later.
121 last_handled_msg_ = call_msg;
122 return true;
123}
124
[email protected]077ecfd42012-06-21 21:46:26125} // namespace proxy
126} // namespace ppapi