Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1369)

Unified Diff: content/browser/renderer_host/render_view_host_impl.cc

Issue 1986153005: The on screen keyboard on Windows 8+ should not obscure the input field. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove include Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_view_host_impl.cc
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index c457e2c339f50a4ca165710470be9a12f0d3b7df..78f5730da7f73ac475fe845d7300640bcb817b14 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -90,7 +90,10 @@
#include "url/url_constants.h"
#if defined(OS_WIN)
+#include "base/memory/singleton.h"
+#include "base/win/osk_display_manager.h"
#include "base/win/win_util.h"
+#include "ui/aura/window.h"
#include "ui/display/win/dpi.h"
#include "ui/gfx/platform_font_win.h"
#endif
@@ -166,6 +169,57 @@ void GetWindowsSpecificPrefs(RendererPreferences* prefs) {
} // namespace
+#if defined(OS_WIN)
ncarter (slow) 2016/05/18 20:09:11 This is getting to be more OS_WIN code in this fil
ananta 2016/05/19 01:57:12 Moved this RenderWidgetHostViewAura. This involve
+// This class implements the base::win::OnScreenKeyboardObserver interface
+// which provides notifications about the on screen keyboard on Windows getting
+// displayed or hidden in response to taps on editable fields.
+class OnScreenKeyboardObserver : public base::win::OnScreenKeyboardObserver {
+ public:
+ OnScreenKeyboardObserver(RenderViewHostImpl* host)
ncarter (slow) 2016/05/18 20:09:11 explicit
ananta 2016/05/19 01:57:13 Done.
+ : host_(host) {
+ }
+
+ // base::win::OnScreenKeyboardObserver overrides.
+ void OnKeyboardVisible(const RECT& keyboard_rect) override {
+ DCHECK(host_);
+ RenderWidgetHostImpl* widget_host = host_->GetWidget();
+ if (widget_host && widget_host->GetView()) {
+ // We use the cursor position to determine whether the tap occurred
+ // inside the bounds of the on screen keyboard.
+ POINT cursor_pos = {};
+ ::GetCursorPos(&cursor_pos);
sky 2016/05/18 19:54:51 Is the cursor position always updated for touch? N
ananta 2016/05/19 02:18:47 It is updated for touch. I pass the cursor positio
+ if (::PtInRect(&keyboard_rect, cursor_pos)) {
+ DVLOG(1) << "OSK covering focus point.";
+ // We set the viewport to the bounds of the keyboard with an offset of
+ // 10 to ensure that the editable field gets scrolled into view
+ // correctly.
+ gfx::Rect display_rect(keyboard_rect);
+ display_rect.set_y(display_rect.y() - 10);
+ display_rect.set_height(display_rect.height() - 10);
+ widget_host->GetView()->SetInsets(
+ gfx::Insets(0, 0, display_rect.height(), 0));
sky 2016/05/18 19:54:52 Shouldn't this depend upon the region of the rende
ananta 2016/05/19 02:18:47 Yeah. Updated. PTAL
+ widget_host->ScrollFocusedEditableNodeIntoRect(display_rect);
+ } else {
+ // Restore the viewport.
+ widget_host->GetView()->SetInsets(gfx::Insets());
+ }
+ }
+ }
+
+ void OnKeyboardHidden(const RECT& keyboard_rect) override {
+ DCHECK(host_);
+ RenderWidgetHost* widget_host = host_->GetWidget();
+ // Restore the viewport.
+ if (widget_host && widget_host->GetView()) {
+ widget_host->GetView()->SetInsets(gfx::Insets());
sky 2016/05/18 19:54:52 Should this be done in the constructor too?
ananta 2016/05/19 01:57:12 Done.
+ }
+ }
+
+ private:
+ RenderViewHostImpl* host_;
+};
sky 2016/05/18 19:54:51 DISALLOW...
ananta 2016/05/19 01:57:13 Done.
+#endif
+
// static
const int64_t RenderViewHostImpl::kUnloadTimeoutMS = 1000;
@@ -1299,13 +1353,18 @@ void RenderViewHostImpl::OnRunFileChooser(const FileChooserParams& params) {
void RenderViewHostImpl::OnFocusedNodeTouched(bool editable) {
#if defined(OS_WIN)
+ base::win::OnScreenKeyboardDisplayManager* osk_display_manager =
+ base::win::OnScreenKeyboardDisplayManager::GetInstance();
+ DCHECK(osk_display_manager);
if (editable) {
- virtual_keyboard_requested_ = base::win::DisplayVirtualKeyboard();
+ keyboard_observer_.reset(new OnScreenKeyboardObserver(this));
sky 2016/05/18 19:54:51 Is it possible the keyboard is already visible at
ananta 2016/05/19 01:57:13 I don't think that would be needed. The DisplayVir
+ virtual_keyboard_requested_ = osk_display_manager->DisplayVirtualKeyboard(
+ keyboard_observer_.get());
delegate_->SetIsVirtualKeyboardRequested(true);
} else {
virtual_keyboard_requested_ = false;
delegate_->SetIsVirtualKeyboardRequested(false);
- base::win::DismissVirtualKeyboard();
+ osk_display_manager->DismissVirtualKeyboard(keyboard_observer_.get());
ncarter (slow) 2016/05/18 20:09:11 It's not clear to me why this DismissVirtualKeyboa
ananta 2016/05/19 01:57:12 Yes. Removed the observer parameter.
}
#endif
}
« base/win/osk_display_manager.cc ('K') | « content/browser/renderer_host/render_view_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698