Merge last green changeset on mozilla-inbound to mozilla-central
This commit is contained in:
@@ -61,13 +61,22 @@
|
||||
#include "nsNetCID.h"
|
||||
#include "nsIContent.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
#include "ANPBase.h"
|
||||
#include <android/log.h>
|
||||
#include "android_npapi.h"
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "mozilla/CondVar.h"
|
||||
#include "AndroidBridge.h"
|
||||
#endif
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::plugins::parent;
|
||||
|
||||
static NS_DEFINE_IID(kIOutputStreamIID, NS_IOUTPUTSTREAM_IID);
|
||||
static NS_DEFINE_IID(kIPluginStreamListenerIID, NS_IPLUGINSTREAMLISTENER_IID);
|
||||
|
||||
NS_IMPL_ISUPPORTS0(nsNPAPIPluginInstance)
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS0(nsNPAPIPluginInstance)
|
||||
|
||||
nsNPAPIPluginInstance::nsNPAPIPluginInstance(nsNPAPIPlugin* plugin)
|
||||
:
|
||||
@@ -77,6 +86,10 @@ nsNPAPIPluginInstance::nsNPAPIPluginInstance(nsNPAPIPlugin* plugin)
|
||||
#else
|
||||
mDrawingModel(NPDrawingModelQuickDraw),
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ANDROID
|
||||
mSurface(nsnull),
|
||||
mDrawingModel(0),
|
||||
#endif
|
||||
mRunning(NOT_STARTED),
|
||||
mWindowless(PR_FALSE),
|
||||
@@ -684,7 +697,7 @@ nsNPAPIPluginInstance::UsesDOMForCursor()
|
||||
return mUsesDOMForCursor;
|
||||
}
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
#if defined(XP_MACOSX)
|
||||
void nsNPAPIPluginInstance::SetDrawingModel(NPDrawingModel aModel)
|
||||
{
|
||||
mDrawingModel = aModel;
|
||||
@@ -702,12 +715,69 @@ void nsNPAPIPluginInstance::SetEventModel(NPEventModel aModel)
|
||||
|
||||
owner->SetEventModel(aModel);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(ANDROID)
|
||||
void nsNPAPIPluginInstance::SetDrawingModel(PRUint32 aModel)
|
||||
{
|
||||
mDrawingModel = aModel;
|
||||
}
|
||||
|
||||
class SurfaceGetter : public nsRunnable {
|
||||
public:
|
||||
SurfaceGetter(NPPluginFuncs* aPluginFunctions, NPP_t aNPP) :
|
||||
mHaveSurface(PR_FALSE), mPluginFunctions(aPluginFunctions), mNPP(aNPP) {
|
||||
mLock = new Mutex("SurfaceGetter::Lock");
|
||||
mCondVar = new CondVar(*mLock, "SurfaceGetter::CondVar");
|
||||
|
||||
}
|
||||
~SurfaceGetter() {
|
||||
delete mLock;
|
||||
delete mCondVar;
|
||||
}
|
||||
nsresult Run() {
|
||||
MutexAutoLock lock(*mLock);
|
||||
(*mPluginFunctions->getvalue)(&mNPP, kJavaSurface_ANPGetValue, &mSurface);
|
||||
mHaveSurface = PR_TRUE;
|
||||
mCondVar->Notify();
|
||||
return NS_OK;
|
||||
}
|
||||
void* GetSurface() {
|
||||
MutexAutoLock lock(*mLock);
|
||||
mHaveSurface = PR_FALSE;
|
||||
AndroidBridge::Bridge()->PostToJavaThread(this);
|
||||
while (!mHaveSurface)
|
||||
mCondVar->Wait();
|
||||
return mSurface;
|
||||
}
|
||||
private:
|
||||
NPP_t mNPP;
|
||||
void* mSurface;
|
||||
Mutex* mLock;
|
||||
CondVar* mCondVar;
|
||||
PRBool mHaveSurface;
|
||||
NPPluginFuncs* mPluginFunctions;
|
||||
};
|
||||
|
||||
|
||||
void* nsNPAPIPluginInstance::GetJavaSurface()
|
||||
{
|
||||
if (mDrawingModel != kSurface_ANPDrawingModel)
|
||||
return nsnull;
|
||||
|
||||
if (mSurface)
|
||||
return mSurface;
|
||||
|
||||
nsCOMPtr<SurfaceGetter> sg = new SurfaceGetter(mPlugin->PluginFuncs(), mNPP);
|
||||
mSurface = sg->GetSurface();
|
||||
return mSurface;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
nsresult nsNPAPIPluginInstance::GetDrawingModel(PRInt32* aModel)
|
||||
{
|
||||
#ifdef XP_MACOSX
|
||||
#if defined(XP_MACOSX) || defined(ANDROID)
|
||||
*aModel = (PRInt32)mDrawingModel;
|
||||
return NS_OK;
|
||||
#else
|
||||
@@ -806,7 +876,12 @@ nsNPAPIPluginInstance::DefineJavaProperties()
|
||||
nsresult
|
||||
nsNPAPIPluginInstance::IsWindowless(PRBool* isWindowless)
|
||||
{
|
||||
#ifdef ANDROID
|
||||
// On android, pre-honeycomb, all plugins are treated as windowless.
|
||||
*isWindowless = PR_TRUE;
|
||||
#else
|
||||
*isWindowless = mWindowless;
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -1066,6 +1141,28 @@ nsNPAPIPluginInstance::PrivateModeStateChanged()
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
class DelayUnscheduleEvent : public nsRunnable {
|
||||
public:
|
||||
nsRefPtr<nsNPAPIPluginInstance> mInstance;
|
||||
uint32_t mTimerID;
|
||||
DelayUnscheduleEvent(nsNPAPIPluginInstance* aInstance, uint32_t aTimerId)
|
||||
: mInstance(aInstance)
|
||||
, mTimerID(aTimerId)
|
||||
{}
|
||||
|
||||
~DelayUnscheduleEvent() {}
|
||||
|
||||
NS_IMETHOD Run();
|
||||
};
|
||||
|
||||
NS_IMETHODIMP
|
||||
DelayUnscheduleEvent::Run()
|
||||
{
|
||||
mInstance->UnscheduleTimer(mTimerID);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
PluginTimerCallback(nsITimer *aTimer, void *aClosure)
|
||||
{
|
||||
@@ -1073,7 +1170,11 @@ PluginTimerCallback(nsITimer *aTimer, void *aClosure)
|
||||
NPP npp = t->npp;
|
||||
uint32_t id = t->id;
|
||||
|
||||
// Some plugins (Flash on Android) calls unscheduletimer
|
||||
// from this callback.
|
||||
t->inCallback = PR_TRUE;
|
||||
(*(t->callback))(npp, id);
|
||||
t->inCallback = PR_FALSE;
|
||||
|
||||
// Make sure we still have an instance and the timer is still alive
|
||||
// after the callback.
|
||||
@@ -1107,6 +1208,7 @@ nsNPAPIPluginInstance::ScheduleTimer(uint32_t interval, NPBool repeat, void (*ti
|
||||
{
|
||||
nsNPAPITimer *newTimer = new nsNPAPITimer();
|
||||
|
||||
newTimer->inCallback = PR_FALSE;
|
||||
newTimer->npp = &mNPP;
|
||||
|
||||
// generate ID that is unique to this instance
|
||||
@@ -1144,6 +1246,12 @@ nsNPAPIPluginInstance::UnscheduleTimer(uint32_t timerID)
|
||||
if (!t)
|
||||
return;
|
||||
|
||||
if (t->inCallback) {
|
||||
nsCOMPtr<nsIRunnable> e = new DelayUnscheduleEvent(this, timerID);
|
||||
NS_DispatchToCurrentThread(e);
|
||||
return;
|
||||
}
|
||||
|
||||
// cancel the timer
|
||||
t->timer->Cancel();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user