Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 8c882673fafe8ec294474ecd1e0cf7647e6b51d2..6f463558721fdfa8bbf690097378e24b27d3db7b 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -1316,6 +1316,7 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged) |
IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted) |
IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement) |
+ IPC_MESSAGE_HANDLER(ViewMsg_FocusChangeComplete, FocusChangeComplete) |
IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque) |
IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode, |
OnEnablePreferredSizeChangedMode) |
@@ -1416,15 +1417,20 @@ void RenderViewImpl::OnScrollFocusedEditableNodeIntoRect( |
const gfx::Rect& rect) { |
if (has_scrolled_focused_editable_node_into_rect_ && |
rect == rect_for_scrolled_focused_editable_node_) { |
+ FocusChangeComplete(); |
return; |
} |
blink::WebElement element = GetFocusedElement(); |
+ bool will_animate = false; |
if (!element.isNull() && IsEditableNode(element)) { |
rect_for_scrolled_focused_editable_node_ = rect; |
has_scrolled_focused_editable_node_into_rect_ = true; |
- webview()->scrollFocusedNodeIntoRect(rect); |
+ will_animate = webview()->scrollFocusedNodeIntoRect(rect); |
} |
+ |
+ if (!will_animate) |
+ FocusChangeComplete(); |
} |
void RenderViewImpl::OnSetEditCommandsForNextKeyEvent( |
@@ -1915,6 +1921,11 @@ void RenderViewImpl::focusedNodeChanged(const WebNode& node) { |
// TODO(dmazzoni): this should be part of RenderFrameObserver. |
GetMainRenderFrame()->FocusedNodeChanged(node); |
+ |
+ blink::WebElement focused_element = GetFocusedElement(); |
+ focused_element_bounds_ = focused_element.isNull() |
+ ? blink::WebRect() |
+ : focused_element.boundsInViewportSpace(); |
} |
void RenderViewImpl::didUpdateLayout() { |
@@ -3211,9 +3222,16 @@ void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) { |
if (old_visible_viewport_size != visible_viewport_size_) |
has_scrolled_focused_editable_node_into_rect_ = false; |
- FOR_EACH_OBSERVER(RenderViewObserver, |
- observers_, |
- Resized()); |
+ blink::WebElement focused_element = GetFocusedElement(); |
+ blink::WebRect bounds = focused_element.isNull() |
+ ? blink::WebRect() |
+ : focused_element.boundsInViewportSpace(); |
+ if (bounds != focused_element_bounds_) { |
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, |
+ FocusedElementMovedOnResize()); |
+ } |
+ |
+ focused_element_bounds_ = bounds; |
} |
void RenderViewImpl::DidInitiatePaint() { |
@@ -3639,6 +3657,11 @@ void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) { |
RenderWidget::GetSelectionBounds(start, end); |
} |
+void RenderViewImpl::FocusChangeComplete() { |
+ RenderWidget::FocusChangeComplete(); |
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusChangeComplete()); |
+} |
+ |
void RenderViewImpl::GetCompositionCharacterBounds( |
std::vector<gfx::Rect>* bounds) { |
DCHECK(bounds); |
@@ -3725,6 +3748,10 @@ void RenderViewImpl::InstrumentWillComposite() { |
webview()->devToolsAgent()->willComposite(); |
} |
+void RenderViewImpl::DidCompletePageScaleAnimation() { |
+ FocusChangeComplete(); |
+} |
+ |
void RenderViewImpl::SetScreenMetricsEmulationParameters( |
float device_scale_factor, |
const gfx::Point& root_layer_offset, |