зеркало из https://github.com/mozilla/gecko-dev.git
Fixing 91140, the Acrobat blocker -- latering plugin stream destruction, r=peterl, bnesse, sr=vidur
This commit is contained in:
Родитель
f43f993809
Коммит
bd2a05ee70
|
@ -50,7 +50,9 @@ static NS_DEFINE_IID(kIPluginStreamListener2IID, NS_IPLUGINSTREAMLISTENER2_IID);
|
||||||
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
||||||
void* notifyData)
|
void* notifyData)
|
||||||
: mNotifyData(notifyData),
|
: mNotifyData(notifyData),
|
||||||
mStreamInfo(nsnull)
|
mStreamInfo(nsnull),
|
||||||
|
mStreamStarted(PR_FALSE),
|
||||||
|
mStreamCleanedUp(PR_FALSE)
|
||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mInst = (ns4xPluginInstance*) inst;
|
mInst = (ns4xPluginInstance*) inst;
|
||||||
|
@ -65,9 +67,79 @@ ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
||||||
|
|
||||||
ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
|
ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
|
||||||
{
|
{
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("ns4xPluginStreamListener::~ns4xPluginStreamListener\n");
|
||||||
|
#endif
|
||||||
|
CleanUpStream();
|
||||||
NS_IF_RELEASE(mInst);
|
NS_IF_RELEASE(mInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult ns4xPluginStreamListener::CleanUpStream()
|
||||||
|
{
|
||||||
|
if(!mStreamStarted || mStreamCleanedUp)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
if(!mInst)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
NPP npp;
|
||||||
|
const NPPluginFuncs *callbacks = nsnull;
|
||||||
|
|
||||||
|
mInst->GetCallbacks(&callbacks);
|
||||||
|
mInst->GetNPP(&npp);
|
||||||
|
|
||||||
|
if(!callbacks)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
NPError error;
|
||||||
|
|
||||||
|
if (callbacks->destroystream != NULL)
|
||||||
|
{
|
||||||
|
// XXX need to convert status to NPReason
|
||||||
|
PRLibrary* lib = nsnull;
|
||||||
|
lib = mInst->fLibrary;
|
||||||
|
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("calling NPP_DestroyStream\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
|
||||||
|
npp,
|
||||||
|
&mNPStream,
|
||||||
|
NPRES_DONE), lib);
|
||||||
|
if(error != NPERR_NO_ERROR)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check to see if we have a call back and a
|
||||||
|
// XXX nasty hack for Shockwave Registration.
|
||||||
|
// we seem to crash doing URLNotify so just always exclude it.
|
||||||
|
// See bug 85334.
|
||||||
|
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
|
||||||
|
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
|
||||||
|
{
|
||||||
|
PRLibrary* lib = nsnull;
|
||||||
|
lib = mInst->fLibrary;
|
||||||
|
|
||||||
|
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
|
||||||
|
npp,
|
||||||
|
mNPStream.url,
|
||||||
|
nsPluginReason_Done,
|
||||||
|
mNotifyData), lib);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lets get rid of the buffer if we made one globally
|
||||||
|
if (mStreamBuffer)
|
||||||
|
{
|
||||||
|
PR_Free(mStreamBuffer);
|
||||||
|
mStreamBuffer=nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStreamCleanedUp = PR_TRUE;
|
||||||
|
mStreamStarted = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
|
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
|
||||||
nsIPluginStreamListener2);
|
nsIPluginStreamListener2);
|
||||||
|
|
||||||
|
@ -144,6 +216,7 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mStreamStarted = PR_TRUE;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,61 +520,26 @@ NS_IMETHODIMP
|
||||||
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
|
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
|
||||||
nsresult status)
|
nsresult status)
|
||||||
{
|
{
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("ns4xPluginStreamListener::OnStopBinding\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!mInst || !mInst->IsStarted())
|
if(!mInst || !mInst->IsStarted())
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
NPP npp;
|
if(pluginInfo) {
|
||||||
const NPPluginFuncs *callbacks = nsnull;
|
|
||||||
|
|
||||||
mInst->GetCallbacks(&callbacks);
|
|
||||||
mInst->GetNPP(&npp);
|
|
||||||
|
|
||||||
if(!callbacks)
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
NPError error;
|
|
||||||
|
|
||||||
pluginInfo->GetURL(&mNPStream.url);
|
pluginInfo->GetURL(&mNPStream.url);
|
||||||
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
|
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
|
||||||
|
}
|
||||||
|
|
||||||
if (callbacks->destroystream != NULL)
|
// check if the stream is not of asfileonly type and later its destruction
|
||||||
{
|
// see bug 91140
|
||||||
// XXX need to convert status to NPReason
|
nsresult rv = NS_OK;
|
||||||
PRLibrary* lib = nsnull;
|
if(mStreamType == nsPluginStreamType_AsFileOnly)
|
||||||
lib = mInst->fLibrary;
|
rv = CleanUpStream();
|
||||||
|
|
||||||
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
|
if(rv != NPERR_NO_ERROR)
|
||||||
npp,
|
|
||||||
&mNPStream,
|
|
||||||
NPRES_DONE), lib);
|
|
||||||
if(error != NPERR_NO_ERROR)
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
// check to see if we have a call back and a
|
|
||||||
// XXX nasty hack for Shockwave Registration.
|
|
||||||
// we seem to crash doing URLNotify so just always exclude it.
|
|
||||||
// See bug 85334.
|
|
||||||
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
|
|
||||||
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
|
|
||||||
{
|
|
||||||
PRLibrary* lib = nsnull;
|
|
||||||
lib = mInst->fLibrary;
|
|
||||||
|
|
||||||
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
|
|
||||||
npp,
|
|
||||||
mNPStream.url,
|
|
||||||
nsPluginReason_Done,
|
|
||||||
mNotifyData), lib);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// lets get rid of the buffer if we made one globally
|
|
||||||
if (mStreamBuffer)
|
|
||||||
{
|
|
||||||
PR_Free(mStreamBuffer);
|
|
||||||
mStreamBuffer=nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ public:
|
||||||
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
|
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
|
||||||
virtual ~ns4xPluginStreamListener();
|
virtual ~ns4xPluginStreamListener();
|
||||||
PRBool IsStarted();
|
PRBool IsStarted();
|
||||||
|
nsresult CleanUpStream();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void* mNotifyData;
|
void* mNotifyData;
|
||||||
|
@ -57,6 +58,8 @@ protected:
|
||||||
PRUint32 mPosition;
|
PRUint32 mPosition;
|
||||||
PRUint32 mCurrentStreamOffset;
|
PRUint32 mCurrentStreamOffset;
|
||||||
nsPluginStreamType mStreamType;
|
nsPluginStreamType mStreamType;
|
||||||
|
PRBool mStreamStarted;
|
||||||
|
PRBool mStreamCleanedUp;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
nsIPluginStreamInfo * mStreamInfo;
|
nsIPluginStreamInfo * mStreamInfo;
|
||||||
|
|
|
@ -50,7 +50,9 @@ static NS_DEFINE_IID(kIPluginStreamListener2IID, NS_IPLUGINSTREAMLISTENER2_IID);
|
||||||
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
||||||
void* notifyData)
|
void* notifyData)
|
||||||
: mNotifyData(notifyData),
|
: mNotifyData(notifyData),
|
||||||
mStreamInfo(nsnull)
|
mStreamInfo(nsnull),
|
||||||
|
mStreamStarted(PR_FALSE),
|
||||||
|
mStreamCleanedUp(PR_FALSE)
|
||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mInst = (ns4xPluginInstance*) inst;
|
mInst = (ns4xPluginInstance*) inst;
|
||||||
|
@ -65,9 +67,79 @@ ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst,
|
||||||
|
|
||||||
ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
|
ns4xPluginStreamListener::~ns4xPluginStreamListener(void)
|
||||||
{
|
{
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("ns4xPluginStreamListener::~ns4xPluginStreamListener\n");
|
||||||
|
#endif
|
||||||
|
CleanUpStream();
|
||||||
NS_IF_RELEASE(mInst);
|
NS_IF_RELEASE(mInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult ns4xPluginStreamListener::CleanUpStream()
|
||||||
|
{
|
||||||
|
if(!mStreamStarted || mStreamCleanedUp)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
if(!mInst)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
NPP npp;
|
||||||
|
const NPPluginFuncs *callbacks = nsnull;
|
||||||
|
|
||||||
|
mInst->GetCallbacks(&callbacks);
|
||||||
|
mInst->GetNPP(&npp);
|
||||||
|
|
||||||
|
if(!callbacks)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
NPError error;
|
||||||
|
|
||||||
|
if (callbacks->destroystream != NULL)
|
||||||
|
{
|
||||||
|
// XXX need to convert status to NPReason
|
||||||
|
PRLibrary* lib = nsnull;
|
||||||
|
lib = mInst->fLibrary;
|
||||||
|
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("calling NPP_DestroyStream\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
|
||||||
|
npp,
|
||||||
|
&mNPStream,
|
||||||
|
NPRES_DONE), lib);
|
||||||
|
if(error != NPERR_NO_ERROR)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check to see if we have a call back and a
|
||||||
|
// XXX nasty hack for Shockwave Registration.
|
||||||
|
// we seem to crash doing URLNotify so just always exclude it.
|
||||||
|
// See bug 85334.
|
||||||
|
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
|
||||||
|
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
|
||||||
|
{
|
||||||
|
PRLibrary* lib = nsnull;
|
||||||
|
lib = mInst->fLibrary;
|
||||||
|
|
||||||
|
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
|
||||||
|
npp,
|
||||||
|
mNPStream.url,
|
||||||
|
nsPluginReason_Done,
|
||||||
|
mNotifyData), lib);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lets get rid of the buffer if we made one globally
|
||||||
|
if (mStreamBuffer)
|
||||||
|
{
|
||||||
|
PR_Free(mStreamBuffer);
|
||||||
|
mStreamBuffer=nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
mStreamCleanedUp = PR_TRUE;
|
||||||
|
mStreamStarted = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
|
NS_IMPL_ISUPPORTS2(ns4xPluginStreamListener, nsIPluginStreamListener,
|
||||||
nsIPluginStreamListener2);
|
nsIPluginStreamListener2);
|
||||||
|
|
||||||
|
@ -144,6 +216,7 @@ ns4xPluginStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mStreamStarted = PR_TRUE;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,61 +520,26 @@ NS_IMETHODIMP
|
||||||
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
|
ns4xPluginStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo,
|
||||||
nsresult status)
|
nsresult status)
|
||||||
{
|
{
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
printf("ns4xPluginStreamListener::OnStopBinding\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!mInst || !mInst->IsStarted())
|
if(!mInst || !mInst->IsStarted())
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
NPP npp;
|
if(pluginInfo) {
|
||||||
const NPPluginFuncs *callbacks = nsnull;
|
|
||||||
|
|
||||||
mInst->GetCallbacks(&callbacks);
|
|
||||||
mInst->GetNPP(&npp);
|
|
||||||
|
|
||||||
if(!callbacks)
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
NPError error;
|
|
||||||
|
|
||||||
pluginInfo->GetURL(&mNPStream.url);
|
pluginInfo->GetURL(&mNPStream.url);
|
||||||
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
|
pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified));
|
||||||
|
}
|
||||||
|
|
||||||
if (callbacks->destroystream != NULL)
|
// check if the stream is not of asfileonly type and later its destruction
|
||||||
{
|
// see bug 91140
|
||||||
// XXX need to convert status to NPReason
|
nsresult rv = NS_OK;
|
||||||
PRLibrary* lib = nsnull;
|
if(mStreamType == nsPluginStreamType_AsFileOnly)
|
||||||
lib = mInst->fLibrary;
|
rv = CleanUpStream();
|
||||||
|
|
||||||
NS_TRY_SAFE_CALL_RETURN(error, CallNPP_DestroyStreamProc(callbacks->destroystream,
|
if(rv != NPERR_NO_ERROR)
|
||||||
npp,
|
|
||||||
&mNPStream,
|
|
||||||
NPRES_DONE), lib);
|
|
||||||
if(error != NPERR_NO_ERROR)
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
// check to see if we have a call back and a
|
|
||||||
// XXX nasty hack for Shockwave Registration.
|
|
||||||
// we seem to crash doing URLNotify so just always exclude it.
|
|
||||||
// See bug 85334.
|
|
||||||
if (callbacks->urlnotify != NULL && mNotifyData != nsnull &&
|
|
||||||
strcmp(mNPStream.url,"http://pinger.macromedia.com") < 0 )
|
|
||||||
{
|
|
||||||
PRLibrary* lib = nsnull;
|
|
||||||
lib = mInst->fLibrary;
|
|
||||||
|
|
||||||
NS_TRY_SAFE_CALL_VOID(CallNPP_URLNotifyProc(callbacks->urlnotify,
|
|
||||||
npp,
|
|
||||||
mNPStream.url,
|
|
||||||
nsPluginReason_Done,
|
|
||||||
mNotifyData), lib);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// lets get rid of the buffer if we made one globally
|
|
||||||
if (mStreamBuffer)
|
|
||||||
{
|
|
||||||
PR_Free(mStreamBuffer);
|
|
||||||
mStreamBuffer=nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ public:
|
||||||
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
|
ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData);
|
||||||
virtual ~ns4xPluginStreamListener();
|
virtual ~ns4xPluginStreamListener();
|
||||||
PRBool IsStarted();
|
PRBool IsStarted();
|
||||||
|
nsresult CleanUpStream();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void* mNotifyData;
|
void* mNotifyData;
|
||||||
|
@ -57,6 +58,8 @@ protected:
|
||||||
PRUint32 mPosition;
|
PRUint32 mPosition;
|
||||||
PRUint32 mCurrentStreamOffset;
|
PRUint32 mCurrentStreamOffset;
|
||||||
nsPluginStreamType mStreamType;
|
nsPluginStreamType mStreamType;
|
||||||
|
PRBool mStreamStarted;
|
||||||
|
PRBool mStreamCleanedUp;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
nsIPluginStreamInfo * mStreamInfo;
|
nsIPluginStreamInfo * mStreamInfo;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче