⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mimetyperegistry.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2006, 2008 Apple Inc.  All rights reserved. * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "MIMETypeRegistry.h"#include "ArchiveFactory.h"#include "MediaPlayer.h"#include "StringHash.h"#include <wtf/HashMap.h>#include <wtf/HashSet.h>#if PLATFORM(CG)#include "ImageSourceCG.h"#include <ApplicationServices/ApplicationServices.h>#include <wtf/RetainPtr.h>#endif#if PLATFORM(QT)#include <qimagereader.h>#include <qimagewriter.h>#endifnamespace WebCore {static HashSet<String>* supportedImageResourceMIMETypes;static HashSet<String>* supportedImageMIMETypes;static HashSet<String>* supportedImageMIMETypesForEncoding;static HashSet<String>* supportedJavaScriptMIMETypes;static HashSet<String>* supportedNonImageMIMETypes;static HashSet<String>* supportedMediaMIMETypes;static void initializeSupportedImageMIMETypes(){#if PLATFORM(CG)    RetainPtr<CFArrayRef> supportedTypes(AdoptCF, CGImageSourceCopyTypeIdentifiers());    CFIndex count = CFArrayGetCount(supportedTypes.get());    for (CFIndex i = 0; i < count; i++) {        RetainPtr<CFStringRef> supportedType(AdoptCF, reinterpret_cast<CFStringRef>(CFArrayGetValueAtIndex(supportedTypes.get(), i)));        String mimeType = MIMETypeForImageSourceType(supportedType.get());        if (!mimeType.isEmpty()) {            supportedImageMIMETypes->add(mimeType);            supportedImageResourceMIMETypes->add(mimeType);        }    }    // On Tiger and Leopard, com.microsoft.bmp doesn't have a MIME type in the registry.    supportedImageMIMETypes->add("image/bmp");    supportedImageResourceMIMETypes->add("image/bmp");    // Favicons don't have a MIME type in the registry either.    supportedImageMIMETypes->add("image/x-icon");    supportedImageResourceMIMETypes->add("image/x-icon");    //  We only get one MIME type per UTI, hence our need to add these manually    supportedImageMIMETypes->add("image/pjpeg");    supportedImageResourceMIMETypes->add("image/pjpeg");    //  We don't want to try to treat all binary data as an image    supportedImageMIMETypes->remove("application/octet-stream");    supportedImageResourceMIMETypes->remove("application/octet-stream");    //  Don't treat pdf/postscript as images directly    supportedImageMIMETypes->remove("application/pdf");    supportedImageMIMETypes->remove("application/postscript");#elif PLATFORM(QT)    QList<QByteArray> formats = QImageReader::supportedImageFormats();    for (size_t i = 0; i < formats.size(); ++i) {#if ENABLE(SVG)        /*         * Qt has support for SVG, but we want to use KSVG2         */        if (formats.at(i).toLower().startsWith("svg"))            continue;#endif        String mimeType = MIMETypeRegistry::getMIMETypeForExtension(formats.at(i).constData());        supportedImageMIMETypes->add(mimeType);        supportedImageResourceMIMETypes->add(mimeType);    }#else    // assume that all implementations at least support the following standard    // image types:    static const char* types[] = {        "image/jpeg",        "image/png",        "image/gif",        "image/bmp",        "image/x-icon",    // ico        "image/x-xbitmap"  // xbm    };    for (size_t i = 0; i < sizeof(types) / sizeof(types[0]); ++i) {        supportedImageMIMETypes->add(types[i]);        supportedImageResourceMIMETypes->add(types[i]);    }#endif}static void initializeSupportedImageMIMETypesForEncoding(){    supportedImageMIMETypesForEncoding = new HashSet<String>;#if PLATFORM(CG)#if PLATFORM(MAC)    RetainPtr<CFArrayRef> supportedTypes(AdoptCF, CGImageDestinationCopyTypeIdentifiers());    CFIndex count = CFArrayGetCount(supportedTypes.get());    for (CFIndex i = 0; i < count; i++) {        RetainPtr<CFStringRef> supportedType(AdoptCF, reinterpret_cast<CFStringRef>(CFArrayGetValueAtIndex(supportedTypes.get(), i)));        String mimeType = MIMETypeForImageSourceType(supportedType.get());        if (!mimeType.isEmpty())            supportedImageMIMETypesForEncoding->add(mimeType);    }#else    // FIXME: Add Windows support for all the supported UTI's when a way to convert from MIMEType to UTI reliably is found.    // For now, only support PNG, JPEG and GIF.  See <rdar://problem/6095286>.    supportedImageMIMETypesForEncoding->add("image/png");    supportedImageMIMETypesForEncoding->add("image/jpeg");    supportedImageMIMETypesForEncoding->add("image/gif");#endif#elif PLATFORM(QT)    QList<QByteArray> formats = QImageWriter::supportedImageFormats();    for (size_t i = 0; i < formats.size(); ++i) {        String mimeType = MIMETypeRegistry::getMIMETypeForExtension(formats.at(i).constData());        supportedImageMIMETypesForEncoding->add(mimeType);    }#elif PLATFORM(CAIRO)    supportedImageMIMETypesForEncoding->add("image/png");#endif}static void initializeSupportedJavaScriptMIMETypes(){    /*        Mozilla 1.8 and WinIE 7 both accept text/javascript and text/ecmascript.        Mozilla 1.8 accepts application/javascript, application/ecmascript, and application/x-javascript, but WinIE 7 doesn't.        WinIE 7 accepts text/javascript1.1 - text/javascript1.3, text/jscript, and text/livescript, but Mozilla 1.8 doesn't.        Mozilla 1.8 allows leading and trailing whitespace, but WinIE 7 doesn't.        Mozilla 1.8 and WinIE 7 both accept the empty string, but neither accept a whitespace-only string.        We want to accept all the values that either of these browsers accept, but not other values.     */    static const char* types[] = {        "text/javascript",        "text/ecmascript",        "application/javascript",        "application/ecmascript",        "application/x-javascript",        "text/javascript1.1",        "text/javascript1.2",        "text/javascript1.3",        "text/jscript",        "text/livescript",    };    for (size_t i = 0; i < sizeof(types) / sizeof(types[0]); ++i)      supportedJavaScriptMIMETypes->add(types[i]);}static void initializeSupportedNonImageMimeTypes(){    static const char* types[] = {#if ENABLE(WML)        "text/vnd.wap.wml",        "application/vnd.wap.wmlc",#endif        "text/html",        "text/xml",        "text/xsl",        "text/plain",        "text/",        "application/xml",        "application/xhtml+xml",        "application/rss+xml",        "application/atom+xml",#if ENABLE(SVG)        "image/svg+xml",#endif#if ENABLE(FTPDIR)        "application/x-ftp-directory",#endif        "multipart/x-mixed-replace"    };    for (size_t i = 0; i < sizeof(types)/sizeof(types[0]); ++i)        supportedNonImageMIMETypes->add(types[i]);    ArchiveFactory::registerKnownArchiveMIMETypes();}static void initializeSupportedMediaMIMETypes(){    supportedMediaMIMETypes = new HashSet<String>;#if ENABLE(VIDEO)    MediaPlayer::getSupportedTypes(*supportedMediaMIMETypes);#endif}static void initializeMIMETypeRegistry(){    supportedJavaScriptMIMETypes = new HashSet<String>;    initializeSupportedJavaScriptMIMETypes();    supportedNonImageMIMETypes = new HashSet<String>(*supportedJavaScriptMIMETypes);    initializeSupportedNonImageMimeTypes();    supportedImageResourceMIMETypes = new HashSet<String>;    supportedImageMIMETypes = new HashSet<String>;    initializeSupportedImageMIMETypes();}String MIMETypeRegistry::getMIMETypeForPath(const String& path){    int pos = path.reverseFind('.');    if (pos >= 0) {        String extension = path.substring(pos + 1);        String result = getMIMETypeForExtension(extension);        if (result.length())            return result;    }    return "application/octet-stream";}bool MIMETypeRegistry::isSupportedImageMIMEType(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedImageMIMETypes)        initializeMIMETypeRegistry();    return supportedImageMIMETypes->contains(mimeType);}bool MIMETypeRegistry::isSupportedImageResourceMIMEType(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedImageResourceMIMETypes)        initializeMIMETypeRegistry();    return supportedImageResourceMIMETypes->contains(mimeType);}bool MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedImageMIMETypesForEncoding)        initializeSupportedImageMIMETypesForEncoding();    return supportedImageMIMETypesForEncoding->contains(mimeType);}bool MIMETypeRegistry::isSupportedJavaScriptMIMEType(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedJavaScriptMIMETypes)        initializeMIMETypeRegistry();    return supportedJavaScriptMIMETypes->contains(mimeType);}bool MIMETypeRegistry::isSupportedNonImageMIMEType(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedNonImageMIMETypes)        initializeMIMETypeRegistry();    return supportedNonImageMIMETypes->contains(mimeType);}bool MIMETypeRegistry::isSupportedMediaMIMEType(const String& mimeType){    if (mimeType.isEmpty())        return false;    if (!supportedMediaMIMETypes)        initializeSupportedMediaMIMETypes();    return supportedMediaMIMETypes->contains(mimeType);}bool MIMETypeRegistry::isJavaAppletMIMEType(const String& mimeType){    // Since this set is very limited and is likely to remain so we won't bother with the overhead    // of using a hash set.    // Any of the MIME types below may be followed by any number of specific versions of the JVM,    // which is why we use startsWith()    return mimeType.startsWith("application/x-java-applet", false)        || mimeType.startsWith("application/x-java-bean", false)        || mimeType.startsWith("application/x-java-vm", false);}HashSet<String>& MIMETypeRegistry::getSupportedImageMIMETypes(){    if (!supportedImageMIMETypes)        initializeMIMETypeRegistry();    return *supportedImageMIMETypes;}HashSet<String>& MIMETypeRegistry::getSupportedImageResourceMIMETypes(){    if (!supportedImageResourceMIMETypes)        initializeMIMETypeRegistry();    return *supportedImageResourceMIMETypes;}HashSet<String>& MIMETypeRegistry::getSupportedImageMIMETypesForEncoding(){    if (!supportedImageMIMETypesForEncoding)        initializeSupportedImageMIMETypesForEncoding();    return *supportedImageMIMETypesForEncoding;}HashSet<String>& MIMETypeRegistry::getSupportedNonImageMIMETypes(){    if (!supportedNonImageMIMETypes)        initializeMIMETypeRegistry();    return *supportedNonImageMIMETypes;}HashSet<String>& MIMETypeRegistry::getSupportedMediaMIMETypes(){    if (!supportedMediaMIMETypes)        initializeSupportedMediaMIMETypes();    return *supportedMediaMIMETypes;}} // namespace WebCore

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -