Bug 633427: Fix bug in which we mis-label plugins as Flash plugins. This was causing us to load plugins unnecessarily when clearing private data. r=smichaud a=lsblakk
authorJosh Aas <joshmoz@gmail.com>
Tue, 20 Mar 2012 16:26:53 -0400
changeset 81736 608da149daae0085e0678db57df3f8a0ae4ecc6a
parent 81735 27b1269dac4dda632e35d7537953bf5970e2926e
child 81737 00f9152478a773c129be10e44c5174d7a99b6362
push id69
push userjosh@mozilla.com
push dateTue, 20 Mar 2012 20:28:03 +0000
reviewerssmichaud, lsblakk
bugs633427
milestone10.0.4esrpre
Bug 633427: Fix bug in which we mis-label plugins as Flash plugins. This was causing us to load plugins unnecessarily when clearing private data. r=smichaud a=lsblakk
dom/plugins/base/nsPluginTags.cpp
dom/plugins/base/nsPluginTags.h
--- a/dom/plugins/base/nsPluginTags.cpp
+++ b/dom/plugins/base/nsPluginTags.cpp
@@ -106,82 +106,20 @@ mIsJavaPlugin(false),
 mIsNPRuntimeEnabledJavaPlugin(false),
 mIsFlashPlugin(false),
 mFileName(aPluginInfo->fFileName),
 mFullPath(aPluginInfo->fFullPath),
 mVersion(aPluginInfo->fVersion),
 mLastModifiedTime(0),
 mFlags(NS_PLUGIN_FLAG_ENABLED)
 {
-  if (!aPluginInfo->fMimeTypeArray) {
-    return;
-  }
-
-  for (PRUint32 i = 0; i < aPluginInfo->fVariantCount; i++) {
-    // First fill in the MIME types.
-    char* currentMIMEType = aPluginInfo->fMimeTypeArray[i];
-    if (currentMIMEType) {
-      if (mIsJavaPlugin) {
-        if (strcmp(currentMIMEType, "application/x-java-vm-npruntime") == 0) {
-          // This "magic MIME type" should not be exposed, but is just a signal
-          // to the browser that this is new-style java.
-          // Don't add it or its associated information to our arrays.
-          mIsNPRuntimeEnabledJavaPlugin = true;
-          continue;
-        }
-      }
-      mMimeTypes.AppendElement(nsCString(currentMIMEType));
-      if (nsPluginHost::IsJavaMIMEType(currentMIMEType)) {
-        mIsJavaPlugin = true;
-      }
-      else if (strcmp(currentMIMEType, "application/x-shockwave-flash") == 0) {
-        mIsFlashPlugin = true;
-      }
-    } else {
-      continue;
-    }
-
-    // Now fill in the MIME descriptions.
-    if (aPluginInfo->fMimeDescriptionArray &&
-        aPluginInfo->fMimeDescriptionArray[i]) {
-      // we should cut off the list of suffixes which the mime
-      // description string may have, see bug 53895
-      // it is usually in form "some description (*.sf1, *.sf2)"
-      // so we can search for the opening round bracket
-      char cur = '\0';
-      char pre = '\0';
-      char * p = PL_strrchr(aPluginInfo->fMimeDescriptionArray[i], '(');
-      if (p && (p != aPluginInfo->fMimeDescriptionArray[i])) {
-        if ((p - 1) && *(p - 1) == ' ') {
-          pre = *(p - 1);
-          *(p - 1) = '\0';
-        } else {
-          cur = *p;
-          *p = '\0';
-        }
-      }
-      mMimeDescriptions.AppendElement(nsCString(aPluginInfo->fMimeDescriptionArray[i]));
-      // restore the original string
-      if (cur != '\0')
-        *p = cur;
-      if (pre != '\0')
-        *(p - 1) = pre;      
-    } else {
-      mMimeDescriptions.AppendElement(nsCString());
-    }
-
-    // Now fill in the extensions.
-    if (aPluginInfo->fExtensionArray &&
-        aPluginInfo->fExtensionArray[i]) {
-      mExtensions.AppendElement(nsCString(aPluginInfo->fExtensionArray[i]));
-    } else {
-      mExtensions.AppendElement(nsCString());
-    }
-  }
-
+  InitMime(aPluginInfo->fMimeTypeArray,
+           aPluginInfo->fMimeDescriptionArray,
+           aPluginInfo->fExtensionArray,
+           aPluginInfo->fVariantCount);
   EnsureMembersAreUTF8();
 }
 
 nsPluginTag::nsPluginTag(const char* aName,
                          const char* aDescription,
                          const char* aFileName,
                          const char* aFullPath,
                          const char* aVersion,
@@ -194,47 +132,110 @@ nsPluginTag::nsPluginTag(const char* aNa
                          bool aArgsAreUTF8)
 : mPluginHost(nsnull),
 mName(aName),
 mDescription(aDescription),
 mLibrary(nsnull),
 mCanUnloadLibrary(aCanUnload),
 mIsJavaPlugin(false),
 mIsNPRuntimeEnabledJavaPlugin(false),
+mIsFlashPlugin(false),
 mFileName(aFileName),
 mFullPath(aFullPath),
 mVersion(aVersion),
 mLastModifiedTime(aLastModifiedTime),
 mFlags(0) // Caller will read in our flags from cache
 {
-  for (PRInt32 i = 0; i < aVariants; i++) {
-    if (mIsJavaPlugin && aMimeTypes[i] &&
-        strcmp(aMimeTypes[i], "application/x-java-vm-npruntime") == 0) {
-      mIsNPRuntimeEnabledJavaPlugin = true;
-      continue;
-    }
-    mMimeTypes.AppendElement(nsCString(aMimeTypes[i]));
-    mMimeDescriptions.AppendElement(nsCString(aMimeDescriptions[i]));
-    mExtensions.AppendElement(nsCString(aExtensions[i]));
-    if (nsPluginHost::IsJavaMIMEType(mMimeTypes[i].get())) {
-      mIsJavaPlugin = true;
-    }
-  }
-
+  InitMime(aMimeTypes, aMimeDescriptions, aExtensions, static_cast<PRUint32>(aVariants));
   if (!aArgsAreUTF8)
     EnsureMembersAreUTF8();
 }
 
 nsPluginTag::~nsPluginTag()
 {
   NS_ASSERTION(!mNext, "Risk of exhausting the stack space, bug 486349");
 }
 
 NS_IMPL_ISUPPORTS1(nsPluginTag, nsIPluginTag)
 
+void nsPluginTag::InitMime(const char* const* aMimeTypes,
+                           const char* const* aMimeDescriptions,
+                           const char* const* aExtensions,
+                           PRUint32 aVariantCount)
+{
+  if (!aMimeTypes) {
+    return;
+  }
+
+  for (PRUint32 i = 0; i < aVariantCount; i++) {
+    if (!aMimeTypes[i]) {
+      continue;
+    }
+
+    // If we already marked this as a Java plugin, a later MIME type will tell
+    // us if it is npruntime-enabled.
+    if (mIsJavaPlugin) {
+      if (strcmp(aMimeTypes[i], "application/x-java-vm-npruntime") == 0) {
+        // This "magic MIME type" should not be exposed, but is just a signal
+        // to the browser that this is new-style java.
+        // Don't add it or its associated information to our arrays.
+        mIsNPRuntimeEnabledJavaPlugin = true;
+        continue;
+      }
+    }
+
+    // Look for certain special plugins.
+    if (nsPluginHost::IsJavaMIMEType(aMimeTypes[i])) {
+      mIsJavaPlugin = true;
+    } else if (strcmp(aMimeTypes[i], "application/x-shockwave-flash") == 0) {
+      mIsFlashPlugin = true;
+    }
+
+    // Fill in our MIME type array.
+    mMimeTypes.AppendElement(nsCString(aMimeTypes[i]));
+
+    // Now fill in the MIME descriptions.
+    if (aMimeDescriptions && aMimeDescriptions[i]) {
+      // we should cut off the list of suffixes which the mime
+      // description string may have, see bug 53895
+      // it is usually in form "some description (*.sf1, *.sf2)"
+      // so we can search for the opening round bracket
+      char cur = '\0';
+      char pre = '\0';
+      char * p = PL_strrchr(aMimeDescriptions[i], '(');
+      if (p && (p != aMimeDescriptions[i])) {
+        if ((p - 1) && *(p - 1) == ' ') {
+          pre = *(p - 1);
+          *(p - 1) = '\0';
+        } else {
+          cur = *p;
+          *p = '\0';
+        }
+      }
+      mMimeDescriptions.AppendElement(nsCString(aMimeDescriptions[i]));
+      // restore the original string
+      if (cur != '\0') {
+        *p = cur;
+      }
+      if (pre != '\0') {
+        *(p - 1) = pre;
+      }
+    } else {
+      mMimeDescriptions.AppendElement(nsCString());
+    }
+
+    // Now fill in the extensions.
+    if (aExtensions && aExtensions[i]) {
+      mExtensions.AppendElement(nsCString(aExtensions[i]));
+    } else {
+      mExtensions.AppendElement(nsCString());
+    }
+  }
+}
+
 static nsresult ConvertToUTF8(nsIUnicodeDecoder *aUnicodeDecoder,
                               nsAFlatCString& aString)
 {
   PRInt32 numberOfBytes = aString.Length();
   PRInt32 outUnicodeLen;
   nsAutoString buffer;
   nsresult rv = aUnicodeDecoder->GetMaxLength(aString.get(), numberOfBytes,
                                               &outUnicodeLen);
--- a/dom/plugins/base/nsPluginTags.h
+++ b/dom/plugins/base/nsPluginTags.h
@@ -82,17 +82,17 @@ public:
               const char* aVersion,
               const char* const* aMimeTypes,
               const char* const* aMimeDescriptions,
               const char* const* aExtensions,
               PRInt32 aVariants,
               PRInt64 aLastModifiedTime = 0,
               bool aCanUnload = true,
               bool aArgsAreUTF8 = false);
-  ~nsPluginTag();
+  virtual ~nsPluginTag();
   
   void SetHost(nsPluginHost * aHost);
   void TryUnloadPlugin();
   void Mark(PRUint32 mask);
   void UnMark(PRUint32 mask);
   bool HasFlag(PRUint32 flag);
   PRUint32 Flags();
   bool Equals(nsPluginTag* aPluginTag);
@@ -114,13 +114,17 @@ public:
   bool          mIsNPRuntimeEnabledJavaPlugin;
   bool          mIsFlashPlugin;
   nsCString     mFileName; // UTF-8
   nsCString     mFullPath; // UTF-8
   nsCString     mVersion;  // UTF-8
   PRInt64       mLastModifiedTime;
 private:
   PRUint32      mFlags;
-  
+
+  void InitMime(const char* const* aMimeTypes,
+                const char* const* aMimeDescriptions,
+                const char* const* aExtensions,
+                PRUint32 aVariantCount);
   nsresult EnsureMembersAreUTF8();
 };
 
 #endif // nsPluginTags_h_