2007-10-29 Jon Honeycutt <jhoneycutt@apple.com>
authorhoneycutt <honeycutt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2007 23:13:24 +0000 (23:13 +0000)
committerhoneycutt <honeycutt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2007 23:13:24 +0000 (23:13 +0000)
        Reviewed by Anders.

        Speculative fix for <rdar://5538489> Safari 3.0.4 seed hangs at
        http://tgmonline.futuregamer.it/ (works fine on Safari 2.0.4 and Safari
        Beta for Mac)

        I cannot reproduce this hang, but it is likely due to our not limiting
        WM_USER+1 messages or InvalidateRect calls for a plugin with initially-
        unknown MIME type. The embed tag on the page is missing a type
        attribute, so as fallback, we choose to load the Flash plugin based on
        the file extension of "swf." However, we do not record this determined
        MIME type, and so our quirks cannot be established.

        Changed findPlugin() so that, if it fails to find a plugin for the
        given MIME type, it will lookup the MIME type for the file extension -
        overwriting its passed MIME type parameter - and search for a plugin
        for that MIME type.

        * plugins/win/PluginDatabaseWin.cpp:
        (WebCore::PluginDatabaseWin::pluginForMIMEType): Added an early return
        if the MIME type is empty
        (WebCore::PluginDatabaseWin::MIMETypeForExtension): Added to replace
        pluginForExtension. Returns a String with the MIME type for the file
        extension. Also, changed to use case-insensitive compares
        (WebCore::PluginDatabaseWin::findPlugin): If we fail to find a plugin
        for the given extension, overwrite the incoming MIME type parameter
        with the MIME type for the file extension, and search for a plugin for
        that MIME type. Also, changed the way that the extension is determined
        (WebCore::PluginDatabaseWin::createPluginView): Pass a mutable String
        to findPlugin() so that it can be updated if necessary
        * plugins/win/PluginDatabaseWin.h: Changed findPlugin() to take a non-
        const String, removed definition of pluginForExtension, added
        definition for MIMETypeForExtension
        * plugins/win/PluginPackageWin.cpp:
        (WebCore::PluginPackageWin::fetchInfo): Store the MIME type in
        lowercase for easier compares

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

WebCore/ChangeLog
WebCore/plugins/win/PluginDatabaseWin.cpp
WebCore/plugins/win/PluginDatabaseWin.h
WebCore/plugins/win/PluginPackageWin.cpp

index f41d08a..899c947 100644 (file)
@@ -1,3 +1,42 @@
+2007-10-29  Jon Honeycutt  <jhoneycutt@apple.com>
+
+        Reviewed by Anders.
+
+        Speculative fix for <rdar://5538489> Safari 3.0.4 seed hangs at
+        http://tgmonline.futuregamer.it/ (works fine on Safari 2.0.4 and Safari
+        Beta for Mac)
+        
+        I cannot reproduce this hang, but it is likely due to our not limiting
+        WM_USER+1 messages or InvalidateRect calls for a plugin with initially-
+        unknown MIME type. The embed tag on the page is missing a type
+        attribute, so as fallback, we choose to load the Flash plugin based on
+        the file extension of "swf." However, we do not record this determined
+        MIME type, and so our quirks cannot be established.
+        
+        Changed findPlugin() so that, if it fails to find a plugin for the
+        given MIME type, it will lookup the MIME type for the file extension -
+        overwriting its passed MIME type parameter - and search for a plugin
+        for that MIME type.
+
+        * plugins/win/PluginDatabaseWin.cpp:
+        (WebCore::PluginDatabaseWin::pluginForMIMEType): Added an early return
+        if the MIME type is empty
+        (WebCore::PluginDatabaseWin::MIMETypeForExtension): Added to replace
+        pluginForExtension. Returns a String with the MIME type for the file
+        extension. Also, changed to use case-insensitive compares
+        (WebCore::PluginDatabaseWin::findPlugin): If we fail to find a plugin
+        for the given extension, overwrite the incoming MIME type parameter
+        with the MIME type for the file extension, and search for a plugin for
+        that MIME type. Also, changed the way that the extension is determined
+        (WebCore::PluginDatabaseWin::createPluginView): Pass a mutable String
+        to findPlugin() so that it can be updated if necessary
+        * plugins/win/PluginDatabaseWin.h: Changed findPlugin() to take a non-
+        const String, removed definition of pluginForExtension, added
+        definition for MIMETypeForExtension
+        * plugins/win/PluginPackageWin.cpp: 
+        (WebCore::PluginPackageWin::fetchInfo): Store the MIME type in
+        lowercase for easier compares
+
 2007-10-29  Andrew Wellington  <proton@wiretapped.net>
 
         Not reviewed - build fix
