diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index bad8eea7f9e4..0529fc81f91d 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -251,34 +251,18 @@ NS_IMETHODIMP nsDocAccessible::GetFocusedChild(nsIAccessible **aFocusedChild) NS_IMETHODIMP nsDocAccessible::TakeFocus() { - NS_ENSURE_TRUE(mDocument, NS_ERROR_FAILURE); - PRUint32 state; - GetState(&state, nsnull); - if (0 == (state & nsIAccessibleStates::STATE_FOCUSABLE)) { - return NS_ERROR_FAILURE; // Not focusable + nsCOMPtr domWin; + GetWindow(getter_AddRefs(domWin)); + nsCOMPtr privateDOMWindow(do_QueryInterface(domWin)); + NS_ENSURE_TRUE(privateDOMWindow, NS_ERROR_FAILURE); + nsIFocusController *focusController = + privateDOMWindow->GetRootFocusController(); + if (focusController) { + nsCOMPtr ele(do_QueryInterface(mDOMNode)); + focusController->SetFocusedElement(ele); + return NS_OK; } - - nsCOMPtr treeItem = GetDocShellTreeItemFor(mDOMNode); - nsCOMPtr docShell = do_QueryInterface(treeItem); - NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE); - - nsCOMPtr shell(GetPresShell()); - nsIEventStateManager *esm = shell->GetPresContext()->EventStateManager(); - NS_ENSURE_TRUE(esm, NS_ERROR_FAILURE); - - nsresult rv = esm->SetContentState(nsnull, NS_EVENT_STATE_FOCUS); - NS_ENSURE_SUCCESS(rv, rv); - rv = docShell->SetHasFocus(PR_TRUE); - NS_ENSURE_SUCCESS(rv, rv); - rv = docShell->SetCanvasHasFocus(PR_TRUE); - NS_ENSURE_SUCCESS(rv, rv); - nsIContent *content = mDocument->GetRootContent(); - NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); - content->SetFocus(shell->GetPresContext()); - esm->SetFocusedContent(content); - esm->MoveCaretToFocus(); - esm->SetFocusedContent(nsnull); - return NS_OK; + return NS_ERROR_FAILURE; } // ------- nsIAccessibleDocument Methods (5) ---------------