| 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 dcf0fbf94dfce46b854462bbdbbd8a16d6e0b1ff..cbb6f5270e18f84963b97643ad8702f41feed688 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 initial_focus = to->Tree().Parent() == from;
|
| +
|
| + return AdvanceFocusInDocumentOrder(to, start, type, initial_focus,
|
| source_capabilities);
|
| }
|
|
|
| @@ -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->GetFrame()) {
|
| + SetFocusedFrame(document->GetFrame());
|
| + 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;
|
| }
|
|
|