summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-08 20:10:28 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-08 20:10:28 +0000
commit8c5068288a36a04dfc3a02d3a30964a6edcfe14a (patch)
treef5fd1f011bc64660fb3eafbb32eef43c88070a11
parent44d961dbed71c0bae386cf5ace72fc53d419dba3 (diff)
downloadchromium_src-8c5068288a36a04dfc3a02d3a30964a6edcfe14a.zip
chromium_src-8c5068288a36a04dfc3a02d3a30964a6edcfe14a.tar.gz
chromium_src-8c5068288a36a04dfc3a02d3a30964a6edcfe14a.tar.bz2
New fix for Win 8 OSK
New approach: keep track of the global x, y coordinates of each touch event. When Windows queries us to determine if the focused control is editable text that should pop up the OSK, only return true if the last touch point is within the bounds of the control. Also, clear the last touch coordinate when a window loses focus. This prevents bugs where the OSK would pop up when a text box gets focus, even if the touch wasn't near it. The downside is that it causes a few touch targets to be more difficult to touch to open the OSK, like the JavaScript console or Google Docs. BUG=140993 TBR=creis Review URL: https://chromiumcodereview.appspot.com/11038057 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@160686 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/accessibility/browser_accessibility_manager.cc16
-rw-r--r--content/browser/accessibility/browser_accessibility_manager.h8
-rw-r--r--content/browser/accessibility/browser_accessibility_win.cc7
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.cc5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.h1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.cc15
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.h6
7 files changed, 33 insertions, 25 deletions
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index fb4d8d4..c20474f 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -135,18 +135,12 @@ void BrowserAccessibilityManager::GotMouseDown() {
NotifyAccessibilityEvent(AccessibilityNotificationFocusChanged, focus_);
}
-bool BrowserAccessibilityManager::IsOSKAllowed() {
- return osk_state_ == OSK_ALLOWED_WITHIN_FOCUSED_OBJECT ||
- osk_state_ == OSK_ALLOWED;
-}
+bool BrowserAccessibilityManager::IsOSKAllowed(const gfx::Rect& bounds) {
+ if (!delegate_ || !delegate_->HasFocus())
+ return false;
-bool BrowserAccessibilityManager::ShouldRestrictOSKToControlBounds() {
- AccessibilityMode mode =
- BrowserAccessibilityStateImpl::GetInstance()->GetAccessibilityMode();
- if (mode == AccessibilityModeEditableTextOnly)
- return osk_state_ == OSK_ALLOWED_WITHIN_FOCUSED_OBJECT;
- else
- return true;
+ gfx::Point touch_point = delegate_->GetLastTouchEventLocation();
+ return bounds.Contains(touch_point);
}
void BrowserAccessibilityManager::Remove(int32 child_id, int32 renderer_id) {
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index b7d99f8..1694c7d 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -35,6 +35,7 @@ class CONTENT_EXPORT BrowserAccessibilityDelegate {
int acc_obj_id, int start_offset, int end_offset) = 0;
virtual bool HasFocus() const = 0;
virtual gfx::Rect GetViewBounds() const = 0;
+ virtual gfx::Point GetLastTouchEventLocation() const = 0;
};
class CONTENT_EXPORT BrowserAccessibilityFactory {
@@ -150,12 +151,7 @@ class CONTENT_EXPORT BrowserAccessibilityManager {
// Is the on-screen keyboard allowed to be shown, in response to a
// focus event on a text box?
- bool IsOSKAllowed();
-
- // Should the on-screen keyboard be shown only when a touch is within the
- // control bounds? If false, the OSK should be shown if any touch event leads
- // to a control getting focus.
- bool ShouldRestrictOSKToControlBounds();
+ bool IsOSKAllowed(const gfx::Rect& bounds);
protected:
BrowserAccessibilityManager(
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc
index a9061ce..917e68c 100644
--- a/content/browser/accessibility/browser_accessibility_win.cc
+++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -255,11 +255,6 @@ STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, LONG* y_top,
if (!target)
return E_INVALIDARG;
- // If we're not supposed to restrict the on-screen keyboard to the control
- // bounds, get the bounds of this control from the root element's bounds.
- while (target->parent() && !manager_->ShouldRestrictOSKToControlBounds())
- target = target->parent()->ToBrowserAccessibilityWin();
-
gfx::Rect bounds = target->GetGlobalBoundsRect();
*x_left = bounds.x();
*y_top = bounds.y();
@@ -2578,7 +2573,7 @@ STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(
if (IsEditableText()) {
// The BrowserAccessibilityManager keeps track of instances when
// we don't want to show the on-screen keyboard.
- if (!manager_->IsOSKAllowed())
+ if (!manager_->IsOSKAllowed(GetGlobalBoundsRect()))
return E_NOTIMPL;
DVLOG(1) << "Returning UIA text provider";
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.cc b/content/browser/renderer_host/render_widget_host_view_gtk.cc
index b5dab88..80c011c 100644
--- a/content/browser/renderer_host/render_widget_host_view_gtk.cc
+++ b/content/browser/renderer_host/render_widget_host_view_gtk.cc
@@ -1523,6 +1523,11 @@ void RenderWidgetHostViewGtk::AccessibilitySetTextSelection(
host_->AccessibilitySetTextSelection(acc_obj_id, start_offset, end_offset);
}
+gfx::Point RenderWidgetHostViewGtk::GetLastTouchEventLocation() const {
+ // Not needed on Linux.
+ return gfx::Point();
+}
+
void RenderWidgetHostViewGtk::OnAccessibilityNotifications(
const std::vector<AccessibilityHostMsg_NotificationParams>& params) {
if (!browser_accessibility_manager_.get()) {
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.h b/content/browser/renderer_host/render_widget_host_view_gtk.h
index 6e86079..a608a9a 100644
--- a/content/browser/renderer_host/render_widget_host_view_gtk.h
+++ b/content/browser/renderer_host/render_widget_host_view_gtk.h
@@ -166,6 +166,7 @@ class CONTENT_EXPORT RenderWidgetHostViewGtk
int acc_obj_id, gfx::Point point) OVERRIDE;
virtual void AccessibilitySetTextSelection(
int acc_obj_id, int start_offset, int end_offset) OVERRIDE;
+ virtual gfx::Point GetLastTouchEventLocation() const OVERRIDE;
// Get the root of the AtkObject* tree for accessibility.
AtkObject* GetAccessible();
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc
index b9e332a..e78a07e 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.cc
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc
@@ -490,6 +490,7 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget)
ALLOW_THIS_IN_INITIALIZER_LIST(
touch_state_(new WebTouchState(this))),
pointer_down_context_(false),
+ last_touch_location_(-1, -1),
focus_on_editable_field_(false),
received_focus_change_after_pointer_down_(false),
touch_events_enabled_(false),
@@ -1530,6 +1531,8 @@ void RenderWidgetHostViewWin::OnKillFocus(HWND window) {
render_widget_host_->SetActive(false);
render_widget_host_->Blur();
+ last_touch_location_ = gfx::Point(-1, -1);
+
if (base::win::IsTsfAwareRequired())
ui::TsfBridge::GetInstance()->RemoveFocusedClient(this);
}
@@ -2244,8 +2247,12 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam,
return 0;
}
- if (total == 1 && (points[0].dwFlags & TOUCHEVENTF_DOWN))
- pointer_down_context_ = true;
+ if (total == 1 && (points[0].dwFlags & TOUCHEVENTF_DOWN)) {
+ pointer_down_context_ = true;
+ last_touch_location_ = gfx::Point(
+ TOUCH_COORD_TO_PIXEL(points[0].x),
+ TOUCH_COORD_TO_PIXEL(points[0].y));
+ }
bool has_touch_handler = render_widget_host_->has_touch_handler() &&
touch_events_enabled_;
@@ -2664,6 +2671,10 @@ void RenderWidgetHostViewWin::AccessibilitySetTextSelection(
acc_obj_id, start_offset, end_offset);
}
+gfx::Point RenderWidgetHostViewWin::GetLastTouchEventLocation() const {
+ return last_touch_location_;
+}
+
LRESULT RenderWidgetHostViewWin::OnGetObject(UINT message, WPARAM wparam,
LPARAM lparam, BOOL& handled) {
TRACE_EVENT0("browser", "RenderWidgetHostViewWin::OnGetObject");
diff --git a/content/browser/renderer_host/render_widget_host_view_win.h b/content/browser/renderer_host/render_widget_host_view_win.h
index 8d388b0..034a9bb 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.h
+++ b/content/browser/renderer_host/render_widget_host_view_win.h
@@ -237,6 +237,7 @@ class RenderWidgetHostViewWin
int acc_obj_id, gfx::Point point) OVERRIDE;
virtual void AccessibilitySetTextSelection(
int acc_obj_id, int start_offset, int end_offset) OVERRIDE;
+ virtual gfx::Point GetLastTouchEventLocation() const OVERRIDE;
// Overridden from ui::GestureEventHelper.
virtual bool DispatchLongPressGestureEvent(ui::GestureEvent* event) OVERRIDE;
@@ -559,6 +560,11 @@ class RenderWidgetHostViewWin
// Set to true if we are in the context of a WM_POINTERDOWN message
bool pointer_down_context_;
+ // The global x, y coordinates of the last point a touch event was
+ // received, used to determine if it's okay to open the on-screen
+ // keyboard. Reset when the window loses focus.
+ gfx::Point last_touch_location_;
+
// Set to true if the focus is currently on an editable field on the page.
bool focus_on_editable_field_;