index d022c25..0c4d251 100644 (file)
@@ -461,11 +461,14 @@ bool PluginDatabaseWin::isPluginBlacklisted(PluginPackageWin* plugin)
 
 PluginPackageWin* PluginDatabaseWin::pluginForMIMEType(const String& mimeType)
 {
+    if (mimeType.isEmpty())
+        return 0;
+
     String key = mimeType.lower();
     String ourPath = safariPluginsPath();
     PluginPackageWin* plugin = 0;
-
     PluginSet::const_iterator end = m_plugins.end();
+
     for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
         if ((*it)->mimeToDescriptions().contains(key)) {
             plugin = (*it).get();
@@ -478,10 +481,14 @@ PluginPackageWin* PluginDatabaseWin::pluginForMIMEType(const String& mimeType)
     return plugin;
 }
 
-PluginPackageWin* PluginDatabaseWin::pluginForExtension(const String& extension)
+String PluginDatabaseWin::MIMETypeForExtension(const String& extension) const
 {
+    if (extension.isEmpty())
+        return String();
+
     PluginSet::const_iterator end = m_plugins.end();
     String ourPath = safariPluginsPath();
+    String mimeType;
     PluginPackageWin* plugin = 0;
 
     for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) {
@@ -489,9 +496,9 @@ PluginPackageWin* PluginDatabaseWin::pluginForExtension(const String& extension)
 
         for (MIMEToExtensionsMap::const_iterator mime_it = (*it)->mimeToExtensions().begin(); mime_it != mime_end; ++mime_it) {
             const Vector<String>& extensions = mime_it->second;
-
             for (unsigned i = 0; i < extensions.size(); i++) {
-                if (extensions[i] == extension) {
+                if (equalIgnoringCase(extensions[i], extension)) {
+                    mimeType = mime_it->first;
                     plugin = (*it).get();
                     // prefer plugins in our own plugins directory
                     if (plugin->parentDirectory() == ourPath)
@@ -501,38 +508,47 @@ PluginPackageWin* PluginDatabaseWin::pluginForExtension(const String& extension)
         }
     }
 
-    return plugin;
+    return mimeType;
 }
 
-PluginPackageWin* PluginDatabaseWin::findPlugin(const KURL& url, const String& mimeType)
+PluginPackageWin* PluginDatabaseWin::findPlugin(const KURL& url, String& mimeType)
 {   
-    PluginPackageWin* plugin = 0;
-
-    if (!mimeType.isNull())
-        plugin = pluginForMIMEType(mimeType);
+    PluginPackageWin* plugin = pluginForMIMEType(mimeType);
+    String filename = url.url();
     
     if (!plugin) {
-        String path = url.path();
-        String extension = path.substring(path.reverseFind('.') + 1);
-
-        plugin = pluginForExtension(extension);
-
-        // FIXME: if no plugin could be found, query Windows for the mime type 
-        // corresponding to the extension.
+        String filename = url.lastPathComponent();
+        if (!filename.endsWith("/")) {
+            int extensionPos = filename.reverseFind('.');
+            if (extensionPos != -1) {
+                String extension = filename.substring(extensionPos + 1);
+
+                mimeType = MIMETypeForExtension(extension);
+                plugin = pluginForMIMEType(mimeType);
+            }
+        }
     }
 
+    // FIXME: if no plugin could be found, query Windows for the mime type 
+    // corresponding to the extension.
+
     return plugin;
 }
 
 PluginViewWin* PluginDatabaseWin::createPluginView(Frame* parentFrame, const IntSize& size, Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually)
 {
-    PluginPackageWin* plugin = findPlugin(url, mimeType);
+    // if we fail to find a plugin for this MIME type, findPlugin will search for
+    // a plugin by the file extension and update the MIME type, so pass a mutable String
+    String mimeTypeCopy = mimeType;
+    PluginPackageWin* plugin = findPlugin(url, mimeTypeCopy);
     
     // No plugin was found, try refreshing the database and searching again
-    if (!plugin && refresh())
-        plugin = findPlugin(url, mimeType);
+    if (!plugin && refresh()) {
+        mimeTypeCopy = mimeType;
+        plugin = findPlugin(url, mimeTypeCopy);
+    }
         
-    return new PluginViewWin(parentFrame, size, plugin, element, url, paramNames, paramValues, mimeType, loadManually);
+    return new PluginViewWin(parentFrame, size, plugin, element, url, paramNames, paramValues, mimeTypeCopy, loadManually);
 }
 
 }
index 8e085c5..ae8bc10 100644 (file)
@@ -57,9 +57,9 @@ namespace WebCore {
         void setPluginPaths(const Vector<String>& paths) { m_pluginPaths = paths; }
         PluginSet getPluginsInPaths() const;
 
-        PluginPackageWin* findPlugin(const KURL& url, const String& mimeType);
+        PluginPackageWin* findPlugin(const KURL& url, String& mimeType);
         PluginPackageWin* pluginForMIMEType(const String& mimeType);
-        PluginPackageWin* pluginForExtension(const String& extension);
+        String MIMETypeForExtension(const String& extension) const;
 
         static Vector<String> defaultPluginPaths();
 
index 40380ef..223decd 100644 (file)
@@ -180,6 +180,8 @@ bool PluginPackageWin::fetchInfo()
             description = description.left(pos);
         }
 
+        mimeTypes[i] = mimeTypes[i].lower();
+
         m_mimeToExtensions.add(mimeTypes[i], splitString(fileExtents[i], ',', -1));
         m_mimeToDescriptions.add(mimeTypes[i], description);
     }