/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