Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 1a17cdd96caa60e7d24a3cf03cc25815d32dc79f..f1f70521254ad7fb0d6aed2fcd8d37250c359e46 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -1423,15 +1423,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( |
@@ -1926,6 +1931,8 @@ void RenderViewImpl::focusedNodeChanged(const WebNode& node) { |
// TODO(dmazzoni): this should be part of RenderFrameObserver. |
GetMainRenderFrame()->FocusedNodeChanged(node); |
+ |
+ focused_element_bounds_ = node_bounds; |
} |
void RenderViewImpl::didUpdateLayout() { |
@@ -3177,9 +3184,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() { |
@@ -3605,6 +3619,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); |
@@ -3691,6 +3710,10 @@ void RenderViewImpl::InstrumentWillComposite() { |
webview()->devToolsAgent()->willComposite(); |
} |
+void RenderViewImpl::DidCompletePageScaleAnimation() { |
+ FocusChangeComplete(); |
+} |
+ |
void RenderViewImpl::SetScreenMetricsEmulationParameters( |
float device_scale_factor, |
const gfx::Point& root_layer_offset, |