2011-01-18 23:05:30 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
* vim: sw=2 ts=8 et :
|
2012-05-21 15:12:37 +04:00
|
|
|
* 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/. */
|
2011-01-18 23:05:30 +03:00
|
|
|
|
|
|
|
#include "mozilla/PluginPRLibrary.h"
|
2013-08-27 09:05:29 +04:00
|
|
|
#include "nsNPAPIPluginInstance.h"
|
2013-03-12 14:34:07 +04:00
|
|
|
|
2011-01-18 23:05:30 +03:00
|
|
|
// Some plugins on Windows, notably Quake Live, implement NP_Initialize using
|
|
|
|
// cdecl instead of the documented stdcall. In order to work around this,
|
|
|
|
// we force the caller to use a frame pointer.
|
|
|
|
#if defined(XP_WIN) && defined(_M_IX86)
|
|
|
|
#include <malloc.h>
|
|
|
|
|
|
|
|
// gNotOptimized exists so that the compiler will not optimize the alloca
|
|
|
|
// below.
|
|
|
|
static int gNotOptimized;
|
|
|
|
#define CALLING_CONVENTION_HACK void* foo = _alloca(gNotOptimized);
|
|
|
|
#else
|
|
|
|
#define CALLING_CONVENTION_HACK
|
|
|
|
#endif
|
|
|
|
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2011-09-17 01:34:31 +04:00
|
|
|
#include "AndroidBridge.h"
|
|
|
|
#include "android_npapi.h"
|
|
|
|
#include <android/log.h>
|
2012-08-07 11:06:29 +04:00
|
|
|
#undef ALOG
|
2011-09-17 01:34:31 +04:00
|
|
|
#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoJavaEnv", ## args)
|
|
|
|
#endif
|
|
|
|
|
2012-11-10 19:45:52 +04:00
|
|
|
using namespace mozilla::layers;
|
|
|
|
|
2011-01-18 23:05:30 +03:00
|
|
|
namespace mozilla {
|
2011-11-11 04:17:46 +04:00
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
2011-09-17 01:34:31 +04:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs,
|
|
|
|
NPPluginFuncs* pFuncs, NPError* error)
|
|
|
|
{
|
2015-08-13 07:53:39 +03:00
|
|
|
JNIEnv* env = jni::GetEnvForThread();
|
2012-01-29 10:38:02 +04:00
|
|
|
|
2012-12-13 09:32:17 +04:00
|
|
|
mozilla::AutoLocalJNIFrame jniFrame(env);
|
|
|
|
|
2011-09-17 01:34:31 +04:00
|
|
|
if (mNP_Initialize) {
|
2012-01-29 10:38:02 +04:00
|
|
|
*error = mNP_Initialize(bFuncs, pFuncs, env);
|
2011-09-17 01:34:31 +04:00
|
|
|
} else {
|
|
|
|
NP_InitializeFunc pfNP_Initialize = (NP_InitializeFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_Initialize");
|
|
|
|
if (!pfNP_Initialize)
|
|
|
|
return NS_ERROR_FAILURE;
|
2012-01-29 10:38:02 +04:00
|
|
|
*error = pfNP_Initialize(bFuncs, pFuncs, env);
|
2011-09-17 01:34:31 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
2011-11-11 04:17:46 +04:00
|
|
|
#elif defined(MOZ_WIDGET_GONK)
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs, NPError* error)
|
|
|
|
{
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2011-09-17 01:34:31 +04:00
|
|
|
#elif defined(XP_UNIX) && !defined(XP_MACOSX)
|
2011-01-18 23:05:30 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs,
|
2011-11-11 04:17:46 +04:00
|
|
|
NPPluginFuncs* pFuncs, NPError* error)
|
2011-01-18 23:05:30 +03:00
|
|
|
{
|
|
|
|
if (mNP_Initialize) {
|
|
|
|
*error = mNP_Initialize(bFuncs, pFuncs);
|
|
|
|
} else {
|
|
|
|
NP_InitializeFunc pfNP_Initialize = (NP_InitializeFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_Initialize");
|
|
|
|
if (!pfNP_Initialize)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
*error = pfNP_Initialize(bFuncs, pFuncs);
|
|
|
|
}
|
|
|
|
|
2011-02-09 01:16:07 +03:00
|
|
|
|
|
|
|
// Save pointers to functions that get called through PluginLibrary itself.
|
2011-01-18 23:05:30 +03:00
|
|
|
mNPP_New = pFuncs->newp;
|
2011-02-09 01:16:07 +03:00
|
|
|
mNPP_ClearSiteData = pFuncs->clearsitedata;
|
|
|
|
mNPP_GetSitesWithData = pFuncs->getsiteswithdata;
|
2011-01-18 23:05:30 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_Initialize(NPNetscapeFuncs* bFuncs, NPError* error)
|
|
|
|
{
|
|
|
|
CALLING_CONVENTION_HACK
|
|
|
|
|
|
|
|
if (mNP_Initialize) {
|
|
|
|
*error = mNP_Initialize(bFuncs);
|
|
|
|
} else {
|
|
|
|
NP_InitializeFunc pfNP_Initialize = (NP_InitializeFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_Initialize");
|
|
|
|
if (!pfNP_Initialize)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
*error = pfNP_Initialize(bFuncs);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_Shutdown(NPError* error)
|
|
|
|
{
|
|
|
|
CALLING_CONVENTION_HACK
|
|
|
|
|
|
|
|
if (mNP_Shutdown) {
|
|
|
|
*error = mNP_Shutdown();
|
|
|
|
} else {
|
|
|
|
NP_ShutdownFunc pfNP_Shutdown = (NP_ShutdownFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_Shutdown");
|
|
|
|
if (!pfNP_Shutdown)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
*error = pfNP_Shutdown();
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_GetMIMEDescription(const char** mimeDesc)
|
|
|
|
{
|
|
|
|
CALLING_CONVENTION_HACK
|
|
|
|
|
|
|
|
if (mNP_GetMIMEDescription) {
|
|
|
|
*mimeDesc = mNP_GetMIMEDescription();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
NP_GetMIMEDescriptionFunc pfNP_GetMIMEDescription =
|
|
|
|
(NP_GetMIMEDescriptionFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_GetMIMEDescription");
|
|
|
|
if (!pfNP_GetMIMEDescription) {
|
|
|
|
*mimeDesc = "";
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
*mimeDesc = pfNP_GetMIMEDescription();
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_GetValue(void *future, NPPVariable aVariable,
|
|
|
|
void *aValue, NPError* error)
|
|
|
|
{
|
|
|
|
#if defined(XP_UNIX) && !defined(XP_MACOSX)
|
|
|
|
if (mNP_GetValue) {
|
|
|
|
*error = mNP_GetValue(future, aVariable, aValue);
|
|
|
|
} else {
|
|
|
|
NP_GetValueFunc pfNP_GetValue = (NP_GetValueFunc)PR_FindFunctionSymbol(mLibrary, "NP_GetValue");
|
|
|
|
if (!pfNP_GetValue)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
*error = pfNP_GetValue(future, aVariable, aValue);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
#else
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2014-02-11 02:57:01 +04:00
|
|
|
#if defined(XP_WIN) || defined(XP_MACOSX)
|
2011-01-18 23:05:30 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NP_GetEntryPoints(NPPluginFuncs* pFuncs, NPError* error)
|
|
|
|
{
|
|
|
|
CALLING_CONVENTION_HACK
|
|
|
|
|
|
|
|
if (mNP_GetEntryPoints) {
|
|
|
|
*error = mNP_GetEntryPoints(pFuncs);
|
|
|
|
} else {
|
|
|
|
NP_GetEntryPointsFunc pfNP_GetEntryPoints = (NP_GetEntryPointsFunc)
|
|
|
|
PR_FindFunctionSymbol(mLibrary, "NP_GetEntryPoints");
|
|
|
|
if (!pfNP_GetEntryPoints)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
*error = pfNP_GetEntryPoints(pFuncs);
|
|
|
|
}
|
|
|
|
|
2011-02-09 01:16:07 +03:00
|
|
|
// Save pointers to functions that get called through PluginLibrary itself.
|
2011-01-18 23:05:30 +03:00
|
|
|
mNPP_New = pFuncs->newp;
|
2011-02-09 01:16:07 +03:00
|
|
|
mNPP_ClearSiteData = pFuncs->clearsitedata;
|
|
|
|
mNPP_GetSitesWithData = pFuncs->getsiteswithdata;
|
2011-01-18 23:05:30 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NPP_New(NPMIMEType pluginType, NPP instance,
|
2017-02-23 20:37:42 +03:00
|
|
|
int16_t argc, char* argn[],
|
2011-01-18 23:05:30 +03:00
|
|
|
char* argv[], NPSavedData* saved,
|
|
|
|
NPError* error)
|
|
|
|
{
|
|
|
|
if (!mNPP_New)
|
|
|
|
return NS_ERROR_FAILURE;
|
2012-12-13 09:32:17 +04:00
|
|
|
|
|
|
|
MAIN_THREAD_JNI_REF_GUARD;
|
2017-02-23 20:37:42 +03:00
|
|
|
*error = mNPP_New(pluginType, instance, NP_EMBED, argc, argn, argv, saved);
|
2011-01-18 23:05:30 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-02-09 01:16:07 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::NPP_ClearSiteData(const char* site, uint64_t flags,
|
2015-07-01 01:08:19 +03:00
|
|
|
uint64_t maxAge, nsCOMPtr<nsIClearSiteDataCallback> callback)
|
2011-02-09 01:16:07 +03:00
|
|
|
{
|
|
|
|
if (!mNPP_ClearSiteData) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2012-12-13 09:32:17 +04:00
|
|
|
MAIN_THREAD_JNI_REF_GUARD;
|
2011-02-09 01:16:07 +03:00
|
|
|
NPError result = mNPP_ClearSiteData(site, flags, maxAge);
|
|
|
|
|
2015-07-01 01:08:19 +03:00
|
|
|
nsresult rv;
|
2011-02-09 01:16:07 +03:00
|
|
|
switch (result) {
|
|
|
|
case NPERR_NO_ERROR:
|
2015-07-01 01:08:19 +03:00
|
|
|
rv = NS_OK;
|
|
|
|
break;
|
2011-02-09 01:16:07 +03:00
|
|
|
case NPERR_TIME_RANGE_NOT_SUPPORTED:
|
2015-07-01 01:08:19 +03:00
|
|
|
rv = NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED;
|
|
|
|
break;
|
2011-02-09 01:16:07 +03:00
|
|
|
case NPERR_MALFORMED_SITE:
|
2015-07-01 01:08:19 +03:00
|
|
|
rv = NS_ERROR_INVALID_ARG;
|
|
|
|
break;
|
2011-02-09 01:16:07 +03:00
|
|
|
default:
|
2015-07-01 01:08:19 +03:00
|
|
|
rv = NS_ERROR_FAILURE;
|
2011-02-09 01:16:07 +03:00
|
|
|
}
|
2015-07-01 01:08:19 +03:00
|
|
|
callback->Callback(rv);
|
|
|
|
return NS_OK;
|
2011-02-09 01:16:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2015-07-01 01:08:19 +03:00
|
|
|
PluginPRLibrary::NPP_GetSitesWithData(nsCOMPtr<nsIGetSitesWithDataCallback> callback)
|
2011-02-09 01:16:07 +03:00
|
|
|
{
|
|
|
|
if (!mNPP_GetSitesWithData) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2012-12-13 09:32:17 +04:00
|
|
|
MAIN_THREAD_JNI_REF_GUARD;
|
2011-02-09 01:16:07 +03:00
|
|
|
char** sites = mNPP_GetSitesWithData();
|
|
|
|
if (!sites) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2015-07-01 01:08:19 +03:00
|
|
|
InfallibleTArray<nsCString> result;
|
2011-02-09 01:16:07 +03:00
|
|
|
char** iterator = sites;
|
|
|
|
while (*iterator) {
|
|
|
|
result.AppendElement(*iterator);
|
2015-04-01 08:29:55 +03:00
|
|
|
free(*iterator);
|
2011-02-09 01:16:07 +03:00
|
|
|
++iterator;
|
|
|
|
}
|
2015-07-01 01:08:19 +03:00
|
|
|
callback->SitesWithData(result);
|
2015-04-01 08:29:55 +03:00
|
|
|
free(sites);
|
2011-02-09 01:16:07 +03:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-01-18 23:05:30 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::AsyncSetWindow(NPP instance, NPWindow* window)
|
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* inst = (nsNPAPIPluginInstance*)instance->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NS_ERROR_NULL_POINTER);
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2011-02-12 19:07:10 +03:00
|
|
|
nsresult
|
2012-02-08 19:34:27 +04:00
|
|
|
PluginPRLibrary::GetImageContainer(NPP instance, ImageContainer** aContainer)
|
2011-02-12 19:07:10 +03:00
|
|
|
{
|
2011-02-23 08:38:09 +03:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
2011-06-30 20:46:26 +04:00
|
|
|
#if defined(XP_MACOSX)
|
|
|
|
nsresult
|
2011-09-29 10:19:26 +04:00
|
|
|
PluginPRLibrary::IsRemoteDrawingCoreAnimation(NPP instance, bool *aDrawing)
|
2011-06-30 20:46:26 +04:00
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* inst = (nsNPAPIPluginInstance*)instance->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NS_ERROR_NULL_POINTER);
|
2011-09-30 10:02:59 +04:00
|
|
|
*aDrawing = false;
|
2011-06-30 20:46:26 +04:00
|
|
|
return NS_OK;
|
2012-10-16 23:41:21 +04:00
|
|
|
}
|
2015-09-17 23:31:34 +03:00
|
|
|
#endif
|
|
|
|
#if defined(XP_MACOSX) || defined(XP_WIN)
|
2012-10-16 23:41:21 +04:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::ContentsScaleFactorChanged(NPP instance, double aContentsScaleFactor)
|
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* inst = (nsNPAPIPluginInstance*)instance->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NS_ERROR_NULL_POINTER);
|
|
|
|
return NS_OK;
|
2011-06-30 20:46:26 +04:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2011-02-23 08:38:09 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::GetImageSize(NPP instance, nsIntSize* aSize)
|
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
2011-02-12 19:07:10 +03:00
|
|
|
}
|
|
|
|
|
2011-02-17 01:43:31 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::SetBackgroundUnknown(NPP instance)
|
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* inst = (nsNPAPIPluginInstance*)instance->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NS_ERROR_NULL_POINTER);
|
|
|
|
NS_ERROR("Unexpected use of async APIs for in-process plugin.");
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2015-12-18 06:39:10 +03:00
|
|
|
PluginPRLibrary::BeginUpdateBackground(NPP instance, const nsIntRect&,
|
|
|
|
DrawTarget** aDrawTarget)
|
2011-02-17 01:43:31 +03:00
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* inst = (nsNPAPIPluginInstance*)instance->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NS_ERROR_NULL_POINTER);
|
|
|
|
NS_ERROR("Unexpected use of async APIs for in-process plugin.");
|
2015-12-18 06:39:10 +03:00
|
|
|
*aDrawTarget = nullptr;
|
2011-02-17 01:43:31 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2015-12-18 06:39:09 +03:00
|
|
|
PluginPRLibrary::EndUpdateBackground(NPP instance, const nsIntRect&)
|
2011-02-17 01:43:31 +03:00
|
|
|
{
|
2016-12-03 00:46:53 +03:00
|
|
|
MOZ_CRASH("This should never be called");
|
2011-02-17 01:43:31 +03:00
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2016-03-01 21:48:25 +03:00
|
|
|
#if defined(XP_WIN)
|
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::GetScrollCaptureContainer(NPP aInstance, ImageContainer** aContainer)
|
|
|
|
{
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
Bug 1257759 part.5 PluginInstanceChild should post received native key event to chrome process if the key combination may be a shortcut key r=jimm
When PluginInstanceChild receives native key events, it should post the events to the chrome process first for checking if the key combination is reserved. However, posting all key events to the chrome process may make damage to the performance of text input. Therefore, this patch starts to post a key event whose key combination may be a shortcut key. However, for avoiding to shuffle the event order, it posts following key events until all posted key events are handled by the chrome process.
For receiving response from widget, this patch defines nsIKeyEventInPluginCallback. It's specified by nsIWidget::OnWindowedPluginKeyEvent() for ensuring the caller will receive the reply. Basically, the caller of nsIWidget::OnWindowedPluginKeyEvent() should reply to the child process. However, if the widget is a PuppetWidget, it cannot return the result synchronously. Therefore, PuppetWidget::OnWindowedPluginKeyEvent() returns NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY and stores the callback to mKeyEventInPluginCallbacks. Then, TabParent::HandledWindowedPluginKeyEvent() will call PuppetWidget::HandledWindowedPluginKeyEvent().
MozReview-Commit-ID: G6brOU26NwQ
--HG--
extra : rebase_source : 8140456de278956d2d594e85c7b397ae366b4962
2016-04-19 14:09:37 +03:00
|
|
|
nsresult
|
|
|
|
PluginPRLibrary::HandledWindowedPluginKeyEvent(
|
|
|
|
NPP aInstance,
|
|
|
|
const NativeEventData& aNativeKeyData,
|
|
|
|
bool aIsConsumed)
|
|
|
|
{
|
|
|
|
nsNPAPIPluginInstance* instance = (nsNPAPIPluginInstance*)aInstance->ndata;
|
|
|
|
if (NS_WARN_IF(!instance)) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-01-18 23:05:30 +03:00
|
|
|
} // namespace mozilla
|