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 f41d08af85057131f549e75e6cd67133b74617b3..899c947eb01bd143e978a08c0d60b244f0b0ece9 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 d022c25b43405a2949a136e5244da6bdf754108f..0c4d25109371de436285f693c411af538672fafc 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 8e085c5ca85c1ceed0c7b35c5fac5085b7ed14d6..ae8bc100e51397e865b7278a6a6dff03442eb77b 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 40380ef3ac55a2deebcd8e36209a34adebdda029..223decda1874994a44b677dff82e2a147c5793d6 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);
     }