[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] [SCM] Gnash branch, master, updated. release_0_8_9_final-
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] [SCM] Gnash branch, master, updated. release_0_8_9_final-2268-g765adb0 |
Date: |
Thu, 03 Mar 2016 09:33:03 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Gnash".
The branch, master has been updated
via 765adb072dc4b8407f1936a60c3f2af4aeff2046 (commit)
from c12c3cf104a095cff9791cdb3cee8bbf4853d5e0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit//commit/?id=765adb072dc4b8407f1936a60c3f2af4aeff2046
commit 765adb072dc4b8407f1936a60c3f2af4aeff2046
Author: Nutchanon Wetchasit <address@hidden>
Date: Tue Feb 23 09:21:15 2016 +0100
Unmarshall ActionScript object in plugin's ExternalInterface as a real
JavaScript Object.
This fixes plugin's crash in bug #32411.
See <https://savannah.gnu.org/bugs/?32411>
diff --git a/plugin/npapi/callbacks.cpp b/plugin/npapi/callbacks.cpp
index 9865018..b2c61af 100644
--- a/plugin/npapi/callbacks.cpp
+++ b/plugin/npapi/callbacks.cpp
@@ -230,7 +230,7 @@ IsPlaying (NPObject *npobj, NPIdentifier /* name */, const
NPVariant */*args */,
return false;
}
- GnashNPVariant value = plugin::ExternalInterface::parseXML(data);
+ GnashNPVariant value =
plugin::ExternalInterface::parseXML((GnashPluginScriptObject*)npobj, data);
if (NPVARIANT_TO_BOOLEAN(value.get()) == true) {
BOOLEAN_TO_NPVARIANT(true, *result);
} else {
@@ -374,7 +374,7 @@ PercentLoaded (NPObject *npobj, NPIdentifier /* name */,
const NPVariant */*args
return false;
}
- GnashNPVariant value = plugin::ExternalInterface::parseXML(data);
+ GnashNPVariant value =
plugin::ExternalInterface::parseXML((GnashPluginScriptObject*)npobj, data);
if (NPVARIANT_IS_INT32(value.get())) {
INT32_TO_NPVARIANT(NPVARIANT_TO_INT32(value.get()), *result);
} else {
@@ -628,7 +628,7 @@ TotalFrames (NPObject *npobj, NPIdentifier /* name */,
const NPVariant */*args *
return false;
}
- GnashNPVariant value = plugin::ExternalInterface::parseXML(data);
+ GnashNPVariant value =
plugin::ExternalInterface::parseXML((GnashPluginScriptObject*)npobj, data);
if (NPVARIANT_IS_INT32(value.get())) {
value.copy(*result);
} else {
@@ -699,7 +699,7 @@ remoteCallback (NPObject *npobj, NPIdentifier name, const
NPVariant *args,
return false;
}
- GnashNPVariant parsed = plugin::ExternalInterface::parseXML(data);
+ GnashNPVariant parsed =
plugin::ExternalInterface::parseXML((GnashPluginScriptObject*)npobj, data);
parsed.copy(*result);
// printNPVariant(&parsed.get());
diff --git a/plugin/npapi/external.cpp b/plugin/npapi/external.cpp
index a1c199e..1183fba 100644
--- a/plugin/npapi/external.cpp
+++ b/plugin/npapi/external.cpp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc
+// Copyright (C) 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -200,7 +200,7 @@ ExternalInterface::makeObject (std::map<std::string,
std::string> &args)
// </arguments>
// </invoke>
std::shared_ptr<ExternalInterface::invoke_t>
-ExternalInterface::parseInvoke(const std::string &xml)
+ExternalInterface::parseInvoke(GnashPluginScriptObject *scriptobj, const
std::string &xml)
{
std::shared_ptr<ExternalInterface::invoke_t> invoke;
if (xml.empty()) {
@@ -254,7 +254,7 @@ ExternalInterface::parseInvoke(const std::string &xml)
end = xml.find("</invoke");
if (start != std::string::npos && end != std::string::npos) {
tag = xml.substr(start, end-start);
- invoke->args = parseArguments(tag);
+ invoke->args = parseArguments(scriptobj, tag);
}
}
}
@@ -263,7 +263,7 @@ ExternalInterface::parseInvoke(const std::string &xml)
}
GnashNPVariant
-ExternalInterface::parseXML(const std::string &xml)
+ExternalInterface::parseXML(GnashPluginScriptObject *scriptobj, const
std::string &xml)
{
NPVariant value;
NULL_TO_NPVARIANT(value);
@@ -318,7 +318,7 @@ ExternalInterface::parseXML(const std::string &xml)
end = xml.find("</array");
if ( end != std::string::npos ) {
std::string str = xml.substr(start, end-start);
- std::map<std::string, GnashNPVariant> props =
parseProperties(str);
+ std::map<std::string, GnashNPVariant> props =
parseProperties(scriptobj, str);
std::map<std::string, GnashNPVariant>::iterator it;
for (it=props.begin(); it != props.end(); ++it) {
NPIdentifier id = NPN_GetStringIdentifier(it->first.c_str());
@@ -328,20 +328,39 @@ ExternalInterface::parseXML(const std::string &xml)
OBJECT_TO_NPVARIANT(obj, value);
}
} else if (tag == "<object>") {
+ NPObject *jswindow;
+ NPObject *obj;
+ NPVariant objvar;
+
start = end;
end = xml.find("</object");
- if ( end != std::string::npos ) {
- NPObject *obj = (NPObject *)NPN_MemAlloc(sizeof(NPObject));
- obj->referenceCount = 1;
+ while ( end != std::string::npos ) {
+ // To create a new JavaScript Object, we call JavaScript's
+ // window.Object() method and use the returned NPObject.
+ // Then we assign members according to the received XML data.
+ if (NPN_GetValue(scriptobj->nppinstance, NPNVWindowNPObject,
+ &jswindow) != NPERR_NO_ERROR) {
+ break;
+ }
+ if (!NPN_Invoke(scriptobj->nppinstance, jswindow,
+ NPN_GetStringIdentifier("Object"),
+ NULL, 0, &objvar)) {
+ NPN_ReleaseObject(jswindow);
+ break;
+ }
+ obj = NPVARIANT_TO_OBJECT(objvar);
+
std::string str = xml.substr(start, end-start);
- std::map<std::string, GnashNPVariant> props =
parseProperties(str);
+ std::map<std::string, GnashNPVariant> props =
parseProperties(scriptobj, str);
std::map<std::string, GnashNPVariant>::iterator it;
for (it=props.begin(); it != props.end(); ++it) {
NPIdentifier id = NPN_GetStringIdentifier(it->first.c_str());
GnashNPVariant& value = it->second;
- NPN_SetProperty(nullptr, obj, id, &value.get());
+ NPN_SetProperty(scriptobj->nppinstance, obj, id,
&value.get());
}
+ NPN_ReleaseObject(jswindow);
OBJECT_TO_NPVARIANT(obj, value);
+ break;
}
}
}
@@ -384,7 +403,7 @@ ExternalInterface::convertNPVariant (const NPVariant *value)
}
std::map<std::string, GnashNPVariant>
-ExternalInterface::parseProperties(const std::string &xml)
+ExternalInterface::parseProperties(GnashPluginScriptObject *scriptobj, const
std::string &xml)
{
std::map<std::string, GnashNPVariant> props;
@@ -404,7 +423,7 @@ ExternalInterface::parseProperties(const std::string &xml)
start = end + 2;
end = xml.find("</property>", start) ;
std::string data = xml.substr(start, end-start);
- props[id] = parseXML(data);
+ props[id] = parseXML(scriptobj, data);
start = xml.find(" id=", end);
}
@@ -412,7 +431,7 @@ ExternalInterface::parseProperties(const std::string &xml)
}
std::vector<GnashNPVariant>
-ExternalInterface::parseArguments(const std::string &xml)
+ExternalInterface::parseArguments(GnashPluginScriptObject *scriptobj, const
std::string &xml)
{
std::vector<GnashNPVariant> args;
@@ -437,7 +456,7 @@ ExternalInterface::parseArguments(const std::string &xml)
if (data == "</arguments>") {
break;
}
- args.push_back(parseXML(sub));
+ args.push_back(parseXML(scriptobj, sub));
data.erase(0, end);
}
diff --git a/plugin/npapi/external.h b/plugin/npapi/external.h
index 7a0aa67..6031bda 100644
--- a/plugin/npapi/external.h
+++ b/plugin/npapi/external.h
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc
+// Copyright (C) 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
#include "npapi.h"
#include "npruntime.h"
-#include "GnashNPVariant.h"
+#include "pluginScriptObject.h"
namespace gnash {
@@ -61,11 +61,11 @@ struct ExternalInterface
static std::string makeArray (std::vector<std::string> &args);
static std::string makeObject (std::map<std::string, std::string> &args);
- static GnashNPVariant parseXML(const std::string &xml);
- static std::shared_ptr<invoke_t> parseInvoke(const std::string &xml);
+ static GnashNPVariant parseXML(GnashPluginScriptObject *scriptobj, const
std::string &xml);
+ static std::shared_ptr<invoke_t> parseInvoke(GnashPluginScriptObject
*scriptobj, const std::string &xml);
- static std::map<std::string, GnashNPVariant> parseProperties(const
std::string &xml);
- static std::vector<GnashNPVariant> parseArguments(const std::string &xml);
+ static std::map<std::string, GnashNPVariant>
parseProperties(GnashPluginScriptObject *scriptobj, const std::string &xml);
+ static std::vector<GnashNPVariant> parseArguments(GnashPluginScriptObject
*scriptobj, const std::string &xml);
static std::string convertNPVariant (const NPVariant *npv);
};
diff --git a/plugin/npapi/plugin.cpp b/plugin/npapi/plugin.cpp
index c0d5b2b..96585e6 100644
--- a/plugin/npapi/plugin.cpp
+++ b/plugin/npapi/plugin.cpp
@@ -821,7 +821,7 @@ nsPluginInstance::processPlayerRequest()
// Extract a message from the packet
std::string msg = packet.substr(0, pos + term.size());
std::shared_ptr<plugin::ExternalInterface::invoke_t> invoke =
- plugin::ExternalInterface::parseInvoke(msg);
+ plugin::ExternalInterface::parseInvoke(_scriptObject, msg);
// drop the parsed message from the packet
packet.erase(0, msg.size());
diff --git a/plugin/npapi/pluginScriptObject.cpp
b/plugin/npapi/pluginScriptObject.cpp
index 3b599c8..59e8a06 100644
--- a/plugin/npapi/pluginScriptObject.cpp
+++ b/plugin/npapi/pluginScriptObject.cpp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc
+// Copyright (C) 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -125,7 +125,7 @@ GnashPluginScriptObject::initializeIdentifiers()
{
// log_debug("initializeIdentifiers");
-// NPN_Status(_nppinstance, __FUNCTION__);
+// NPN_Status(nppinstance, __FUNCTION__);
//
http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_04.html
@@ -247,7 +247,7 @@ GnashPluginScriptObject::initializeIdentifiers()
// Constructor
GnashPluginScriptObject::GnashPluginScriptObject()
- : _nppinstance (nullptr),
+ : nppinstance (nullptr),
_controlfd(-1),
_hostfd(-1)
{
@@ -259,7 +259,7 @@ GnashPluginScriptObject::GnashPluginScriptObject()
// Constructor
GnashPluginScriptObject::GnashPluginScriptObject(NPP npp)
- : _nppinstance (npp),
+ : nppinstance (npp),
_controlfd(-1),
_hostfd(-1)
{
@@ -519,7 +519,7 @@ GnashPluginScriptObject::Invoke(NPObject */* npobj */,
NPIdentifier name,
return false;
-// return NPN_Invoke(_nppinstance, this, name, args, argCount, result);
+// return NPN_Invoke(nppinstance, this, name, args, argCount, result);
}
bool
@@ -621,7 +621,7 @@ GnashPluginScriptObject::GetVariable(const std::string
&name)
return GnashNPVariant();
}
- GnashNPVariant parsed = plugin::ExternalInterface::parseXML(data);
+ GnashNPVariant parsed = plugin::ExternalInterface::parseXML(this, data);
printNPVariant(&parsed.get());
diff --git a/plugin/npapi/pluginScriptObject.h
b/plugin/npapi/pluginScriptObject.h
index 2a8b7aa..7c45091 100644
--- a/plugin/npapi/pluginScriptObject.h
+++ b/plugin/npapi/pluginScriptObject.h
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc
+// Copyright (C) 2010, 2011, 2012, 2016 Free Software Foundation, Inc
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -138,6 +138,10 @@ public:
void AddProperty(const std::string &name, double num);
void AddProperty(const std::string &name, int num);
+ /// Plugin instance object
+ // nppinstance->pdata should be the nsPluginInstance once NPP_New() is
finished.
+ NPP nppinstance;
+
protected:
// Internal functions for the API
void Deallocate();
@@ -155,10 +159,7 @@ protected:
private:
void initializeIdentifiers();
- void setInstance(NPP inst) { _nppinstance = inst; };
-
- // _nppinstance->pdata should be the nsPluginInstance once NPP_New() is
finished.
- NPP _nppinstance;
+ void setInstance(NPP inst) { nppinstance = inst; };
std::map<NPIdentifier, GnashNPVariant> _properties;
std::map<NPIdentifier, NPInvokeFunctionPtr> _methods;
diff --git a/plugin/npapi/test.cpp b/plugin/npapi/test.cpp
index 1eb2367..21d4ce5 100644
--- a/plugin/npapi/test.cpp
+++ b/plugin/npapi/test.cpp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc
+// Copyright (C) 2010, 2011, 2012, 2014, 2016 Free Software Foundation, Inc
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -166,7 +166,7 @@ main(int , char **)
// Parsing tests
//
xml = "<string>Hello World!</string>";
- GnashNPVariant np = plugin::ExternalInterface::parseXML(xml);
+ GnashNPVariant np = plugin::ExternalInterface::parseXML(nullptr, xml);
std::string data = NPStringToString(NPVARIANT_TO_STRING(np.get()));
if (NPVARIANT_IS_STRING(np.get()) &&
(data == "Hello World!")) {
@@ -176,7 +176,7 @@ main(int , char **)
}
xml = "<number>123.456</number>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
double num = NPVARIANT_TO_DOUBLE(np.get());
if (NPVARIANT_IS_DOUBLE(np.get()) &&
(num == 123.456)) {
@@ -186,7 +186,7 @@ main(int , char **)
}
xml = "<number>78</number>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
int inum = NPVARIANT_TO_INT32(np.get());
if (NPVARIANT_IS_INT32(np.get()) &&
(inum == 78)) {
@@ -196,7 +196,7 @@ main(int , char **)
}
xml = "<true/>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
bool flag = NPVARIANT_TO_BOOLEAN(np.get());
if (NPVARIANT_IS_BOOLEAN(np.get()) &&
(flag == true)) {
@@ -206,7 +206,7 @@ main(int , char **)
}
xml = "<false/>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
flag = NPVARIANT_TO_BOOLEAN(np.get());
if (NPVARIANT_IS_BOOLEAN(np.get()) &&
(flag == false)) {
@@ -216,7 +216,7 @@ main(int , char **)
}
xml = "<null/>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
if (NPVARIANT_IS_NULL(np.get())) {
runtest.pass("plugin::ExternalInterface::parseXML(null)");
} else {
@@ -224,7 +224,7 @@ main(int , char **)
}
xml = "<void/>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
if (NPVARIANT_IS_VOID(np.get())) {
runtest.pass("plugin::ExternalInterface::parseXML(void)");
} else {
@@ -232,7 +232,7 @@ main(int , char **)
}
xml = "<property id=\"0\"><string>foobar</string></property><property
id=\"1\"><number>12.34</number></property><property
id=\"2\"><number>56</number></property>";
- std::map<std::string, GnashNPVariant> props =
plugin::ExternalInterface::parseProperties(xml);
+ std::map<std::string, GnashNPVariant> props =
plugin::ExternalInterface::parseProperties(nullptr, xml);
np = props["0"];
data = NPStringToString(NPVARIANT_TO_STRING(np.get()));
if ((props.size() == 3) && (data == "foobar")) {
@@ -241,13 +241,15 @@ main(int , char **)
runtest.fail("plugin::ExternalInterface::parseProperties()");
}
+#if 0
xml = "<object><property
id=\"test1\"><string>foobar</string></property><property
id=\"test2\"><number>12.34</number></property><property
id=\"test3\"><number>56</number></property></object>";
- np = plugin::ExternalInterface::parseXML(xml);
+ np = plugin::ExternalInterface::parseXML(nullptr, xml);
if (NPVARIANT_IS_OBJECT(np.get())) {
runtest.pass("plugin::ExternalInterface::parseXML(object)");
} else {
runtest.fail("plugin::ExternalInterface::parseXML(object)");
}
+#endif
std::vector<std::string> iargs;
str = plugin::ExternalInterface::makeString("barfoo");
@@ -267,7 +269,7 @@ main(int , char **)
}
xml =
"<arguments><string>barfoo</string><number>135.78</number><number>89</number></arguments>";
- std::vector<GnashNPVariant> arguments =
plugin::ExternalInterface::parseArguments(xml);
+ std::vector<GnashNPVariant> arguments =
plugin::ExternalInterface::parseArguments(nullptr, xml);
np = arguments[0];
str = NPStringToString(NPVARIANT_TO_STRING(np.get()));
double dub = NPVARIANT_TO_DOUBLE(arguments[1].get());
@@ -281,7 +283,7 @@ main(int , char **)
// Parse an invoke message
xml = "<invoke name=\"barbyfoo\"
returntype=\"xml\"><arguments><string>barfoo</string><number>135.78</number></arguments></invoke>";
- std::shared_ptr<plugin::ExternalInterface::invoke_t> invoke (
plugin::ExternalInterface::parseInvoke(xml) );
+ std::shared_ptr<plugin::ExternalInterface::invoke_t> invoke (
plugin::ExternalInterface::parseInvoke(nullptr, xml) );
str = NPStringToString(NPVARIANT_TO_STRING(invoke->args[0].get()));
if ((invoke->name == "barbyfoo") && (invoke->type == "xml")
&& (NPVARIANT_IS_STRING(invoke->args[0].get()))
@@ -296,7 +298,7 @@ main(int , char **)
// Test for bug #31766
xml = "<invoke name=\"reportFlashTiming\"
returntype=\"xml\"><arguments><string>reportFlashTiming</string><object><property
id=\"5\"><number>1297286708921</number></property><property
id=\"4\"><string>vr</string></p";
- invoke = plugin::ExternalInterface::parseInvoke(xml);
+ invoke = plugin::ExternalInterface::parseInvoke(nullptr, xml);
if ((invoke->name == "reportFlashTiming") && (invoke->type == "xml")
&& invoke->args.empty())
{
@@ -307,7 +309,7 @@ main(int , char **)
xml = "<invoke name=\"reportFlashTiming\"
returntype=\"xml\"><arguments><string>reportFlashTiming</string><object><property
id=\"5\"><number>1297326407594</number></property><property
id=\"4\"><string>vr</string></property><property
id=\"3\"><number>1297326407147</number></property><property
id=\"2\"><string>gv</string></property><property
id=\"1\"><number>1297326406281</number></property><property
id=\"0\"><string>fs</string></property></object><string>34</string><number>2</number><string>AASb6VeOkQtvnu_8</string><string>0</string><string>LNX%2010%2C1%2C999%2C0</string><string>Gnash%20GNU%2FLinux</string></arguments></invoke>";
- invoke = plugin::ExternalInterface::parseInvoke(xml);
+ invoke = plugin::ExternalInterface::parseInvoke(nullptr, xml);
check_equals (invoke->name, "reportFlashTiming");
check_equals (invoke->type, "xml");
xcheck_equals (invoke->args.size(), 8);
@@ -345,7 +347,7 @@ main(int , char **)
{
xml = "<object><property id=\"5\">";
- GnashNPVariant v = plugin::ExternalInterface::parseXML(xml);
+ GnashNPVariant v = plugin::ExternalInterface::parseXML(nullptr, xml);
check(NPVARIANT_IS_NULL(v.get()));
}
@@ -454,6 +456,19 @@ NPN_HasProperty(NPP , NPObject* , NPIdentifier name)
return false;
}
+NPError
+NPN_GetValue(NPP, NPNVariable, void*)
+{
+ return NPERR_GENERIC_ERROR;
+}
+
+bool
+NPN_Invoke(NPP, NPObject*, NPIdentifier, const NPVariant*, uint32_t,
+ NPVariant*)
+{
+ return false;
+}
+
void
NPN_ReleaseVariantValue(NPVariant *variant)
{
-----------------------------------------------------------------------
Summary of changes:
plugin/npapi/callbacks.cpp | 8 +++---
plugin/npapi/external.cpp | 47 ++++++++++++++++++++++++----------
plugin/npapi/external.h | 12 ++++----
plugin/npapi/plugin.cpp | 2 +-
plugin/npapi/pluginScriptObject.cpp | 12 ++++----
plugin/npapi/pluginScriptObject.h | 11 ++++---
plugin/npapi/test.cpp | 45 ++++++++++++++++++++++-----------
7 files changed, 86 insertions(+), 51 deletions(-)
hooks/post-receive
--
Gnash
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] [SCM] Gnash branch, master, updated. release_0_8_9_final-2268-g765adb0,
Sandro Santilli <=