Changeset 62600 in webkit


Ignore:
Timestamp:
Jul 6, 2010 3:52:46 PM (14 years ago)
Author:
andersca@apple.com
Message:

Add PluginInfoStore::findPlugin
https://bugs.webkit.org/show_bug.cgi?id=41719

Reviewed by Sam Weinig.

  • UIProcess/Plugins/PluginInfoStore.cpp:

(WebKit::PluginInfoStore::getPlugins):
(WebKit::PluginInfoStore::findPluginForMIMEType):
(WebKit::PluginInfoStore::findPluginForExtension):
(WebKit::pathExtension):
(WebKit::PluginInfoStore::findPlugin):

  • UIProcess/Plugins/PluginInfoStore.h:
  • UIProcess/Plugins/mac/PluginInfoStoreMac.mm:

(WebKit::PluginInfoStore::mimeTypeFromExtension):

Location:
trunk/WebKit2
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit2/ChangeLog

    r62590 r62600  
     12010-07-06  Anders Carlsson  <andersca@apple.com>
     2
     3        Reviewed by Sam Weinig.
     4
     5        Add PluginInfoStore::findPlugin
     6        https://bugs.webkit.org/show_bug.cgi?id=41719
     7
     8        * UIProcess/Plugins/PluginInfoStore.cpp:
     9        (WebKit::PluginInfoStore::getPlugins):
     10        (WebKit::PluginInfoStore::findPluginForMIMEType):
     11        (WebKit::PluginInfoStore::findPluginForExtension):
     12        (WebKit::pathExtension):
     13        (WebKit::PluginInfoStore::findPlugin):
     14        * UIProcess/Plugins/PluginInfoStore.h:
     15        * UIProcess/Plugins/mac/PluginInfoStoreMac.mm:
     16        (WebKit::PluginInfoStore::mimeTypeFromExtension):
     17
    1182010-07-06  Sam Weinig  <sam@webkit.org>
    219
  • trunk/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp

    r61591 r62600  
    2626#include "PluginInfoStore.h"
    2727
     28#include <algorithm>
     29#include <WebCore/KURL.h>
    2830#include <wtf/StdLibExtras.h>
    2931
     32using namespace std;
    3033using namespace WebCore;
    3134
     
    8386}
    8487
    85 void PluginInfoStore::getPlugins(Vector<WebCore::PluginInfo>& plugins)
     88void PluginInfoStore::getPlugins(Vector<PluginInfo>& plugins)
    8689{
    8790    loadPluginsIfNecessary();
     
    9194}
    9295
     96PluginInfoStore::Plugin PluginInfoStore::findPluginForMIMEType(const String& mimeType)
     97{
     98    ASSERT(!mimeType.isNull());
     99   
     100    for (size_t i = 0; i < m_plugins.size(); ++i) {
     101        const Plugin& plugin = m_plugins[i];
     102       
     103        for (size_t j = 0; j < plugin.info.mimes.size(); ++j) {
     104            const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j];
     105            if (mimeClassInfo.type == mimeType)
     106                return plugin;
     107        }
     108    }
     109   
     110    return Plugin();
     111}
     112
     113PluginInfoStore::Plugin PluginInfoStore::findPluginForExtension(const String& extension, String& mimeType)
     114{
     115    ASSERT(!extension.isNull());
     116   
     117    for (size_t i = 0; i < m_plugins.size(); ++i) {
     118        const Plugin& plugin = m_plugins[i];
     119       
     120        for (size_t j = 0; j < plugin.info.mimes.size(); ++j) {
     121            const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j];
     122           
     123            const Vector<String>& extensions = mimeClassInfo.extensions;
     124           
     125            if (find(extensions.begin(), extensions.end(), extension) != extensions.end()) {
     126                // We found a supported extension, set the correct MIME type.
     127                mimeType = mimeClassInfo.type;
     128                return plugin;
     129            }
     130        }
     131    }
     132   
     133    return Plugin();
     134}
     135
     136static inline String pathExtension(const KURL& url)
     137{
     138    String extension;
     139    String filename = url.lastPathComponent();
     140    if (!filename.endsWith("/")) {
     141        int extensionPos = filename.reverseFind('.');
     142        if (extensionPos != -1)
     143            extension = filename.substring(extensionPos + 1);
     144    }
     145   
     146    return extension;
     147}
     148
     149PluginInfoStore::Plugin PluginInfoStore::findPlugin(String& mimeType, const KURL& url)
     150{
     151    loadPluginsIfNecessary();
     152   
     153    // First, check if we can get the plug-in based on its MIME type.
     154    if (!mimeType.isNull()) {
     155        Plugin plugin = findPluginForMIMEType(mimeType);
     156        if (!plugin.path.isNull())
     157            return plugin;
     158    }
     159
     160    // Next, check if any plug-ins claim to support the URL extension.
     161    String extension = pathExtension(url).lower();
     162    if (!extension.isNull()) {
     163        Plugin plugin = findPluginForExtension(extension, mimeType);
     164        if (!plugin.path.isNull())
     165            return plugin;
     166       
     167        // Finally, try to get the MIME type from the extension in a platform specific manner and use that.
     168        String extensionMimeType = mimeTypeFromExtension(extension);
     169        if (!extensionMimeType.isNull()) {
     170            Plugin plugin = findPluginForMIMEType(extensionMimeType);
     171            if (!plugin.path.isNull()) {
     172                mimeType = extensionMimeType;
     173                return plugin;
     174            }
     175        }
     176    }
     177   
     178    return Plugin();
     179}
     180
    93181} // namespace WebKit
  • trunk/WebKit2/UIProcess/Plugins/PluginInfoStore.h

    r61624 r62600  
    2929#include <WebCore/PluginData.h>
    3030
     31namespace WebCore {
     32    class KURL;
     33}
     34
    3135namespace WebKit {
    3236
     
    3842    void getPlugins(Vector<WebCore::PluginInfo>& plugins);
    3943   
    40 private:
    41     PluginInfoStore();
    42 
    4344    // Represents a single plug-in.
    4445    struct Plugin {
     
    5253    };
    5354
     55    // Returns the info for a plug-in that can handle the given MIME type.
     56    // If the MIME type is null, the file extension of the given url will be used to infer the
     57    // plug-in type. In that case, mimeType will be filled in with the right MIME type.
     58    Plugin findPlugin(WebCore::String& mimeType, const WebCore::KURL& url);
     59   
     60private:
     61    PluginInfoStore();
     62
     63    Plugin findPluginForMIMEType(const WebCore::String& mimeType);
     64    Plugin findPluginForExtension(const WebCore::String& extension, WebCore::String& mimeType);
     65
    5466    void loadPluginsIfNecessary();
    5567    void loadPluginsInDirectory(const WebCore::String& directory);
     
    6173    static bool getPluginInfo(const WebCore::String& pluginPath, Plugin& plugin);
    6274    static bool shouldUsePlugin(const Plugin& plugin, const Vector<Plugin>& loadedPlugins);
     75    static WebCore::String mimeTypeFromExtension(const WebCore::String& extension);
    6376   
    6477    Vector<Plugin> m_plugins;
  • trunk/WebKit2/UIProcess/Plugins/mac/PluginInfoStoreMac.mm

    r61725 r62600  
    2929#include <wtf/HashSet.h>
    3030#include <wtf/RetainPtr.h>
     31#include "WebKitSystemInterface.h"
    3132
    3233using namespace WebCore;
     
    368369}
    369370
     371String PluginInfoStore::mimeTypeFromExtension(const WebCore::String& extension)
     372{
     373    RetainPtr<CFStringRef> extensionCF(AdoptCF, safeCreateCFString(extension));
     374   
     375    return WKGetMIMETypeForExtension((NSString *)extensionCF.get());
     376}
     377
    370378} // namespace WebKit
Note: See TracChangeset for help on using the changeset viewer.