Changeset 255119 in webkit


Ignore:
Timestamp:
Jan 25, 2020 8:51:34 AM (4 years ago)
Author:
pvollan@apple.com
Message:

[Cocoa] Media mime types map should be created in the UI process
https://bugs.webkit.org/show_bug.cgi?id=206478

Reviewed by Darin Adler.

Source/WebCore:

Creating this map in the WebContent process will access the launch services daemon, which will be blocked.
This patch creates the map in the UI process and sends it to the WebContent process as part of the WebProcess
creation parameters.

API test: WebKit.MimeTypes

  • platform/MIMETypeRegistry.cpp:

(WebCore::overriddenMimeTypesMap):
(WebCore::commonMediaTypes):
(WebCore::commonMimeTypesMap):
(WebCore::typesForCommonExtension):

  • platform/MIMETypeRegistry.h:
  • testing/Internals.cpp:

(WebCore::Internals::mediaMIMETypeForExtension):

  • testing/Internals.h:
  • testing/Internals.idl:

Source/WebKit:

Send the mime type map from the UI process to the WebContent process as part of the
WebProcess creation parameters.

  • Shared/WebProcessCreationParameters.cpp:

(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):

  • Shared/WebProcessCreationParameters.h:
  • UIProcess/Cocoa/WebProcessPoolCocoa.mm:

(WebKit::WebProcessPool::platformInitializeWebProcess):

  • WebProcess/cocoa/WebProcessCocoa.mm:

(WebKit::WebProcess::platformInitializeWebProcess):

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit/MimeTypes.mm: Added.

(TEST):

