| Index: extensions/browser/api/hid/hid_device_manager.cc
 | 
| diff --git a/extensions/browser/api/hid/hid_device_manager.cc b/extensions/browser/api/hid/hid_device_manager.cc
 | 
| index 5c84f8a904bd4eeb11128b997a2e24c791037cb9..c95d20fcf124ee7480f7a1fb40e4072d6c779a8b 100644
 | 
| --- a/extensions/browser/api/hid/hid_device_manager.cc
 | 
| +++ b/extensions/browser/api/hid/hid_device_manager.cc
 | 
| @@ -26,14 +26,14 @@ namespace extensions {
 | 
|  namespace {
 | 
|  
 | 
|  void PopulateHidDeviceInfo(hid::HidDeviceInfo* output,
 | 
| -                           const HidDeviceInfo& input) {
 | 
| -  output->vendor_id = input.vendor_id;
 | 
| -  output->product_id = input.product_id;
 | 
| -  output->max_input_report_size = input.max_input_report_size;
 | 
| -  output->max_output_report_size = input.max_output_report_size;
 | 
| -  output->max_feature_report_size = input.max_feature_report_size;
 | 
| -
 | 
| -  for (const device::HidCollectionInfo& collection : input.collections) {
 | 
| +                           scoped_refptr<HidDeviceInfo> input) {
 | 
| +  output->vendor_id = input->vendor_id();
 | 
| +  output->product_id = input->product_id();
 | 
| +  output->max_input_report_size = input->max_input_report_size();
 | 
| +  output->max_output_report_size = input->max_output_report_size();
 | 
| +  output->max_feature_report_size = input->max_feature_report_size();
 | 
| +
 | 
| +  for (const device::HidCollectionInfo& collection : input->collections()) {
 | 
|      // Don't expose sensitive data.
 | 
|      if (collection.usage.IsProtected()) {
 | 
|        continue;
 | 
| @@ -51,7 +51,7 @@ void PopulateHidDeviceInfo(hid::HidDeviceInfo* output,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -bool WillDispatchDeviceEvent(const HidDeviceInfo& device_info,
 | 
| +bool WillDispatchDeviceEvent(scoped_refptr<HidDeviceInfo> device_info,
 | 
|                               content::BrowserContext* context,
 | 
|                               const Extension* extension,
 | 
|                               base::ListValue* event_args) {
 | 
| @@ -119,8 +119,7 @@ void HidDeviceManager::GetApiDevices(
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -bool HidDeviceManager::GetDeviceInfo(int resource_id,
 | 
| -                                     HidDeviceInfo* device_info) {
 | 
| +scoped_refptr<HidDeviceInfo> HidDeviceManager::GetDeviceInfo(int resource_id) {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    HidService* hid_service = device::DeviceClient::Get()->GetHidService();
 | 
|    DCHECK(hid_service);
 | 
| @@ -128,18 +127,17 @@ bool HidDeviceManager::GetDeviceInfo(int resource_id,
 | 
|    ResourceIdToDeviceIdMap::const_iterator device_iter =
 | 
|        device_ids_.find(resource_id);
 | 
|    if (device_iter == device_ids_.end()) {
 | 
| -    return false;
 | 
| +    return nullptr;
 | 
|    }
 | 
|  
 | 
| -  return hid_service->GetDeviceInfo(device_iter->second, device_info);
 | 
| +  return hid_service->GetDeviceInfo(device_iter->second);
 | 
|  }
 | 
|  
 | 
|  // static
 | 
|  bool HidDeviceManager::HasPermission(const Extension* extension,
 | 
| -                                     const HidDeviceInfo& device_info) {
 | 
| +                                     scoped_refptr<HidDeviceInfo> device_info) {
 | 
|    UsbDevicePermission::CheckParam usbParam(
 | 
| -      device_info.vendor_id,
 | 
| -      device_info.product_id,
 | 
| +      device_info->vendor_id(), device_info->product_id(),
 | 
|        UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
 | 
|    if (extension->permissions_data()->CheckAPIPermissionWithParam(
 | 
|            APIPermission::kUsbDevice, &usbParam)) {
 | 
| @@ -168,13 +166,13 @@ void HidDeviceManager::OnListenerAdded(const EventListenerInfo& details) {
 | 
|    LazyInitialize();
 | 
|  }
 | 
|  
 | 
| -void HidDeviceManager::OnDeviceAdded(const HidDeviceInfo& device_info) {
 | 
| +void HidDeviceManager::OnDeviceAdded(scoped_refptr<HidDeviceInfo> device_info) {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    DCHECK_LT(next_resource_id_, std::numeric_limits<int>::max());
 | 
|    int new_id = next_resource_id_++;
 | 
| -  DCHECK(!ContainsKey(resource_ids_, device_info.device_id));
 | 
| -  resource_ids_[device_info.device_id] = new_id;
 | 
| -  device_ids_[new_id] = device_info.device_id;
 | 
| +  DCHECK(!ContainsKey(resource_ids_, device_info->device_id()));
 | 
| +  resource_ids_[device_info->device_id()] = new_id;
 | 
| +  device_ids_[new_id] = device_info->device_id();
 | 
|  
 | 
|    // Don't generate events during the initial enumeration.
 | 
|    if (enumeration_ready_ && event_router_) {
 | 
| @@ -190,9 +188,10 @@ void HidDeviceManager::OnDeviceAdded(const HidDeviceInfo& device_info) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void HidDeviceManager::OnDeviceRemoved(const HidDeviceInfo& device_info) {
 | 
| +void HidDeviceManager::OnDeviceRemoved(
 | 
| +    scoped_refptr<HidDeviceInfo> device_info) {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
| -  const auto& resource_entry = resource_ids_.find(device_info.device_id);
 | 
| +  const auto& resource_entry = resource_ids_.find(device_info->device_id());
 | 
|    DCHECK(resource_entry != resource_ids_.end());
 | 
|    int resource_id = resource_entry->second;
 | 
|    const auto& device_entry = device_ids_.find(resource_id);
 | 
| @@ -234,8 +233,9 @@ scoped_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList(
 | 
|      int resource_id = map_entry.first;
 | 
|      const HidDeviceId& device_id = map_entry.second;
 | 
|  
 | 
| -    HidDeviceInfo device_info;
 | 
| -    if (!hid_service->GetDeviceInfo(device_id, &device_info)) {
 | 
| +    scoped_refptr<HidDeviceInfo> device_info =
 | 
| +        hid_service->GetDeviceInfo(device_id);
 | 
| +    if (!device_info) {
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| @@ -262,10 +262,10 @@ scoped_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList(
 | 
|  }
 | 
|  
 | 
|  void HidDeviceManager::OnEnumerationComplete(
 | 
| -    const std::vector<HidDeviceInfo>& devices) {
 | 
| +    const std::vector<scoped_refptr<HidDeviceInfo>>& devices) {
 | 
|    DCHECK(resource_ids_.empty());
 | 
|    DCHECK(device_ids_.empty());
 | 
| -  for (const device::HidDeviceInfo& device_info : devices) {
 | 
| +  for (const scoped_refptr<HidDeviceInfo>& device_info : devices) {
 | 
|      OnDeviceAdded(device_info);
 | 
|    }
 | 
|    enumeration_ready_ = true;
 | 
| @@ -280,7 +280,7 @@ void HidDeviceManager::OnEnumerationComplete(
 | 
|  
 | 
|  void HidDeviceManager::DispatchEvent(const std::string& event_name,
 | 
|                                       scoped_ptr<base::ListValue> event_args,
 | 
| -                                     const HidDeviceInfo& device_info) {
 | 
| +                                     scoped_refptr<HidDeviceInfo> device_info) {
 | 
|    scoped_ptr<Event> event(new Event(event_name, event_args.Pass()));
 | 
|    event->will_dispatch_callback =
 | 
|        base::Bind(&WillDispatchDeviceEvent, device_info);
 | 
| 
 |