Index: third_party/WebKit/Source/core/page/FocusController.cpp |
diff --git a/third_party/WebKit/Source/core/page/FocusController.cpp b/third_party/WebKit/Source/core/page/FocusController.cpp |
index 383f1623b0b046285b32c9e0537673b3ddb79e4d..6becd697d6e65608d336173a0e3d35f78b13d759 100644 |
--- a/third_party/WebKit/Source/core/page/FocusController.cpp |
+++ b/third_party/WebKit/Source/core/page/FocusController.cpp |
@@ -933,7 +933,11 @@ bool FocusController::advanceFocusAcrossFrames( |
start = toHTMLFrameOwnerElement(from->owner()); |
} |
- return advanceFocusInDocumentOrder(to, start, type, false, |
+ // If we're coming from a parent frame, we need to restart from the first or |
+ // last focusable element. |
+ bool initialFocus = to->tree().parent() == from; |
+ |
+ return advanceFocusInDocumentOrder(to, start, type, initialFocus, |
sourceCapabilities); |
} |
@@ -998,7 +1002,11 @@ bool FocusController::advanceFocusInDocumentOrder( |
} |
if (element == document->focusedElement()) { |
- // Focus wrapped around to the same element. |
+ // Focus is either coming from a remote frame or has wrapped around. |
+ if (focusedFrame() != document->frame()) { |
+ setFocusedFrame(document->frame()); |
+ dispatchFocusEvent(*document, *element); |
+ } |
return true; |
} |
@@ -1012,14 +1020,17 @@ bool FocusController::advanceFocusInDocumentOrder( |
return false; |
document->clearFocusedElement(); |
- setFocusedFrame(owner->contentFrame()); |
- // If contentFrame is remote, continue the search for focusable |
- // elements in that frame's process. |
- // clearFocusedElement() fires events that might detach the |
- // contentFrame, hence the need to null-check it again. |
+ // If contentFrame is remote, continue the search for focusable elements in |
+ // that frame's process. The target contentFrame's process will grab focus |
+ // from inside advanceFocusInDocumentOrder(). |
+ // |
+ // clearFocusedElement() fires events that might detach the contentFrame, |
+ // hence the need to null-check it again. |
if (owner->contentFrame() && owner->contentFrame()->isRemoteFrame()) |
toRemoteFrame(owner->contentFrame())->advanceFocus(type, frame); |
+ else |
+ setFocusedFrame(owner->contentFrame()); |
return true; |
} |