Location:
trunk
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r255118 r255119  
     12020-01-25  Per Arne Vollan  <pvollan@apple.com>
     2
     3        [Cocoa] Media mime types map should be created in the UI process
     4        https://bugs.webkit.org/show_bug.cgi?id=206478
     5
     6        Reviewed by Darin Adler.
     7
     8        Creating this map in the WebContent process will access the launch services daemon, which will be blocked.
     9        This patch creates the map in the UI process and sends it to the WebContent process as part of the WebProcess
     10        creation parameters.
     11
     12        API test: WebKit.MimeTypes
     13
     14        * platform/MIMETypeRegistry.cpp:
     15        (WebCore::overriddenMimeTypesMap):
     16        (WebCore::commonMediaTypes):
     17        (WebCore::commonMimeTypesMap):
     18        (WebCore::typesForCommonExtension):
     19        * platform/MIMETypeRegistry.h:
     20        * testing/Internals.cpp:
     21        (WebCore::Internals::mediaMIMETypeForExtension):
     22        * testing/Internals.h:
     23        * testing/Internals.idl:
     24
    1252020-01-25  Zalan Bujtas  <zalan@apple.com>
    226
  • trunk/Source/WebCore/platform/MIMETypeRegistry.cpp

    r255081 r255119  
    275275}
    276276
    277 static const Vector<String>* typesForCommonExtension(const String& extension)
    278 {
    279     static const auto map = makeNeverDestroyed([] {
    280         struct TypeExtensionPair {
    281             ASCIILiteral type;
    282             ASCIILiteral extension;
    283         };
    284 
    285         // A table of common media MIME types and file extentions used when a platform's
    286         // specific MIME type lookup doesn't have a match for a media file extension.
    287         static const TypeExtensionPair commonMediaTypes[] = {
    288             // Ogg
    289             { "application/ogg"_s, "ogx"_s },
    290             { "audio/ogg"_s, "ogg"_s },
    291             { "audio/ogg"_s, "oga"_s },
    292             { "video/ogg"_s, "ogv"_s },
    293 
    294             // Annodex
    295             { "application/annodex"_s, "anx"_s },
    296             { "audio/annodex"_s, "axa"_s },
    297             { "video/annodex"_s, "axv"_s },
    298             { "audio/speex"_s, "spx"_s },
    299 
    300             // WebM
    301             { "video/webm"_s, "webm"_s },
    302             { "audio/webm"_s, "webm"_s },
    303 
    304             // MPEG
    305             { "audio/mpeg"_s, "m1a"_s },
    306             { "audio/mpeg"_s, "m2a"_s },
    307             { "audio/mpeg"_s, "m1s"_s },
    308             { "audio/mpeg"_s, "mpa"_s },
    309             { "video/mpeg"_s, "mpg"_s },
    310             { "video/mpeg"_s, "m15"_s },
    311             { "video/mpeg"_s, "m1s"_s },
    312             { "video/mpeg"_s, "m1v"_s },
    313             { "video/mpeg"_s, "m75"_s },
    314             { "video/mpeg"_s, "mpa"_s },
    315             { "video/mpeg"_s, "mpeg"_s },
    316             { "video/mpeg"_s, "mpm"_s },
    317             { "video/mpeg"_s, "mpv"_s },
    318 
    319             // MPEG playlist
    320             { "application/vnd.apple.mpegurl"_s, "m3u8"_s },
    321             { "application/mpegurl"_s, "m3u8"_s },
    322             { "application/x-mpegurl"_s, "m3u8"_s },
    323             { "audio/mpegurl"_s, "m3url"_s },
    324             { "audio/x-mpegurl"_s, "m3url"_s },
    325             { "audio/mpegurl"_s, "m3u"_s },
    326             { "audio/x-mpegurl"_s, "m3u"_s },
    327 
    328             // MPEG-4
    329             { "video/x-m4v"_s, "m4v"_s },
    330             { "audio/x-m4a"_s, "m4a"_s },
    331             { "audio/x-m4b"_s, "m4b"_s },
    332             { "audio/x-m4p"_s, "m4p"_s },
    333             { "audio/mp4"_s, "m4a"_s },
    334 
    335             // MP3
    336             { "audio/mp3"_s, "mp3"_s },
    337             { "audio/x-mp3"_s, "mp3"_s },
    338             { "audio/x-mpeg"_s, "mp3"_s },
    339 
    340             // MPEG-2
    341             { "video/x-mpeg2"_s, "mp2"_s },
    342             { "video/mpeg2"_s, "vob"_s },
    343             { "video/mpeg2"_s, "mod"_s },
    344             { "video/m2ts"_s, "m2ts"_s },
    345             { "video/x-m2ts"_s, "m2t"_s },
    346             { "video/x-m2ts"_s, "ts"_s },
    347 
    348             // 3GP/3GP2
    349             { "audio/3gpp"_s, "3gpp"_s },
    350             { "audio/3gpp2"_s, "3g2"_s },
    351             { "application/x-mpeg"_s, "amc"_s },
    352 
    353             // AAC
    354             { "audio/aac"_s, "aac"_s },
    355             { "audio/aac"_s, "adts"_s },
    356             { "audio/x-aac"_s, "m4r"_s },
    357 
    358             // CoreAudio File
    359             { "audio/x-caf"_s, "caf"_s },
    360             { "audio/x-gsm"_s, "gsm"_s },
    361 
    362             // ADPCM
    363             { "audio/x-wav"_s, "wav"_s },
    364             { "audio/vnd.wave"_s, "wav"_s },
    365         };
    366 
     277Optional<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>>& overriddenMimeTypesMap()
     278{
     279    static NeverDestroyed<Optional<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>>> map;
     280    return map;
     281}
     282
     283const std::initializer_list<TypeExtensionPair>& commonMediaTypes()
     284{
     285    // A table of common media MIME types and file extensions used when a platform's
     286    // specific MIME type lookup doesn't have a match for a media file extension.
     287    static std::initializer_list<TypeExtensionPair> commonMediaTypes = {
     288        // Ogg
     289        { "application/ogg"_s, "ogx"_s },
     290        { "audio/ogg"_s, "ogg"_s },
     291        { "audio/ogg"_s, "oga"_s },
     292        { "video/ogg"_s, "ogv"_s },
     293
     294        // Annodex
     295        { "application/annodex"_s, "anx"_s },
     296        { "audio/annodex"_s, "axa"_s },
     297        { "video/annodex"_s, "axv"_s },
     298        { "audio/speex"_s, "spx"_s },
     299
     300        // WebM
     301        { "video/webm"_s, "webm"_s },
     302        { "audio/webm"_s, "webm"_s },
     303
     304        // MPEG
     305        { "audio/mpeg"_s, "m1a"_s },
     306        { "audio/mpeg"_s, "m2a"_s },
     307        { "audio/mpeg"_s, "m1s"_s },
     308        { "audio/mpeg"_s, "mpa"_s },
     309        { "video/mpeg"_s, "mpg"_s },
     310        { "video/mpeg"_s, "m15"_s },
     311        { "video/mpeg"_s, "m1s"_s },
     312        { "video/mpeg"_s, "m1v"_s },
     313        { "video/mpeg"_s, "m75"_s },
     314        { "video/mpeg"_s, "mpa"_s },
     315        { "video/mpeg"_s, "mpeg"_s },
     316        { "video/mpeg"_s, "mpm"_s },
     317        { "video/mpeg"_s, "mpv"_s },
     318
     319        // MPEG playlist
     320        { "application/vnd.apple.mpegurl"_s, "m3u8"_s },
     321        { "application/mpegurl"_s, "m3u8"_s },
     322        { "application/x-mpegurl"_s, "m3u8"_s },
     323        { "audio/mpegurl"_s, "m3url"_s },
     324        { "audio/x-mpegurl"_s, "m3url"_s },
     325        { "audio/mpegurl"_s, "m3u"_s },
     326        { "audio/x-mpegurl"_s, "m3u"_s },
     327
     328        // MPEG-4
     329        { "video/x-m4v"_s, "m4v"_s },
     330        { "audio/x-m4a"_s, "m4a"_s },
     331        { "audio/x-m4b"_s, "m4b"_s },
     332        { "audio/x-m4p"_s, "m4p"_s },
     333        { "audio/mp4"_s, "m4a"_s },
     334
     335        // MP3
     336        { "audio/mp3"_s, "mp3"_s },
     337        { "audio/x-mp3"_s, "mp3"_s },
     338        { "audio/x-mpeg"_s, "mp3"_s },
     339
     340        // MPEG-2
     341        { "video/x-mpeg2"_s, "mp2"_s },
     342        { "video/mpeg2"_s, "vob"_s },
     343        { "video/mpeg2"_s, "mod"_s },
     344        { "video/m2ts"_s, "m2ts"_s },
     345        { "video/x-m2ts"_s, "m2t"_s },
     346        { "video/x-m2ts"_s, "ts"_s },
     347
     348        // 3GP/3GP2
     349        { "audio/3gpp"_s, "3gpp"_s },
     350        { "audio/3gpp2"_s, "3g2"_s },
     351        { "application/x-mpeg"_s, "amc"_s },
     352
     353        // AAC
     354        { "audio/aac"_s, "aac"_s },
     355        { "audio/aac"_s, "adts"_s },
     356        { "audio/x-aac"_s, "m4r"_s },
     357
     358        // CoreAudio File
     359        { "audio/x-caf"_s, "caf"_s },
     360        { "audio/x-gsm"_s, "gsm"_s },
     361
     362        // ADPCM
     363        { "audio/x-wav"_s, "wav"_s },
     364        { "audio/vnd.wave"_s, "wav"_s },
     365    };
     366    return commonMediaTypes;
     367}
     368
     369const HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>& commonMimeTypesMap()
     370{
     371    ASSERT(isMainThread());
     372    static NeverDestroyed<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>> mimeTypesMap = [] {
    367373        HashMap<String, Vector<String>, ASCIICaseInsensitiveHash> map;
    368         for (auto& pair : commonMediaTypes) {
     374        for (auto& pair : commonMediaTypes()) {
    369375            ASCIILiteral type = pair.type;
    370376            ASCIILiteral extension = pair.extension;
     
    380386        }
    381387        return map;
    382     }());
    383     auto mapEntry = map.get().find(extension);
    384     if (mapEntry == map.get().end())
     388    }();
     389    return mimeTypesMap;
     390}
     391
     392static const Vector<String>* typesForCommonExtension(const String& extension)
     393{
     394    if (overriddenMimeTypesMap().hasValue()) {
     395        auto mapEntry = overriddenMimeTypesMap()->find(extension);
     396        if (mapEntry == overriddenMimeTypesMap()->end())
     397            return nullptr;
     398        return &mapEntry->value;
     399    }
     400    auto mapEntry = commonMimeTypesMap().find(extension);
     401    if (mapEntry == commonMimeTypesMap().end())
    385402        return nullptr;
    386403    return &mapEntry->value;
  • trunk/Source/WebCore/platform/MIMETypeRegistry.h

    r255081 r255119  
    3232namespace WebCore {
    3333
     34WEBCORE_EXPORT Optional<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>>& overriddenMimeTypesMap();
     35WEBCORE_EXPORT const HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>& commonMimeTypesMap();
     36
     37struct TypeExtensionPair {
     38    ASCIILiteral type;
     39    ASCIILiteral extension;
     40};
     41
     42WEBCORE_EXPORT const std::initializer_list<TypeExtensionPair>& commonMediaTypes();
     43
    3444struct MIMETypeRegistryThreadGlobalData {
    3545    WTF_MAKE_NONCOPYABLE(MIMETypeRegistryThreadGlobalData);
     
    5363    static Vector<String> getExtensionsForMIMEType(const String& type);
    5464    WEBCORE_EXPORT static String getPreferredExtensionForMIMEType(const String& type);
    55     static String getMediaMIMETypeForExtension(const String& extension);
     65    WEBCORE_EXPORT static String getMediaMIMETypeForExtension(const String& extension);
    5666    static Vector<String> getMediaMIMETypesForExtension(const String& extension);
    5767
  • trunk/Source/WebCore/testing/Internals.cpp

    r255081 r255119  
    119119#include "LoaderStrategy.h"
    120120#include "Location.h"
     121#include "MIMETypeRegistry.h"
    121122#include "MallocStatistics.h"
    122123#include "MediaDevices.h"
     
    54415442}
    54425443
     5444String Internals::mediaMIMETypeForExtension(const String& extension)
     5445{
     5446    return MIMETypeRegistry::getMediaMIMETypeForExtension(extension);
     5447}
     5448
    54435449} // namespace WebCore
  • trunk/Source/WebCore/testing/Internals.h

    r255081 r255119  
    931931    bool systemHasBattery() const;
    932932
     933    String mediaMIMETypeForExtension(const String& extension);
     934
    933935private:
    934936    explicit Internals(Document&);
  • trunk/Source/WebCore/testing/Internals.idl

    r255081 r255119  
    838838
    839839    boolean systemHasBattery();
    840 };
     840
     841    DOMString mediaMIMETypeForExtension(DOMString extension);
     842};
  • trunk/Source/WebKit/ChangeLog

    r255117 r255119  
     12020-01-25  Per Arne Vollan  <pvollan@apple.com>
     2
     3        [Cocoa] Media mime types map should be created in the UI process
     4        https://bugs.webkit.org/show_bug.cgi?id=206478
     5
     6        Reviewed by Darin Adler.
     7
     8        Send the mime type map from the UI process to the WebContent process as part of the
     9        WebProcess creation parameters.
     10
     11        * Shared/WebProcessCreationParameters.cpp:
     12        (WebKit::WebProcessCreationParameters::encode const):
     13        (WebKit::WebProcessCreationParameters::decode):
     14        * Shared/WebProcessCreationParameters.h:
     15        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
     16        (WebKit::WebProcessPool::platformInitializeWebProcess):
     17        * WebProcess/cocoa/WebProcessCocoa.mm:
     18        (WebKit::WebProcess::platformInitializeWebProcess):
     19
    1202020-01-25  Antti Koivisto  <antti@apple.com>
    221
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp

    r255081 r255119  
    168168    encoder << neSessionManagerExtensionHandle;
    169169    encoder << systemHasBattery;
     170    encoder << mimeTypesMap;
    170171#endif
    171172
     
    441442        return false;
    442443    parameters.systemHasBattery = WTFMove(*systemHasBattery);
     444
     445    Optional<Optional<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>>> mimeTypesMap;
     446    decoder >> mimeTypesMap;
     447    if (!mimeTypesMap)
     448        return false;
     449    parameters.mimeTypesMap = WTFMove(*mimeTypesMap);
    443450#endif
    444451
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.h

    r255081 r255119  
    210210    Optional<SandboxExtension::Handle> neSessionManagerExtensionHandle;
    211211    bool systemHasBattery { false };
     212    Optional<HashMap<String, Vector<String>, ASCIICaseInsensitiveHash>> mimeTypesMap;
    212213#endif
    213214
  • trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm

    r255081 r255119  
    4848#import "WindowServerConnection.h"
    4949#import <WebCore/Color.h>
     50#import <WebCore/MIMETypeRegistry.h>
    5051#import <WebCore/NetworkStorageSession.h>
    5152#import <WebCore/NotImplemented.h>
     
    354355        parameters.contentFilterExtensionHandle = WTFMove(handle);
    355356    }
     357    parameters.mimeTypesMap = commonMimeTypesMap();
    356358#endif
    357359   
  • trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

    r255081 r255119  
    6060#import <WebCore/LocalizedStrings.h>
    6161#import <WebCore/LogInitialization.h>
     62#import <WebCore/MIMETypeRegistry.h>
    6263#import <WebCore/MemoryRelease.h>
    6364#import <WebCore/NSScrollerImpDetails.h>
     
    261262    NetworkExtensionContentFilter::setHasConsumedSandboxExtensions(parameters.neHelperExtensionHandle.hasValue() && parameters.neSessionManagerExtensionHandle.hasValue());
    262263    setSystemHasBattery(parameters.systemHasBattery);
     264
     265    if (parameters.mimeTypesMap)
     266        overriddenMimeTypesMap() = WTFMove(parameters.mimeTypesMap);
    263267#endif
    264268
  • trunk/Tools/ChangeLog

    r255117 r255119  
     12020-01-25  Per Arne Vollan  <pvollan@apple.com>
     2
     3        [Cocoa] Media mime types map should be created in the UI process
     4        https://bugs.webkit.org/show_bug.cgi?id=206478
     5
     6        Reviewed by Darin Adler.
     7
     8        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     9        * TestWebKitAPI/Tests/WebKit/MimeTypes.mm: Added.
     10        (TEST):
     11
    1122020-01-25  Antti Koivisto  <antti@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r255081 r255119  
    863863                C0BD669F131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C0BD669E131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp */; };
    864864                C0C5D3C61459912900A802A6 /* GetBackingScaleFactor_Bundle.mm in Sources */ = {isa = PBXBuildFile; fileRef = C0C5D3BD14598B6F00A802A6 /* GetBackingScaleFactor_Bundle.mm */; };
     865                C145CC0C23DA5A1F003A5EEB /* MimeTypes.mm in Sources */ = {isa = PBXBuildFile; fileRef = C145CC0B23DA5A0F003A5EEB /* MimeTypes.mm */; };
    865866                C1692DCA23D10DAE006E88F7 /* Battery.mm in Sources */ = {isa = PBXBuildFile; fileRef = C1692DC923D10DAE006E88F7 /* Battery.mm */; };
    866867                C20F88A72295B96700D610FA /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C20F88A62295B96700D610FA /* CoreText.framework */; };
     
    23862387                C0C5D3BC14598B6F00A802A6 /* GetBackingScaleFactor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetBackingScaleFactor.mm; sourceTree = "<group>"; };
    23872388                C0C5D3BD14598B6F00A802A6 /* GetBackingScaleFactor_Bundle.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetBackingScaleFactor_Bundle.mm; sourceTree = "<group>"; };
     2389                C145CC0B23DA5A0F003A5EEB /* MimeTypes.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MimeTypes.mm; sourceTree = "<group>"; };
    23882390                C1692DC923D10DAE006E88F7 /* Battery.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Battery.mm; sourceTree = "<group>"; };
    23892391                C1D8EE212028E8E3008EB141 /* WebProcessTerminate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebProcessTerminate.mm; sourceTree = "<group>"; };
     
    28272829                        children = (
    28282830                                C1692DC923D10DAE006E88F7 /* Battery.mm */,
     2831                                C145CC0B23DA5A0F003A5EEB /* MimeTypes.mm */,
    28292832                                0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */,
    28302833                        );
     
    48104813                                5165FE04201EE620009F7EC3 /* MessagePortProviders.mm in Sources */,
    48114814                                A5B149DE1F5A19EA00C6DAFF /* MIMETypeRegistry.cpp in Sources */,
     4815                                C145CC0C23DA5A1F003A5EEB /* MimeTypes.mm in Sources */,
    48124816                                51CD1C6C1B38CE4300142CA5 /* ModalAlerts.mm in Sources */,
    48134817                                7C83E0B61D0A64B300FEBCF3 /* ModalAlertsSPI.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.