M mozilla/nppluglet.h
M src/Pluglet.cpp
M src/Pluglet.h
M src/PlugletEngine.cpp

SetWindow works.  Next step is to try hook up scriptability.
This commit is contained in:
edburns%acm.org 2006-10-13 14:45:14 +00:00
Родитель 0952825320
Коммит c7d2ffa09e
5 изменённых файлов: 84 добавлений и 25 удалений

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

@ -154,8 +154,9 @@ void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin)
//
nsPluginInstance::nsPluginInstance(nsPluginCreateData * aCreateDataStruct) : nsPluginInstanceBase(),
mInstance(aCreateDataStruct->instance),
mInitialized(FALSE),
mScriptablePeer(NULL)
mInitialized(PR_FALSE),
mScriptablePeer(nsnull),
mPluglet(nsnull)
{
mCreateDataStruct.instance = aCreateDataStruct->instance;
mCreateDataStruct.type = aCreateDataStruct->type;
@ -168,26 +169,82 @@ nsPluginInstance::nsPluginInstance(nsPluginCreateData * aCreateDataStruct) : nsP
nsPluginInstance::~nsPluginInstance()
{
if (mPluglet) {
mPluglet->Destroy();
mPluglet = nsnull;
}
mInitialized = PR_FALSE;
// mScriptablePeer may be also held by the browser
// so releasing it here does not guarantee that it is over
// we should take precaution in case it will be called later
// and zero its mPlugin member
mScriptablePeer->SetInstance(NULL);
mScriptablePeer->SetInstance(nsnull);
NS_IF_RELEASE(mScriptablePeer);
}
NPBool nsPluginInstance::init(NPWindow* aWindow)
{
if(aWindow == NULL)
return FALSE;
nsresult rv = NS_ERROR_FAILURE;
nsPluginWindow pluginWindow;
mInitialized = TRUE;
return TRUE;
if (mInitialized) {
return PR_TRUE;
}
if(nsnull == aWindow || nsnull == mPluglet) {
return mInitialized;
}
nsCOMPtr<nsIPluginInstance> ns4xPluginInst =
do_QueryInterface((nsISupports*)mInstance->ndata, &rv);
if (NS_FAILED(rv)) {
return mInitialized;
}
nsCOMPtr<nsIPluginInstancePeer> peer = nsnull;
rv = ns4xPluginInst->GetPeer(getter_AddRefs(peer));
if(NS_FAILED(rv)) {
return mInitialized;
}
rv = mPluglet->Initialize(peer);
#if defined(XP_MAC) || defined(XP_MACOSX)
#elif defined(XP_WIN) || defined(XP_OS2)
pluginWindow.window = (nsPluginPort *) aWindow->window;
#elif defined(XP_UNIX) && defined(MOZ_X11)
#else
#endif
pluginWindow.x = aWindow->x;
pluginWindow.y = aWindow->y;
pluginWindow.width = aWindow->width;
pluginWindow.height = aWindow->height;
pluginWindow.clipRect.top = aWindow->clipRect.top;
pluginWindow.clipRect.left = aWindow->clipRect.left;
pluginWindow.clipRect.bottom = aWindow->clipRect.bottom;
pluginWindow.clipRect.right = aWindow->clipRect.right;
#if defined(XP_UNIX) && !defined(XP_MACOSX)
pluginWindow.ws_info = aWindow->ws_info;
#endif
pluginWindow.type = aWindow->type == NPWindowTypeWindow ?
nsPluginWindowType_Window : nsPluginWindowType_Drawable;
rv = mPluglet->SetWindow(&pluginWindow);
if (NS_SUCCEEDED(rv)) {
rv = mPluglet->Start();
if (NS_SUCCEEDED(rv)) {
mInitialized = PR_TRUE;
}
}
return mInitialized;
}
void nsPluginInstance::shut()
{
mInitialized = FALSE;
if (mInitialized) {
if (mPluglet) {
mPluglet->Stop();
}
}
}
NPBool nsPluginInstance::isInitialized()
@ -200,16 +257,16 @@ NS_IMETHODIMP nsPluginInstance::HasPlugletForMimeType(const char *aMimeType,
{
nsresult rv = NS_ERROR_FAILURE;
nsCOMPtr<nsIPlugin> pluglet =
nsCOMPtr<nsIPlugin> plugletEngine =
do_GetService(PLUGLETENGINE_ContractID, &rv);
void *outInstance = nsnull;
*outResult = PR_FALSE;
nsIID scriptableIID = NS_ISIMPLEPLUGIN_IID;
if (NS_SUCCEEDED(rv)) {
rv = pluglet->CreatePluginInstance(nsnull, scriptableIID,
aMimeType, &outInstance);
if (NS_SUCCEEDED(rv) && outInstance) {
rv = plugletEngine->CreatePluginInstance(nsnull, scriptableIID,
aMimeType,
getter_AddRefs(mPluglet));
if (NS_SUCCEEDED(rv) && mPluglet) {
*outResult = PR_TRUE;
}
}

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

@ -40,6 +40,8 @@
#include "pluginbase.h"
#include "nsScriptablePeer.h"
#include "nsCOMPtr.h"
#include "nsIPluginInstance.h"
class nsPluginInstance : public nsPluginInstanceBase
{
@ -64,6 +66,7 @@ public:
private:
NPP mInstance;
NPBool mInitialized;
nsCOMPtr<nsIPluginInstance> mPluglet;
nsScriptablePeer * mScriptablePeer;
nsPluginCreateData mCreateDataStruct;

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

@ -42,7 +42,7 @@ static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID);
NS_IMPL_ISUPPORTS1(Pluglet,nsIPluginInstance);
Pluglet::Pluglet(jobject object) : plugletEngine(nsnull) {
Pluglet::Pluglet(jobject object) : plugletEngine(nsnull), peer(nsnull) {
nsIServiceManager *servman = nsnull;
NS_GetServiceManager(&servman);
nsresult rv;
@ -66,7 +66,6 @@ Pluglet::Pluglet(jobject object) : plugletEngine(nsnull) {
jthis = jniEnv->NewGlobalRef(object);
//nb check for null
peer = NULL;
view = PlugletViewFactory::GetPlugletView();
Registry::SetPeer(jthis,(jlong)this);
}
@ -83,7 +82,7 @@ Pluglet::~Pluglet() {
}
jniEnv->DeleteGlobalRef(jthis);
NS_RELEASE(peer);
peer = nsnull;
}
NS_METHOD Pluglet::HandleEvent(nsPluginEvent* event, PRBool* handled) {
@ -148,20 +147,20 @@ NS_METHOD Pluglet::Initialize(nsIPluginInstancePeer* _peer) {
}
}
peer = _peer;
peer->AddRef();
jobject obj = PlugletPeer::GetJObject(peer);
if (!obj) {
return NS_ERROR_FAILURE;
if (peer) {
jobject obj = PlugletPeer::GetJObject(peer);
if (!obj) {
return NS_ERROR_FAILURE;
}
env->CallVoidMethod(jthis,initializeMID,obj);
}
env->CallVoidMethod(jthis,initializeMID,obj);
return NS_OK;
}
NS_METHOD Pluglet::GetPeer(nsIPluginInstancePeer* *result) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("Pluglet::GetPeer\n"));
peer->AddRef();
*result = peer;
NS_ADDREF(*result = peer);
return NS_OK;
}

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

@ -52,7 +52,7 @@ class Pluglet : public nsIPluginInstance {
static jmethodID setWindowMID;
static jmethodID printMID;
static jmethodID getValueMID;
nsIPluginInstancePeer *peer;
nsCOMPtr<nsIPluginInstancePeer> peer;
PlugletView *view;
nsCOMPtr<iPlugletEngine> plugletEngine;
};

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

@ -202,7 +202,7 @@ void PlugletEngine::StartJVM() {
options[3].optionString=""; //-Djava.compiler=NONE";
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = 1; // EDBURNS: Change for debugging
vm_args.nOptions = 3; // EDBURNS: Change for debugging
vm_args.ignoreUnrecognized = JNI_FALSE;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);