Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 59b6a58c79f7da5ff97637928c4e05fcda1286a9..c8394b913c09ca5be591d526f943d240097bada3 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -1908,21 +1908,39 @@ void RenderViewImpl::focusPrevious() { |
Send(new ViewHostMsg_TakeFocus(routing_id_, true)); |
} |
-void RenderViewImpl::focusedNodeChanged(const WebNode& node) { |
+void RenderViewImpl::focusedNodeChanged(const WebNode& previouslyFocusedNode, |
+ const WebNode& focusedNode) { |
has_scrolled_focused_editable_node_into_rect_ = false; |
gfx::Rect node_bounds; |
- if (!node.isNull() && node.isElementNode()) { |
- WebNode web_node = const_cast<WebNode&>(node); |
+ if (!focusedNode.isNull() && focusedNode.isElementNode()) { |
+ WebNode web_node = const_cast<WebNode&>(focusedNode); |
node_bounds = gfx::Rect(web_node.to<WebElement>().boundsInViewportSpace()); |
} |
- Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(node), |
- node_bounds)); |
+ Send(new ViewHostMsg_FocusedNodeChanged( |
+ routing_id_, IsEditableNode(focusedNode), node_bounds)); |
- FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(node)); |
+ // TODO(estade): remove. |
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, |
+ FocusedNodeChanged(focusedNode)); |
+ |
+ RenderFrameImpl* previous_frame = nullptr; |
+ if (!previouslyFocusedNode.isNull()) { |
+ previous_frame = |
+ RenderFrameImpl::FromWebFrame(previouslyFocusedNode.document().frame()); |
+ } |
+ RenderFrameImpl* new_frame = nullptr; |
+ if (!focusedNode.isNull()) { |
nasko
2015/01/20 05:09:51
nit: no need for {}
Evan Stade
2015/01/20 22:31:01
Done.
|
+ new_frame = RenderFrameImpl::FromWebFrame(focusedNode.document().frame()); |
+ } |
+ |
+ if (previous_frame && previous_frame != new_frame) |
+ previous_frame->FocusedNodeChanged(WebNode()); |
+ if (new_frame) |
+ new_frame->FocusedNodeChanged(focusedNode); |
- // TODO(dmazzoni): this should be part of RenderFrameObserver. |
- GetMainRenderFrame()->FocusedNodeChanged(node); |
+ // TODO(dmazzoni): remove once there's a separate a11y tree per frame. |
+ GetMainRenderFrame()->FocusedNodeChangedForAccessibility(focusedNode); |
} |
void RenderViewImpl::didUpdateLayout() { |