Bug 1524983 - Make nsFocusManager::Blur() hand off focus one level up only. r=NeilDeakin

Depends on D22974

Differential Revision: https://phabricator.services.mozilla.com/D22468

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Henri Sivonen 2019-03-14 16:25:33 +00:00
Родитель f31daadc47
Коммит 83788eac4c
4 изменённых файлов: 46 добавлений и 1 удалений

Просмотреть файл

@ -135,6 +135,35 @@ mozilla::ipc::IPCResult BrowserBridgeChild::RecvRequestFocus(
return IPC_OK();
}
mozilla::ipc::IPCResult BrowserBridgeChild::RecvMoveFocus(
const bool& aForward, const bool& aForDocumentNavigation) {
// Adapted from TabParent
nsCOMPtr<nsIFocusManager> fm = nsFocusManager::GetFocusManager();
if (!fm) {
return IPC_OK();
}
RefPtr<Element> owner = mFrameLoader->GetOwnerContent();
if (!owner || !owner->OwnerDoc()) {
return IPC_OK();
}
RefPtr<Element> dummy;
uint32_t type =
aForward
? (aForDocumentNavigation
? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARDDOC)
: static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARD))
: (aForDocumentNavigation
? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARDDOC)
: static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARD));
fm->MoveFocus(nullptr, owner, type, nsIFocusManager::FLAG_BYKEY,
getter_AddRefs(dummy));
return IPC_OK();
}
void BrowserBridgeChild::ActorDestroy(ActorDestroyReason aWhy) {
mIPCOpen = false;
}

Просмотреть файл

@ -52,6 +52,9 @@ class BrowserBridgeChild : public PBrowserBridgeChild {
mozilla::ipc::IPCResult RecvRequestFocus(const bool& aCanRaise);
mozilla::ipc::IPCResult RecvMoveFocus(const bool& aForward,
const bool& aForDocumentNavigation);
void ActorDestroy(ActorDestroyReason aWhy) override;
private:

Просмотреть файл

@ -32,6 +32,12 @@ child:
*/
async RequestFocus(bool canRaise);
/**
* When IPC parent / Web child sends this message, the IPC child / Web parent
* should move focus to the next or previous focusable element or document.
*/
async MoveFocus(bool forward, bool forDocumentNavigation);
parent:
// Destroy the remote web browser due to the nsFrameLoader going away.
async __delete__();

Просмотреть файл

@ -482,7 +482,14 @@ void TabParent::ActorDestroy(ActorDestroyReason why) {
mozilla::ipc::IPCResult TabParent::RecvMoveFocus(
const bool& aForward, const bool& aForDocumentNavigation) {
nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
BrowserBridgeParent* bridgeParent = GetBrowserBridgeParent();
if (bridgeParent) {
mozilla::Unused << bridgeParent->SendMoveFocus(aForward,
aForDocumentNavigation);
return IPC_OK();
}
nsCOMPtr<nsIFocusManager> fm = nsFocusManager::GetFocusManager();
if (fm) {
RefPtr<Element> dummy;