Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index d37337b367e7961df83f23a614b9330fd268fec1..1141aaf0c7e13b8e1da6b0c07e39c35ccca8e61d 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -1317,6 +1317,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) |
@@ -1417,15 +1418,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( |
@@ -1920,6 +1926,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() { |
@@ -3198,9 +3206,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() { |
@@ -3626,6 +3641,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); |
@@ -3712,6 +3732,10 @@ void RenderViewImpl::InstrumentWillComposite() { |
webview()->devToolsAgent()->willComposite(); |
} |
+void RenderViewImpl::DidCompletePageScaleAnimation() { |
+ FocusChangeComplete(); |
+} |
+ |
void RenderViewImpl::SetScreenMetricsEmulationParameters( |
float device_scale_factor, |
const gfx::Point& root_layer_offset, |