mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-28 01:57:30 +09:00
Issue #1053 - Remove android support from NPAPI
This commit is contained in:
parent
516bf07de1
commit
49ea8c2f2d
28 changed files with 14 additions and 3639 deletions
|
|
@ -21,43 +21,10 @@ static int gNotOptimized;
|
||||||
#define CALLING_CONVENTION_HACK
|
#define CALLING_CONVENTION_HACK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include "AndroidBridge.h"
|
|
||||||
#include "android_npapi.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
#undef ALOG
|
|
||||||
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoJavaEnv", ## args)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla::layers;
|
using namespace mozilla::layers;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#if defined(XP_UNIX) && !defined(XP_MACOSX)
|
||||||
nsresult
|
|
||||||
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs,
|
|
||||||
NPPluginFuncs* pFuncs, NPError* error)
|
|
||||||
{
|
|
||||||
JNIEnv* env = jni::GetEnvForThread();
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame jniFrame(env);
|
|
||||||
|
|
||||||
if (mNP_Initialize) {
|
|
||||||
*error = mNP_Initialize(bFuncs, pFuncs, env);
|
|
||||||
} else {
|
|
||||||
NP_InitializeFunc pfNP_Initialize = (NP_InitializeFunc)
|
|
||||||
PR_FindFunctionSymbol(mLibrary, "NP_Initialize");
|
|
||||||
if (!pfNP_Initialize)
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
*error = pfNP_Initialize(bFuncs, pFuncs, env);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save pointers to functions that get called through PluginLibrary itself.
|
|
||||||
mNPP_New = pFuncs->newp;
|
|
||||||
mNPP_ClearSiteData = pFuncs->clearsitedata;
|
|
||||||
mNPP_GetSitesWithData = pFuncs->getsiteswithdata;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
|
|
||||||
nsresult
|
nsresult
|
||||||
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs,
|
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs,
|
||||||
NPPluginFuncs* pFuncs, NPError* error)
|
NPPluginFuncs* pFuncs, NPError* error)
|
||||||
|
|
|
||||||
|
|
@ -1,390 +0,0 @@
|
||||||
/* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
|
||||||
#include "AndroidBridge.h"
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "assert.h"
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "nsIThread.h"
|
|
||||||
#include "nsThreadUtils.h"
|
|
||||||
#include "mozilla/Mutex.h"
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPluginsAudio" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_audio_##name
|
|
||||||
|
|
||||||
/* android.media.AudioTrack */
|
|
||||||
struct AudioTrack {
|
|
||||||
jclass at_class;
|
|
||||||
jmethodID constructor;
|
|
||||||
jmethodID flush;
|
|
||||||
jmethodID pause;
|
|
||||||
jmethodID play;
|
|
||||||
jmethodID setvol;
|
|
||||||
jmethodID stop;
|
|
||||||
jmethodID write;
|
|
||||||
jmethodID getpos;
|
|
||||||
jmethodID getstate;
|
|
||||||
jmethodID release;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum AudioTrackMode {
|
|
||||||
MODE_STATIC = 0,
|
|
||||||
MODE_STREAM = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* android.media.AudioManager */
|
|
||||||
enum AudioManagerStream {
|
|
||||||
STREAM_VOICE_CALL = 0,
|
|
||||||
STREAM_SYSTEM = 1,
|
|
||||||
STREAM_RING = 2,
|
|
||||||
STREAM_MUSIC = 3,
|
|
||||||
STREAM_ALARM = 4,
|
|
||||||
STREAM_NOTIFICATION = 5,
|
|
||||||
STREAM_DTMF = 8
|
|
||||||
};
|
|
||||||
|
|
||||||
/* android.media.AudioFormat */
|
|
||||||
enum AudioFormatChannel {
|
|
||||||
CHANNEL_OUT_MONO = 4,
|
|
||||||
CHANNEL_OUT_STEREO = 12
|
|
||||||
};
|
|
||||||
|
|
||||||
enum AudioFormatEncoding {
|
|
||||||
ENCODING_PCM_16BIT = 2,
|
|
||||||
ENCODING_PCM_8BIT = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum AudioFormatState {
|
|
||||||
STATE_UNINITIALIZED = 0,
|
|
||||||
STATE_INITIALIZED = 1,
|
|
||||||
STATE_NO_STATIC_DATA = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct AudioTrack at;
|
|
||||||
|
|
||||||
static jclass
|
|
||||||
init_jni_bindings(JNIEnv *jenv) {
|
|
||||||
jclass jc =
|
|
||||||
(jclass)jenv->NewGlobalRef(jenv->FindClass("android/media/AudioTrack"));
|
|
||||||
|
|
||||||
at.constructor = jenv->GetMethodID(jc, "<init>", "(IIIIII)V");
|
|
||||||
at.flush = jenv->GetMethodID(jc, "flush", "()V");
|
|
||||||
at.pause = jenv->GetMethodID(jc, "pause", "()V");
|
|
||||||
at.play = jenv->GetMethodID(jc, "play", "()V");
|
|
||||||
at.setvol = jenv->GetMethodID(jc, "setStereoVolume", "(FF)I");
|
|
||||||
at.stop = jenv->GetMethodID(jc, "stop", "()V");
|
|
||||||
at.write = jenv->GetMethodID(jc, "write", "([BII)I");
|
|
||||||
at.getpos = jenv->GetMethodID(jc, "getPlaybackHeadPosition", "()I");
|
|
||||||
at.getstate = jenv->GetMethodID(jc, "getState", "()I");
|
|
||||||
at.release = jenv->GetMethodID(jc, "release", "()V");
|
|
||||||
|
|
||||||
return jc;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ANPAudioTrack {
|
|
||||||
jobject output_unit;
|
|
||||||
jclass at_class;
|
|
||||||
|
|
||||||
unsigned int rate;
|
|
||||||
unsigned int channels;
|
|
||||||
unsigned int bufferSize;
|
|
||||||
unsigned int isStopped;
|
|
||||||
unsigned int keepGoing;
|
|
||||||
|
|
||||||
mozilla::Mutex lock;
|
|
||||||
|
|
||||||
void* user;
|
|
||||||
ANPAudioCallbackProc proc;
|
|
||||||
ANPSampleFormat format;
|
|
||||||
|
|
||||||
ANPAudioTrack() : lock("ANPAudioTrack") { }
|
|
||||||
};
|
|
||||||
|
|
||||||
class AudioRunnable : public mozilla::Runnable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
NS_DECL_NSIRUNNABLE
|
|
||||||
|
|
||||||
AudioRunnable(ANPAudioTrack* aAudioTrack) {
|
|
||||||
mTrack = aAudioTrack;
|
|
||||||
}
|
|
||||||
|
|
||||||
ANPAudioTrack* mTrack;
|
|
||||||
};
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
AudioRunnable::Run()
|
|
||||||
{
|
|
||||||
PR_SetCurrentThreadName("Android Audio");
|
|
||||||
|
|
||||||
JNIEnv* const jenv = mozilla::jni::GetEnvForThread();
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame autoFrame(jenv, 2);
|
|
||||||
|
|
||||||
jbyteArray bytearray = jenv->NewByteArray(mTrack->bufferSize);
|
|
||||||
if (!bytearray) {
|
|
||||||
LOG("AudioRunnable:: Run. Could not create bytearray");
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
jbyte *byte = jenv->GetByteArrayElements(bytearray, nullptr);
|
|
||||||
if (!byte) {
|
|
||||||
LOG("AudioRunnable:: Run. Could not create bytearray");
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ANPAudioBuffer buffer;
|
|
||||||
buffer.channelCount = mTrack->channels;
|
|
||||||
buffer.format = mTrack->format;
|
|
||||||
buffer.bufferData = (void*) byte;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
// reset the buffer size
|
|
||||||
buffer.size = mTrack->bufferSize;
|
|
||||||
|
|
||||||
{
|
|
||||||
mozilla::MutexAutoLock lock(mTrack->lock);
|
|
||||||
|
|
||||||
if (!mTrack->keepGoing)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Get data from the plugin
|
|
||||||
mTrack->proc(kMoreData_ANPAudioEvent, mTrack->user, &buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer.size == 0) {
|
|
||||||
LOG("%p - kMoreData_ANPAudioEvent", mTrack);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t wroteSoFar = 0;
|
|
||||||
jint retval;
|
|
||||||
do {
|
|
||||||
retval = jenv->CallIntMethod(mTrack->output_unit,
|
|
||||||
at.write,
|
|
||||||
bytearray,
|
|
||||||
wroteSoFar,
|
|
||||||
buffer.size - wroteSoFar);
|
|
||||||
if (retval < 0) {
|
|
||||||
LOG("%p - Write failed %d", mTrack, retval);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
wroteSoFar += retval;
|
|
||||||
|
|
||||||
} while(wroteSoFar < buffer.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
jenv->CallVoidMethod(mTrack->output_unit, at.release);
|
|
||||||
|
|
||||||
jenv->DeleteGlobalRef(mTrack->output_unit);
|
|
||||||
jenv->DeleteGlobalRef(mTrack->at_class);
|
|
||||||
|
|
||||||
delete mTrack;
|
|
||||||
|
|
||||||
jenv->ReleaseByteArrayElements(bytearray, byte, 0);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ANPAudioTrack*
|
|
||||||
anp_audio_newTrack(uint32_t sampleRate, // sampling rate in Hz
|
|
||||||
ANPSampleFormat format,
|
|
||||||
int channelCount, // MONO=1, STEREO=2
|
|
||||||
ANPAudioCallbackProc proc,
|
|
||||||
void* user)
|
|
||||||
{
|
|
||||||
ANPAudioTrack *s = new ANPAudioTrack();
|
|
||||||
if (s == nullptr) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEnv* const jenv = mozilla::jni::GetEnvForThread();
|
|
||||||
|
|
||||||
s->at_class = init_jni_bindings(jenv);
|
|
||||||
s->rate = sampleRate;
|
|
||||||
s->channels = channelCount;
|
|
||||||
s->bufferSize = s->rate * s->channels;
|
|
||||||
s->isStopped = true;
|
|
||||||
s->keepGoing = false;
|
|
||||||
s->user = user;
|
|
||||||
s->proc = proc;
|
|
||||||
s->format = format;
|
|
||||||
|
|
||||||
int jformat;
|
|
||||||
switch (format) {
|
|
||||||
case kPCM16Bit_ANPSampleFormat:
|
|
||||||
jformat = ENCODING_PCM_16BIT;
|
|
||||||
break;
|
|
||||||
case kPCM8Bit_ANPSampleFormat:
|
|
||||||
jformat = ENCODING_PCM_8BIT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG("Unknown audio format. defaulting to 16bit.");
|
|
||||||
jformat = ENCODING_PCM_16BIT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int jChannels;
|
|
||||||
switch (channelCount) {
|
|
||||||
case 1:
|
|
||||||
jChannels = CHANNEL_OUT_MONO;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
jChannels = CHANNEL_OUT_STEREO;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG("Unknown channel count. defaulting to mono.");
|
|
||||||
jChannels = CHANNEL_OUT_MONO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame autoFrame(jenv);
|
|
||||||
|
|
||||||
jobject obj = jenv->NewObject(s->at_class,
|
|
||||||
at.constructor,
|
|
||||||
STREAM_MUSIC,
|
|
||||||
s->rate,
|
|
||||||
jChannels,
|
|
||||||
jformat,
|
|
||||||
s->bufferSize,
|
|
||||||
MODE_STREAM);
|
|
||||||
|
|
||||||
if (autoFrame.CheckForException() || obj == nullptr) {
|
|
||||||
jenv->DeleteGlobalRef(s->at_class);
|
|
||||||
delete s;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
jint state = jenv->CallIntMethod(obj, at.getstate);
|
|
||||||
|
|
||||||
if (autoFrame.CheckForException() || state == STATE_UNINITIALIZED) {
|
|
||||||
jenv->DeleteGlobalRef(s->at_class);
|
|
||||||
delete s;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->output_unit = jenv->NewGlobalRef(obj);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_audio_deleteTrack(ANPAudioTrack* s)
|
|
||||||
{
|
|
||||||
if (s == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mozilla::MutexAutoLock lock(s->lock);
|
|
||||||
s->keepGoing = false;
|
|
||||||
|
|
||||||
// deallocation happens in the AudioThread. There is a
|
|
||||||
// potential leak if anp_audio_start is never called, but
|
|
||||||
// we do not see that from flash.
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_audio_start(ANPAudioTrack* s)
|
|
||||||
{
|
|
||||||
if (s == nullptr || s->output_unit == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->keepGoing) {
|
|
||||||
// we are already playing. Ignore.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEnv* const jenv = mozilla::jni::GetEnvForThread();
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame autoFrame(jenv, 0);
|
|
||||||
jenv->CallVoidMethod(s->output_unit, at.play);
|
|
||||||
|
|
||||||
if (autoFrame.CheckForException()) {
|
|
||||||
jenv->DeleteGlobalRef(s->at_class);
|
|
||||||
delete s;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->isStopped = false;
|
|
||||||
s->keepGoing = true;
|
|
||||||
|
|
||||||
// AudioRunnable now owns the ANPAudioTrack
|
|
||||||
RefPtr<AudioRunnable> runnable = new AudioRunnable(s);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIThread> thread;
|
|
||||||
NS_NewThread(getter_AddRefs(thread), runnable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_audio_pause(ANPAudioTrack* s)
|
|
||||||
{
|
|
||||||
if (s == nullptr || s->output_unit == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEnv* const jenv = mozilla::jni::GetEnvForThread();
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame autoFrame(jenv, 0);
|
|
||||||
jenv->CallVoidMethod(s->output_unit, at.pause);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_audio_stop(ANPAudioTrack* s)
|
|
||||||
{
|
|
||||||
if (s == nullptr || s->output_unit == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->isStopped = true;
|
|
||||||
JNIEnv* const jenv = mozilla::jni::GetEnvForThread();
|
|
||||||
|
|
||||||
mozilla::AutoLocalJNIFrame autoFrame(jenv, 0);
|
|
||||||
jenv->CallVoidMethod(s->output_unit, at.stop);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
anp_audio_isStopped(ANPAudioTrack* s)
|
|
||||||
{
|
|
||||||
return s->isStopped;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t
|
|
||||||
anp_audio_trackLatency(ANPAudioTrack* s) {
|
|
||||||
// Hardcode an estimate of the system's audio latency. Flash hardcodes
|
|
||||||
// similar latency estimates for pre-Honeycomb devices that do not support
|
|
||||||
// ANPAudioTrackInterfaceV1's trackLatency(). The Android stock browser
|
|
||||||
// calls android::AudioTrack::latency(), an internal Android API that is
|
|
||||||
// not available in the public NDK:
|
|
||||||
// https://github.com/android/platform_external_webkit/commit/49bf866973cb3b2a6c74c0eab864e9562e4cbab1
|
|
||||||
return 100; // milliseconds
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitAudioTrackInterfaceV0(ANPAudioTrackInterfaceV0 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, newTrack);
|
|
||||||
ASSIGN(i, deleteTrack);
|
|
||||||
ASSIGN(i, start);
|
|
||||||
ASSIGN(i, pause);
|
|
||||||
ASSIGN(i, stop);
|
|
||||||
ASSIGN(i, isStopped);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitAudioTrackInterfaceV1(ANPAudioTrackInterfaceV1 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, newTrack);
|
|
||||||
ASSIGN(i, deleteTrack);
|
|
||||||
ASSIGN(i, start);
|
|
||||||
ASSIGN(i, pause);
|
|
||||||
ASSIGN(i, stop);
|
|
||||||
ASSIGN(i, isStopped);
|
|
||||||
ASSIGN(i, trackLatency);
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "android_npapi.h"
|
|
||||||
#include "nsISupportsImpl.h"
|
|
||||||
|
|
||||||
#define NOT_IMPLEMENTED_FATAL() do { \
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoPlugins", \
|
|
||||||
"%s not implemented %s, %d", \
|
|
||||||
__PRETTY_FUNCTION__, __FILE__, __LINE__); \
|
|
||||||
abort(); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define NOT_IMPLEMENTED() \
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoPlugins", \
|
|
||||||
"!!!!!!!!!!!!!! %s not implemented %s, %d", \
|
|
||||||
__PRETTY_FUNCTION__, __FILE__, __LINE__); \
|
|
||||||
|
|
||||||
void InitAudioTrackInterfaceV0(ANPAudioTrackInterfaceV0 *i);
|
|
||||||
void InitAudioTrackInterfaceV1(ANPAudioTrackInterfaceV1* i);
|
|
||||||
void InitCanvasInterface(ANPCanvasInterfaceV0 *i);
|
|
||||||
void InitEventInterface(ANPEventInterfaceV0 *i);
|
|
||||||
void InitLogInterface(ANPLogInterfaceV0 *i);
|
|
||||||
void InitPaintInterface(ANPPaintInterfaceV0 *i);
|
|
||||||
void InitSurfaceInterface(ANPSurfaceInterfaceV0 *i);
|
|
||||||
void InitSystemInterfaceV1(ANPSystemInterfaceV1 *i);
|
|
||||||
void InitSystemInterfaceV2(ANPSystemInterfaceV2 *i);
|
|
||||||
void InitTypeFaceInterface(ANPTypefaceInterfaceV0 *i);
|
|
||||||
void InitWindowInterface(ANPWindowInterfaceV0 *i);
|
|
||||||
void InitWindowInterfaceV2(ANPWindowInterfaceV2 *i);
|
|
||||||
void InitVideoInterfaceV1(ANPVideoInterfaceV1 *i);
|
|
||||||
void InitOpenGLInterface(ANPOpenGLInterfaceV0 *i);
|
|
||||||
void InitNativeWindowInterface(ANPNativeWindowInterfaceV0 *i);
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "assert.h"
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "nsThreadUtils.h"
|
|
||||||
#include "nsNPAPIPluginInstance.h"
|
|
||||||
#include "nsNPAPIPlugin.h"
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_event_##name
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_event_postEvent(NPP instance, const ANPEvent* event)
|
|
||||||
{
|
|
||||||
LOG("%s", __PRETTY_FUNCTION__);
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
pinst->PostEvent((void*) event);
|
|
||||||
|
|
||||||
LOG("returning from %s", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InitEventInterface(ANPEventInterfaceV0 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, postEvent);
|
|
||||||
}
|
|
||||||
|
|
@ -1,152 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2008, The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
||||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANPKeyCodes_DEFINED
|
|
||||||
#define ANPKeyCodes_DEFINED
|
|
||||||
|
|
||||||
/* List the key codes that are set to a plugin in the ANPKeyEvent.
|
|
||||||
|
|
||||||
These exactly match the values in android/view/KeyEvent.java and the
|
|
||||||
corresponding .h file android/keycodes.h.
|
|
||||||
*/
|
|
||||||
enum ANPKeyCodes {
|
|
||||||
kUnknown_ANPKeyCode = 0,
|
|
||||||
|
|
||||||
kSoftLeft_ANPKeyCode = 1,
|
|
||||||
kSoftRight_ANPKeyCode = 2,
|
|
||||||
kHome_ANPKeyCode = 3,
|
|
||||||
kBack_ANPKeyCode = 4,
|
|
||||||
kCall_ANPKeyCode = 5,
|
|
||||||
kEndCall_ANPKeyCode = 6,
|
|
||||||
k0_ANPKeyCode = 7,
|
|
||||||
k1_ANPKeyCode = 8,
|
|
||||||
k2_ANPKeyCode = 9,
|
|
||||||
k3_ANPKeyCode = 10,
|
|
||||||
k4_ANPKeyCode = 11,
|
|
||||||
k5_ANPKeyCode = 12,
|
|
||||||
k6_ANPKeyCode = 13,
|
|
||||||
k7_ANPKeyCode = 14,
|
|
||||||
k8_ANPKeyCode = 15,
|
|
||||||
k9_ANPKeyCode = 16,
|
|
||||||
kStar_ANPKeyCode = 17,
|
|
||||||
kPound_ANPKeyCode = 18,
|
|
||||||
kDpadUp_ANPKeyCode = 19,
|
|
||||||
kDpadDown_ANPKeyCode = 20,
|
|
||||||
kDpadLeft_ANPKeyCode = 21,
|
|
||||||
kDpadRight_ANPKeyCode = 22,
|
|
||||||
kDpadCenter_ANPKeyCode = 23,
|
|
||||||
kVolumeUp_ANPKeyCode = 24,
|
|
||||||
kVolumeDown_ANPKeyCode = 25,
|
|
||||||
kPower_ANPKeyCode = 26,
|
|
||||||
kCamera_ANPKeyCode = 27,
|
|
||||||
kClear_ANPKeyCode = 28,
|
|
||||||
kA_ANPKeyCode = 29,
|
|
||||||
kB_ANPKeyCode = 30,
|
|
||||||
kC_ANPKeyCode = 31,
|
|
||||||
kD_ANPKeyCode = 32,
|
|
||||||
kE_ANPKeyCode = 33,
|
|
||||||
kF_ANPKeyCode = 34,
|
|
||||||
kG_ANPKeyCode = 35,
|
|
||||||
kH_ANPKeyCode = 36,
|
|
||||||
kI_ANPKeyCode = 37,
|
|
||||||
kJ_ANPKeyCode = 38,
|
|
||||||
kK_ANPKeyCode = 39,
|
|
||||||
kL_ANPKeyCode = 40,
|
|
||||||
kM_ANPKeyCode = 41,
|
|
||||||
kN_ANPKeyCode = 42,
|
|
||||||
kO_ANPKeyCode = 43,
|
|
||||||
kP_ANPKeyCode = 44,
|
|
||||||
kQ_ANPKeyCode = 45,
|
|
||||||
kR_ANPKeyCode = 46,
|
|
||||||
kS_ANPKeyCode = 47,
|
|
||||||
kT_ANPKeyCode = 48,
|
|
||||||
kU_ANPKeyCode = 49,
|
|
||||||
kV_ANPKeyCode = 50,
|
|
||||||
kW_ANPKeyCode = 51,
|
|
||||||
kX_ANPKeyCode = 52,
|
|
||||||
kY_ANPKeyCode = 53,
|
|
||||||
kZ_ANPKeyCode = 54,
|
|
||||||
kComma_ANPKeyCode = 55,
|
|
||||||
kPeriod_ANPKeyCode = 56,
|
|
||||||
kAltLeft_ANPKeyCode = 57,
|
|
||||||
kAltRight_ANPKeyCode = 58,
|
|
||||||
kShiftLeft_ANPKeyCode = 59,
|
|
||||||
kShiftRight_ANPKeyCode = 60,
|
|
||||||
kTab_ANPKeyCode = 61,
|
|
||||||
kSpace_ANPKeyCode = 62,
|
|
||||||
kSym_ANPKeyCode = 63,
|
|
||||||
kExplorer_ANPKeyCode = 64,
|
|
||||||
kEnvelope_ANPKeyCode = 65,
|
|
||||||
kNewline_ANPKeyCode = 66,
|
|
||||||
kDel_ANPKeyCode = 67,
|
|
||||||
kGrave_ANPKeyCode = 68,
|
|
||||||
kMinus_ANPKeyCode = 69,
|
|
||||||
kEquals_ANPKeyCode = 70,
|
|
||||||
kLeftBracket_ANPKeyCode = 71,
|
|
||||||
kRightBracket_ANPKeyCode = 72,
|
|
||||||
kBackslash_ANPKeyCode = 73,
|
|
||||||
kSemicolon_ANPKeyCode = 74,
|
|
||||||
kApostrophe_ANPKeyCode = 75,
|
|
||||||
kSlash_ANPKeyCode = 76,
|
|
||||||
kAt_ANPKeyCode = 77,
|
|
||||||
kNum_ANPKeyCode = 78,
|
|
||||||
kHeadSetHook_ANPKeyCode = 79,
|
|
||||||
kFocus_ANPKeyCode = 80,
|
|
||||||
kPlus_ANPKeyCode = 81,
|
|
||||||
kMenu_ANPKeyCode = 82,
|
|
||||||
kNotification_ANPKeyCode = 83,
|
|
||||||
kSearch_ANPKeyCode = 84,
|
|
||||||
kMediaPlayPause_ANPKeyCode = 85,
|
|
||||||
kMediaStop_ANPKeyCode = 86,
|
|
||||||
kMediaNext_ANPKeyCode = 87,
|
|
||||||
kMediaPrevious_ANPKeyCode = 88,
|
|
||||||
kMediaRewind_ANPKeyCode = 89,
|
|
||||||
kMediaFastForward_ANPKeyCode = 90,
|
|
||||||
kMute_ANPKeyCode = 91,
|
|
||||||
kPageUp_ANPKeyCode = 92,
|
|
||||||
kPageDown_ANPKeyCode = 93,
|
|
||||||
kPictsymbols_ANPKeyCode = 94,
|
|
||||||
kSwitchCharset_ANPKeyCode = 95,
|
|
||||||
kButtonA_ANPKeyCode = 96,
|
|
||||||
kButtonB_ANPKeyCode = 97,
|
|
||||||
kButtonC_ANPKeyCode = 98,
|
|
||||||
kButtonX_ANPKeyCode = 99,
|
|
||||||
kButtonY_ANPKeyCode = 100,
|
|
||||||
kButtonZ_ANPKeyCode = 101,
|
|
||||||
kButtonL1_ANPKeyCode = 102,
|
|
||||||
kButtonR1_ANPKeyCode = 103,
|
|
||||||
kButtonL2_ANPKeyCode = 104,
|
|
||||||
kButtonR2_ANPKeyCode = 105,
|
|
||||||
kButtonThumbL_ANPKeyCode = 106,
|
|
||||||
kButtonThumbR_ANPKeyCode = 107,
|
|
||||||
kButtonStart_ANPKeyCode = 108,
|
|
||||||
kButtonSelect_ANPKeyCode = 109,
|
|
||||||
kButtonMode_ANPKeyCode = 110,
|
|
||||||
|
|
||||||
// NOTE: If you add a new keycode here you must also add it to several other files.
|
|
||||||
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "assert.h"
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_log_##name
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_log_log(ANPLogType type, const char format[], ...) {
|
|
||||||
|
|
||||||
va_list argp;
|
|
||||||
va_start(argp,format);
|
|
||||||
__android_log_vprint(type == kError_ANPLogType ? ANDROID_LOG_ERROR : type == kWarning_ANPLogType ?
|
|
||||||
ANDROID_LOG_WARN : ANDROID_LOG_INFO, "GeckoPluginLog", format, argp);
|
|
||||||
va_end(argp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitLogInterface(ANPLogInterfaceV0 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, log);
|
|
||||||
}
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
// must include config.h first for webkit to fiddle with new/delete
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "nsIPluginInstanceOwner.h"
|
|
||||||
#include "nsPluginInstanceOwner.h"
|
|
||||||
#include "nsNPAPIPluginInstance.h"
|
|
||||||
#include "gfxRect.h"
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_native_window_##name
|
|
||||||
|
|
||||||
static ANPNativeWindow anp_native_window_acquireNativeWindow(NPP instance) {
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
return pinst->AcquireContentWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void anp_native_window_invertPluginContent(NPP instance, bool isContentInverted) {
|
|
||||||
// NativeWindow is TopLeft if uninverted.
|
|
||||||
gl::OriginPos newOriginPos = gl::OriginPos::TopLeft;
|
|
||||||
if (isContentInverted)
|
|
||||||
newOriginPos = gl::OriginPos::BottomLeft;
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
pinst->SetOriginPos(newOriginPos);
|
|
||||||
pinst->RedrawPlugin();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InitNativeWindowInterface(ANPNativeWindowInterfaceV0* i) {
|
|
||||||
ASSIGN(i, acquireNativeWindow);
|
|
||||||
ASSIGN(i, invertPluginContent);
|
|
||||||
}
|
|
||||||
|
|
@ -1,266 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "ANPBase.h"
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_surface_##name
|
|
||||||
|
|
||||||
#define CLEAR_EXCEPTION(env) if (env->ExceptionOccurred()) env->ExceptionClear();
|
|
||||||
|
|
||||||
#define ANDROID_REGION_SIZE 512
|
|
||||||
|
|
||||||
enum {
|
|
||||||
PIXEL_FORMAT_RGBA_8888 = 1,
|
|
||||||
PIXEL_FORMAT_RGB_565 = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SurfaceInfo {
|
|
||||||
uint32_t w;
|
|
||||||
uint32_t h;
|
|
||||||
uint32_t s;
|
|
||||||
uint32_t usage;
|
|
||||||
uint32_t format;
|
|
||||||
unsigned char* bits;
|
|
||||||
uint32_t reserved[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct ARect {
|
|
||||||
int32_t left;
|
|
||||||
int32_t top;
|
|
||||||
int32_t right;
|
|
||||||
int32_t bottom;
|
|
||||||
} ARect;
|
|
||||||
|
|
||||||
|
|
||||||
// used to cache JNI method and field IDs for Surface Objects
|
|
||||||
static struct ANPSurfaceInterfaceJavaGlue {
|
|
||||||
bool initialized;
|
|
||||||
jmethodID getSurfaceHolder;
|
|
||||||
jmethodID getSurface;
|
|
||||||
jfieldID surfacePointer;
|
|
||||||
} gSurfaceJavaGlue;
|
|
||||||
|
|
||||||
static struct ANPSurfaceFunctions {
|
|
||||||
bool initialized;
|
|
||||||
|
|
||||||
int (* lock)(void*, SurfaceInfo*, void*);
|
|
||||||
int (* unlockAndPost)(void*);
|
|
||||||
|
|
||||||
void* (* regionConstructor)(void*);
|
|
||||||
void (* setRegion)(void*, ARect const&);
|
|
||||||
} gSurfaceFunctions;
|
|
||||||
|
|
||||||
|
|
||||||
static inline void* getSurface(JNIEnv* env, jobject view) {
|
|
||||||
if (!env || !view) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gSurfaceJavaGlue.initialized) {
|
|
||||||
|
|
||||||
jclass surfaceViewClass = env->FindClass("android/view/SurfaceView");
|
|
||||||
gSurfaceJavaGlue.getSurfaceHolder = env->GetMethodID(surfaceViewClass, "getHolder", "()Landroid/view/SurfaceHolder;");
|
|
||||||
|
|
||||||
jclass surfaceHolderClass = env->FindClass("android/view/SurfaceHolder");
|
|
||||||
gSurfaceJavaGlue.getSurface = env->GetMethodID(surfaceHolderClass, "getSurface", "()Landroid/view/Surface;");
|
|
||||||
|
|
||||||
jclass surfaceClass = env->FindClass("android/view/Surface");
|
|
||||||
gSurfaceJavaGlue.surfacePointer = env->GetFieldID(surfaceClass,
|
|
||||||
"mSurfacePointer", "I");
|
|
||||||
|
|
||||||
if (!gSurfaceJavaGlue.surfacePointer) {
|
|
||||||
CLEAR_EXCEPTION(env);
|
|
||||||
|
|
||||||
// It was something else in 2.2.
|
|
||||||
gSurfaceJavaGlue.surfacePointer = env->GetFieldID(surfaceClass,
|
|
||||||
"mSurface", "I");
|
|
||||||
|
|
||||||
if (!gSurfaceJavaGlue.surfacePointer) {
|
|
||||||
CLEAR_EXCEPTION(env);
|
|
||||||
|
|
||||||
// And something else in 2.3+
|
|
||||||
gSurfaceJavaGlue.surfacePointer = env->GetFieldID(surfaceClass,
|
|
||||||
"mNativeSurface", "I");
|
|
||||||
|
|
||||||
CLEAR_EXCEPTION(env);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gSurfaceJavaGlue.surfacePointer) {
|
|
||||||
LOG("Failed to acquire surface pointer");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
env->DeleteLocalRef(surfaceClass);
|
|
||||||
env->DeleteLocalRef(surfaceViewClass);
|
|
||||||
env->DeleteLocalRef(surfaceHolderClass);
|
|
||||||
|
|
||||||
gSurfaceJavaGlue.initialized = (gSurfaceJavaGlue.surfacePointer != nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
jobject holder = env->CallObjectMethod(view, gSurfaceJavaGlue.getSurfaceHolder);
|
|
||||||
jobject surface = env->CallObjectMethod(holder, gSurfaceJavaGlue.getSurface);
|
|
||||||
jint surfacePointer = env->GetIntField(surface, gSurfaceJavaGlue.surfacePointer);
|
|
||||||
|
|
||||||
env->DeleteLocalRef(holder);
|
|
||||||
env->DeleteLocalRef(surface);
|
|
||||||
|
|
||||||
return (void*)surfacePointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ANPBitmapFormat convertPixelFormat(int32_t format) {
|
|
||||||
switch (format) {
|
|
||||||
case PIXEL_FORMAT_RGBA_8888: return kRGBA_8888_ANPBitmapFormat;
|
|
||||||
case PIXEL_FORMAT_RGB_565: return kRGB_565_ANPBitmapFormat;
|
|
||||||
default: return kUnknown_ANPBitmapFormat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bytesPerPixel(int32_t format) {
|
|
||||||
switch (format) {
|
|
||||||
case PIXEL_FORMAT_RGBA_8888: return 4;
|
|
||||||
case PIXEL_FORMAT_RGB_565: return 2;
|
|
||||||
default: return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool init() {
|
|
||||||
if (gSurfaceFunctions.initialized)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
void* handle = dlopen("libsurfaceflinger_client.so", RTLD_LAZY);
|
|
||||||
|
|
||||||
if (!handle) {
|
|
||||||
LOG("Failed to open libsurfaceflinger_client.so");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gSurfaceFunctions.lock = (int (*)(void*, SurfaceInfo*, void*))dlsym(handle, "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionEb");
|
|
||||||
gSurfaceFunctions.unlockAndPost = (int (*)(void*))dlsym(handle, "_ZN7android7Surface13unlockAndPostEv");
|
|
||||||
|
|
||||||
|
|
||||||
if (!gSurfaceFunctions.lock) {
|
|
||||||
// Stuff changed in 3.0/4.0
|
|
||||||
handle = dlopen("libgui.so", RTLD_LAZY);
|
|
||||||
gSurfaceFunctions.lock = (int (*)(void*, SurfaceInfo*, void*))dlsym(handle, "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE");
|
|
||||||
gSurfaceFunctions.unlockAndPost = (int (*)(void*))dlsym(handle, "_ZN7android7Surface13unlockAndPostEv");
|
|
||||||
}
|
|
||||||
|
|
||||||
handle = dlopen("libui.so", RTLD_LAZY);
|
|
||||||
if (!handle) {
|
|
||||||
LOG("Failed to open libui.so");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gSurfaceFunctions.regionConstructor = (void* (*)(void*))dlsym(handle, "_ZN7android6RegionC1Ev");
|
|
||||||
gSurfaceFunctions.setRegion = (void (*)(void*, ARect const&))dlsym(handle, "_ZN7android6Region3setERKNS_4RectE");
|
|
||||||
|
|
||||||
gSurfaceFunctions.initialized = (gSurfaceFunctions.lock && gSurfaceFunctions.unlockAndPost &&
|
|
||||||
gSurfaceFunctions.regionConstructor && gSurfaceFunctions.setRegion);
|
|
||||||
LOG("Initialized? %d\n", gSurfaceFunctions.initialized);
|
|
||||||
return gSurfaceFunctions.initialized;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: All of this should be changed to use the equivalent things in AndroidBridge, bug 758612
|
|
||||||
static bool anp_surface_lock(JNIEnv* env, jobject surfaceView, ANPBitmap* bitmap, ANPRectI* dirtyRect) {
|
|
||||||
if (!bitmap || !surfaceView) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* surface = getSurface(env, surfaceView);
|
|
||||||
|
|
||||||
if (!bitmap || !surface) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!init()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* region = nullptr;
|
|
||||||
if (dirtyRect) {
|
|
||||||
region = malloc(ANDROID_REGION_SIZE);
|
|
||||||
gSurfaceFunctions.regionConstructor(region);
|
|
||||||
|
|
||||||
ARect rect;
|
|
||||||
rect.left = dirtyRect->left;
|
|
||||||
rect.top = dirtyRect->top;
|
|
||||||
rect.right = dirtyRect->right;
|
|
||||||
rect.bottom = dirtyRect->bottom;
|
|
||||||
|
|
||||||
gSurfaceFunctions.setRegion(region, rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
SurfaceInfo info;
|
|
||||||
int err = gSurfaceFunctions.lock(surface, &info, region);
|
|
||||||
if (err < 0) {
|
|
||||||
LOG("Failed to lock surface");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the surface may have expanded the dirty region so we must to pass that
|
|
||||||
// information back to the plugin.
|
|
||||||
if (dirtyRect) {
|
|
||||||
ARect* dirtyBounds = (ARect*)region; // The bounds are the first member, so this should work!
|
|
||||||
|
|
||||||
dirtyRect->left = dirtyBounds->left;
|
|
||||||
dirtyRect->right = dirtyBounds->right;
|
|
||||||
dirtyRect->top = dirtyBounds->top;
|
|
||||||
dirtyRect->bottom = dirtyBounds->bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (region)
|
|
||||||
free(region);
|
|
||||||
|
|
||||||
int bpr = info.s * bytesPerPixel(info.format);
|
|
||||||
|
|
||||||
bitmap->format = convertPixelFormat(info.format);
|
|
||||||
bitmap->width = info.w;
|
|
||||||
bitmap->height = info.h;
|
|
||||||
bitmap->rowBytes = bpr;
|
|
||||||
|
|
||||||
if (info.w > 0 && info.h > 0) {
|
|
||||||
bitmap->baseAddr = info.bits;
|
|
||||||
} else {
|
|
||||||
bitmap->baseAddr = nullptr;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void anp_surface_unlock(JNIEnv* env, jobject surfaceView) {
|
|
||||||
if (!surfaceView) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!init()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* surface = getSurface(env, surfaceView);
|
|
||||||
|
|
||||||
if (!surface) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gSurfaceFunctions.unlockAndPost(surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void InitSurfaceInterface(ANPSurfaceInterfaceV0* i) {
|
|
||||||
ASSIGN(i, lock);
|
|
||||||
ASSIGN(i, unlock);
|
|
||||||
|
|
||||||
// setup the java glue struct
|
|
||||||
gSurfaceJavaGlue.initialized = false;
|
|
||||||
|
|
||||||
// setup the function struct
|
|
||||||
gSurfaceFunctions.initialized = false;
|
|
||||||
}
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
|
||||||
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "GeneratedJNIWrappers.h"
|
|
||||||
#include "PluginPRLibrary.h"
|
|
||||||
#include "assert.h"
|
|
||||||
#include "nsNPAPIPluginInstance.h"
|
|
||||||
#include "nsNPAPIPlugin.h"
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_system_##name
|
|
||||||
|
|
||||||
const char*
|
|
||||||
anp_system_getApplicationDataDirectory(NPP instance)
|
|
||||||
{
|
|
||||||
static const char *dir = nullptr;
|
|
||||||
static const char *privateDir = nullptr;
|
|
||||||
|
|
||||||
bool isPrivate = false;
|
|
||||||
|
|
||||||
if (!dir) {
|
|
||||||
dir = getenv("ANDROID_PLUGIN_DATADIR");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!privateDir) {
|
|
||||||
privateDir = getenv("ANDROID_PLUGIN_DATADIR_PRIVATE");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!instance) {
|
|
||||||
return dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
if (pinst && NS_SUCCEEDED(pinst->IsPrivateBrowsing(&isPrivate)) && isPrivate) {
|
|
||||||
return privateDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char*
|
|
||||||
anp_system_getApplicationDataDirectory()
|
|
||||||
{
|
|
||||||
return anp_system_getApplicationDataDirectory(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
jclass anp_system_loadJavaClass(NPP instance, const char* className)
|
|
||||||
{
|
|
||||||
LOG("%s", __PRETTY_FUNCTION__);
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
mozilla::PluginPRLibrary* lib = static_cast<mozilla::PluginPRLibrary*>(pinst->GetPlugin()->GetLibrary());
|
|
||||||
|
|
||||||
nsCString libName;
|
|
||||||
lib->GetLibraryPath(libName);
|
|
||||||
|
|
||||||
return mozilla::java::GeckoAppShell::LoadPluginClass(className, libName).Forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void anp_system_setPowerState(NPP instance, ANPPowerState powerState)
|
|
||||||
{
|
|
||||||
nsNPAPIPluginInstance* pinst = nsNPAPIPluginInstance::GetFromNPP(instance);
|
|
||||||
|
|
||||||
if (pinst) {
|
|
||||||
pinst->SetWakeLock(powerState == kScreenOn_ANPPowerState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitSystemInterfaceV1(ANPSystemInterfaceV1 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, getApplicationDataDirectory);
|
|
||||||
ASSIGN(i, loadJavaClass);
|
|
||||||
ASSIGN(i, setPowerState);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitSystemInterfaceV2(ANPSystemInterfaceV2 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, getApplicationDataDirectory);
|
|
||||||
ASSIGN(i, loadJavaClass);
|
|
||||||
ASSIGN(i, setPowerState);
|
|
||||||
}
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "nsIPluginInstanceOwner.h"
|
|
||||||
#include "nsPluginInstanceOwner.h"
|
|
||||||
#include "nsNPAPIPluginInstance.h"
|
|
||||||
#include "gfxRect.h"
|
|
||||||
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_video_##name
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
|
|
||||||
typedef nsNPAPIPluginInstance::VideoInfo VideoInfo;
|
|
||||||
|
|
||||||
static ANPNativeWindow anp_video_acquireNativeWindow(NPP instance) {
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
|
|
||||||
return pinst->AcquireVideoWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void anp_video_setWindowDimensions(NPP instance, const ANPNativeWindow window,
|
|
||||||
const ANPRectF* dimensions) {
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
|
|
||||||
gfxRect rect(dimensions->left, dimensions->top,
|
|
||||||
dimensions->right - dimensions->left,
|
|
||||||
dimensions->bottom - dimensions->top);
|
|
||||||
|
|
||||||
pinst->SetVideoDimensions(window, rect);
|
|
||||||
pinst->RedrawPlugin();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void anp_video_releaseNativeWindow(NPP instance, ANPNativeWindow window) {
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
pinst->ReleaseVideoWindow(window);
|
|
||||||
pinst->RedrawPlugin();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void anp_video_setFramerateCallback(NPP instance, const ANPNativeWindow window, ANPVideoFrameCallbackProc callback) {
|
|
||||||
// Bug 722682
|
|
||||||
NOT_IMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void InitVideoInterfaceV1(ANPVideoInterfaceV1* i) {
|
|
||||||
ASSIGN(i, acquireNativeWindow);
|
|
||||||
ASSIGN(i, setWindowDimensions);
|
|
||||||
ASSIGN(i, releaseNativeWindow);
|
|
||||||
ASSIGN(i, setFramerateCallback);
|
|
||||||
}
|
|
||||||
|
|
@ -1,152 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
|
||||||
#include "assert.h"
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "nsNPAPIPluginInstance.h"
|
|
||||||
#include "nsPluginInstanceOwner.h"
|
|
||||||
#include "nsWindow.h"
|
|
||||||
#include "mozilla/dom/ScreenOrientation.h"
|
|
||||||
|
|
||||||
#undef LOG
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#define ASSIGN(obj, name) (obj)->name = anp_window_##name
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
using namespace mozilla::widget;
|
|
||||||
using namespace mozilla::dom;
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_setVisibleRects(NPP instance, const ANPRectI rects[], int32_t count)
|
|
||||||
{
|
|
||||||
NOT_IMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_clearVisibleRects(NPP instance)
|
|
||||||
{
|
|
||||||
NOT_IMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_showKeyboard(NPP instance, bool value)
|
|
||||||
{
|
|
||||||
InputContext context;
|
|
||||||
context.mIMEState.mEnabled = value ? IMEState::PLUGIN : IMEState::DISABLED;
|
|
||||||
context.mIMEState.mOpen = value ? IMEState::OPEN : IMEState::CLOSED;
|
|
||||||
context.mActionHint.Assign(EmptyString());
|
|
||||||
|
|
||||||
InputContextAction action;
|
|
||||||
action.mCause = InputContextAction::CAUSE_UNKNOWN;
|
|
||||||
action.mFocusChange = InputContextAction::FOCUS_NOT_CHANGED;
|
|
||||||
|
|
||||||
nsWindow* window = nsWindow::TopWindow();
|
|
||||||
if (!window) {
|
|
||||||
LOG("Couldn't get top window?");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
window->SetInputContext(context, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_requestFullScreen(NPP instance)
|
|
||||||
{
|
|
||||||
nsNPAPIPluginInstance* inst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
|
|
||||||
RefPtr<nsPluginInstanceOwner> owner = inst->GetOwner();
|
|
||||||
if (!owner) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
owner->RequestFullScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_exitFullScreen(NPP instance)
|
|
||||||
{
|
|
||||||
nsNPAPIPluginInstance* inst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
|
|
||||||
RefPtr<nsPluginInstanceOwner> owner = inst->GetOwner();
|
|
||||||
if (!owner) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
owner->ExitFullScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
anp_window_requestCenterFitZoom(NPP instance)
|
|
||||||
{
|
|
||||||
NOT_IMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
ANPRectI
|
|
||||||
anp_window_visibleRect(NPP instance)
|
|
||||||
{
|
|
||||||
ANPRectI rect = { 0, 0, 0, 0 };
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
|
|
||||||
nsIntSize currentSize = pinst->CurrentSize();
|
|
||||||
rect.left = rect.top = 0;
|
|
||||||
rect.right = currentSize.width;
|
|
||||||
rect.bottom = currentSize.height;
|
|
||||||
|
|
||||||
return rect;
|
|
||||||
}
|
|
||||||
|
|
||||||
void anp_window_requestFullScreenOrientation(NPP instance, ANPScreenOrientation orientation)
|
|
||||||
{
|
|
||||||
short newOrientation;
|
|
||||||
|
|
||||||
// Convert to the ActivityInfo equivalent
|
|
||||||
switch (orientation) {
|
|
||||||
case kFixedLandscape_ANPScreenOrientation:
|
|
||||||
newOrientation = eScreenOrientation_LandscapePrimary;
|
|
||||||
break;
|
|
||||||
case kFixedPortrait_ANPScreenOrientation:
|
|
||||||
newOrientation = eScreenOrientation_PortraitPrimary;
|
|
||||||
break;
|
|
||||||
case kLandscape_ANPScreenOrientation:
|
|
||||||
newOrientation = eScreenOrientation_LandscapePrimary |
|
|
||||||
eScreenOrientation_LandscapeSecondary;
|
|
||||||
break;
|
|
||||||
case kPortrait_ANPScreenOrientation:
|
|
||||||
newOrientation = eScreenOrientation_PortraitPrimary |
|
|
||||||
eScreenOrientation_PortraitSecondary;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
newOrientation = eScreenOrientation_None;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* pinst = static_cast<nsNPAPIPluginInstance*>(instance->ndata);
|
|
||||||
pinst->SetFullScreenOrientation(newOrientation);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitWindowInterface(ANPWindowInterfaceV0 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, setVisibleRects);
|
|
||||||
ASSIGN(i, clearVisibleRects);
|
|
||||||
ASSIGN(i, showKeyboard);
|
|
||||||
ASSIGN(i, requestFullScreen);
|
|
||||||
ASSIGN(i, exitFullScreen);
|
|
||||||
ASSIGN(i, requestCenterFitZoom);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitWindowInterfaceV2(ANPWindowInterfaceV2 *i) {
|
|
||||||
_assert(i->inSize == sizeof(*i));
|
|
||||||
ASSIGN(i, setVisibleRects);
|
|
||||||
ASSIGN(i, clearVisibleRects);
|
|
||||||
ASSIGN(i, showKeyboard);
|
|
||||||
ASSIGN(i, requestFullScreen);
|
|
||||||
ASSIGN(i, exitFullScreen);
|
|
||||||
ASSIGN(i, requestCenterFitZoom);
|
|
||||||
ASSIGN(i, visibleRect);
|
|
||||||
ASSIGN(i, requestFullScreenOrientation);
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,35 +0,0 @@
|
||||||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
|
||||||
# vim: set filetype=python:
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
EXPORTS += [
|
|
||||||
'android_npapi.h',
|
|
||||||
'ANPKeyCodes.h',
|
|
||||||
]
|
|
||||||
|
|
||||||
SOURCES += [
|
|
||||||
'ANPAudio.cpp',
|
|
||||||
'ANPEvent.cpp',
|
|
||||||
'ANPLog.cpp',
|
|
||||||
'ANPNativeWindow.cpp',
|
|
||||||
'ANPSurface.cpp',
|
|
||||||
'ANPSystem.cpp',
|
|
||||||
'ANPVideo.cpp',
|
|
||||||
'ANPWindow.cpp',
|
|
||||||
]
|
|
||||||
|
|
||||||
include('/ipc/chromium/chromium-config.mozbuild')
|
|
||||||
|
|
||||||
FINAL_LIBRARY = 'xul'
|
|
||||||
LOCAL_INCLUDES += [
|
|
||||||
'/dom/plugins/base',
|
|
||||||
'/gfx/gl',
|
|
||||||
'/widget',
|
|
||||||
'/widget/android',
|
|
||||||
]
|
|
||||||
|
|
||||||
DEFINES['MOZ_APP_NAME'] = '"%s"' % CONFIG['MOZ_APP_NAME']
|
|
||||||
|
|
||||||
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
|
||||||
|
|
@ -4,9 +4,6 @@
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
|
||||||
DIRS += ['android']
|
|
||||||
|
|
||||||
XPIDL_SOURCES += [
|
XPIDL_SOURCES += [
|
||||||
'nsIHTTPHeaderListener.idl',
|
'nsIHTTPHeaderListener.idl',
|
||||||
'nsIPluginDocument.idl',
|
'nsIPluginDocument.idl',
|
||||||
|
|
@ -89,16 +86,10 @@ LOCAL_INCLUDES += [
|
||||||
'/layout/xul',
|
'/layout/xul',
|
||||||
'/netwerk/base',
|
'/netwerk/base',
|
||||||
'/widget',
|
'/widget',
|
||||||
'/widget/android',
|
|
||||||
'/widget/cocoa',
|
'/widget/cocoa',
|
||||||
'/xpcom/base',
|
'/xpcom/base',
|
||||||
]
|
]
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
|
||||||
LOCAL_INCLUDES += [
|
|
||||||
'/dom/plugins/base/android',
|
|
||||||
]
|
|
||||||
|
|
||||||
if CONFIG['OS_ARCH'] == 'WINNT':
|
if CONFIG['OS_ARCH'] == 'WINNT':
|
||||||
LOCAL_INCLUDES += [
|
LOCAL_INCLUDES += [
|
||||||
'/xpcom/base',
|
'/xpcom/base',
|
||||||
|
|
@ -106,8 +97,6 @@ if CONFIG['OS_ARCH'] == 'WINNT':
|
||||||
|
|
||||||
include('/ipc/chromium/chromium-config.mozbuild')
|
include('/ipc/chromium/chromium-config.mozbuild')
|
||||||
|
|
||||||
DEFINES['SK_BUILD_FOR_ANDROID_NDK'] = True
|
|
||||||
|
|
||||||
FINAL_LIBRARY = 'xul'
|
FINAL_LIBRARY = 'xul'
|
||||||
|
|
||||||
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,6 @@
|
||||||
#include "npapi.h"
|
#include "npapi.h"
|
||||||
#include "npruntime.h"
|
#include "npruntime.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include <jni.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef NPError (* NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
|
typedef NPError (* NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
|
||||||
typedef NPError (* NPP_DestroyProcPtr)(NPP instance, NPSavedData** save);
|
typedef NPError (* NPP_DestroyProcPtr)(NPP instance, NPSavedData** save);
|
||||||
typedef NPError (* NPP_SetWindowProcPtr)(NPP instance, NPWindow* window);
|
typedef NPError (* NPP_SetWindowProcPtr)(NPP instance, NPWindow* window);
|
||||||
|
|
@ -261,14 +257,9 @@ NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs);
|
||||||
typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*);
|
typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*);
|
||||||
NP_EXPORT(NPError) NP_GetEntryPoints(NPPluginFuncs* pFuncs);
|
NP_EXPORT(NPError) NP_GetEntryPoints(NPPluginFuncs* pFuncs);
|
||||||
#else
|
#else
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*, JNIEnv* pEnv);
|
|
||||||
NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs, JNIEnv* pEnv);
|
|
||||||
#else
|
|
||||||
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*);
|
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*);
|
||||||
NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs);
|
NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
typedef NPError (*NP_ShutdownFunc)(void);
|
typedef NPError (*NP_ShutdownFunc)(void);
|
||||||
NP_EXPORT(NPError) NP_Shutdown(void);
|
NP_EXPORT(NPError) NP_Shutdown(void);
|
||||||
typedef NPError (*NP_GetValueFunc)(void *, NPPVariable, void *);
|
typedef NPError (*NP_GetValueFunc)(void *, NPPVariable, void *);
|
||||||
|
|
|
||||||
|
|
@ -97,15 +97,6 @@ using mozilla::plugins::PluginModuleContentParent;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "android_npapi.h"
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "GeneratedJNIWrappers.h"
|
|
||||||
#undef LOG
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "nsIAudioChannelAgent.h"
|
#include "nsIAudioChannelAgent.h"
|
||||||
#include "AudioChannelService.h"
|
#include "AudioChannelService.h"
|
||||||
|
|
||||||
|
|
@ -236,11 +227,7 @@ nsNPAPIPlugin::PluginCrashed(const nsAString& pluginDumpID,
|
||||||
bool
|
bool
|
||||||
nsNPAPIPlugin::RunPluginOOP(const nsPluginTag *aPluginTag)
|
nsNPAPIPlugin::RunPluginOOP(const nsPluginTag *aPluginTag)
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
return true;
|
return true;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PluginLibrary*
|
inline PluginLibrary*
|
||||||
|
|
@ -282,7 +269,7 @@ nsNPAPIPlugin::CreatePlugin(nsPluginTag *aPluginTag, nsNPAPIPlugin** aResult)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID)
|
#ifdef XP_MACOSX
|
||||||
if (!pluginLib->HasRequiredFunctions()) {
|
if (!pluginLib->HasRequiredFunctions()) {
|
||||||
NS_WARNING("Not all necessary functions exposed by plugin, it will not load.");
|
NS_WARNING("Not all necessary functions exposed by plugin, it will not load.");
|
||||||
delete pluginLib;
|
delete pluginLib;
|
||||||
|
|
@ -2019,156 +2006,6 @@ _getvalue(NPP npp, NPNVariable variable, void *result)
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
case kLogInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get log interface");
|
|
||||||
ANPLogInterfaceV0 *i = (ANPLogInterfaceV0 *) result;
|
|
||||||
InitLogInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kBitmapInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get bitmap interface");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kMatrixInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get matrix interface");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kPathInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get path interface");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kTypefaceInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get typeface interface");
|
|
||||||
ANPTypefaceInterfaceV0 *i = (ANPTypefaceInterfaceV0 *) result;
|
|
||||||
InitTypeFaceInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kPaintInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get paint interface");
|
|
||||||
ANPPaintInterfaceV0 *i = (ANPPaintInterfaceV0 *) result;
|
|
||||||
InitPaintInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kCanvasInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get canvas interface");
|
|
||||||
ANPCanvasInterfaceV0 *i = (ANPCanvasInterfaceV0 *) result;
|
|
||||||
InitCanvasInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kWindowInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get window interface");
|
|
||||||
ANPWindowInterfaceV0 *i = (ANPWindowInterfaceV0 *) result;
|
|
||||||
InitWindowInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kAudioTrackInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get audio interface");
|
|
||||||
ANPAudioTrackInterfaceV0 *i = (ANPAudioTrackInterfaceV0 *) result;
|
|
||||||
InitAudioTrackInterfaceV0(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kEventInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get event interface");
|
|
||||||
ANPEventInterfaceV0 *i = (ANPEventInterfaceV0 *) result;
|
|
||||||
InitEventInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kSystemInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get system interface");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kSurfaceInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get surface interface");
|
|
||||||
ANPSurfaceInterfaceV0 *i = (ANPSurfaceInterfaceV0 *) result;
|
|
||||||
InitSurfaceInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kSupportedDrawingModel_ANPGetValue: {
|
|
||||||
LOG("get supported drawing model");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kJavaContext_ANPGetValue: {
|
|
||||||
LOG("get java context");
|
|
||||||
auto ret = java::GeckoAppShell::GetContext();
|
|
||||||
if (!ret)
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
|
|
||||||
*static_cast<jobject*>(result) = ret.Forget();
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kAudioTrackInterfaceV1_ANPGetValue: {
|
|
||||||
LOG("get audio interface v1");
|
|
||||||
ANPAudioTrackInterfaceV1 *i = (ANPAudioTrackInterfaceV1 *) result;
|
|
||||||
InitAudioTrackInterfaceV1(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kNativeWindowInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get native window interface v0");
|
|
||||||
ANPNativeWindowInterfaceV0* i = (ANPNativeWindowInterfaceV0 *) result;
|
|
||||||
InitNativeWindowInterface(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kOpenGLInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get openGL interface");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kWindowInterfaceV1_ANPGetValue: {
|
|
||||||
LOG("get Window interface V1");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kWindowInterfaceV2_ANPGetValue: {
|
|
||||||
LOG("get Window interface V2");
|
|
||||||
ANPWindowInterfaceV2 *i = (ANPWindowInterfaceV2 *) result;
|
|
||||||
InitWindowInterfaceV2(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kVideoInterfaceV0_ANPGetValue: {
|
|
||||||
LOG("get video interface V0");
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kVideoInterfaceV1_ANPGetValue: {
|
|
||||||
LOG("get video interface V1");
|
|
||||||
ANPVideoInterfaceV1 *i = (ANPVideoInterfaceV1*) result;
|
|
||||||
InitVideoInterfaceV1(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kSystemInterfaceV1_ANPGetValue: {
|
|
||||||
LOG("get system interface v1");
|
|
||||||
ANPSystemInterfaceV1* i = reinterpret_cast<ANPSystemInterfaceV1*>(result);
|
|
||||||
InitSystemInterfaceV1(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
case kSystemInterfaceV2_ANPGetValue: {
|
|
||||||
LOG("get system interface v2");
|
|
||||||
ANPSystemInterfaceV2* i = reinterpret_cast<ANPSystemInterfaceV2*>(result);
|
|
||||||
InitSystemInterfaceV2(i);
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// we no longer hand out any XPCOM objects
|
// we no longer hand out any XPCOM objects
|
||||||
case NPNVDOMElement:
|
case NPNVDOMElement:
|
||||||
case NPNVDOMWindow:
|
case NPNVDOMWindow:
|
||||||
|
|
@ -2298,8 +2135,6 @@ _setvalue(NPP npp, NPPVariable variable, void *result)
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef MOZ_WIDGET_ANDROID
|
|
||||||
// On android, their 'drawing model' uses the same constant!
|
|
||||||
case NPPVpluginDrawingModel: {
|
case NPPVpluginDrawingModel: {
|
||||||
if (inst) {
|
if (inst) {
|
||||||
inst->SetDrawingModel((NPDrawingModel)NS_PTR_TO_INT32(result));
|
inst->SetDrawingModel((NPDrawingModel)NS_PTR_TO_INT32(result));
|
||||||
|
|
@ -2309,7 +2144,6 @@ _setvalue(NPP npp, NPPVariable variable, void *result)
|
||||||
return NPERR_GENERIC_ERROR;
|
return NPERR_GENERIC_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
case NPPVpluginEventModel: {
|
case NPPVpluginEventModel: {
|
||||||
|
|
@ -2322,14 +2156,7 @@ _setvalue(NPP npp, NPPVariable variable, void *result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
case kRequestDrawingModel_ANPSetValue:
|
|
||||||
if (inst)
|
|
||||||
inst->SetANPDrawingModel(NS_PTR_TO_INT32(result));
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
case kAcceptEvents_ANPSetValue:
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
#endif
|
|
||||||
default:
|
default:
|
||||||
return NPERR_GENERIC_ERROR;
|
return NPERR_GENERIC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
@ -2682,13 +2509,8 @@ _unscheduletimer(NPP instance, uint32_t timerID)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
// Sometimes Flash calls this with a dead NPP instance. Ensure the one we have
|
|
||||||
// here is valid and maps to a nsNPAPIPluginInstance.
|
|
||||||
nsNPAPIPluginInstance *inst = nsNPAPIPluginInstance::GetFromNPP(instance);
|
|
||||||
#else
|
|
||||||
nsNPAPIPluginInstance *inst = (nsNPAPIPluginInstance *)instance->ndata;
|
nsNPAPIPluginInstance *inst = (nsNPAPIPluginInstance *)instance->ndata;
|
||||||
#endif
|
|
||||||
if (!inst)
|
if (!inst)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,6 @@
|
||||||
|
|
||||||
#include "mozilla/DebugOnly.h"
|
#include "mozilla/DebugOnly.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
// For ScreenOrientation.h and Hal.h
|
|
||||||
#include "base/basictypes.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mozilla/Logging.h"
|
#include "mozilla/Logging.h"
|
||||||
#include "prmem.h"
|
#include "prmem.h"
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
|
|
@ -45,64 +40,6 @@
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
using namespace mozilla::dom;
|
using namespace mozilla::dom;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "android_npapi.h"
|
|
||||||
#include "mozilla/Mutex.h"
|
|
||||||
#include "mozilla/CondVar.h"
|
|
||||||
#include "mozilla/dom/ScreenOrientation.h"
|
|
||||||
#include "mozilla/Hal.h"
|
|
||||||
#include "GLContextProvider.h"
|
|
||||||
#include "GLContext.h"
|
|
||||||
#include "TexturePoolOGL.h"
|
|
||||||
#include "SurfaceTypes.h"
|
|
||||||
#include "EGLUtils.h"
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
using namespace mozilla::gl;
|
|
||||||
|
|
||||||
typedef nsNPAPIPluginInstance::VideoInfo VideoInfo;
|
|
||||||
|
|
||||||
class PluginEventRunnable : public Runnable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PluginEventRunnable(nsNPAPIPluginInstance* instance, ANPEvent* event)
|
|
||||||
: mInstance(instance), mEvent(*event), mCanceled(false) {}
|
|
||||||
|
|
||||||
virtual nsresult Run() {
|
|
||||||
if (mCanceled)
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
mInstance->HandleEvent(&mEvent, nullptr);
|
|
||||||
mInstance->PopPostedEvent(this);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Cancel() { mCanceled = true; }
|
|
||||||
private:
|
|
||||||
nsNPAPIPluginInstance* mInstance;
|
|
||||||
ANPEvent mEvent;
|
|
||||||
bool mCanceled;
|
|
||||||
};
|
|
||||||
|
|
||||||
static RefPtr<GLContext> sPluginContext = nullptr;
|
|
||||||
|
|
||||||
static bool EnsureGLContext()
|
|
||||||
{
|
|
||||||
if (!sPluginContext) {
|
|
||||||
const auto flags = CreateContextFlags::REQUIRE_COMPAT_PROFILE;
|
|
||||||
nsCString discardedFailureId;
|
|
||||||
sPluginContext = GLContextProvider::CreateHeadless(flags, &discardedFailureId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sPluginContext != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<NPP, nsNPAPIPluginInstance*> sPluginNPPMap;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
using namespace mozilla::plugins::parent;
|
using namespace mozilla::plugins::parent;
|
||||||
using namespace mozilla::layers;
|
using namespace mozilla::layers;
|
||||||
|
|
@ -113,13 +50,6 @@ NS_IMPL_ISUPPORTS(nsNPAPIPluginInstance, nsIAudioChannelAgentCallback)
|
||||||
|
|
||||||
nsNPAPIPluginInstance::nsNPAPIPluginInstance()
|
nsNPAPIPluginInstance::nsNPAPIPluginInstance()
|
||||||
: mDrawingModel(kDefaultDrawingModel)
|
: mDrawingModel(kDefaultDrawingModel)
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
, mANPDrawingModel(0)
|
|
||||||
, mFullScreenOrientation(dom::eScreenOrientation_LandscapePrimary)
|
|
||||||
, mWakeLocked(false)
|
|
||||||
, mFullScreen(false)
|
|
||||||
, mOriginPos(gl::OriginPos::TopLeft)
|
|
||||||
#endif
|
|
||||||
, mRunning(NOT_STARTED)
|
, mRunning(NOT_STARTED)
|
||||||
, mWindowless(false)
|
, mWindowless(false)
|
||||||
, mTransparent(false)
|
, mTransparent(false)
|
||||||
|
|
@ -131,9 +61,6 @@ nsNPAPIPluginInstance::nsNPAPIPluginInstance()
|
||||||
, mOwner(nullptr)
|
, mOwner(nullptr)
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
, mCurrentPluginEvent(nullptr)
|
, mCurrentPluginEvent(nullptr)
|
||||||
#endif
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
, mOnScreen(true)
|
|
||||||
#endif
|
#endif
|
||||||
, mHaveJavaC2PJSObjectQuirk(false)
|
, mHaveJavaC2PJSObjectQuirk(false)
|
||||||
, mCachedParamLength(0)
|
, mCachedParamLength(0)
|
||||||
|
|
@ -145,20 +72,12 @@ nsNPAPIPluginInstance::nsNPAPIPluginInstance()
|
||||||
mNPP.ndata = this;
|
mNPP.ndata = this;
|
||||||
|
|
||||||
PLUGIN_LOG(PLUGIN_LOG_BASIC, ("nsNPAPIPluginInstance ctor: this=%p\n",this));
|
PLUGIN_LOG(PLUGIN_LOG_BASIC, ("nsNPAPIPluginInstance ctor: this=%p\n",this));
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
sPluginNPPMap[&mNPP] = this;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nsNPAPIPluginInstance::~nsNPAPIPluginInstance()
|
nsNPAPIPluginInstance::~nsNPAPIPluginInstance()
|
||||||
{
|
{
|
||||||
PLUGIN_LOG(PLUGIN_LOG_BASIC, ("nsNPAPIPluginInstance dtor: this=%p\n",this));
|
PLUGIN_LOG(PLUGIN_LOG_BASIC, ("nsNPAPIPluginInstance dtor: this=%p\n",this));
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
sPluginNPPMap.erase(&mNPP);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (mMIMEType) {
|
if (mMIMEType) {
|
||||||
PR_Free((void *)mMIMEType);
|
PR_Free((void *)mMIMEType);
|
||||||
mMIMEType = nullptr;
|
mMIMEType = nullptr;
|
||||||
|
|
@ -195,21 +114,6 @@ nsNPAPIPluginInstance::Destroy()
|
||||||
Stop();
|
Stop();
|
||||||
mPlugin = nullptr;
|
mPlugin = nullptr;
|
||||||
mAudioChannelAgent = nullptr;
|
mAudioChannelAgent = nullptr;
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
if (mContentSurface)
|
|
||||||
mContentSurface->SetFrameAvailableCallback(nullptr);
|
|
||||||
|
|
||||||
mContentSurface = nullptr;
|
|
||||||
|
|
||||||
std::map<void*, VideoInfo*>::iterator it;
|
|
||||||
for (it = mVideos.begin(); it != mVideos.end(); it++) {
|
|
||||||
it->second->mSurfaceTexture->SetFrameAvailableCallback(nullptr);
|
|
||||||
delete it->second;
|
|
||||||
}
|
|
||||||
mVideos.clear();
|
|
||||||
SetWakeLock(false);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeStamp
|
TimeStamp
|
||||||
|
|
@ -297,14 +201,6 @@ nsresult nsNPAPIPluginInstance::Stop()
|
||||||
}
|
}
|
||||||
mRunning = DESTROYED;
|
mRunning = DESTROYED;
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
for (uint32_t i = 0; i < mPostedEvents.Length(); i++) {
|
|
||||||
mPostedEvents[i]->Cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
mPostedEvents.Clear();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nsJSNPRuntime::OnPluginDestroy(&mNPP);
|
nsJSNPRuntime::OnPluginDestroy(&mNPP);
|
||||||
|
|
||||||
if (error != NPERR_NO_ERROR)
|
if (error != NPERR_NO_ERROR)
|
||||||
|
|
@ -404,13 +300,8 @@ nsNPAPIPluginInstance::Start()
|
||||||
mCachedParamValues[i] = ToNewUTF8String(attributes[i].mValue);
|
mCachedParamValues[i] = ToNewUTF8String(attributes[i].mValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Android expects and empty string instead of null.
|
|
||||||
mCachedParamNames[attributes.Length()] = ToNewUTF8String(NS_LITERAL_STRING("PARAM"));
|
mCachedParamNames[attributes.Length()] = ToNewUTF8String(NS_LITERAL_STRING("PARAM"));
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
mCachedParamValues[attributes.Length()] = nullptr;
|
||||||
mCachedParamValues[attributes.Length()] = ToNewUTF8String(NS_LITERAL_STRING(""));
|
|
||||||
#else
|
|
||||||
mCachedParamValues[attributes.Length()] = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (uint32_t i = 0, pos = attributes.Length() + 1; i < params.Length(); i ++) {
|
for (uint32_t i = 0, pos = attributes.Length() + 1; i < params.Length(); i ++) {
|
||||||
mCachedParamNames[pos] = ToNewUTF8String(params[i].mName);
|
mCachedParamNames[pos] = ToNewUTF8String(params[i].mName);
|
||||||
|
|
@ -738,249 +629,6 @@ void nsNPAPIPluginInstance::SetEventModel(NPEventModel aModel)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_ANDROID)
|
|
||||||
|
|
||||||
static void SendLifecycleEvent(nsNPAPIPluginInstance* aInstance, uint32_t aAction)
|
|
||||||
{
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = kLifecycle_ANPEventType;
|
|
||||||
event.data.lifecycle.action = aAction;
|
|
||||||
aInstance->HandleEvent(&event, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::NotifyForeground(bool aForeground)
|
|
||||||
{
|
|
||||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsNPAPIPluginInstance::SetForeground this=%p\n foreground=%d",this, aForeground));
|
|
||||||
if (RUNNING != mRunning)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SendLifecycleEvent(this, aForeground ? kResume_ANPLifecycleAction : kPause_ANPLifecycleAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::NotifyOnScreen(bool aOnScreen)
|
|
||||||
{
|
|
||||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsNPAPIPluginInstance::SetOnScreen this=%p\n onScreen=%d",this, aOnScreen));
|
|
||||||
if (RUNNING != mRunning || mOnScreen == aOnScreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mOnScreen = aOnScreen;
|
|
||||||
SendLifecycleEvent(this, aOnScreen ? kOnScreen_ANPLifecycleAction : kOffScreen_ANPLifecycleAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::MemoryPressure()
|
|
||||||
{
|
|
||||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsNPAPIPluginInstance::MemoryPressure this=%p\n",this));
|
|
||||||
if (RUNNING != mRunning)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SendLifecycleEvent(this, kFreeMemory_ANPLifecycleAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::NotifyFullScreen(bool aFullScreen)
|
|
||||||
{
|
|
||||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsNPAPIPluginInstance::NotifyFullScreen this=%p\n",this));
|
|
||||||
|
|
||||||
if (RUNNING != mRunning || mFullScreen == aFullScreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mFullScreen = aFullScreen;
|
|
||||||
SendLifecycleEvent(this, mFullScreen ? kEnterFullScreen_ANPLifecycleAction : kExitFullScreen_ANPLifecycleAction);
|
|
||||||
|
|
||||||
if (mFullScreen && mFullScreenOrientation != dom::eScreenOrientation_None) {
|
|
||||||
java::GeckoAppShell::LockScreenOrientation(mFullScreenOrientation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::NotifySize(nsIntSize size)
|
|
||||||
{
|
|
||||||
if (kOpenGL_ANPDrawingModel != GetANPDrawingModel() ||
|
|
||||||
size == mCurrentSize)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mCurrentSize = size;
|
|
||||||
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = kDraw_ANPEventType;
|
|
||||||
event.data.draw.model = kOpenGL_ANPDrawingModel;
|
|
||||||
event.data.draw.data.surfaceSize.width = size.width;
|
|
||||||
event.data.draw.data.surfaceSize.height = size.height;
|
|
||||||
|
|
||||||
HandleEvent(&event, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::SetANPDrawingModel(uint32_t aModel)
|
|
||||||
{
|
|
||||||
mANPDrawingModel = aModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* nsNPAPIPluginInstance::GetJavaSurface()
|
|
||||||
{
|
|
||||||
void* surface = nullptr;
|
|
||||||
nsresult rv = GetValueFromPlugin(kJavaSurface_ANPGetValue, &surface);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return surface;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::PostEvent(void* event)
|
|
||||||
{
|
|
||||||
PluginEventRunnable *r = new PluginEventRunnable(this, (ANPEvent*)event);
|
|
||||||
mPostedEvents.AppendElement(RefPtr<PluginEventRunnable>(r));
|
|
||||||
|
|
||||||
NS_DispatchToMainThread(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::SetFullScreenOrientation(uint32_t orientation)
|
|
||||||
{
|
|
||||||
if (mFullScreenOrientation == orientation)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32_t oldOrientation = mFullScreenOrientation;
|
|
||||||
mFullScreenOrientation = orientation;
|
|
||||||
|
|
||||||
if (mFullScreen) {
|
|
||||||
// We're already fullscreen so immediately apply the orientation change
|
|
||||||
|
|
||||||
if (mFullScreenOrientation != dom::eScreenOrientation_None) {
|
|
||||||
java::GeckoAppShell::LockScreenOrientation(mFullScreenOrientation);
|
|
||||||
} else if (oldOrientation != dom::eScreenOrientation_None) {
|
|
||||||
// We applied an orientation when we entered fullscreen, but
|
|
||||||
// we don't want it anymore
|
|
||||||
java::GeckoAppShell::UnlockScreenOrientation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::PopPostedEvent(PluginEventRunnable* r)
|
|
||||||
{
|
|
||||||
mPostedEvents.RemoveElement(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::SetWakeLock(bool aLocked)
|
|
||||||
{
|
|
||||||
if (aLocked == mWakeLocked)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mWakeLocked = aLocked;
|
|
||||||
hal::ModifyWakeLock(NS_LITERAL_STRING("screen"),
|
|
||||||
mWakeLocked ? hal::WAKE_LOCK_ADD_ONE : hal::WAKE_LOCK_REMOVE_ONE,
|
|
||||||
hal::WAKE_LOCK_NO_CHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLContext* nsNPAPIPluginInstance::GLContext()
|
|
||||||
{
|
|
||||||
if (!EnsureGLContext())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return sPluginContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<AndroidSurfaceTexture> nsNPAPIPluginInstance::CreateSurfaceTexture()
|
|
||||||
{
|
|
||||||
if (!EnsureGLContext())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
GLuint texture = TexturePoolOGL::AcquireTexture();
|
|
||||||
if (!texture)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
RefPtr<AndroidSurfaceTexture> surface = AndroidSurfaceTexture::Create(TexturePoolOGL::GetGLContext(),
|
|
||||||
texture);
|
|
||||||
if (!surface) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsIRunnable> frameCallback = NewRunnableMethod(this, &nsNPAPIPluginInstance::OnSurfaceTextureFrameAvailable);
|
|
||||||
surface->SetFrameAvailableCallback(frameCallback);
|
|
||||||
return surface.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::OnSurfaceTextureFrameAvailable()
|
|
||||||
{
|
|
||||||
if (mRunning == RUNNING && mOwner)
|
|
||||||
mOwner->Recomposite();
|
|
||||||
}
|
|
||||||
|
|
||||||
void* nsNPAPIPluginInstance::AcquireContentWindow()
|
|
||||||
{
|
|
||||||
if (!mContentSurface) {
|
|
||||||
mContentSurface = CreateSurfaceTexture();
|
|
||||||
|
|
||||||
if (!mContentSurface)
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mContentSurface->NativeWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
AndroidSurfaceTexture*
|
|
||||||
nsNPAPIPluginInstance::AsSurfaceTexture()
|
|
||||||
{
|
|
||||||
if (!mContentSurface)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return mContentSurface;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* nsNPAPIPluginInstance::AcquireVideoWindow()
|
|
||||||
{
|
|
||||||
RefPtr<AndroidSurfaceTexture> surface = CreateSurfaceTexture();
|
|
||||||
if (!surface) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoInfo* info = new VideoInfo(surface);
|
|
||||||
|
|
||||||
void* window = info->mSurfaceTexture->NativeWindow();
|
|
||||||
mVideos.insert(std::pair<void*, VideoInfo*>(window, info));
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::ReleaseVideoWindow(void* window)
|
|
||||||
{
|
|
||||||
std::map<void*, VideoInfo*>::iterator it = mVideos.find(window);
|
|
||||||
if (it == mVideos.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
delete it->second;
|
|
||||||
mVideos.erase(window);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::SetVideoDimensions(void* window, gfxRect aDimensions)
|
|
||||||
{
|
|
||||||
std::map<void*, VideoInfo*>::iterator it;
|
|
||||||
|
|
||||||
it = mVideos.find(window);
|
|
||||||
if (it == mVideos.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
it->second->mDimensions = aDimensions;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsNPAPIPluginInstance::GetVideos(nsTArray<VideoInfo*>& aVideos)
|
|
||||||
{
|
|
||||||
std::map<void*, VideoInfo*>::iterator it;
|
|
||||||
for (it = mVideos.begin(); it != mVideos.end(); it++)
|
|
||||||
aVideos.AppendElement(it->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsNPAPIPluginInstance* nsNPAPIPluginInstance::GetFromNPP(NPP npp)
|
|
||||||
{
|
|
||||||
std::map<NPP, nsNPAPIPluginInstance*>::iterator it;
|
|
||||||
|
|
||||||
it = sPluginNPPMap.find(npp);
|
|
||||||
if (it == sPluginNPPMap.end())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nsresult nsNPAPIPluginInstance::GetDrawingModel(int32_t* aModel)
|
nsresult nsNPAPIPluginInstance::GetDrawingModel(int32_t* aModel)
|
||||||
{
|
{
|
||||||
*aModel = (int32_t)mDrawingModel;
|
*aModel = (int32_t)mDrawingModel;
|
||||||
|
|
@ -1083,9 +731,8 @@ nsNPAPIPluginInstance::ShouldCache()
|
||||||
nsresult
|
nsresult
|
||||||
nsNPAPIPluginInstance::IsWindowless(bool* isWindowless)
|
nsNPAPIPluginInstance::IsWindowless(bool* isWindowless)
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(XP_MACOSX)
|
#ifdef XP_MACOSX
|
||||||
// All OS X plugins are windowless.
|
// All OS X plugins are windowless.
|
||||||
// On android, pre-honeycomb, all plugins are treated as windowless.
|
|
||||||
*isWindowless = true;
|
*isWindowless = true;
|
||||||
#else
|
#else
|
||||||
*isWindowless = mWindowless;
|
*isWindowless = mWindowless;
|
||||||
|
|
|
||||||
|
|
@ -18,15 +18,6 @@
|
||||||
#include <prinrval.h>
|
#include <prinrval.h>
|
||||||
#include "js/TypeDecls.h"
|
#include "js/TypeDecls.h"
|
||||||
#include "nsIAudioChannelAgent.h"
|
#include "nsIAudioChannelAgent.h"
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include "nsIRunnable.h"
|
|
||||||
#include "GLContextTypes.h"
|
|
||||||
#include "AndroidSurfaceTexture.h"
|
|
||||||
#include "AndroidBridge.h"
|
|
||||||
#include <map>
|
|
||||||
class PluginEventRunnable;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mozilla/EventForwards.h"
|
#include "mozilla/EventForwards.h"
|
||||||
#include "mozilla/TimeStamp.h"
|
#include "mozilla/TimeStamp.h"
|
||||||
#include "mozilla/PluginLibrary.h"
|
#include "mozilla/PluginLibrary.h"
|
||||||
|
|
@ -163,90 +154,6 @@ public:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
void NotifyForeground(bool aForeground);
|
|
||||||
void NotifyOnScreen(bool aOnScreen);
|
|
||||||
void MemoryPressure();
|
|
||||||
void NotifyFullScreen(bool aFullScreen);
|
|
||||||
void NotifySize(nsIntSize size);
|
|
||||||
|
|
||||||
nsIntSize CurrentSize() { return mCurrentSize; }
|
|
||||||
|
|
||||||
bool IsOnScreen() {
|
|
||||||
return mOnScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t GetANPDrawingModel() { return mANPDrawingModel; }
|
|
||||||
void SetANPDrawingModel(uint32_t aModel);
|
|
||||||
|
|
||||||
void* GetJavaSurface();
|
|
||||||
|
|
||||||
void PostEvent(void* event);
|
|
||||||
|
|
||||||
// These are really mozilla::dom::ScreenOrientation, but it's
|
|
||||||
// difficult to include that here
|
|
||||||
uint32_t FullScreenOrientation() { return mFullScreenOrientation; }
|
|
||||||
void SetFullScreenOrientation(uint32_t orientation);
|
|
||||||
|
|
||||||
void SetWakeLock(bool aLock);
|
|
||||||
|
|
||||||
mozilla::gl::GLContext* GLContext();
|
|
||||||
|
|
||||||
// For ANPOpenGL
|
|
||||||
class TextureInfo {
|
|
||||||
public:
|
|
||||||
TextureInfo() :
|
|
||||||
mTexture(0), mWidth(0), mHeight(0), mInternalFormat(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureInfo(GLuint aTexture, int32_t aWidth, int32_t aHeight, GLuint aInternalFormat) :
|
|
||||||
mTexture(aTexture), mWidth(aWidth), mHeight(aHeight), mInternalFormat(aInternalFormat)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GLuint mTexture;
|
|
||||||
int32_t mWidth;
|
|
||||||
int32_t mHeight;
|
|
||||||
GLuint mInternalFormat;
|
|
||||||
};
|
|
||||||
|
|
||||||
// For ANPNativeWindow
|
|
||||||
void* AcquireContentWindow();
|
|
||||||
|
|
||||||
mozilla::gl::AndroidSurfaceTexture* AsSurfaceTexture();
|
|
||||||
|
|
||||||
// For ANPVideo
|
|
||||||
class VideoInfo {
|
|
||||||
public:
|
|
||||||
VideoInfo(mozilla::gl::AndroidSurfaceTexture* aSurfaceTexture) :
|
|
||||||
mSurfaceTexture(aSurfaceTexture)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~VideoInfo()
|
|
||||||
{
|
|
||||||
mSurfaceTexture = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<mozilla::gl::AndroidSurfaceTexture> mSurfaceTexture;
|
|
||||||
gfxRect mDimensions;
|
|
||||||
};
|
|
||||||
|
|
||||||
void* AcquireVideoWindow();
|
|
||||||
void ReleaseVideoWindow(void* aWindow);
|
|
||||||
void SetVideoDimensions(void* aWindow, gfxRect aDimensions);
|
|
||||||
|
|
||||||
void GetVideos(nsTArray<VideoInfo*>& aVideos);
|
|
||||||
|
|
||||||
void SetOriginPos(mozilla::gl::OriginPos aOriginPos) {
|
|
||||||
mOriginPos = aOriginPos;
|
|
||||||
}
|
|
||||||
mozilla::gl::OriginPos OriginPos() const { return mOriginPos; }
|
|
||||||
|
|
||||||
static nsNPAPIPluginInstance* GetFromNPP(NPP npp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nsresult NewStreamListener(const char* aURL, void* notifyData,
|
nsresult NewStreamListener(const char* aURL, void* notifyData,
|
||||||
nsNPAPIPluginStreamListener** listener);
|
nsNPAPIPluginStreamListener** listener);
|
||||||
|
|
||||||
|
|
@ -347,23 +254,6 @@ protected:
|
||||||
|
|
||||||
NPDrawingModel mDrawingModel;
|
NPDrawingModel mDrawingModel;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
uint32_t mANPDrawingModel;
|
|
||||||
|
|
||||||
friend class PluginEventRunnable;
|
|
||||||
|
|
||||||
nsTArray<RefPtr<PluginEventRunnable>> mPostedEvents;
|
|
||||||
void PopPostedEvent(PluginEventRunnable* r);
|
|
||||||
void OnSurfaceTextureFrameAvailable();
|
|
||||||
|
|
||||||
uint32_t mFullScreenOrientation;
|
|
||||||
bool mWakeLocked;
|
|
||||||
bool mFullScreen;
|
|
||||||
mozilla::gl::OriginPos mOriginPos;
|
|
||||||
|
|
||||||
RefPtr<mozilla::gl::AndroidSurfaceTexture> mContentSurface;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NOT_STARTED,
|
NOT_STARTED,
|
||||||
RUNNING,
|
RUNNING,
|
||||||
|
|
@ -410,15 +300,6 @@ private:
|
||||||
// This is only valid when the plugin is actually stopped!
|
// This is only valid when the plugin is actually stopped!
|
||||||
mozilla::TimeStamp mStopTime;
|
mozilla::TimeStamp mStopTime;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
already_AddRefed<mozilla::gl::AndroidSurfaceTexture> CreateSurfaceTexture();
|
|
||||||
|
|
||||||
std::map<void*, VideoInfo*> mVideos;
|
|
||||||
bool mOnScreen;
|
|
||||||
|
|
||||||
nsIntSize mCurrentSize;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// is this instance Java and affected by bug 750480?
|
// is this instance Java and affected by bug 750480?
|
||||||
bool mHaveJavaC2PJSObjectQuirk;
|
bool mHaveJavaC2PJSObjectQuirk;
|
||||||
|
|
||||||
|
|
@ -434,13 +315,7 @@ private:
|
||||||
bool mMuted;
|
bool mMuted;
|
||||||
};
|
};
|
||||||
|
|
||||||
// On Android, we need to guard against plugin code leaking entries in the local
|
#define MAIN_THREAD_JNI_REF_GUARD
|
||||||
// JNI ref table. See https://bugzilla.mozilla.org/show_bug.cgi?id=780831#c21
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#define MAIN_THREAD_JNI_REF_GUARD mozilla::AutoLocalJNIFrame jniFrame
|
|
||||||
#else
|
|
||||||
#define MAIN_THREAD_JNI_REF_GUARD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void NS_NotifyBeginPluginCall(NSPluginCallReentry aReentryState);
|
void NS_NotifyBeginPluginCall(NSPluginCallReentry aReentryState);
|
||||||
void NS_NotifyPluginCall(NSPluginCallReentry aReentryState);
|
void NS_NotifyPluginCall(NSPluginCallReentry aReentryState);
|
||||||
|
|
|
||||||
|
|
@ -104,11 +104,6 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ANDROID
|
|
||||||
#include <android/log.h>
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "npapi.h"
|
#include "npapi.h"
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
|
|
@ -293,10 +288,6 @@ nsPluginHost::nsPluginHost()
|
||||||
if (obsService) {
|
if (obsService) {
|
||||||
obsService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
|
obsService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
|
||||||
obsService->AddObserver(this, "blocklist-updated", false);
|
obsService->AddObserver(this, "blocklist-updated", false);
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
obsService->AddObserver(this, "application-foreground", false);
|
|
||||||
obsService->AddObserver(this, "application-background", false);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PLUGIN_LOGGING
|
#ifdef PLUGIN_LOGGING
|
||||||
|
|
@ -2306,11 +2297,6 @@ WatchRegKey(uint32_t aRoot, nsCOMPtr<nsIWindowsRegKey>& aKey)
|
||||||
|
|
||||||
nsresult nsPluginHost::LoadPlugins()
|
nsresult nsPluginHost::LoadPlugins()
|
||||||
{
|
{
|
||||||
#ifdef ANDROID
|
|
||||||
if (XRE_IsContentProcess()) {
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// do not do anything if it is already done
|
// do not do anything if it is already done
|
||||||
// use ReloadPlugins() to enforce loading
|
// use ReloadPlugins() to enforce loading
|
||||||
if (mPluginsLoaded)
|
if (mPluginsLoaded)
|
||||||
|
|
@ -2453,10 +2439,6 @@ nsresult nsPluginHost::FindPlugins(bool aCreatePluginList, bool * aPluginsChange
|
||||||
NS_ITERATIVE_UNREF_LIST(RefPtr<nsInvalidPluginTag>, mInvalidPlugins, mNext);
|
NS_ITERATIVE_UNREF_LIST(RefPtr<nsInvalidPluginTag>, mInvalidPlugins, mNext);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
#ifdef ANDROID
|
|
||||||
LOG("getting plugins dir failed");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mPluginsLoaded = true; // at this point 'some' plugins have been loaded,
|
mPluginsLoaded = true; // at this point 'some' plugins have been loaded,
|
||||||
|
|
@ -3069,14 +3051,6 @@ nsPluginHost::ReadPluginInfo()
|
||||||
if (!reader.NextLine())
|
if (!reader.NextLine())
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
// Flash on Android does not populate the version field, but it is tacked on to the description.
|
|
||||||
// For example, "Shockwave Flash 11.1 r115"
|
|
||||||
if (PL_strncmp("Shockwave Flash ", description, 16) == 0 && description[16]) {
|
|
||||||
version = &description[16];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *name = reader.LinePtr();
|
const char *name = reader.LinePtr();
|
||||||
if (!reader.NextLine())
|
if (!reader.NextLine())
|
||||||
return rv;
|
return rv;
|
||||||
|
|
@ -3144,31 +3118,6 @@ nsPluginHost::ReadPluginInfo()
|
||||||
mCachedPlugins = tag;
|
mCachedPlugins = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
// On Android we always want to try to load a plugin again (Flash). Bug 935676.
|
|
||||||
#ifndef MOZ_WIDGET_ANDROID
|
|
||||||
if (!ReadSectionHeader(reader, "INVALID")) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (reader.NextLine()) {
|
|
||||||
const char *fullpath = reader.LinePtr();
|
|
||||||
if (!reader.NextLine()) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *lastModifiedTimeStamp = reader.LinePtr();
|
|
||||||
int64_t lastmod = nsCRT::atoll(lastModifiedTimeStamp);
|
|
||||||
|
|
||||||
RefPtr<nsInvalidPluginTag> invalidTag = new nsInvalidPluginTag(fullpath, lastmod);
|
|
||||||
|
|
||||||
invalidTag->mNext = mInvalidPlugins;
|
|
||||||
if (mInvalidPlugins) {
|
|
||||||
mInvalidPlugins->mPrev = invalidTag;
|
|
||||||
}
|
|
||||||
mInvalidPlugins = invalidTag;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3491,24 +3440,7 @@ NS_IMETHODIMP nsPluginHost::Observe(nsISupports *aSubject,
|
||||||
plugin = plugin->mNext;
|
plugin = plugin->mNext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
if (!strcmp("application-background", aTopic)) {
|
|
||||||
for(uint32_t i = 0; i < mInstances.Length(); i++) {
|
|
||||||
mInstances[i]->NotifyForeground(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!strcmp("application-foreground", aTopic)) {
|
|
||||||
for(uint32_t i = 0; i < mInstances.Length(); i++) {
|
|
||||||
if (mInstances[i]->IsOnScreen())
|
|
||||||
mInstances[i]->NotifyForeground(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!strcmp("memory-pressure", aTopic)) {
|
|
||||||
for(uint32_t i = 0; i < mInstances.Length(); i++) {
|
|
||||||
mInstances[i]->MemoryPressure();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,20 +87,6 @@ static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
#include "ANPBase.h"
|
|
||||||
#include "AndroidBridge.h"
|
|
||||||
#include "ClientLayerManager.h"
|
|
||||||
#include "nsWindow.h"
|
|
||||||
|
|
||||||
static nsPluginInstanceOwner* sFullScreenInstance = nullptr;
|
|
||||||
|
|
||||||
using namespace mozilla::dom;
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
using namespace mozilla::dom;
|
using namespace mozilla::dom;
|
||||||
using namespace mozilla::layers;
|
using namespace mozilla::layers;
|
||||||
|
|
@ -165,29 +151,6 @@ nsPluginInstanceOwner::NotifyPaintWaiter(nsDisplayListBuilder* aBuilder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
static void
|
|
||||||
AttachToContainerAsSurfaceTexture(ImageContainer* container,
|
|
||||||
nsNPAPIPluginInstance* instance,
|
|
||||||
const LayoutDeviceRect& rect,
|
|
||||||
RefPtr<Image>* out_image)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(out_image);
|
|
||||||
MOZ_ASSERT(!*out_image);
|
|
||||||
|
|
||||||
mozilla::gl::AndroidSurfaceTexture* surfTex = instance->AsSurfaceTexture();
|
|
||||||
if (!surfTex) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<Image> img = new SurfaceTextureImage(
|
|
||||||
surfTex,
|
|
||||||
gfx::IntSize::Truncate(rect.width, rect.height),
|
|
||||||
instance->OriginPos());
|
|
||||||
*out_image = img;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nsPluginInstanceOwner::NeedsScrollImageLayer()
|
nsPluginInstanceOwner::NeedsScrollImageLayer()
|
||||||
{
|
{
|
||||||
|
|
@ -211,27 +174,6 @@ nsPluginInstanceOwner::GetImageContainer()
|
||||||
|
|
||||||
RefPtr<ImageContainer> container;
|
RefPtr<ImageContainer> container;
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
LayoutDeviceRect r = GetPluginRect();
|
|
||||||
|
|
||||||
// NotifySize() causes Flash to do a bunch of stuff like ask for surfaces to render
|
|
||||||
// into, set y-flip flags, etc, so we do this at the beginning.
|
|
||||||
float resolution = mPluginFrame->PresContext()->PresShell()->GetCumulativeResolution();
|
|
||||||
ScreenSize screenSize = (r * LayoutDeviceToScreenScale(resolution)).Size();
|
|
||||||
mInstance->NotifySize(nsIntSize::Truncate(screenSize.width, screenSize.height));
|
|
||||||
|
|
||||||
container = LayerManager::CreateImageContainer();
|
|
||||||
|
|
||||||
if (r.width && r.height) {
|
|
||||||
// Try to get it as an EGLImage first.
|
|
||||||
RefPtr<Image> img;
|
|
||||||
AttachToContainerAsSurfaceTexture(container, mInstance, r, &img);
|
|
||||||
|
|
||||||
if (img) {
|
|
||||||
container->SetCurrentImageInTransaction(img);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (NeedsScrollImageLayer()) {
|
if (NeedsScrollImageLayer()) {
|
||||||
// windowed plugin under e10s
|
// windowed plugin under e10s
|
||||||
#if defined(XP_WIN)
|
#if defined(XP_WIN)
|
||||||
|
|
@ -241,7 +183,6 @@ nsPluginInstanceOwner::GetImageContainer()
|
||||||
// async windowless rendering
|
// async windowless rendering
|
||||||
mInstance->GetImageContainer(getter_AddRefs(container));
|
mInstance->GetImageContainer(getter_AddRefs(container));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return container.forget();
|
return container.forget();
|
||||||
}
|
}
|
||||||
|
|
@ -358,11 +299,6 @@ nsPluginInstanceOwner::nsPluginInstanceOwner()
|
||||||
|
|
||||||
mWaitingForPaint = false;
|
mWaitingForPaint = false;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
mFullScreen = false;
|
|
||||||
mJavaView = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_WIN
|
#ifdef XP_WIN
|
||||||
mGotCompositionData = false;
|
mGotCompositionData = false;
|
||||||
mSentStartComposition = false;
|
mSentStartComposition = false;
|
||||||
|
|
@ -387,10 +323,6 @@ nsPluginInstanceOwner::~nsPluginInstanceOwner()
|
||||||
PLUG_DeletePluginNativeWindow(mPluginWindow);
|
PLUG_DeletePluginNativeWindow(mPluginWindow);
|
||||||
mPluginWindow = nullptr;
|
mPluginWindow = nullptr;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
RemovePluginView();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (mInstance) {
|
if (mInstance) {
|
||||||
mInstance->SetOwner(nullptr);
|
mInstance->SetOwner(nullptr);
|
||||||
}
|
}
|
||||||
|
|
@ -413,10 +345,6 @@ nsPluginInstanceOwner::SetInstance(nsNPAPIPluginInstance *aInstance)
|
||||||
// from our destructor. This fixes bug 613376.
|
// from our destructor. This fixes bug 613376.
|
||||||
if (mInstance && !aInstance) {
|
if (mInstance && !aInstance) {
|
||||||
mInstance->SetOwner(nullptr);
|
mInstance->SetOwner(nullptr);
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
RemovePluginView();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mInstance = aInstance;
|
mInstance = aInstance;
|
||||||
|
|
@ -601,7 +529,7 @@ NS_IMETHODIMP nsPluginInstanceOwner::InvalidateRect(NPRect *invalidRect)
|
||||||
if (!mPluginFrame || !invalidRect || !mWidgetVisible)
|
if (!mPluginFrame || !invalidRect || !mWidgetVisible)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
#if defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID)
|
#ifdef XP_MACOSX
|
||||||
// Each time an asynchronously-drawing plugin sends a new surface to display,
|
// Each time an asynchronously-drawing plugin sends a new surface to display,
|
||||||
// the image in the ImageContainer is updated and InvalidateRect is called.
|
// the image in the ImageContainer is updated and InvalidateRect is called.
|
||||||
// There are different side effects for (sync) Android plugins.
|
// There are different side effects for (sync) Android plugins.
|
||||||
|
|
@ -624,6 +552,7 @@ NS_IMETHODIMP nsPluginInstanceOwner::InvalidateRect(NPRect *invalidRect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nsIntRect rect(invalidRect->left,
|
nsIntRect rect(invalidRect->left,
|
||||||
invalidRect->top,
|
invalidRect->top,
|
||||||
invalidRect->right - invalidRect->left,
|
invalidRect->right - invalidRect->left,
|
||||||
|
|
@ -1485,185 +1414,6 @@ nsPluginInstanceOwner::GetEventloopNestingLevel()
|
||||||
return currentLevel;
|
return currentLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
|
|
||||||
// Modified version of nsFrame::GetOffsetToCrossDoc that stops when it
|
|
||||||
// hits an element with a displayport (or runs out of frames). This is
|
|
||||||
// not really the right thing to do, but it's better than what was here before.
|
|
||||||
static nsPoint
|
|
||||||
GetOffsetRootContent(nsIFrame* aFrame)
|
|
||||||
{
|
|
||||||
// offset will hold the final offset
|
|
||||||
// docOffset holds the currently accumulated offset at the current APD, it
|
|
||||||
// will be converted and added to offset when the current APD changes.
|
|
||||||
nsPoint offset(0, 0), docOffset(0, 0);
|
|
||||||
const nsIFrame* f = aFrame;
|
|
||||||
int32_t currAPD = aFrame->PresContext()->AppUnitsPerDevPixel();
|
|
||||||
int32_t apd = currAPD;
|
|
||||||
while (f) {
|
|
||||||
if (f->GetContent() && nsLayoutUtils::HasDisplayPort(f->GetContent()))
|
|
||||||
break;
|
|
||||||
|
|
||||||
docOffset += f->GetPosition();
|
|
||||||
nsIFrame* parent = f->GetParent();
|
|
||||||
if (parent) {
|
|
||||||
f = parent;
|
|
||||||
} else {
|
|
||||||
nsPoint newOffset(0, 0);
|
|
||||||
f = nsLayoutUtils::GetCrossDocParentFrame(f, &newOffset);
|
|
||||||
int32_t newAPD = f ? f->PresContext()->AppUnitsPerDevPixel() : 0;
|
|
||||||
if (!f || newAPD != currAPD) {
|
|
||||||
// Convert docOffset to the right APD and add it to offset.
|
|
||||||
offset += docOffset.ScaleToOtherAppUnits(currAPD, apd);
|
|
||||||
docOffset.x = docOffset.y = 0;
|
|
||||||
}
|
|
||||||
currAPD = newAPD;
|
|
||||||
docOffset += newOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
offset += docOffset.ScaleToOtherAppUnits(currAPD, apd);
|
|
||||||
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
LayoutDeviceRect nsPluginInstanceOwner::GetPluginRect()
|
|
||||||
{
|
|
||||||
// Get the offset of the content relative to the page
|
|
||||||
nsRect bounds = mPluginFrame->GetContentRectRelativeToSelf() + GetOffsetRootContent(mPluginFrame);
|
|
||||||
LayoutDeviceIntRect rect = LayoutDeviceIntRect::FromAppUnitsToNearest(bounds, mPluginFrame->PresContext()->AppUnitsPerDevPixel());
|
|
||||||
return LayoutDeviceRect(rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nsPluginInstanceOwner::AddPluginView(const LayoutDeviceRect& aRect /* = LayoutDeviceRect(0, 0, 0, 0) */)
|
|
||||||
{
|
|
||||||
if (!mJavaView) {
|
|
||||||
mJavaView = mInstance->GetJavaSurface();
|
|
||||||
|
|
||||||
if (!mJavaView)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
mJavaView = (void*)jni::GetGeckoThreadEnv()->NewGlobalRef((jobject)mJavaView);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFullScreen) {
|
|
||||||
java::GeckoAppShell::AddFullScreenPluginView(jni::Object::Ref::From(jobject(mJavaView)));
|
|
||||||
sFullScreenInstance = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::RemovePluginView()
|
|
||||||
{
|
|
||||||
if (!mInstance || !mJavaView)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mFullScreen) {
|
|
||||||
java::GeckoAppShell::RemoveFullScreenPluginView(jni::Object::Ref::From(jobject(mJavaView)));
|
|
||||||
}
|
|
||||||
jni::GetGeckoThreadEnv()->DeleteGlobalRef((jobject)mJavaView);
|
|
||||||
mJavaView = nullptr;
|
|
||||||
|
|
||||||
if (mFullScreen)
|
|
||||||
sFullScreenInstance = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsPluginInstanceOwner::GetVideos(nsTArray<nsNPAPIPluginInstance::VideoInfo*>& aVideos)
|
|
||||||
{
|
|
||||||
if (!mInstance)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mInstance->GetVideos(aVideos);
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<ImageContainer>
|
|
||||||
nsPluginInstanceOwner::GetImageContainerForVideo(nsNPAPIPluginInstance::VideoInfo* aVideoInfo)
|
|
||||||
{
|
|
||||||
RefPtr<ImageContainer> container = LayerManager::CreateImageContainer();
|
|
||||||
|
|
||||||
if (aVideoInfo->mDimensions.width && aVideoInfo->mDimensions.height) {
|
|
||||||
RefPtr<Image> img = new SurfaceTextureImage(
|
|
||||||
aVideoInfo->mSurfaceTexture,
|
|
||||||
gfx::IntSize::Truncate(aVideoInfo->mDimensions.width, aVideoInfo->mDimensions.height),
|
|
||||||
gl::OriginPos::BottomLeft);
|
|
||||||
container->SetCurrentImageInTransaction(img);
|
|
||||||
}
|
|
||||||
|
|
||||||
return container.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::Invalidate() {
|
|
||||||
NPRect rect;
|
|
||||||
rect.left = rect.top = 0;
|
|
||||||
rect.right = mPluginWindow->width;
|
|
||||||
rect.bottom = mPluginWindow->height;
|
|
||||||
InvalidateRect(&rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::Recomposite() {
|
|
||||||
nsIWidget* const widget = mPluginFrame->GetNearestWidget();
|
|
||||||
NS_ENSURE_TRUE_VOID(widget);
|
|
||||||
|
|
||||||
LayerManager* const lm = widget->GetLayerManager();
|
|
||||||
NS_ENSURE_TRUE_VOID(lm);
|
|
||||||
|
|
||||||
ClientLayerManager* const clm = lm->AsClientLayerManager();
|
|
||||||
NS_ENSURE_TRUE_VOID(clm && clm->GetRoot());
|
|
||||||
|
|
||||||
clm->SendInvalidRegion(
|
|
||||||
clm->GetRoot()->GetLocalVisibleRegion().ToUnknownRegion().GetBounds());
|
|
||||||
clm->Composite();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::RequestFullScreen() {
|
|
||||||
if (mFullScreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Remove whatever view we currently have (if any, fullscreen or otherwise)
|
|
||||||
RemovePluginView();
|
|
||||||
|
|
||||||
mFullScreen = true;
|
|
||||||
AddPluginView();
|
|
||||||
|
|
||||||
mInstance->NotifyFullScreen(mFullScreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::ExitFullScreen() {
|
|
||||||
if (!mFullScreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
RemovePluginView();
|
|
||||||
|
|
||||||
mFullScreen = false;
|
|
||||||
|
|
||||||
int32_t model = mInstance->GetANPDrawingModel();
|
|
||||||
|
|
||||||
if (model == kSurface_ANPDrawingModel) {
|
|
||||||
// We need to do this immediately, otherwise Flash
|
|
||||||
// sometimes causes a deadlock (bug 762407)
|
|
||||||
AddPluginView(GetPluginRect());
|
|
||||||
}
|
|
||||||
|
|
||||||
mInstance->NotifyFullScreen(mFullScreen);
|
|
||||||
|
|
||||||
// This will cause Paint() to be called, which is where
|
|
||||||
// we normally add/update views and layers
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::ExitFullScreen(jobject view) {
|
|
||||||
JNIEnv* env = jni::GetGeckoThreadEnv();
|
|
||||||
|
|
||||||
if (sFullScreenInstance && sFullScreenInstance->mInstance &&
|
|
||||||
env->IsSameObject(view, (jobject)sFullScreenInstance->mInstance->GetJavaSurface())) {
|
|
||||||
sFullScreenInstance->ExitFullScreen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsPluginInstanceOwner::NotifyHostAsyncInitFailed()
|
nsPluginInstanceOwner::NotifyHostAsyncInitFailed()
|
||||||
{
|
{
|
||||||
|
|
@ -1705,27 +1455,6 @@ nsPluginInstanceOwner::NotifyDestroyPending()
|
||||||
|
|
||||||
nsresult nsPluginInstanceOwner::DispatchFocusToPlugin(nsIDOMEvent* aFocusEvent)
|
nsresult nsPluginInstanceOwner::DispatchFocusToPlugin(nsIDOMEvent* aFocusEvent)
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
if (mInstance) {
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = kLifecycle_ANPEventType;
|
|
||||||
|
|
||||||
nsAutoString eventType;
|
|
||||||
aFocusEvent->GetType(eventType);
|
|
||||||
if (eventType.EqualsLiteral("focus")) {
|
|
||||||
event.data.lifecycle.action = kGainFocus_ANPLifecycleAction;
|
|
||||||
}
|
|
||||||
else if (eventType.EqualsLiteral("blur")) {
|
|
||||||
event.data.lifecycle.action = kLoseFocus_ANPLifecycleAction;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
NS_ASSERTION(false, "nsPluginInstanceOwner::DispatchFocusToPlugin, wierd eventType");
|
|
||||||
}
|
|
||||||
mInstance->HandleEvent(&event, nullptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef XP_MACOSX
|
#ifndef XP_MACOSX
|
||||||
if (!mPluginWindow || (mPluginWindow->type == NPWindowTypeWindow)) {
|
if (!mPluginWindow || (mPluginWindow->type == NPWindowTypeWindow)) {
|
||||||
// continue only for cases without child window
|
// continue only for cases without child window
|
||||||
|
|
@ -2786,96 +2515,6 @@ nsEventStatus nsPluginInstanceOwner::ProcessEvent(const WidgetGUIEvent& anEvent)
|
||||||
rv = nsEventStatus_eConsumeNoDefault;
|
rv = nsEventStatus_eConsumeNoDefault;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
// this code supports windowless plugins
|
|
||||||
{
|
|
||||||
// The plugin needs focus to receive keyboard and touch events
|
|
||||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
|
||||||
if (fm) {
|
|
||||||
nsCOMPtr<nsIDOMElement> elem = do_QueryReferent(mContent);
|
|
||||||
fm->SetFocus(elem, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(anEvent.mClass) {
|
|
||||||
case eMouseEventClass:
|
|
||||||
{
|
|
||||||
switch (anEvent.mMessage) {
|
|
||||||
case eMouseClick:
|
|
||||||
case eMouseDoubleClick:
|
|
||||||
case eMouseAuxClick:
|
|
||||||
// Button up/down events sent instead.
|
|
||||||
return rv;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get reference point relative to plugin origin.
|
|
||||||
const nsPresContext* presContext = mPluginFrame->PresContext();
|
|
||||||
nsPoint appPoint =
|
|
||||||
nsLayoutUtils::GetEventCoordinatesRelativeTo(&anEvent, mPluginFrame) -
|
|
||||||
mPluginFrame->GetContentRectRelativeToSelf().TopLeft();
|
|
||||||
nsIntPoint pluginPoint(presContext->AppUnitsToDevPixels(appPoint.x),
|
|
||||||
presContext->AppUnitsToDevPixels(appPoint.y));
|
|
||||||
|
|
||||||
switch (anEvent.mMessage) {
|
|
||||||
case eMouseMove:
|
|
||||||
{
|
|
||||||
// are these going to be touch events?
|
|
||||||
// pluginPoint.x;
|
|
||||||
// pluginPoint.y;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case eMouseDown:
|
|
||||||
{
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = kMouse_ANPEventType;
|
|
||||||
event.data.mouse.action = kDown_ANPMouseAction;
|
|
||||||
event.data.mouse.x = pluginPoint.x;
|
|
||||||
event.data.mouse.y = pluginPoint.y;
|
|
||||||
mInstance->HandleEvent(&event, nullptr, NS_PLUGIN_CALL_SAFE_TO_REENTER_GECKO);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case eMouseUp:
|
|
||||||
{
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = kMouse_ANPEventType;
|
|
||||||
event.data.mouse.action = kUp_ANPMouseAction;
|
|
||||||
event.data.mouse.x = pluginPoint.x;
|
|
||||||
event.data.mouse.y = pluginPoint.y;
|
|
||||||
mInstance->HandleEvent(&event, nullptr, NS_PLUGIN_CALL_SAFE_TO_REENTER_GECKO);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case eKeyboardEventClass:
|
|
||||||
{
|
|
||||||
const WidgetKeyboardEvent& keyEvent = *anEvent.AsKeyboardEvent();
|
|
||||||
LOG("Firing eKeyboardEventClass %d %d\n",
|
|
||||||
keyEvent.mKeyCode, keyEvent.mCharCode);
|
|
||||||
// pluginEvent is initialized by nsWindow::InitKeyEvent().
|
|
||||||
const ANPEvent* pluginEvent = static_cast<const ANPEvent*>(keyEvent.mPluginEvent);
|
|
||||||
if (pluginEvent) {
|
|
||||||
MOZ_ASSERT(pluginEvent->inSize == sizeof(ANPEvent));
|
|
||||||
MOZ_ASSERT(pluginEvent->eventType == kKey_ANPEventType);
|
|
||||||
mInstance->HandleEvent(const_cast<ANPEvent*>(pluginEvent),
|
|
||||||
nullptr,
|
|
||||||
NS_PLUGIN_CALL_SAFE_TO_REENTER_GECKO);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
rv = nsEventStatus_eConsumeNoDefault;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2922,10 +2561,6 @@ nsPluginInstanceOwner::Destroy()
|
||||||
this, true);
|
this, true);
|
||||||
content->RemoveSystemEventListener(NS_LITERAL_STRING("text"), this, true);
|
content->RemoveSystemEventListener(NS_LITERAL_STRING("text"), this, true);
|
||||||
|
|
||||||
#if MOZ_WIDGET_ANDROID
|
|
||||||
RemovePluginView();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (mWidget) {
|
if (mWidget) {
|
||||||
if (mPluginWindow) {
|
if (mPluginWindow) {
|
||||||
mPluginWindow->SetPluginWidget(nullptr);
|
mPluginWindow->SetPluginWidget(nullptr);
|
||||||
|
|
@ -2995,72 +2630,6 @@ void nsPluginInstanceOwner::Paint(const RECT& aDirty, HDC aDC)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
|
|
||||||
void nsPluginInstanceOwner::Paint(gfxContext* aContext,
|
|
||||||
const gfxRect& aFrameRect,
|
|
||||||
const gfxRect& aDirtyRect)
|
|
||||||
{
|
|
||||||
if (!mInstance || !mPluginFrame || !mPluginDocumentActiveState || mFullScreen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int32_t model = mInstance->GetANPDrawingModel();
|
|
||||||
|
|
||||||
if (model == kSurface_ANPDrawingModel) {
|
|
||||||
if (!AddPluginView(GetPluginRect())) {
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model != kBitmap_ANPDrawingModel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef ANP_BITMAP_DRAWING_MODEL
|
|
||||||
static RefPtr<gfxImageSurface> pluginSurface;
|
|
||||||
|
|
||||||
if (pluginSurface == nullptr ||
|
|
||||||
aFrameRect.width != pluginSurface->Width() ||
|
|
||||||
aFrameRect.height != pluginSurface->Height()) {
|
|
||||||
|
|
||||||
pluginSurface = new gfxImageSurface(gfx::IntSize(aFrameRect.width, aFrameRect.height),
|
|
||||||
SurfaceFormat::A8R8G8B8_UINT32);
|
|
||||||
if (!pluginSurface)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clears buffer. I think this is needed.
|
|
||||||
gfxUtils::ClearThebesSurface(pluginSurface);
|
|
||||||
|
|
||||||
ANPEvent event;
|
|
||||||
event.inSize = sizeof(ANPEvent);
|
|
||||||
event.eventType = 4;
|
|
||||||
event.data.draw.model = 1;
|
|
||||||
|
|
||||||
event.data.draw.clip.top = 0;
|
|
||||||
event.data.draw.clip.left = 0;
|
|
||||||
event.data.draw.clip.bottom = aFrameRect.width;
|
|
||||||
event.data.draw.clip.right = aFrameRect.height;
|
|
||||||
|
|
||||||
event.data.draw.data.bitmap.format = kRGBA_8888_ANPBitmapFormat;
|
|
||||||
event.data.draw.data.bitmap.width = aFrameRect.width;
|
|
||||||
event.data.draw.data.bitmap.height = aFrameRect.height;
|
|
||||||
event.data.draw.data.bitmap.baseAddr = pluginSurface->Data();
|
|
||||||
event.data.draw.data.bitmap.rowBytes = aFrameRect.width * 4;
|
|
||||||
|
|
||||||
if (!mInstance)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mInstance->HandleEvent(&event, nullptr);
|
|
||||||
|
|
||||||
aContext->SetOp(gfx::CompositionOp::OP_SOURCE);
|
|
||||||
aContext->SetSource(pluginSurface, gfxPoint(aFrameRect.x, aFrameRect.y));
|
|
||||||
aContext->Clip(aFrameRect);
|
|
||||||
aContext->Paint();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MOZ_X11)
|
#if defined(MOZ_X11)
|
||||||
void nsPluginInstanceOwner::Paint(gfxContext* aContext,
|
void nsPluginInstanceOwner::Paint(gfxContext* aContext,
|
||||||
const gfxRect& aFrameRect,
|
const gfxRect& aFrameRect,
|
||||||
|
|
@ -3663,24 +3232,6 @@ nsPluginInstanceOwner::UpdateDocumentActiveState(bool aIsActive)
|
||||||
#ifndef XP_MACOSX
|
#ifndef XP_MACOSX
|
||||||
UpdateWindowPositionAndClipRect(true);
|
UpdateWindowPositionAndClipRect(true);
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
if (mInstance) {
|
|
||||||
if (!mPluginDocumentActiveState) {
|
|
||||||
RemovePluginView();
|
|
||||||
}
|
|
||||||
|
|
||||||
mInstance->NotifyOnScreen(mPluginDocumentActiveState);
|
|
||||||
|
|
||||||
// This is, perhaps, incorrect. It is supposed to be sent
|
|
||||||
// when "the webview has paused or resumed". The side effect
|
|
||||||
// is that Flash video players pause or resume (if they were
|
|
||||||
// playing before) based on the value here. I personally think
|
|
||||||
// we want that on Android when switching to another tab, so
|
|
||||||
// that's why we call it here.
|
|
||||||
mInstance->NotifyForeground(mPluginDocumentActiveState);
|
|
||||||
}
|
|
||||||
#endif // #ifdef MOZ_WIDGET_ANDROID
|
|
||||||
|
|
||||||
// We don't have a connection to PluginWidgetParent in the chrome
|
// We don't have a connection to PluginWidgetParent in the chrome
|
||||||
// process when dealing with tab visibility changes, so this needs
|
// process when dealing with tab visibility changes, so this needs
|
||||||
// to be forwarded over after the active state is updated. If we
|
// to be forwarded over after the active state is updated. If we
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class nsPluginDOMContextMenuListener;
|
||||||
class nsPluginFrame;
|
class nsPluginFrame;
|
||||||
class nsDisplayListBuilder;
|
class nsDisplayListBuilder;
|
||||||
|
|
||||||
#if defined(MOZ_X11) || defined(ANDROID)
|
#ifdef MOZ_X11
|
||||||
class gfxContext;
|
class gfxContext;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -108,7 +108,7 @@ public:
|
||||||
void Paint(const gfxRect& aDirtyRect, CGContextRef cgContext);
|
void Paint(const gfxRect& aDirtyRect, CGContextRef cgContext);
|
||||||
void RenderCoreAnimation(CGContextRef aCGContext, int aWidth, int aHeight);
|
void RenderCoreAnimation(CGContextRef aCGContext, int aWidth, int aHeight);
|
||||||
void DoCocoaEventDrawRect(const gfxRect& aDrawRect, CGContextRef cgContext);
|
void DoCocoaEventDrawRect(const gfxRect& aDrawRect, CGContextRef cgContext);
|
||||||
#elif defined(MOZ_X11) || defined(ANDROID)
|
#elif defined(MOZ_X11)
|
||||||
void Paint(gfxContext* aContext,
|
void Paint(gfxContext* aContext,
|
||||||
const gfxRect& aFrameRect,
|
const gfxRect& aFrameRect,
|
||||||
const gfxRect& aDirtyRect);
|
const gfxRect& aDirtyRect);
|
||||||
|
|
@ -254,21 +254,6 @@ public:
|
||||||
|
|
||||||
already_AddRefed<nsIURI> GetBaseURI() const;
|
already_AddRefed<nsIURI> GetBaseURI() const;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
|
||||||
// Returns the image container for the specified VideoInfo
|
|
||||||
void GetVideos(nsTArray<nsNPAPIPluginInstance::VideoInfo*>& aVideos);
|
|
||||||
already_AddRefed<mozilla::layers::ImageContainer> GetImageContainerForVideo(nsNPAPIPluginInstance::VideoInfo* aVideoInfo);
|
|
||||||
|
|
||||||
void Invalidate();
|
|
||||||
void Recomposite();
|
|
||||||
|
|
||||||
void RequestFullScreen();
|
|
||||||
void ExitFullScreen();
|
|
||||||
|
|
||||||
// Called from nsAppShell when we removed the fullscreen view.
|
|
||||||
static void ExitFullScreen(jobject view);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void NotifyHostAsyncInitFailed();
|
void NotifyHostAsyncInitFailed();
|
||||||
void NotifyHostCreateWidget();
|
void NotifyHostCreateWidget();
|
||||||
void NotifyDestroyPending();
|
void NotifyDestroyPending();
|
||||||
|
|
@ -306,16 +291,7 @@ private:
|
||||||
size == nsIntSize(mPluginWindow->width, mPluginWindow->height);
|
size == nsIntSize(mPluginWindow->width, mPluginWindow->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef XP_WIN
|
||||||
mozilla::LayoutDeviceRect GetPluginRect();
|
|
||||||
bool AddPluginView(const mozilla::LayoutDeviceRect& aRect = mozilla::LayoutDeviceRect(0, 0, 0, 0));
|
|
||||||
void RemovePluginView();
|
|
||||||
|
|
||||||
bool mFullScreen;
|
|
||||||
void* mJavaView;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(XP_WIN)
|
|
||||||
nsIWidget* GetContainingWidgetIfOffset();
|
nsIWidget* GetContainingWidgetIfOffset();
|
||||||
already_AddRefed<mozilla::TextComposition> GetTextComposition();
|
already_AddRefed<mozilla::TextComposition> GetTextComposition();
|
||||||
void HandleNoConsumedCompositionMessage(
|
void HandleNoConsumedCompositionMessage(
|
||||||
|
|
|
||||||
|
|
@ -735,10 +735,6 @@ nsPluginTag::GetNiceName(nsACString & aResult)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsPluginTag::GetBlocklistState(uint32_t *aResult)
|
nsPluginTag::GetBlocklistState(uint32_t *aResult)
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_ANDROID)
|
|
||||||
*aResult = nsIBlocklistService::STATE_NOT_BLOCKED;
|
|
||||||
return NS_OK;
|
|
||||||
#else
|
|
||||||
if (mCachedBlocklistStateValid) {
|
if (mCachedBlocklistStateValid) {
|
||||||
*aResult = mCachedBlocklistState;
|
*aResult = mCachedBlocklistState;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
@ -772,7 +768,6 @@ nsPluginTag::GetBlocklistState(uint32_t *aResult)
|
||||||
mCachedBlocklistState = (uint16_t) *aResult;
|
mCachedBlocklistState = (uint16_t) *aResult;
|
||||||
mCachedBlocklistStateValid = true;
|
mCachedBlocklistStateValid = true;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
#endif // defined(MOZ_WIDGET_ANDROID)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -206,16 +206,6 @@ bool nsPluginsDir::IsPluginFile(nsIFile* file)
|
||||||
if (NS_FAILED(file->GetNativeLeafName(filename)))
|
if (NS_FAILED(file->GetNativeLeafName(filename)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef ANDROID
|
|
||||||
// It appears that if you load
|
|
||||||
// 'libstagefright_honeycomb.so' on froyo, or
|
|
||||||
// 'libstagefright_froyo.so' on honeycomb, we will abort.
|
|
||||||
// Since these are just helper libs, we can ignore.
|
|
||||||
const char *cFile = filename.get();
|
|
||||||
if (strstr(cFile, "libstagefright") != nullptr)
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NS_NAMED_LITERAL_CSTRING(dllSuffix, LOCAL_PLUGIN_DLL_SUFFIX);
|
NS_NAMED_LITERAL_CSTRING(dllSuffix, LOCAL_PLUGIN_DLL_SUFFIX);
|
||||||
if (filename.Length() > dllSuffix.Length() &&
|
if (filename.Length() > dllSuffix.Length() &&
|
||||||
StringEndsWith(filename, dllSuffix))
|
StringEndsWith(filename, dllSuffix))
|
||||||
|
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8 -*- */
|
|
||||||
/* vim: set sw=4 ts=8 et tw=80 ft=cpp : */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
// This is a NPEventX11.h derived stub for Android
|
|
||||||
// Plugins aren't actually supported yet
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_plugins_NPEventAndroid_h
|
|
||||||
#define mozilla_dom_plugins_NPEventAndroid_h
|
|
||||||
|
|
||||||
#include "npapi.h"
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
|
|
||||||
namespace plugins {
|
|
||||||
|
|
||||||
struct NPRemoteEvent {
|
|
||||||
NPEvent event;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace IPC {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ParamTraits<mozilla::plugins::NPRemoteEvent>
|
|
||||||
{
|
|
||||||
typedef mozilla::plugins::NPRemoteEvent paramType;
|
|
||||||
|
|
||||||
static void Write(Message* aMsg, const paramType& aParam)
|
|
||||||
{
|
|
||||||
aMsg->WriteBytes(&aParam, sizeof(paramType));
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
|
|
||||||
{
|
|
||||||
return aMsg->ReadBytesInto(aIter, aResult, sizeof(paramType));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void Log(const paramType& aParam, std::wstring* aLog)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
aLog->append(L"(AndroidEvent)");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace IPC
|
|
||||||
|
|
||||||
|
|
||||||
#endif // mozilla_dom_plugins_NPEventAndroid_h
|
|
||||||
|
|
@ -1427,8 +1427,6 @@ PluginInstanceChild::AnswerNPP_SetWindow(const NPRemoteWindow& aWindow)
|
||||||
if (mPluginIface->setwindow)
|
if (mPluginIface->setwindow)
|
||||||
(void) mPluginIface->setwindow(&mData, &mWindow);
|
(void) mPluginIface->setwindow(&mData, &mWindow);
|
||||||
|
|
||||||
#elif defined(ANDROID)
|
|
||||||
// TODO: Need Android impl
|
|
||||||
#elif defined(MOZ_WIDGET_UIKIT)
|
#elif defined(MOZ_WIDGET_UIKIT)
|
||||||
// Don't care
|
// Don't care
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -265,9 +265,6 @@ PluginInstanceParent::AnswerNPN_GetValue_NPNVnetscapeWindow(NativeWindowHandle*
|
||||||
XID id;
|
XID id;
|
||||||
#elif defined(XP_DARWIN)
|
#elif defined(XP_DARWIN)
|
||||||
intptr_t id;
|
intptr_t id;
|
||||||
#elif defined(ANDROID)
|
|
||||||
// TODO: Need Android impl
|
|
||||||
int id;
|
|
||||||
#else
|
#else
|
||||||
#warning Implement me
|
#warning Implement me
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ struct NPAudioDeviceChangeDetailsIPC
|
||||||
typedef HWND NativeWindowHandle;
|
typedef HWND NativeWindowHandle;
|
||||||
#elif defined(MOZ_X11)
|
#elif defined(MOZ_X11)
|
||||||
typedef XID NativeWindowHandle;
|
typedef XID NativeWindowHandle;
|
||||||
#elif defined(XP_DARWIN) || defined(ANDROID)
|
#elif defined(XP_DARWIN)
|
||||||
typedef intptr_t NativeWindowHandle; // never actually used, will always be 0
|
typedef intptr_t NativeWindowHandle; // never actually used, will always be 0
|
||||||
#else
|
#else
|
||||||
#error Need NativeWindowHandle for this platform
|
#error Need NativeWindowHandle for this platform
|
||||||
|
|
@ -736,8 +736,6 @@ struct ParamTraits<mozilla::plugins::NPAudioDeviceChangeDetailsIPC>
|
||||||
# include "mozilla/plugins/NPEventOSX.h"
|
# include "mozilla/plugins/NPEventOSX.h"
|
||||||
#elif defined(XP_WIN)
|
#elif defined(XP_WIN)
|
||||||
# include "mozilla/plugins/NPEventWindows.h"
|
# include "mozilla/plugins/NPEventWindows.h"
|
||||||
#elif defined(ANDROID)
|
|
||||||
# include "mozilla/plugins/NPEventAndroid.h"
|
|
||||||
#elif defined(XP_UNIX)
|
#elif defined(XP_UNIX)
|
||||||
# include "mozilla/plugins/NPEventUnix.h"
|
# include "mozilla/plugins/NPEventUnix.h"
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ EXPORTS.mozilla.plugins += [
|
||||||
'BrowserStreamParent.h',
|
'BrowserStreamParent.h',
|
||||||
'ChildAsyncCall.h',
|
'ChildAsyncCall.h',
|
||||||
'ChildTimer.h',
|
'ChildTimer.h',
|
||||||
'NPEventAndroid.h',
|
|
||||||
'NPEventOSX.h',
|
'NPEventOSX.h',
|
||||||
'NPEventUnix.h',
|
'NPEventUnix.h',
|
||||||
'NPEventWindows.h',
|
'NPEventWindows.h',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue