/hg/icedtea-web: 2 new changesets
aazores at icedtea.classpath.org
aazores at icedtea.classpath.org
Wed Sep 4 09:22:28 PDT 2013
changeset d5eab1484308 in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=d5eab1484308
author: Andrew Azores <aazores at redhat.com>
date: Wed Sep 04 12:18:40 2013 -0400
Extracted integer response casting/handling logic in SecurityDialogs to new method, added test for this method
changeset 6c0e37585a5e in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=6c0e37585a5e
author: Andrew Azores <aazores at redhat.com>
date: Wed Sep 04 12:22:16 2013 -0400
merging
diffstat:
ChangeLog | 41 +
netx/net/sourceforge/jnlp/Launcher.java | 2 +
netx/net/sourceforge/jnlp/security/SecurityDialogs.java | 61 +-
netx/net/sourceforge/jnlp/services/XFileOpenService.java | 11 +-
plugin/icedteanp/IcedTeaNPPlugin.cc | 36 +-
plugin/icedteanp/IcedTeaPluginUtils.cc | 134 ++++-
plugin/icedteanp/IcedTeaPluginUtils.h | 67 ++-
plugin/icedteanp/IcedTeaScriptablePluginObject.cc | 220 +++++++--
plugin/icedteanp/IcedTeaScriptablePluginObject.h | 28 +-
tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc | 15 +-
tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java | 60 ++
tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java | 70 +++
12 files changed, 542 insertions(+), 203 deletions(-)
diffs (truncated from 1174 to 500 lines):
diff -r 94ebabfba6ab -r 6c0e37585a5e ChangeLog
--- a/ChangeLog Fri Aug 23 16:35:37 2013 -0400
+++ b/ChangeLog Wed Sep 04 12:22:16 2013 -0400
@@ -1,3 +1,44 @@
+2013-09-04 Andrew Azores <aazores at redhat.com>
+
+ * netx/net/sourceforge/jnlp/security/SecurityDialogs.java:
+ (getIntegerResponseAsBoolean) extracted integer response casting/handling
+ logic into new method
+ * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java:
+ new unit test for SecurityDialogs#getIntegerReponseAsBoolean()
+
+2013-09-04 Adam Domurad <adomurad at redhat.com>
+
+ * netx/net/sourceforge/jnlp/Launcher.java:
+ Fix applet context being null during applet init & start.
+
+2013-08-29 Omair Majid <omajid at redhat.com>
+
+ * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java
+ (testPropertyRestrictions): New method. Check that properties in
+ resources are are combined and filtered as appropriate.
+
+2013-08-29 Omair Majid <omajid at redhat.com>
+
+ PR1058
+ * netx/net/sourceforge/jnlp/services/XFileOpenService.java
+ (openMultiFileDialog): Create a privileged proxy for each FileContents
+ instance and return an array of them.
+
+2013-08-27 Adam Domurad <adomurad at redhat.com>
+
+ Do not wait for applet initialization when binding Java applets for NPAPI.
+ * plugin/icedteanp/IcedTeaNPPlugin.cc: Refactor to use
+ lazy-initialized javascript applet binding.
+ * plugin/icedteanp/IcedTeaPluginUtils.cc: Make use of new helper
+ class, introduce (stringPrintf), introduce NPObjectRef.
+ * plugin/icedteanp/IcedTeaPluginUtils.h: Same.
+ * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Allow
+ IcedTeaScriptableJavaObject to be lazy-initialized, introduce
+ lazy-initializing (get_scriptable_applet_object).
+ * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same.
+ * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: Adapt
+ test to new helper class.
+
2013-08-23 Adam Domurad <adomurad at redhat.com>
Spawn Java side during C++ unit tests. Many new tests.
diff -r 94ebabfba6ab -r 6c0e37585a5e netx/net/sourceforge/jnlp/Launcher.java
--- a/netx/net/sourceforge/jnlp/Launcher.java Fri Aug 23 16:35:37 2013 -0400
+++ b/netx/net/sourceforge/jnlp/Launcher.java Wed Sep 04 12:22:16 2013 -0400
@@ -19,6 +19,7 @@
import static net.sourceforge.jnlp.runtime.Translator.R;
import java.applet.Applet;
+import java.applet.AppletStub;
import java.awt.Container;
import java.awt.SplashScreen;
import java.io.File;
@@ -716,6 +717,7 @@
String appletName = file.getApplet().getMainClass();
Class appletClass = loader.loadClass(appletName);
Applet applet = (Applet) appletClass.newInstance();
+ applet.setStub((AppletStub)cont);
// Finish setting up appletInstance.
appletInstance.setApplet(applet);
appletInstance.getAppletEnvironment().setApplet(applet);
diff -r 94ebabfba6ab -r 6c0e37585a5e netx/net/sourceforge/jnlp/security/SecurityDialogs.java
--- a/netx/net/sourceforge/jnlp/security/SecurityDialogs.java Fri Aug 23 16:35:37 2013 -0400
+++ b/netx/net/sourceforge/jnlp/security/SecurityDialogs.java Wed Sep 04 12:22:16 2013 -0400
@@ -132,16 +132,7 @@
Object selectedValue = getUserResponse(message);
- if (selectedValue == null) {
- return false;
- } else if (selectedValue instanceof Integer) {
- if (((Integer) selectedValue).intValue() == 0)
- return true;
- else
- return false;
- } else {
- return false;
- }
+ return getIntegerResponseAsBoolean(selectedValue);
}
/**
@@ -164,17 +155,7 @@
Object selectedValue = getUserResponse(message);
- if (selectedValue == null) {
- return false;
- } else if (selectedValue instanceof Integer) {
- if (((Integer) selectedValue).intValue() == 0) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
+ return getIntegerResponseAsBoolean(selectedValue);
}
/**
@@ -224,16 +205,7 @@
Object selectedValue = getUserResponse(message);
- if (selectedValue == null) {
- return false;
- } else if (selectedValue instanceof Integer) {
- if (((Integer) selectedValue).intValue() == 0)
- return true;
- else
- return false;
- } else {
- return false;
- }
+ return getIntegerResponseAsBoolean(selectedValue);
}
/**
@@ -263,11 +235,7 @@
message.extras = new Object[] { host, port, prompt, type };
Object response = getUserResponse(message);
- if (response == null) {
- return null;
- } else {
- return (Object[]) response;
- }
+ return (Object[]) response;
}
/**
@@ -286,11 +254,11 @@
Object selectedValue = getUserResponse(message);
// result 0 = Yes, 1 = No, 2 = Cancel
- if (selectedValue == null) {
- return 2;
- } else if (selectedValue instanceof Integer) {
+ if (selectedValue instanceof Integer) {
+ // If the selected value can be cast to Integer, use that value
return ((Integer) selectedValue).intValue();
} else {
+ // Otherwise default to "cancel"
return 2;
}
}
@@ -376,6 +344,21 @@
}
/**
+ * Returns true iff the given Object reference can be cast to Integer and that Integer's
+ * intValue is 0.
+ * @param ref the Integer (hopefully) reference
+ * @return whether the given reference is both an Integer type and has intValue of 0
+ */
+ public static boolean getIntegerResponseAsBoolean(Object ref) {
+ boolean isInteger = ref instanceof Integer;
+ if (isInteger) {
+ Integer i = (Integer) ref;
+ return i.intValue() == 0;
+ }
+ return false;
+ }
+
+ /**
* Returns whether the current runtime configuration allows prompting user
* for security warnings.
*
diff -r 94ebabfba6ab -r 6c0e37585a5e netx/net/sourceforge/jnlp/services/XFileOpenService.java
--- a/netx/net/sourceforge/jnlp/services/XFileOpenService.java Fri Aug 23 16:35:37 2013 -0400
+++ b/netx/net/sourceforge/jnlp/services/XFileOpenService.java Wed Sep 04 12:22:16 2013 -0400
@@ -91,11 +91,12 @@
if (chosen == JFileChooser.APPROVE_OPTION) {
File[] files = chooser.getSelectedFiles();
int length = files.length;
- XFileContents[] xfiles = new XFileContents[length];
- for (int i = 0; i < length; i++)
- xfiles[i] = new XFileContents(files[i]);
- return (FileContents[]) ServiceUtil.createPrivilegedProxy(
- FileContents.class, xfiles);
+ FileContents[] result = new FileContents[length];
+ for (int i = 0; i < length; i++) {
+ XFileContents xfile = new XFileContents(files[i]);
+ result[i] = (FileContents) ServiceUtil.createPrivilegedProxy(FileContents.class, xfile);
+ }
+ return result;
} else {
return null;
}
diff -r 94ebabfba6ab -r 6c0e37585a5e plugin/icedteanp/IcedTeaNPPlugin.cc
--- a/plugin/icedteanp/IcedTeaNPPlugin.cc Fri Aug 23 16:35:37 2013 -0400
+++ b/plugin/icedteanp/IcedTeaNPPlugin.cc Wed Sep 04 12:22:16 2013 -0400
@@ -2101,14 +2101,6 @@
if (data->is_applet_instance) // dummy instance/package?
{
- JavaRequestProcessor java_request = JavaRequestProcessor();
- JavaResultData* java_result;
- std::string instance_id = std::string();
- std::string applet_class_id = std::string();
-
- int id = get_id_from_instance(instance);
- gchar* id_str = g_strdup_printf ("%d", id);
-
// Some browsers.. (e.g. chromium) don't call NPP_SetWindow
// for 0x0 plugins and therefore require initialization with
// a 0 handle
@@ -2117,30 +2109,10 @@
plugin_send_initialization_message(data->instance_id, 0, 0, 0, data->parameters_string);
}
- java_result = java_request.getAppletObjectInstance(id_str);
-
- g_free(id_str);
-
- if (java_result->error_occurred)
- {
- printf("Error: Unable to fetch applet instance id from Java side.\n");
- return NULL;
- }
-
- instance_id.append(*(java_result->return_string));
-
- java_result = java_request.getClassID(instance_id);
-
- if (java_result->error_occurred)
- {
- printf("Error: Unable to fetch applet instance id from Java side.\n");
- return NULL;
- }
-
- applet_class_id.append(*(java_result->return_string));
-
- obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, applet_class_id, instance_id, false);
-
+ NPObjectRef applet_object = IcedTeaScriptableJavaObject::get_scriptable_applet_object(instance);
+ /* Retain because we are returning an NPObject* */
+ applet_object.raw_retain();
+ obj = applet_object.get();
} else
{
obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(instance, "");
diff -r 94ebabfba6ab -r 6c0e37585a5e plugin/icedteanp/IcedTeaPluginUtils.cc
--- a/plugin/icedteanp/IcedTeaPluginUtils.cc Fri Aug 23 16:35:37 2013 -0400
+++ b/plugin/icedteanp/IcedTeaPluginUtils.cc Wed Sep 04 12:22:16 2013 -0400
@@ -53,7 +53,7 @@
int IcedTeaPluginUtilities::reference = -1;
pthread_mutex_t IcedTeaPluginUtilities::reference_mutex = PTHREAD_MUTEX_INITIALIZER;
std::map<void*, NPP>* IcedTeaPluginUtilities::instance_map = new std::map<void*, NPP>();
-std::map<std::string, NPObject*>* IcedTeaPluginUtilities::object_map = new std::map<std::string, NPObject*>();
+std::map<std::string, NPObjectRef> IcedTeaPluginUtilities::object_map;
/* Plugin async call queue */
static std::vector< PluginThreadCall* >* pendingPluginThreadRequests = new std::vector< PluginThreadCall* >();
@@ -433,9 +433,9 @@
IcedTeaPluginUtilities::printStringVector(const char* prefix, std::vector<std::string>* str_vector)
{
- // This is a CPU intensive function. Run only if debugging
- if (!plugin_debug)
- return;
+ // This is a CPU intensive function. Run only if debugging
+ if (!plugin_debug)
+ return;
std::string* str = new std::string();
*str += "{ ";
@@ -561,27 +561,25 @@
* @return The associated active NPObject, NULL otherwise
*/
-NPObject*
+NPObjectRef
IcedTeaPluginUtilities::getNPObjectFromJavaKey(std::string key)
{
-
- NPObject* object = NULL;
PLUGIN_DEBUG("getNPObjectFromJavaKey looking for %s\n", key.c_str());
- std::map<std::string, NPObject*>::iterator iterator = object_map->find(key);
+ std::map<std::string, NPObjectRef>::iterator iterator = object_map.find(key);
- if (iterator != object_map->end())
+ if (iterator != object_map.end())
{
- NPObject* mapped_object = object_map->find(key)->second;
+ NPObjectRef object = object_map.find(key)->second;
- if (getInstanceFromMemberPtr(mapped_object) != NULL)
+ if (getInstanceFromMemberPtr(object.get()) != NULL)
{
- object = mapped_object;
- PLUGIN_DEBUG("getNPObjectFromJavaKey found %s. NPObject = %p\n", key.c_str(), object);
+ PLUGIN_DEBUG("getNPObjectFromJavaKey found %s. NPObject = %p\n", key.c_str(), object.get());
+ return object;
}
}
- return object;
+ return NPObjectRef(NULL);
}
/**
@@ -592,10 +590,10 @@
*/
void
-IcedTeaPluginUtilities::storeObjectMapping(std::string key, NPObject* object)
+IcedTeaPluginUtilities::storeObjectMapping(std::string key, NPObjectRef object)
{
- PLUGIN_DEBUG("Storing object %p with key %s\n", object, key.c_str());
- object_map->insert(std::make_pair(key, object));
+ PLUGIN_DEBUG("Storing object %p with key %s\n", object.get(), key.c_str());
+ object_map.insert(std::make_pair(key, object));
}
/**
@@ -608,19 +606,14 @@
IcedTeaPluginUtilities::removeObjectMapping(std::string key)
{
PLUGIN_DEBUG("Removing key %s from object map\n", key.c_str());
- object_map->erase(key);
+ object_map.erase(key);
}
/* Clear object_map. Useful for tests. */
void
IcedTeaPluginUtilities::clearObjectMapping()
{
- std::map<std::string, NPObject*>::iterator iter = object_map->begin();
- for (; iter != object_map->end(); ++iter) {
- browser_functions.releaseobject(iter->second);
- }
- delete object_map;
- object_map = new std::map<std::string, NPObject*>();
+ object_map = std::map<std::string, NPObjectRef>();
}
/*
@@ -633,9 +626,9 @@
void
IcedTeaPluginUtilities::printStringPtrVector(const char* prefix, std::vector<std::string*>* str_ptr_vector)
{
- // This is a CPU intensive function. Run only if debugging
- if (!plugin_debug)
- return;
+ // This is a CPU intensive function. Run only if debugging
+ if (!plugin_debug)
+ return;
std::string* str = new std::string();
*str += "{ ";
@@ -819,18 +812,13 @@
std::string jclass_id = *jclass_result->return_string;
- NPObject* obj;
- if (jclass_id.at(0) == '[') // array
- {
- obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, jclass_id,
- jobject_id, true);
- } else
- {
- obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, jclass_id,
- jobject_id, false);
- }
+ bool is_array = (jclass_id.at(0) == '[');
+ NPObjectRef object = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, jclass_id,
+ jobject_id, is_array);
- OBJECT_TO_NPVARIANT(obj, *variant);
+ OBJECT_TO_NPVARIANT(object.get(), *variant);
+ /* Retain because we are returning an NPObject* */
+ object.raw_retain();
return true;
}
@@ -874,12 +862,12 @@
}
bool
-IcedTeaPluginUtilities::isObjectJSArray(NPP instance, NPObject* object)
+IcedTeaPluginUtilities::isObjectJSArray(NPP instance, NPObjectRef object)
{
NPVariant constructor_v = NPVariant();
NPIdentifier constructor_id = browser_functions.getstringidentifier("constructor");
- browser_functions.getproperty(instance, object, constructor_id, &constructor_v);
+ browser_functions.getproperty(instance, object.get(), constructor_id, &constructor_v);
IcedTeaPluginUtilities::printNPVariant(constructor_v);
// void constructor => not an array
@@ -1087,6 +1075,34 @@
str = str.substr(start, end - start + 1);
}
+std::string
+IcedTeaPluginUtilities::stringPrintf(const char* fmt, /*variable arguments*/ ...)
+{
+ /* Extract the variable arguments */
+ va_list args;
+ va_start(args, fmt);
+
+ gchar* result = NULL;
+ size_t size;
+
+ /* Format the arguments into a new buffer, held in 'result' */
+ size = g_vasprintf (&result, fmt, args);
+
+ if (result == NULL)
+ {
+ // We are out of memory
+ throw std::bad_alloc();
+ }
+
+ /* Wrap as string and free buffer */
+ std::string str(result, size);
+ g_free(result);
+
+ va_end(args); /* Finish using variable arguments */
+
+ return str;
+}
+
std::string IcedTeaPluginUtilities::NPIdentifierAsString(NPIdentifier id) {
NPUTF8* cstr = browser_functions.utf8fromidentifier(id);
if (cstr == NULL) {
@@ -1242,3 +1258,41 @@
PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex);
}
+void
+NPObjectRef::set(NPObject* new_object)
+{
+ if (new_object != NULL) {
+ /* Increase the new object's reference count */
+ browser_functions.retainobject(new_object);
+ }
+ if (current_object != NULL) {
+ /* Decrease the old object's reference count */
+ browser_functions.releaseobject(current_object);
+ }
+
+ this->current_object = new_object;
+}
+
+NPObjectRef
+NPObjectRef::create(NPP instance, NPClass* np_class)
+{
+ NPObjectRef ref;
+ /* Don't use set(), otherwise we'd double-retain */
+ ref.current_object = browser_functions.createobject(instance, np_class);
+ return ref;
+}
+
+/* Explicit reference counting operations, use only if needed for interoperating with NPObject* */
+void
+NPObjectRef::raw_retain() {
+ if (current_object != NULL) {
+ browser_functions.retainobject(current_object);
+ }
+}
+
+void
+NPObjectRef::raw_release() {
+ if (current_object != NULL) {
+ browser_functions.releaseobject(current_object);
+ }
+}
diff -r 94ebabfba6ab -r 6c0e37585a5e plugin/icedteanp/IcedTeaPluginUtils.h
--- a/plugin/icedteanp/IcedTeaPluginUtils.h Fri Aug 23 16:35:37 2013 -0400
+++ b/plugin/icedteanp/IcedTeaPluginUtils.h Wed Sep 04 12:22:16 2013 -0400
@@ -153,6 +153,61 @@
/* Function to process all pending async calls */
void processAsyncCallQueue(void*);
+/* Reference-counted 'smart pointer' to NPObject */
+class NPObjectRef {
+public:
+ /* Create with browser_functions.createobject.
+ * This ensures the object is not double-retained. */
+ static NPObjectRef create(NPP instance, NPClass* np_class);
+
+ NPObjectRef(NPObject* obj = NULL) {
+ current_object = NULL;
+ set(obj);
+ }
+
+ NPObjectRef(const NPObjectRef& ref) {
+ current_object = NULL;
+ set(ref.current_object);
+ }
+
More information about the distro-pkg-dev
mailing list