Fixing bug 48972 -- adding GetOwner interface method to plugin instance peer, r=peterl, sr=beard

This commit is contained in:
av%netscape.com 2002-08-23 11:23:49 +00:00
parent 4b9a8a51c9
commit 2536baebbc
4 changed files with 54 additions and 103 deletions

View File

@ -55,7 +55,7 @@ public:
* To get a plugin instance owner
*/
NS_IMETHOD
GetOwner(nsCOMPtr<nsIPluginInstanceOwner> &aOwner) = 0;
GetOwner(nsIPluginInstanceOwner **aOwner) = 0;
};
#endif /* nsPIPluginInstancePeer_h___ */

View File

@ -506,10 +506,11 @@ nsActivePlugin::~nsActivePlugin()
if(mPeer)
{
nsresult rv = NS_OK;
nsPluginInstancePeerImpl * peer = (nsPluginInstancePeerImpl *)mPeer;
nsCOMPtr<nsPIPluginInstancePeer> peer(do_QueryInterface(mPeer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
rv = peer->GetOwner(*getter_AddRefs(owner));
owner->SetInstance(nsnull);
rv = peer->GetOwner(getter_AddRefs(owner));
if (owner)
owner->SetInstance(nsnull);
}
// now check for cached plugins because they haven't had nsIPluginInstance::Destroy()
@ -711,9 +712,9 @@ void nsActivePluginList::stopRunning(nsISupportsArray* aReloadDocs)
// removing duplicates. These will be reframed (embedded) or reloaded (full-page) later
// to kickstart our instances.
if (aReloadDocs && p->mPeer) {
nsPluginInstancePeerImpl * peer = (nsPluginInstancePeerImpl *)p->mPeer;
nsCOMPtr<nsPIPluginInstancePeer> peer(do_QueryInterface(p->mPeer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
peer->GetOwner(*getter_AddRefs(owner));
peer->GetOwner(getter_AddRefs(owner));
if (owner) {
nsCOMPtr<nsIDocument> doc;
owner->GetDocument(getter_AddRefs(doc));
@ -3027,17 +3028,14 @@ NS_IMETHODIMP nsPluginHostImpl::GetURLWithHeaders(nsISupports* pluginInst,
{
if (nsnull != target)
{
nsPluginInstancePeerImpl *peer;
rv = instance->GetPeer(NS_REINTERPRET_CAST(nsIPluginInstancePeer **, &peer));
nsCOMPtr<nsIPluginInstancePeer> peer;
rv = instance->GetPeer(getter_AddRefs(peer));
if (NS_SUCCEEDED(rv) && peer)
{
nsCOMPtr<nsPIPluginInstancePeer> privpeer(do_QueryInterface(peer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
rv = peer->GetOwner(*getter_AddRefs(owner));
if (NS_SUCCEEDED(rv))
rv = privpeer->GetOwner(getter_AddRefs(owner));
if (owner)
{
if ((0 == PL_strcmp(target, "newwindow")) ||
(0 == PL_strcmp(target, "_new")))
@ -3045,19 +3043,14 @@ NS_IMETHODIMP nsPluginHostImpl::GetURLWithHeaders(nsISupports* pluginInst,
else if (0 == PL_strcmp(target, "_current"))
target = "_self";
rv = owner->GetURL(url, target, nsnull, 0, (void *) getHeaders,
getHeadersLength);
rv = owner->GetURL(url, target, nsnull, 0, (void *) getHeaders, getHeadersLength);
}
NS_RELEASE(peer);
}
}
if (nsnull != streamListener)
rv = NewPluginURLStream(string, instance, streamListener, nsnull,
PR_FALSE, nsnull, getHeaders, getHeadersLength);
NS_RELEASE(instance);
}
return rv;
@ -3112,16 +3105,15 @@ NS_IMETHODIMP nsPluginHostImpl::PostURL(nsISupports* pluginInst,
if (nsnull != target)
{
nsPluginInstancePeerImpl *peer;
rv = instance->GetPeer(NS_REINTERPRET_CAST(nsIPluginInstancePeer **, &peer));
nsCOMPtr<nsIPluginInstancePeer> peer;
rv = instance->GetPeer(getter_AddRefs(peer));
if (NS_SUCCEEDED(rv) && peer)
{
nsCOMPtr<nsPIPluginInstancePeer> privpeer(do_QueryInterface(peer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
rv = peer->GetOwner(*getter_AddRefs(owner));
if (NS_SUCCEEDED(rv))
rv = privpeer->GetOwner(getter_AddRefs(owner));
if (owner)
{
if (!target) {
target = "_self";
@ -3137,8 +3129,6 @@ NS_IMETHODIMP nsPluginHostImpl::PostURL(nsISupports* pluginInst,
rv = owner->GetURL(url, target, (void*)dataToPost, postDataLen,
(void*) postHeaders, postHeadersLength, isFile);
}
NS_RELEASE(peer);
}
}
@ -5063,8 +5053,9 @@ NS_IMETHODIMP nsPluginHostImpl::LoadPlugins()
nsresult nsPluginHostImpl::FindPlugins(PRBool aCreatePluginList, PRBool * aPluginsChanged)
{
// let's start timing if we are only really creating the plugin list
if (aCreatePluginList)
NS_TIMELINE_START_TIMER("LoadPlugins");
if (aCreatePluginList) {
NS_TIMELINE_START_TIMER("LoadPlugins");
}
#ifdef CALL_SAFETY_ON
// check preferences on whether or not we want to try safe calls to plugins
@ -5614,13 +5605,15 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL,
// get the full URL of the document that the plugin is embedded
// in to create an absolute url in case aURL is relative
nsCOMPtr<nsIDocument> doc;
nsPluginInstancePeerImpl *peer;
nsCOMPtr<nsIPluginInstancePeer> peer;
rv = aInstance->GetPeer(getter_AddRefs(peer));
rv = aInstance->GetPeer(NS_REINTERPRET_CAST(nsIPluginInstancePeer **, &peer));
if (NS_SUCCEEDED(rv) && peer)
{
nsCOMPtr<nsPIPluginInstancePeer> privpeer(do_QueryInterface(peer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
rv = peer->GetOwner(*getter_AddRefs(owner));
if (NS_SUCCEEDED(rv) && owner)
rv = privpeer->GetOwner(getter_AddRefs(owner));
if (owner)
{
rv = owner->GetDocument(getter_AddRefs(doc));
if (NS_SUCCEEDED(rv) && doc)
@ -5633,7 +5626,6 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL,
rv = NS_MakeAbsoluteURI(absUrl, aURL, docURL);
}
}
NS_RELEASE(peer);
}
if (absUrl.IsEmpty())
@ -6107,10 +6099,11 @@ NS_IMETHODIMP nsPluginHostImpl::HandleBadPlugin(PRLibrary* aLibrary, nsIPluginIn
nsCOMPtr<nsIPluginInstanceOwner> owner;
if (instance) {
nsPluginInstancePeerImpl *peer;
rv =instance->GetPeer(NS_REINTERPRET_CAST(nsIPluginInstancePeer **, &peer));
nsCOMPtr<nsIPluginInstancePeer> peer;
rv =instance->GetPeer(getter_AddRefs(peer));
if (NS_SUCCEEDED(rv) && peer) {
peer->GetOwner(*getter_AddRefs(owner));
nsCOMPtr<nsPIPluginInstancePeer> privpeer(do_QueryInterface(peer));
privpeer->GetOwner(getter_AddRefs(owner));
}
}
@ -6544,20 +6537,18 @@ nsresult nsPluginStreamListenerPeer::ServeStreamAsFile(nsIRequest *request,
// mInstance->Stop calls mPStreamListener->CleanUpStream(), so stream will be properly clean up
mInstance->Stop();
mInstance->Start();
nsPluginInstancePeerImpl *peer;
mInstance->GetPeer(NS_REINTERPRET_CAST(nsIPluginInstancePeer **, &peer));
nsCOMPtr<nsIPluginInstancePeer> peer;
mInstance->GetPeer(getter_AddRefs(peer));
if (peer) {
nsCOMPtr<nsPIPluginInstancePeer> privpeer(do_QueryInterface(peer));
nsCOMPtr<nsIPluginInstanceOwner> owner;
peer->GetOwner(*getter_AddRefs(owner));
privpeer->GetOwner(getter_AddRefs(owner));
if (owner) {
nsPluginWindow *window = nsnull;
owner->GetWindow(window);
if (window->window)
mInstance->SetWindow(window);
}
// because we are starting plugin using existing peer
// it'll get one extra RefCnt, release it here.
NS_RELEASE(peer);
}
mPluginStreamInfo->SetSeekable(0);

View File

@ -86,55 +86,15 @@ nsPluginInstancePeerImpl::~nsPluginInstancePeerImpl()
static NS_DEFINE_IID(kIPluginTagInfoIID, NS_IPLUGINTAGINFO_IID);
static NS_DEFINE_IID(kIPluginTagInfo2IID, NS_IPLUGINTAGINFO2_IID);
static NS_DEFINE_IID(kIJVMPluginTagInfoIID, NS_IJVMPLUGINTAGINFO_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID);//~~~
NS_IMPL_ADDREF(nsPluginInstancePeerImpl);
NS_IMPL_RELEASE(nsPluginInstancePeerImpl);
nsresult nsPluginInstancePeerImpl::QueryInterface(const nsIID& iid, void** instance)
{
if (instance == NULL)
return NS_ERROR_NULL_POINTER;
if (iid.Equals(NS_GET_IID(nsIPluginInstancePeer)) || iid.Equals(NS_GET_IID(nsIPluginInstancePeer2))) {
*instance = (void *)(nsIPluginInstancePeer2*)this;
AddRef();
return NS_OK;
}
if (iid.Equals(kIWindowlessPluginInstancePeerIID)) {
*instance = (void *)(nsIWindowlessPluginInstancePeer*)this;
AddRef();
return NS_OK;
}
if (iid.Equals(kIPluginTagInfoIID)) {
*instance = (void *)(nsIPluginTagInfo *)this;
AddRef();
return NS_OK;
}
if (iid.Equals(kIPluginTagInfo2IID)) {
*instance = (void *)(nsIPluginTagInfo2 *)this;
AddRef();
return NS_OK;
}
if (iid.Equals(kIJVMPluginTagInfoIID)) {
*instance = (void *)(nsIJVMPluginTagInfo *)this;
AddRef();
return NS_OK;
}
if (iid.Equals(kISupportsIID)) {
*instance = (void *)(nsISupports *)(nsIPluginTagInfo *)this;
AddRef();
return NS_OK;
}
return NS_NOINTERFACE;
}
NS_IMPL_ISUPPORTS7(nsPluginInstancePeerImpl,
nsIPluginInstancePeer,
nsIPluginInstancePeer2,
nsIWindowlessPluginInstancePeer,
nsIPluginTagInfo,
nsIPluginTagInfo2,
nsIJVMPluginTagInfo,
nsPIPluginInstancePeer);
NS_IMETHODIMP nsPluginInstancePeerImpl::GetValue(nsPluginInstancePeerVariable variable, void *value)
{
@ -837,18 +797,14 @@ nsresult nsPluginInstancePeerImpl::SetOwner(nsIPluginInstanceOwner *aOwner)
return NS_OK;
}
nsresult nsPluginInstancePeerImpl::GetOwner(nsIPluginInstanceOwner *&aOwner)
NS_IMETHODIMP nsPluginInstancePeerImpl::GetOwner(nsIPluginInstanceOwner **aOwner)
{
aOwner = mOwner;
NS_ENSURE_ARG_POINTER(aOwner);
*aOwner = mOwner;
NS_IF_ADDREF(mOwner);
if (nsnull != mOwner)
return NS_OK;
else
return NS_ERROR_FAILURE;
return (mOwner) ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP nsPluginInstancePeerImpl::InvalidateRect(nsPluginRect *invalidRect)
{
if(!mOwner)

View File

@ -43,12 +43,13 @@
#include "nsIPluginTagInfo.h"
#include "nsIPluginInstanceOwner.h"
#include "nsIJVMPluginTagInfo.h"
#include "nsPIPluginInstancePeer.h"
class nsPluginInstancePeerImpl : public nsIPluginInstancePeer2,
public nsIWindowlessPluginInstancePeer,
public nsIPluginTagInfo2,
public nsIJVMPluginTagInfo
public nsIJVMPluginTagInfo,
public nsPIPluginInstancePeer
{
public:
@ -171,6 +172,11 @@ public:
NS_IMETHOD
GetMayScript(PRBool *result);
// nsPIPluginInstancePeer interface
NS_IMETHOD
GetOwner(nsIPluginInstanceOwner **aOwner);
//locals
nsresult Initialize(nsIPluginInstanceOwner *aOwner,
@ -178,8 +184,6 @@ public:
nsresult SetOwner(nsIPluginInstanceOwner *aOwner);
nsresult GetOwner(nsIPluginInstanceOwner *&aOwner);
private:
nsIPluginInstance *mInstance; //we don't add a ref to this
nsIPluginInstanceOwner *mOwner; //we don't add a ref to this