Bug 378371 - Crash [@ nsNativeDragTarget::ProcessDrag] when drag event handler and removing iframe, patch by Andrew Smith, r+sr=roc, (blocking1.9+)

This commit is contained in:
martijn.martijn@gmail.com 2007-09-28 15:45:14 -07:00
Родитель cc831ba0e1
Коммит a4ad8c4b8a
3 изменённых файлов: 16 добавлений и 8 удалений

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

@ -75,7 +75,7 @@ static POINTL gDragLastPoint;
// construction // construction
//----------------------------------------------------- //-----------------------------------------------------
nsNativeDragTarget::nsNativeDragTarget(nsIWidget * aWnd) nsNativeDragTarget::nsNativeDragTarget(nsIWidget * aWnd)
: m_cRef(0), mWindow(aWnd), mCanMove(PR_TRUE) : m_cRef(0), mWindow(aWnd), mCanMove(PR_TRUE), mDragCancelled(PR_FALSE)
{ {
mHWnd = (HWND)mWindow->GetNativeData(NS_NATIVE_WINDOW); mHWnd = (HWND)mWindow->GetNativeData(NS_NATIVE_WINDOW);
@ -294,10 +294,15 @@ nsNativeDragTarget::DragOver(DWORD grfKeyState,
return ResultFromScode(E_FAIL); return ResultFromScode(E_FAIL);
} }
// without the AddRef() |this| can get destroyed in an event handler
this->AddRef();
mDragService->FireDragEventAtSource(NS_DRAGDROP_DRAG); mDragService->FireDragEventAtSource(NS_DRAGDROP_DRAG);
if (!mDragCancelled) {
// Now process the native drag state and then dispatch the event
ProcessDrag(nsnull, NS_DRAGDROP_OVER, grfKeyState, pt, pdwEffect);
}
this->Release();
// Now process the native drag state and then dispatch the event
ProcessDrag(nsnull, NS_DRAGDROP_OVER, grfKeyState, pt, pdwEffect);
return S_OK; return S_OK;
} }

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

@ -90,6 +90,8 @@ public:
STDMETHODIMP Drop(LPDATAOBJECT pSource, DWORD grfKeyState, STDMETHODIMP Drop(LPDATAOBJECT pSource, DWORD grfKeyState,
POINTL point, DWORD* pEffect); POINTL point, DWORD* pEffect);
PRBool mDragCancelled;
protected: protected:
void GetGeckoDragAction(LPDATAOBJECT pData, DWORD grfKeyState, void GetGeckoDragAction(LPDATAOBJECT pData, DWORD grfKeyState,

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

@ -3096,6 +3096,7 @@ NS_METHOD nsWindow::EnableDragDrop(PRBool aEnable)
if (S_OK == ::CoLockObjectExternal((LPUNKNOWN)mNativeDragTarget, FALSE, TRUE)) { if (S_OK == ::CoLockObjectExternal((LPUNKNOWN)mNativeDragTarget, FALSE, TRUE)) {
rv = NS_OK; rv = NS_OK;
} }
mNativeDragTarget->mDragCancelled = PR_TRUE;
NS_RELEASE(mNativeDragTarget); NS_RELEASE(mNativeDragTarget);
} }
} }
@ -4608,11 +4609,11 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
#endif #endif
case WM_SETFOCUS: case WM_SETFOCUS:
result = DispatchFocus(NS_GOTFOCUS, PR_TRUE); result = DispatchFocus(NS_GOTFOCUS, PR_TRUE);
if (gJustGotActivate) { if (gJustGotActivate) {
gJustGotActivate = PR_FALSE; gJustGotActivate = PR_FALSE;
gJustGotDeactivate = PR_FALSE; gJustGotDeactivate = PR_FALSE;
result = DispatchFocus(NS_ACTIVATE, PR_TRUE); result = DispatchFocus(NS_ACTIVATE, PR_TRUE);
} }
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY