12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 10ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch#include "base/memory/weak_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/host_message_context.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_host.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_message_utils.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_params.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_test_sink.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdochclass TestDelegate : public PepperDeviceEnumerationHostHelper::Delegate, 29ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch public base::SupportsWeakPtr<TestDelegate> { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TestDelegate() : last_used_id_(0) {} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~TestDelegate() { CHECK(callbacks_.empty()); } 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual int EnumerateDevices(PP_DeviceType_Dev /* type */, 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const GURL& /* document_url */, 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const EnumerateDevicesCallback& callback) 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OVERRIDE { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_used_id_++; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks_[last_used_id_] = callback; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return last_used_id_; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StopEnumerateDevices(int request_id) OVERRIDE { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, EnumerateDevicesCallback>::iterator iter = 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks_.find(request_id); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(iter != callbacks_.end()); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks_.erase(iter); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns false if |request_id| is not found. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SimulateEnumerateResult( 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<ppapi::DeviceRefData>& devices) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, EnumerateDevicesCallback>::iterator iter = 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks_.find(request_id); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == callbacks_.end()) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter->second.Run(request_id, devices); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t GetRegisteredCallbackCount() const { return callbacks_.size(); } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_used_id() const { return last_used_id_; } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, EnumerateDevicesCallback> callbacks_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_used_id_; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TestDelegate); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PepperDeviceEnumerationHostHelperTest : public testing::Test { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperDeviceEnumerationHostHelperTest() 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ppapi_host_(&sink_, ppapi::PpapiPermissions()), 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch resource_host_(&ppapi_host_, 12345, 67890), 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch device_enumeration_(&resource_host_, 81ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch delegate_.AsWeakPtr(), 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PP_DEVICETYPE_DEV_AUDIOCAPTURE, 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL("http://example.com")) {} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PepperDeviceEnumerationHostHelperTest() {} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SimulateMonitorDeviceChangeReceived(uint32_t callback_id) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange msg(callback_id); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageCallParams call_params( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_host_.pp_resource(), 123); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext context(call_params); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = PP_ERROR_FAILED; 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_TRUE( 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch device_enumeration_.HandleResourceMessage(msg, &context, &result)); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PP_OK, result); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckNotifyDeviceChangeMessage( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t callback_id, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<ppapi::DeviceRefData>& expected) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageReplyParams reply_params; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::Message reply_msg; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(sink_.GetFirstResourceReplyMatching( 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange::ID, 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &reply_params, 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &reply_msg)); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sink_.ClearMessages(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PP_OK, reply_params.result()); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t reply_callback_id = 0; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ppapi::DeviceRefData> reply_data; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ppapi::UnpackMessage< 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange>( 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch reply_msg, &reply_callback_id, &reply_data)); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(callback_id, reply_callback_id); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, reply_data); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch TestDelegate delegate_; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageTestSink sink_; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::PpapiHost ppapi_host_; 123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ppapi::host::ResourceHost resource_host_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperDeviceEnumerationHostHelper device_enumeration_; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PepperDeviceEnumerationHostHelperTest); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PepperDeviceEnumerationHostHelperTest, EnumerateDevices) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_DeviceEnumeration_EnumerateDevices msg; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageCallParams call_params( 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_host_.pp_resource(), 123); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext context(call_params); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = PP_ERROR_FAILED; 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_TRUE( 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch device_enumeration_.HandleResourceMessage(msg, &context, &result)); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PP_OK_COMPLETIONPENDING, result); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id = delegate_.last_used_id(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ppapi::DeviceRefData> data; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::DeviceRefData data_item; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.name = "name_1"; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.id = "id_1"; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back(data_item); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.name = "name_2"; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.id = "id_2"; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back(data_item); 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data)); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StopEnumerateDevices() should have been called since the EnumerateDevices 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // message is not a persistent request. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0U, delegate_.GetRegisteredCallbackCount()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A reply message should have been sent to the test sink. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageReplyParams reply_params; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::Message reply_msg; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(sink_.GetFirstResourceReplyMatching( 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply::ID, 166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &reply_params, 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &reply_msg)); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(call_params.sequence(), reply_params.sequence()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PP_OK, reply_params.result()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ppapi::DeviceRefData> reply_data; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ppapi::UnpackMessage< 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply>(reply_msg, 175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &reply_data)); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(data, reply_data); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PepperDeviceEnumerationHostHelperTest, MonitorDeviceChange) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t callback_id = 456; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateMonitorDeviceChangeReceived(callback_id); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount()); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id = delegate_.last_used_id(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ppapi::DeviceRefData> data; 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data)); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StopEnumerateDevices() shouldn't be called because the MonitorDeviceChange 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // message is a persistent request. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckNotifyDeviceChangeMessage(callback_id, data); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::DeviceRefData data_item; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.name = "name_1"; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.id = "id_1"; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back(data_item); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.name = "name_2"; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.id = "id_2"; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back(data_item); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id, data)); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount()); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckNotifyDeviceChangeMessage(callback_id, data); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t callback_id2 = 789; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimulateMonitorDeviceChangeReceived(callback_id2); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StopEnumerateDevice() should have been called for the previous request. 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount()); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id2 = delegate_.last_used_id(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.name = "name_3"; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_item.id = "id_3"; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back(data_item); 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(delegate_.SimulateEnumerateResult(request_id2, data)); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckNotifyDeviceChangeMessage(callback_id2, data); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange msg; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::ResourceMessageCallParams call_params( 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_host_.pp_resource(), 123); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext context(call_params); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = PP_ERROR_FAILED; 229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_TRUE( 230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch device_enumeration_.HandleResourceMessage(msg, &context, &result)); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PP_OK, result); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0U, delegate_.GetRegisteredCallbackCount()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 237