Bug 1045270 - Part 2: Focus the text control inside a number control when recreating frames for a focused number control off of the event loop; r=smaug

This is needed because the text control doesn't have a document yet in
CreateAnonymousContent, so setting the focus to it will fail.
This commit is contained in:
Ehsan Akhgari 2014-07-31 20:25:43 -04:00
parent 7b43655435
commit 23c527d9cf

View File

@ -22,6 +22,7 @@
#include "nsContentList.h"
#include "nsStyleSet.h"
#include "nsIDOMMutationEvent.h"
#include "nsThreadUtils.h"
#ifdef ACCESSIBILITY
#include "mozilla/a11y/AccTypes.h"
@ -259,6 +260,28 @@ nsNumberControlFrame::GetTextFieldFrame()
return do_QueryFrame(GetAnonTextControl()->GetPrimaryFrame());
}
class FocusTextField : public nsRunnable
{
public:
FocusTextField(nsIContent* aNumber, nsIContent* aTextField)
: mNumber(aNumber),
mTextField(aTextField)
{}
NS_IMETHODIMP Run() MOZ_OVERRIDE
{
if (mNumber->AsElement()->State().HasState(NS_EVENT_STATE_FOCUS)) {
HTMLInputElement::FromContent(mTextField)->Focus();
}
return NS_OK;
}
private:
nsCOMPtr<nsIContent> mNumber;
nsCOMPtr<nsIContent> mTextField;
};
nsresult
nsNumberControlFrame::MakeAnonymousElement(Element** aResult,
nsTArray<ContentInfo>& aElements,
@ -364,10 +387,8 @@ nsNumberControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
if (mContent->AsElement()->State().HasState(NS_EVENT_STATE_FOCUS)) {
// We don't want to focus the frame but the text field.
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(mTextField);
NS_ASSERTION(element, "Really, this should be a nsIDOMElement!");
fm->SetFocus(element, 0);
nsRefPtr<FocusTextField> focusJob = new FocusTextField(mContent, mTextField);
nsContentUtils::AddScriptRunner(focusJob);
}
if (StyleDisplay()->mAppearance == NS_THEME_TEXTFIELD) {