| Index: content/browser/renderer_host/input/input_device_change_observer.cc | 
| diff --git a/content/browser/renderer_host/input/input_device_change_observer.cc b/content/browser/renderer_host/input/input_device_change_observer.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..7ef1041c01170bb3d2f3653ec115d74932de39ea | 
| --- /dev/null | 
| +++ b/content/browser/renderer_host/input/input_device_change_observer.cc | 
| @@ -0,0 +1,60 @@ | 
| +// Copyright 2017 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "content/browser/renderer_host/input/input_device_change_observer.h" | 
| +#include "base/trace_event/trace_event.h" | 
| +#include "content/public/common/web_preferences.h" | 
| + | 
| +#if defined(OS_WIN) | 
| +#include "ui/events/devices/input_device_observer_win.h" | 
| +#endif | 
| + | 
| +namespace content { | 
| + | 
| +InputDeviceChangeObserver::InputDeviceChangeObserver(RenderViewHost* rvh) { | 
| +  render_view_host_ = rvh; | 
| +#if defined(OS_WIN) | 
| +  ui::InputDeviceObserverWin::GetInstance()->AddObserver(this); | 
| +#endif | 
| +} | 
| + | 
| +InputDeviceChangeObserver::~InputDeviceChangeObserver() { | 
| +#if defined(OS_WIN) | 
| +  ui::InputDeviceObserverWin::GetInstance()->RemoveObserver(this); | 
| +#endif | 
| +  render_view_host_ = nullptr; | 
| +} | 
| + | 
| +void InputDeviceChangeObserver::OnTouchscreenDeviceConfigurationChanged() { | 
| +  NotifyRenderViewHost(); | 
| +} | 
| + | 
| +void InputDeviceChangeObserver::OnKeyboardDeviceConfigurationChanged() { | 
| +  NotifyRenderViewHost(); | 
| +} | 
| + | 
| +void InputDeviceChangeObserver::OnMouseDeviceConfigurationChanged() { | 
| +  NotifyRenderViewHost(); | 
| +} | 
| + | 
| +void InputDeviceChangeObserver::OnTouchpadDeviceConfigurationChanged() { | 
| +  NotifyRenderViewHost(); | 
| +} | 
| + | 
| +void InputDeviceChangeObserver::NotifyRenderViewHost() { | 
| +  WebPreferences prefs = render_view_host_->GetWebkitPreferences(); | 
| +  int available_pointer_types, available_hover_types; | 
| +  std::tie(available_pointer_types, available_hover_types) = | 
| +      ui::GetAvailablePointerAndHoverTypes(); | 
| +  bool input_device_changed = | 
| +      prefs.available_pointer_types != available_pointer_types || | 
| +      prefs.available_hover_types != available_hover_types; | 
| + | 
| +  if (input_device_changed) { | 
| +    TRACE_EVENT0("input", "InputDeviceChangeObserver::NotifyRendererViewHost"); | 
| +    render_view_host_->OnWebkitPreferencesChanged(); | 
| +  } | 
| +} | 
| + | 
| +}  // namespace content | 
|  |