Reviewed by Darin, landed by Anders.
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Nov 2007 22:30:41 +0000 (22:30 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Nov 2007 22:30:41 +0000 (22:30 +0000)
        Fixed: <rdar://problem/4610818> CrashTracer: 1533 crashes in Safari at com.macromedia.Flash Player.plugin: native_ShockwaveFlash_TCallLabel + 271131

        The problem was that some Leopard users were still inadvertently using the old Flash 8 plug-in, even though Leopard
        shipped with Flash 9. To avoid loading an older version of a plug-in when a newer version is installed, the plug-in
        database will compare bundle versions and always load the latest version.

        * Plugins/WebBasePluginPackage.h:
        * Plugins/WebBasePluginPackage.m:
        (-[WebBasePluginPackage versionNumber]): New method. CFBundleGetVersionNumber doesn't work with all possible versioning schemes,
        but we think for now it's good enough for us.
        * Plugins/WebPluginDatabase.m:
        (considerCandidate): Added a C utility function which compares the current plug-in against a candidate plug-in's version number.
        If both plug-ins have the same bundle ID and the candiate is newer, the current plug-in becomes the candidate.
        (-[WebPluginDatabase pluginForKey:withEnumeratorSelector:]): Calls the new considerCandidate() function.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28081 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/mac/ChangeLog
WebKit/mac/Plugins/WebBasePluginPackage.h
WebKit/mac/Plugins/WebBasePluginPackage.m
WebKit/mac/Plugins/WebPluginDatabase.m

index c7c79948123389ff6bdea80d522bf196fab58804..affa3d785ff431e5b3e36600fb7074b046affc39 100644 (file)
@@ -1,3 +1,22 @@
+2007-11-27  Kevin Decker  <kdecker@apple.com>
+
+        Reviewed by Darin, landed by Anders.
+
+        Fixed: <rdar://problem/4610818> CrashTracer: 1533 crashes in Safari at com.macromedia.Flash Player.plugin: native_ShockwaveFlash_TCallLabel + 271131
+
+        The problem was that some Leopard users were still inadvertently using the old Flash 8 plug-in, even though Leopard
+        shipped with Flash 9. To avoid loading an older version of a plug-in when a newer version is installed, the plug-in
+        database will compare bundle versions and always load the latest version.
+
+        * Plugins/WebBasePluginPackage.h:
+        * Plugins/WebBasePluginPackage.m:
+        (-[WebBasePluginPackage versionNumber]): New method. CFBundleGetVersionNumber doesn't work with all possible versioning schemes,
+        but we think for now it's good enough for us.
+        * Plugins/WebPluginDatabase.m:
+        (considerCandidate): Added a C utility function which compares the current plug-in against a candidate plug-in's version number.
+        If both plug-ins have the same bundle ID and the candiate is newer, the current plug-in becomes the candidate.
+        (-[WebPluginDatabase pluginForKey:withEnumeratorSelector:]): Calls the new considerCandidate() function.
+
 2007-11-26  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Dave Hyatt.
index 60f2c41d3e6e07e30566217ea5587652f67cf86c..7a884b81588adb2dc86acbbc53e18b68fca2e919 100644 (file)
@@ -99,7 +99,7 @@ typedef void (*BP_CreatePluginMIMETypesPreferencesFuncPtr)(void);
 - (BOOL)isJavaPlugIn;
 
 - (BOOL)isNativeLibraryData:(NSData *)data;
-
+- (UInt32)versionNumber;
 - (void)wasAddedToPluginDatabase:(WebPluginDatabase *)database;
 - (void)wasRemovedFromPluginDatabase:(WebPluginDatabase *)database;
 
index c0b983f4d06c5b4912b17396130d5117daa331d6..99d4e74b6d686dcba603d054e076555cd69165d1 100644 (file)
     return YES;
 }
 
+- (UInt32)versionNumber
+{
+    // CFBundleGetVersionNumber doesn't work with all possible versioning schemes, but we think for now it's good enough for us.
+    return CFBundleGetVersionNumber(cfBundle);
+}
+
 - (void)wasAddedToPluginDatabase:(WebPluginDatabase *)database
 {    
     if (!pluginDatabases)
index c92da4fa177b406cb273af02ecf7ba455f19cf74..e7994436a53a21be3e34831c1a0989d3ba3f4a40 100644 (file)
@@ -41,6 +41,8 @@
 #import <WebKit/WebViewPrivate.h>
 #import <WebKitSystemInterface.h>
 
+static void checkCandidate(WebBasePluginPackage **currentPlugin, WebBasePluginPackage **candidatePlugin);
+
 @interface WebPluginDatabase (Internal)
 + (NSArray *)_defaultPlugInPaths;
 - (NSArray *)_plugInPaths;
@@ -69,32 +71,40 @@ static WebPluginDatabase *sharedDatabase = nil;
     [sharedDatabase close];
 }
 
+static void checkCandidate(WebBasePluginPackage **currentPlugin, WebBasePluginPackage **candidatePlugin)
+{
+    if (!*currentPlugin) {
+        *currentPlugin = *candidatePlugin;
+        return;
+    }
+
+    if ([[[*currentPlugin bundle] bundleIdentifier] isEqualToString:[[*candidatePlugin bundle] bundleIdentifier]] && [*candidatePlugin versionNumber] > [*currentPlugin versionNumber]) 
+        *currentPlugin = *candidatePlugin;
+}
+
 - (WebBasePluginPackage *)pluginForKey:(NSString *)key withEnumeratorSelector:(SEL)enumeratorSelector
 {
     WebBasePluginPackage *plugin = nil;
     WebBasePluginPackage *webPlugin = nil;
 #ifndef __LP64__
     WebBasePluginPackage *CFMPlugin = nil;
-    WebBasePluginPackage *machoPlugin = nil;
+    WebBasePluginPackage *machoPlugin = nil;    
 #endif
+
     NSEnumerator *pluginEnumerator = [plugins objectEnumerator];
     key = [key lowercaseString];
 
     while ((plugin = [pluginEnumerator nextObject]) != nil) {
         if ([[[plugin performSelector:enumeratorSelector] allObjects] containsObject:key]) {
-            if ([plugin isKindOfClass:[WebPluginPackage class]]) {
-                if (!webPlugin)
-                    webPlugin = plugin;
-            } 
+            if ([plugin isKindOfClass:[WebPluginPackage class]]) 
+                checkCandidate(&webPlugin, &plugin);
 #ifndef __LP64__
             else if([plugin isKindOfClass:[WebNetscapePluginPackage class]]) {
                 WebExecutableType executableType = [(WebNetscapePluginPackage *)plugin executableType];
                 if (executableType == WebCFMExecutableType) {
-                    if (!CFMPlugin)
-                        CFMPlugin = plugin;
+                    checkCandidate(&CFMPlugin, &plugin);
                 } else if (executableType == WebMachOExecutableType) {
-                    if (!machoPlugin)
-                        machoPlugin = plugin;
+                    checkCandidate(&machoPlugin, &plugin);
                 } else {
                     ASSERT_NOT_REACHED();
                 }