Bug 331088. Handle file-control frame being torn down while the dialog is up. r=smaug,sr=mats,a=dveditz
git-svn-id: svn://10.0.0.236/trunk@255760 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
7a1ecd860b
commit
47fa975658
@ -262,9 +262,11 @@ nsFileControlFrame::SetFocus(PRBool aOn, PRBool aRepaint)
|
||||
/**
|
||||
* This is called when our browse button is clicked
|
||||
*/
|
||||
nsresult
|
||||
nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
NS_IMETHODIMP
|
||||
nsFileControlFrame::MouseListener::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
{
|
||||
NS_ASSERTION(mFrame, "We should have been unregistered");
|
||||
|
||||
// only allow the left button
|
||||
nsCOMPtr<nsIDOMMouseEvent> mouseEvent = do_QueryInterface(aMouseEvent);
|
||||
nsCOMPtr<nsIDOMNSUIEvent> uiEvent = do_QueryInterface(aMouseEvent);
|
||||
@ -288,7 +290,7 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
nsresult result;
|
||||
|
||||
// Get parent nsIDOMWindowInternal object.
|
||||
nsIContent* content = GetContent();
|
||||
nsIContent* content = mFrame->GetContent();
|
||||
if (!content)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
@ -314,7 +316,7 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
|
||||
// Set default directry and filename
|
||||
nsAutoString defaultName;
|
||||
GetFormProperty(nsGkAtoms::value, defaultName);
|
||||
mFrame->GetFormProperty(nsGkAtoms::value, defaultName);
|
||||
|
||||
nsCOMPtr<nsILocalFile> currentFile = do_CreateInstance("@mozilla.org/file/local;1");
|
||||
if (currentFile && !defaultName.IsEmpty()) {
|
||||
@ -338,7 +340,7 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
}
|
||||
|
||||
// Tell our textframe to remember the currently focused value
|
||||
mTextFrame->InitFocusedValue();
|
||||
mFrame->mTextFrame->InitFocusedValue();
|
||||
|
||||
// Open dialog
|
||||
PRInt16 mode;
|
||||
@ -348,8 +350,11 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
if (mode == nsIFilePicker::returnCancel)
|
||||
return NS_OK;
|
||||
|
||||
if (!mTextFrame) {
|
||||
// We got destroyed while the filepicker was up. Don't do anything here.
|
||||
if (!mFrame) {
|
||||
// The frame got destroyed while the filepicker was up. Don't do
|
||||
// anything here.
|
||||
// (This listener itself can't be destroyed because the event listener
|
||||
// manager holds a strong reference to us while it fires the event.)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -363,16 +368,16 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
// Tell mTextFrame that this update of the value is a user initiated
|
||||
// change. Otherwise it'll think that the value is being set by a script
|
||||
// and not fire onchange when it should.
|
||||
PRBool oldState = mTextFrame->GetFireChangeEventState();
|
||||
mTextFrame->SetFireChangeEventState(PR_TRUE);
|
||||
nsCOMPtr<nsIFileControlElement> fileControl = do_QueryInterface(mContent);
|
||||
PRBool oldState = mFrame->mTextFrame->GetFireChangeEventState();
|
||||
mFrame->mTextFrame->SetFireChangeEventState(PR_TRUE);
|
||||
nsCOMPtr<nsIFileControlElement> fileControl = do_QueryInterface(content);
|
||||
if (fileControl) {
|
||||
fileControl->SetFileName(unicodePath);
|
||||
}
|
||||
|
||||
mTextFrame->SetFireChangeEventState(oldState);
|
||||
mFrame->mTextFrame->SetFireChangeEventState(oldState);
|
||||
// May need to fire an onchange here
|
||||
mTextFrame->CheckFireOnChange();
|
||||
mFrame->mTextFrame->CheckFireOnChange();
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
@ -615,13 +620,3 @@ NS_IMETHODIMP nsFileControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
||||
NS_IMPL_ISUPPORTS2(nsFileControlFrame::MouseListener,
|
||||
nsIDOMMouseListener,
|
||||
nsIDOMEventListener)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFileControlFrame::MouseListener::MouseClick(nsIDOMEvent* aMouseEvent)
|
||||
{
|
||||
if (mFrame) {
|
||||
return mFrame->MouseClick(aMouseEvent);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -126,8 +126,6 @@ protected:
|
||||
nsFileControlFrame* mFrame;
|
||||
};
|
||||
|
||||
nsresult MouseClick(nsIDOMEvent* aMouseEvent);
|
||||
|
||||
virtual PRBool IsFrameOfType(PRUint32 aFlags) const
|
||||
{
|
||||
return nsAreaFrame::IsFrameOfType(aFlags &
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user