Title: [199315] trunk/Source
Revision
199315
Author
[email protected]
Date
2016-04-11 15:43:42 -0700 (Mon, 11 Apr 2016)

Log Message

When clearing cache, also clear AVFoundation cache.
https://bugs.webkit.org/show_bug.cgi?id=155783
rdar://problem/25252541

Patch by Jeremy Jones <[email protected]> on 2016-04-11
Reviewed by Darin Adler.

Source/WebCore:

Use AVAssetCache at a specified location on disk for all AVURLAssets. This AVAssetCache
can then be used to manage the cache storage used by AVFoundation. It is used to query the
contents of the cache in originsInMediaCache() and to clear the cache completely or partially in
clearMediaCache() and clearMediaCacheForOrigins().

Use SecurityOrigin instead of the less formal site String to represent origins in the cache.

* html/HTMLMediaElement.cpp:
(WebCore::sharedMediaCacheDirectory): Added.
(WebCore::HTMLMediaElement::setMediaCacheDirectory): Added.
(WebCore::HTMLMediaElement::mediaCacheDirectory): Added.
(WebCore::HTMLMediaElement::originsInMediaCache): Added.
(WebCore::HTMLMediaElement::clearMediaCache): Added parameter.
(WebCore::HTMLMediaElement::clearMediaCacheForOrigins): Added.
(WebCore::HTMLMediaElement::mediaPlayerMediaCacheDirectory): Added.
(WebCore::HTMLMediaElement::getSitesInMediaCache): Deleted.
(WebCore::HTMLMediaElement::clearMediaCacheForSite): Deleted.
* html/HTMLMediaElement.h:
(WebCore::HTMLMediaElement::clearMediaCache): Added parameter.
* platform/graphics/MediaPlayer.cpp:
(WebCore::addMediaEngine): Add new cache methods.
(WebCore::addToHash): Added.
(WebCore::MediaPlayer::originsInMediaCache): Added.
(WebCore::MediaPlayer::clearMediaCache): Added parameter.
(WebCore::MediaPlayer::clearMediaCacheForOrigins): Added.
(WebCore::MediaPlayer::getSitesInMediaCache): Deleted.
(WebCore::MediaPlayer::clearMediaCacheForSite): Deleted.
* platform/graphics/MediaPlayer.h:
(WebCore::MediaPlayerClient::mediaPlayerMediaCacheDirectory): Added.
* platform/graphics/MediaPlayerPrivate.h:
(WebCore::MediaPlayerPrivateInterface::originsInMediaCache): Added.
(WebCore::MediaPlayerPrivateInterface::clearMediaCache): Added parameter.
(WebCore::MediaPlayerPrivateInterface::clearMediaCacheForOrigins): Added.
(WebCore::MediaPlayerPrivateInterface::getSitesInMediaCache): Deleted.
(WebCore::MediaPlayerPrivateInterface::clearMediaCacheForSite): Deleted.
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::registerMediaEngine): Added cache methods.
(WebCore::assetCacheForPath): Added.
(WebCore::MediaPlayerPrivateAVFoundationObjC::originsInMediaCache): Added.
(WebCore::toSystemClockTime): Added.
(WebCore::MediaPlayerPrivateAVFoundationObjC::clearMediaCache): Added parameter.
(WebCore::MediaPlayerPrivateAVFoundationObjC::clearMediaCacheForOrigins): Added.
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Added.
* platform/graphics/mac/MediaPlayerPrivateQTKit.h:
* platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
(WebCore::MediaPlayerPrivateQTKit::registerMediaEngine): Added cache methods.
(WebCore::MediaPlayerPrivateQTKit::originsInMediaCache): Added.
(WebCore::MediaPlayerPrivateQTKit::clearMediaCache): Added parameter.
(WebCore::MediaPlayerPrivateQTKit::clearMediaCacheForOrigins): Added.
(WebCore::MediaPlayerPrivateQTKit::getSitesInMediaCache): Deleted.
(WebCore::MediaPlayerPrivateQTKit::clearMediaCacheForSite): Deleted.
* platform/spi/mac/AVFoundationSPI.h:

Source/WebKit2:

Include the HTMLMediaElement media cache when doing disk cache operations.
Add a sandbox extension for media cache directory. This allows the UI process and the web process
to access the same cache.

* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode): Add media cache directory.
(WebKit::WebProcessCreationParameters::decode): Add media cache directory.
* Shared/WebProcessCreationParameters.h:
* UIProcess/API/APIProcessPoolConfiguration.cpp:
(API::ProcessPoolConfiguration::createWithLegacyOptions):
(API::ProcessPoolConfiguration::ProcessPoolConfiguration): Add media cache directory.
(API::ProcessPoolConfiguration::copy): Add media cache directory.
* UIProcess/API/APIProcessPoolConfiguration.h:
* UIProcess/API/APIWebsiteDataStore.cpp:
(API::WebsiteDataStore::defaultMediaCacheDirectory): Default implementation.
* UIProcess/API/APIWebsiteDataStore.h:
* UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm:
(API::WebsiteDataStore::defaultMediaCacheDirectory): Media cache is in temporary directory.
(API::WebsiteDataStore::tempDirectoryFileSystemRepresentation): For resources in temporary directory.
(API::WebsiteDataStore::defaultDataStoreConfiguration): Init media cache directory.
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory):
* UIProcess/WebProcessPool.cpp:
(WebKit::legacyWebsiteDataStoreConfiguration): Add mediaCacheDirectory.
(WebKit::WebProcessPool::createNewWebProcess): Add mediaCacheDirectory.
* UIProcess/WebProcessPool.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::WebsiteDataStore):
(WebKit::WebsiteDataStore::fetchData): Implement for mediaCacheDirectory.
(WebKit::WebsiteDataStore::removeData): Implement for mediaCacheDirectory.
* UIProcess/WebsiteData/WebsiteDataStore.h:
* UIProcess/efl/WebProcessPoolEfl.cpp:
(WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory): Added.
* UIProcess/gtk/WebProcessPoolGtk.cpp:
(WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory): Added.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeWebProcess): Initialize media cache directory.
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::platformInitializeWebProcess): Consume sandbox extension.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (199314 => 199315)


--- trunk/Source/WebCore/ChangeLog	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/ChangeLog	2016-04-11 22:43:42 UTC (rev 199315)
@@ -1,3 +1,65 @@
+2016-04-11  Jeremy Jones  <[email protected]>
+
+        When clearing cache, also clear AVFoundation cache.
+        https://bugs.webkit.org/show_bug.cgi?id=155783
+        rdar://problem/25252541
+
+        Reviewed by Darin Adler.
+
+        Use AVAssetCache at a specified location on disk for all AVURLAssets. This AVAssetCache
+        can then be used to manage the cache storage used by AVFoundation. It is used to query the
+        contents of the cache in originsInMediaCache() and to clear the cache completely or partially in
+        clearMediaCache() and clearMediaCacheForOrigins().
+
+        Use SecurityOrigin instead of the less formal site String to represent origins in the cache.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::sharedMediaCacheDirectory): Added.
+        (WebCore::HTMLMediaElement::setMediaCacheDirectory): Added.
+        (WebCore::HTMLMediaElement::mediaCacheDirectory): Added.
+        (WebCore::HTMLMediaElement::originsInMediaCache): Added.
+        (WebCore::HTMLMediaElement::clearMediaCache): Added parameter.
+        (WebCore::HTMLMediaElement::clearMediaCacheForOrigins): Added.
+        (WebCore::HTMLMediaElement::mediaPlayerMediaCacheDirectory): Added.
+        (WebCore::HTMLMediaElement::getSitesInMediaCache): Deleted.
+        (WebCore::HTMLMediaElement::clearMediaCacheForSite): Deleted.
+        * html/HTMLMediaElement.h:
+        (WebCore::HTMLMediaElement::clearMediaCache): Added parameter.
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::addMediaEngine): Add new cache methods.
+        (WebCore::addToHash): Added.
+        (WebCore::MediaPlayer::originsInMediaCache): Added.
+        (WebCore::MediaPlayer::clearMediaCache): Added parameter.
+        (WebCore::MediaPlayer::clearMediaCacheForOrigins): Added.
+        (WebCore::MediaPlayer::getSitesInMediaCache): Deleted.
+        (WebCore::MediaPlayer::clearMediaCacheForSite): Deleted.
+        * platform/graphics/MediaPlayer.h:
+        (WebCore::MediaPlayerClient::mediaPlayerMediaCacheDirectory): Added.
+        * platform/graphics/MediaPlayerPrivate.h:
+        (WebCore::MediaPlayerPrivateInterface::originsInMediaCache): Added.
+        (WebCore::MediaPlayerPrivateInterface::clearMediaCache): Added parameter.
+        (WebCore::MediaPlayerPrivateInterface::clearMediaCacheForOrigins): Added.
+        (WebCore::MediaPlayerPrivateInterface::getSitesInMediaCache): Deleted.
+        (WebCore::MediaPlayerPrivateInterface::clearMediaCacheForSite): Deleted.
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::registerMediaEngine): Added cache methods.
+        (WebCore::assetCacheForPath): Added.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::originsInMediaCache): Added.
+        (WebCore::toSystemClockTime): Added.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::clearMediaCache): Added parameter.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::clearMediaCacheForOrigins): Added.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Added.
+        * platform/graphics/mac/MediaPlayerPrivateQTKit.h:
+        * platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
+        (WebCore::MediaPlayerPrivateQTKit::registerMediaEngine): Added cache methods.
+        (WebCore::MediaPlayerPrivateQTKit::originsInMediaCache): Added.
+        (WebCore::MediaPlayerPrivateQTKit::clearMediaCache): Added parameter.
+        (WebCore::MediaPlayerPrivateQTKit::clearMediaCacheForOrigins): Added.
+        (WebCore::MediaPlayerPrivateQTKit::getSitesInMediaCache): Deleted.
+        (WebCore::MediaPlayerPrivateQTKit::clearMediaCacheForSite): Deleted.
+        * platform/spi/mac/AVFoundationSPI.h:
+
 2016-04-11  Antoine Quint  <[email protected]>
 
         [WebGL2] Use Open GL ES 3.0 to back WebGL2 contexts

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (199314 => 199315)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -5593,23 +5593,38 @@
     else
         document().decrementLoadEventDelayCount();
 }
-    
 
-void HTMLMediaElement::getSitesInMediaCache(Vector<String>& sites)
+static String& sharedMediaCacheDirectory()
 {
-    MediaPlayer::getSitesInMediaCache(sites);
+    static NeverDestroyed<String> sharedMediaCacheDirectory;
+    return sharedMediaCacheDirectory;
 }
 
-void HTMLMediaElement::clearMediaCache()
+void HTMLMediaElement::setMediaCacheDirectory(const String& path)
 {
-    MediaPlayer::clearMediaCache();
+    sharedMediaCacheDirectory() = path;
 }
 
-void HTMLMediaElement::clearMediaCacheForSite(const String& site)
+const String& HTMLMediaElement::mediaCacheDirectory()
 {
-    MediaPlayer::clearMediaCacheForSite(site);
+    return sharedMediaCacheDirectory();
 }
 
+HashSet<RefPtr<SecurityOrigin>> HTMLMediaElement::originsInMediaCache(const String& path)
+{
+    return MediaPlayer::originsInMediaCache(path);
+}
+
+void HTMLMediaElement::clearMediaCache(const String& path, std::chrono::system_clock::time_point modifiedSince)
+{
+    MediaPlayer::clearMediaCache(path, modifiedSince);
+}
+
+void HTMLMediaElement::clearMediaCacheForOrigins(const String& path, const HashSet<RefPtr<SecurityOrigin>>& origins)
+{
+    MediaPlayer::clearMediaCacheForOrigins(path, origins);
+}
+
 void HTMLMediaElement::resetMediaEngines()
 {
     MediaPlayer::resetMediaEngines();
@@ -6192,6 +6207,11 @@
     return false;
 }
 
+const String& HTMLMediaElement::mediaPlayerMediaCacheDirectory() const
+{
+    return mediaCacheDirectory();
+}
+
 bool HTMLMediaElement::mediaPlayerShouldWaitForResponseToAuthenticationChallenge(const AuthenticationChallenge& challenge)
 {
     Frame* frame = document().frame();

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (199314 => 199315)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -380,9 +380,11 @@
     void privateBrowsingStateDidChange() override;
 
     // Media cache management.
-    WEBCORE_EXPORT static void getSitesInMediaCache(Vector<String>&);
-    WEBCORE_EXPORT static void clearMediaCache();
-    WEBCORE_EXPORT static void clearMediaCacheForSite(const String&);
+    WEBCORE_EXPORT static void setMediaCacheDirectory(const String&);
+    WEBCORE_EXPORT static const String& mediaCacheDirectory();
+    WEBCORE_EXPORT static HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String&);
+    WEBCORE_EXPORT static void clearMediaCache(const String&, std::chrono::system_clock::time_point modifiedSince = { });
+    WEBCORE_EXPORT static void clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>&);
     static void resetMediaEngines();
 
     bool isPlaying() const { return m_playing; }
@@ -597,6 +599,7 @@
     CachedResourceLoader* mediaPlayerCachedResourceLoader() override;
     RefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader() override;
     bool mediaPlayerShouldUsePersistentCache() const override;
+    const String& mediaPlayerMediaCacheDirectory() const override;
 
 #if PLATFORM(WIN) && USE(AVFOUNDATION)
     GraphicsDeviceAdapter* mediaPlayerGraphicsDeviceAdapter(const MediaPlayer*) const override;

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -170,13 +170,13 @@
     CreateMediaEnginePlayer constructor;
     MediaEngineSupportedTypes getSupportedTypes;
     MediaEngineSupportsType supportsTypeAndCodecs;
-    MediaEngineGetSitesInMediaCache getSitesInMediaCache;
+    MediaEngineOriginsInMediaCache originsInMediaCache;
     MediaEngineClearMediaCache clearMediaCache;
-    MediaEngineClearMediaCacheForSite clearMediaCacheForSite;
+    MediaEngineClearMediaCacheForOrigins clearMediaCacheForOrigins;
     MediaEngineSupportsKeySystem supportsKeySystem;
 };
 
-static void addMediaEngine(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType, MediaEngineGetSitesInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForSite, MediaEngineSupportsKeySystem);
+static void addMediaEngine(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType, MediaEngineOriginsInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForOrigins, MediaEngineSupportsKeySystem);
 
 static bool haveMediaEnginesVector;
 
@@ -234,13 +234,13 @@
 }
 
 static void addMediaEngine(CreateMediaEnginePlayer constructor, MediaEngineSupportedTypes getSupportedTypes, MediaEngineSupportsType supportsType,
-    MediaEngineGetSitesInMediaCache getSitesInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForSite clearMediaCacheForSite, MediaEngineSupportsKeySystem supportsKeySystem)
+    MediaEngineOriginsInMediaCache originsInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForOrigins clearMediaCacheForOrigins, MediaEngineSupportsKeySystem supportsKeySystem)
 {
     ASSERT(constructor);
     ASSERT(getSupportedTypes);
     ASSERT(supportsType);
 
-    mutableInstalledMediaEnginesVector().append(MediaPlayerFactory { constructor, getSupportedTypes, supportsType, getSitesInMediaCache, clearMediaCache, clearMediaCacheForSite, supportsKeySystem });
+    mutableInstalledMediaEnginesVector().append(MediaPlayerFactory { constructor, getSupportedTypes, supportsType, originsInMediaCache, clearMediaCache, clearMediaCacheForOrigins, supportsKeySystem });
 }
 
 static const AtomicString& applicationOctetStream()
@@ -1042,30 +1042,39 @@
     loadWithNextMediaEngine(m_currentMediaEngine);
 }
 
-void MediaPlayer::getSitesInMediaCache(Vector<String>& sites)
+template<typename T>
+static void addToHash(HashSet<T>& toHash, HashSet<T>&& fromHash)
 {
+    if (toHash.isEmpty())
+        toHash = WTFMove(fromHash);
+    else
+        toHash.add(fromHash.begin(), fromHash.end());
+}
+    
+HashSet<RefPtr<SecurityOrigin>> MediaPlayer::originsInMediaCache(const String& path)
+{
+    HashSet<RefPtr<SecurityOrigin>> origins;
     for (auto& engine : installedMediaEngines()) {
-        if (!engine.getSitesInMediaCache)
+        if (!engine.originsInMediaCache)
             continue;
-        Vector<String> engineSites;
-        engine.getSitesInMediaCache(engineSites);
-        sites.appendVector(engineSites);
+        addToHash(origins, engine.originsInMediaCache(path));
     }
+    return origins;
 }
 
-void MediaPlayer::clearMediaCache()
+void MediaPlayer::clearMediaCache(const String& path, std::chrono::system_clock::time_point modifiedSince)
 {
     for (auto& engine : installedMediaEngines()) {
         if (engine.clearMediaCache)
-            engine.clearMediaCache();
+            engine.clearMediaCache(path, modifiedSince);
     }
 }
 
-void MediaPlayer::clearMediaCacheForSite(const String& site)
+void MediaPlayer::clearMediaCacheForOrigins(const String& path, const HashSet<RefPtr<SecurityOrigin>>& origins)
 {
     for (auto& engine : installedMediaEngines()) {
-        if (engine.clearMediaCacheForSite)
-            engine.clearMediaCacheForSite(site);
+        if (engine.clearMediaCacheForOrigins)
+            engine.clearMediaCacheForOrigins(path, origins);
     }
 }
 

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -40,6 +40,7 @@
 #include "PlatformLayer.h"
 #include "PlatformMediaResourceLoader.h"
 #include "PlatformMediaSession.h"
+#include "SecurityOriginHash.h"
 #include "Timer.h"
 #include "VideoTrackPrivate.h"
 #include <runtime/Uint8Array.h>
@@ -236,6 +237,7 @@
     virtual RefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader() { return nullptr; }
     virtual bool doesHaveAttribute(const AtomicString&, AtomicString* = 0) const { return false; }
     virtual bool mediaPlayerShouldUsePersistentCache() const { return true; }
+    virtual const String& mediaPlayerMediaCacheDirectory() const { return emptyString(); }
 
 #if ENABLE(VIDEO_TRACK)
     virtual void mediaPlayerDidAddAudioTrack(PassRefPtr<AudioTrackPrivate>) { }
@@ -292,9 +294,9 @@
     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&, const MediaPlayerSupportsTypeClient*);
     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
     static bool isAvailable();
-    static void getSitesInMediaCache(Vector<String>&);
-    static void clearMediaCache();
-    static void clearMediaCacheForSite(const String&);
+    static HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String& path);
+    static void clearMediaCache(const String& path, std::chrono::system_clock::time_point modifiedSince);
+    static void clearMediaCacheForOrigins(const String& path, const HashSet<RefPtr<SecurityOrigin>>&);
     static bool supportsKeySystem(const String& keySystem, const String& mimeType);
 
     bool supportsFullscreen() const;
@@ -630,13 +632,13 @@
 typedef std::function<std::unique_ptr<MediaPlayerPrivateInterface> (MediaPlayer*)> CreateMediaEnginePlayer;
 typedef void (*MediaEngineSupportedTypes)(HashSet<String, ASCIICaseInsensitiveHash>& types);
 typedef MediaPlayer::SupportsType (*MediaEngineSupportsType)(const MediaEngineSupportParameters& parameters);
-typedef void (*MediaEngineGetSitesInMediaCache)(Vector<String>&);
-typedef void (*MediaEngineClearMediaCache)();
-typedef void (*MediaEngineClearMediaCacheForSite)(const String&);
+typedef HashSet<RefPtr<SecurityOrigin>> (*MediaEngineOriginsInMediaCache)(const String& path);
+typedef void (*MediaEngineClearMediaCache)(const String& path, std::chrono::system_clock::time_point modifiedSince);
+typedef void (*MediaEngineClearMediaCacheForOrigins)(const String& path, const HashSet<RefPtr<SecurityOrigin>>&);
 typedef bool (*MediaEngineSupportsKeySystem)(const String& keySystem, const String& mimeType);
 
 typedef void (*MediaEngineRegistrar)(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType,
-    MediaEngineGetSitesInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForSite, MediaEngineSupportsKeySystem);
+    MediaEngineOriginsInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForOrigins, MediaEngineSupportsKeySystem);
 typedef void (*MediaEngineRegister)(MediaEngineRegistrar);
 
 class MediaPlayerFactorySupport {

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -214,9 +214,9 @@
     virtual unsigned audioDecodedByteCount() const { return 0; }
     virtual unsigned videoDecodedByteCount() const { return 0; }
 
-    void getSitesInMediaCache(Vector<String>&) { }
-    void clearMediaCache() { }
-    void clearMediaCacheForSite(const String&) { }
+    HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String&) { return { }; }
+    void clearMediaCache(const String&, std::chrono::system_clock::time_point) { }
+    void clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>&) { }
 
     virtual void setPrivateBrowsingMode(bool) { }
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -87,6 +87,10 @@
 
     static void registerMediaEngine(MediaEngineRegistrar);
 
+    static HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String&);
+    static void clearMediaCache(const String&, std::chrono::system_clock::time_point modifiedSince);
+    static void clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>&);
+
     void setAsset(RetainPtr<id>);
     void tracksChanged() override;
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2016-04-11 22:43:42 UTC (rev 199315)
@@ -158,6 +158,7 @@
 SOFT_LINK_CLASS(AVFoundation, AVURLAsset)
 SOFT_LINK_CLASS(AVFoundation, AVAssetImageGenerator)
 SOFT_LINK_CLASS(AVFoundation, AVMetadataItem)
+SOFT_LINK_CLASS(AVFoundation, AVAssetCache)
 
 SOFT_LINK_CLASS(CoreImage, CIContext)
 SOFT_LINK_CLASS(CoreImage, CIImage)
@@ -227,6 +228,7 @@
 #endif
 
 #if ENABLE(AVF_CAPTIONS)
+SOFT_LINK_POINTER(AVFoundation, AVURLAssetCacheKey, NSString*)
 SOFT_LINK_POINTER(AVFoundation, AVURLAssetHTTPCookiesKey, NSString*)
 SOFT_LINK_POINTER(AVFoundation, AVURLAssetOutOfBandAlternateTracksKey, NSString*)
 SOFT_LINK_POINTER(AVFoundation, AVURLAssetUsesNoPersistentCacheKey, NSString*)
@@ -242,6 +244,7 @@
 
 #define AVURLAssetHTTPCookiesKey getAVURLAssetHTTPCookiesKey()
 #define AVURLAssetOutOfBandAlternateTracksKey getAVURLAssetOutOfBandAlternateTracksKey()
+#define AVURLAssetCacheKey getAVURLAssetCacheKey()
 #define AVURLAssetUsesNoPersistentCacheKey getAVURLAssetUsesNoPersistentCacheKey()
 #define AVOutOfBandAlternateTrackDisplayNameKey getAVOutOfBandAlternateTrackDisplayNameKey()
 #define AVOutOfBandAlternateTrackExtendedLanguageTagKey getAVOutOfBandAlternateTrackExtendedLanguageTagKey()
@@ -422,9 +425,97 @@
 {
     if (isAvailable())
         registrar([](MediaPlayer* player) { return std::make_unique<MediaPlayerPrivateAVFoundationObjC>(player); },
-            getSupportedTypes, supportsType, 0, 0, 0, supportsKeySystem);
+            getSupportedTypes, supportsType, originsInMediaCache, clearMediaCache, clearMediaCacheForOrigins, supportsKeySystem);
 }
 
+static AVAssetCache *assetCacheForPath(const String& path)
+{
+    NSURL *assetCacheURL;
+    
+    if (path.isEmpty())
+        assetCacheURL = [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:@"MediaCache" isDirectory:YES];
+    else
+        assetCacheURL = [NSURL fileURLWithPath:path isDirectory:YES];
+
+    return [getAVAssetCacheClass() assetCacheWithURL:assetCacheURL];
+}
+
+HashSet<RefPtr<SecurityOrigin>> MediaPlayerPrivateAVFoundationObjC::originsInMediaCache(const String& path)
+{
+    HashSet<RefPtr<SecurityOrigin>> origins;
+    for (NSString *key in [assetCacheForPath(path) allKeys]) {
+        URL keyAsURL = URL(URL(), key);
+        if (keyAsURL.isValid())
+            origins.add(SecurityOrigin::create(keyAsURL));
+    }
+    return origins;
+}
+
+static std::chrono::system_clock::time_point toSystemClockTime(NSDate *date)
+{
+    ASSERT(date);
+    using namespace std::chrono;
+
+    return system_clock::time_point(duration_cast<system_clock::duration>(duration<double>(date.timeIntervalSince1970)));
+}
+
+void MediaPlayerPrivateAVFoundationObjC::clearMediaCache(const String& path, std::chrono::system_clock::time_point modifiedSince)
+{
+    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::clearMediaCache()");
+    
+    AVAssetCache* assetCache = assetCacheForPath(path);
+    
+    for (NSString *key in [assetCache allKeys]) {
+        if (toSystemClockTime([assetCache lastModifiedDateOfEntryForKey:key]) > modifiedSince)
+            [assetCache removeEntryForKey:key];
+    }
+
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    NSURL *baseURL = [assetCache URL];
+
+    if (modifiedSince <= std::chrono::system_clock::time_point { }) {
+        [fileManager removeItemAtURL:baseURL error:nil];
+        return;
+    }
+    
+    NSArray *propertyKeys = @[NSURLNameKey, NSURLContentModificationDateKey, NSURLIsRegularFileKey];
+    NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:baseURL includingPropertiesForKeys:
+        propertyKeys options:NSDirectoryEnumerationSkipsSubdirectoryDescendants
+        errorHandler:nil];
+    
+    RetainPtr<NSMutableArray<NSURL *>> urlsToDelete = adoptNS([[NSMutableArray alloc] init]);
+    for (NSURL *fileURL : enumerator) {
+        NSDictionary<NSString *, id> *fileAttributes = [fileURL resourceValuesForKeys:propertyKeys error:nil];
+    
+        if (![fileAttributes[NSURLNameKey] hasPrefix:@"CachedMedia-"])
+            continue;
+        
+        if (![fileAttributes[NSURLIsRegularFileKey] boolValue])
+            continue;
+        
+        if (toSystemClockTime(fileAttributes[NSURLContentModificationDateKey]) <= modifiedSince)
+            continue;
+        
+        [urlsToDelete addObject:fileURL];
+    }
+    
+    for (NSURL *fileURL in urlsToDelete.get())
+        [fileManager removeItemAtURL:fileURL error:nil];
+}
+
+void MediaPlayerPrivateAVFoundationObjC::clearMediaCacheForOrigins(const String& path, const HashSet<RefPtr<SecurityOrigin>>& origins)
+{
+    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::clearMediaCacheForOrigins()");
+    AVAssetCache* assetCache = assetCacheForPath(path);
+    for (NSString *key in [assetCache allKeys]) {
+        URL keyAsURL = URL(URL(), key);
+        if (keyAsURL.isValid()) {
+            if (origins.contains(SecurityOrigin::create(keyAsURL)))
+                [assetCache removeEntryForKey:key];
+        }
+    }
+}
+
 MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC(MediaPlayer* player)
     : MediaPlayerPrivateAVFoundation(player)
     , m_weakPtrFactory(this)
@@ -874,7 +965,11 @@
     }
 #endif
 
-    [options setObject:[NSNumber numberWithBool:!player()->client().mediaPlayerShouldUsePersistentCache()] forKey:AVURLAssetUsesNoPersistentCacheKey];
+    bool usePersistentCache = player()->client().mediaPlayerShouldUsePersistentCache();
+    [options setObject:@(!usePersistentCache) forKey:AVURLAssetUsesNoPersistentCacheKey];
+    
+    if (usePersistentCache)
+        [options setObject:assetCacheForPath(player()->client().mediaPlayerMediaCacheDirectory()) forKey:AVURLAssetCacheKey];
 
     NSURL *cocoaURL = canonicalURL(url);
     m_avAsset = adoptNS([allocAVURLAssetInstance() initWithURL:cocoaURL options:options.get()]);

Modified: trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -68,9 +68,9 @@
     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>& types);
     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
 
-    static void getSitesInMediaCache(Vector<String>&);
-    static void clearMediaCache();
-    static void clearMediaCacheForSite(const String&);
+    static HashSet<RefPtr<SecurityOrigin>> originsInMediaCache(const String&);
+    static void clearMediaCache(const String&, std::chrono::system_clock::time_point modifiedSince);
+    static void clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>&);
     static bool isAvailable();
 
     PlatformMedia platformMedia() const override;

Modified: trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm (199314 => 199315)


--- trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm	2016-04-11 22:43:42 UTC (rev 199315)
@@ -175,7 +175,7 @@
 {
     if (isAvailable())
         registrar([](MediaPlayer* player) { return std::make_unique<MediaPlayerPrivateQTKit>(player); }, getSupportedTypes,
-            supportsType, getSitesInMediaCache, clearMediaCache, clearMediaCacheForSite, 0);
+            supportsType, originsInMediaCache, clearMediaCache, clearMediaCacheForOrigins, 0);
 }
 
 MediaPlayerPrivateQTKit::MediaPlayerPrivateQTKit(MediaPlayer* player)
@@ -1339,23 +1339,30 @@
     return QTKitLibrary();
 }
 
-void MediaPlayerPrivateQTKit::getSitesInMediaCache(Vector<String>& sites) 
+HashSet<RefPtr<SecurityOrigin>> MediaPlayerPrivateQTKit::originsInMediaCache(const String&)
 {
+    HashSet<RefPtr<SecurityOrigin>> origins;
     NSArray *mediaSites = wkQTGetSitesInMediaDownloadCache();
-    for (NSString *site in mediaSites)
-        sites.append(site);
+    
+    for (NSString *site in mediaSites) {
+        URL siteAsURL = URL(URL(), site);
+        if (siteAsURL.isValid())
+            origins.add(SecurityOrigin::create(siteAsURL));
+    }
+    return origins;
 }
 
-void MediaPlayerPrivateQTKit::clearMediaCache()
+void MediaPlayerPrivateQTKit::clearMediaCache(const String&, std::chrono::system_clock::time_point)
 {
     LOG(Media, "MediaPlayerPrivateQTKit::clearMediaCache()");
     wkQTClearMediaDownloadCache();
 }
 
-void MediaPlayerPrivateQTKit::clearMediaCacheForSite(const String& site)
+void MediaPlayerPrivateQTKit::clearMediaCacheForOrigins(const String&, const HashSet<RefPtr<SecurityOrigin>>& origins)
 {
-    LOG(Media, "MediaPlayerPrivateQTKit::clearMediaCacheForSite()");
-    wkQTClearMediaDownloadCacheForSite(site);
+    LOG(Media, "MediaPlayerPrivateQTKit::clearMediaCacheForOrigins()");
+    for (auto& origin : origins)
+        wkQTClearMediaDownloadCacheForSite(origin->toRawString());
 }
 
 void MediaPlayerPrivateQTKit::disableUnsupportedTracks()

Modified: trunk/Source/WebCore/platform/spi/mac/AVFoundationSPI.h (199314 => 199315)


--- trunk/Source/WebCore/platform/spi/mac/AVFoundationSPI.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebCore/platform/spi/mac/AVFoundationSPI.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -55,6 +55,21 @@
 
 #endif // ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
 
+#if USE(APPLE_INTERNAL_SDK)
+#import <AVFoundation/AVAssetCache_Private.h>
+#else
+NS_ASSUME_NONNULL_BEGIN
+@interface AVAssetCache : NSObject
++ (AVAssetCache *)assetCacheWithURL:(NSURL *)URL;
+- (id)initWithURL:(NSURL *)URL;
+- (NSArray *)allKeys;
+- (NSDate *)lastModifiedDateOfEntryForKey:(NSString *)key;
+- (void)removeEntryForKey:(NSString *)key;
+@property (nonatomic, readonly, copy) NSURL *URL;
+@end
+NS_ASSUME_NONNULL_END
+#endif
+
 #if PLATFORM(IOS)
 
 #if HAVE(AVKIT) && USE(APPLE_INTERNAL_SDK)

Modified: trunk/Source/WebKit2/ChangeLog (199314 => 199315)


--- trunk/Source/WebKit2/ChangeLog	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/ChangeLog	2016-04-11 22:43:42 UTC (rev 199315)
@@ -1,3 +1,51 @@
+2016-04-11  Jeremy Jones  <[email protected]>
+
+        When clearing cache, also clear AVFoundation cache.
+        https://bugs.webkit.org/show_bug.cgi?id=155783
+        rdar://problem/25252541
+
+        Reviewed by Darin Adler.
+
+        Include the HTMLMediaElement media cache when doing disk cache operations.
+        Add a sandbox extension for media cache directory. This allows the UI process and the web process
+        to access the same cache.
+
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode): Add media cache directory.
+        (WebKit::WebProcessCreationParameters::decode): Add media cache directory.
+        * Shared/WebProcessCreationParameters.h:
+        * UIProcess/API/APIProcessPoolConfiguration.cpp:
+        (API::ProcessPoolConfiguration::createWithLegacyOptions):
+        (API::ProcessPoolConfiguration::ProcessPoolConfiguration): Add media cache directory.
+        (API::ProcessPoolConfiguration::copy): Add media cache directory.
+        * UIProcess/API/APIProcessPoolConfiguration.h:
+        * UIProcess/API/APIWebsiteDataStore.cpp:
+        (API::WebsiteDataStore::defaultMediaCacheDirectory): Default implementation.
+        * UIProcess/API/APIWebsiteDataStore.h:
+        * UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm:
+        (API::WebsiteDataStore::defaultMediaCacheDirectory): Media cache is in temporary directory.
+        (API::WebsiteDataStore::tempDirectoryFileSystemRepresentation): For resources in temporary directory.
+        (API::WebsiteDataStore::defaultDataStoreConfiguration): Init media cache directory.
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory):
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::legacyWebsiteDataStoreConfiguration): Add mediaCacheDirectory.
+        (WebKit::WebProcessPool::createNewWebProcess): Add mediaCacheDirectory.
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::WebsiteDataStore):
+        (WebKit::WebsiteDataStore::fetchData): Implement for mediaCacheDirectory.
+        (WebKit::WebsiteDataStore::removeData): Implement for mediaCacheDirectory.
+        * UIProcess/WebsiteData/WebsiteDataStore.h:
+        * UIProcess/efl/WebProcessPoolEfl.cpp:
+        (WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory): Added.
+        * UIProcess/gtk/WebProcessPoolGtk.cpp:
+        (WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory): Added.
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::initializeWebProcess): Initialize media cache directory.
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::platformInitializeWebProcess): Consume sandbox extension.
+
 2016-04-11  Said Abou-Hallawa  <sabouhallawa@apple,com>
 
         Merge CG ImageSource and non CG ImageSource implementation in one file

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (199314 => 199315)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -65,6 +65,8 @@
     encoder << applicationCacheDirectoryExtensionHandle;
     encoder << webSQLDatabaseDirectory;
     encoder << webSQLDatabaseDirectoryExtensionHandle;
+    encoder << mediaCacheDirectory;
+    encoder << mediaCacheDirectoryExtensionHandle;
 #if ENABLE(SECCOMP_FILTERS)
     encoder << cookieStorageDirectory;
 #endif
@@ -159,6 +161,10 @@
         return false;
     if (!decoder.decode(parameters.webSQLDatabaseDirectoryExtensionHandle))
         return false;
+    if (!decoder.decode(parameters.mediaCacheDirectory))
+        return false;
+    if (!decoder.decode(parameters.mediaCacheDirectoryExtensionHandle))
+        return false;
 #if ENABLE(SECCOMP_FILTERS)
     if (!decoder.decode(parameters.cookieStorageDirectory))
         return false;

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (199314 => 199315)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -72,6 +72,8 @@
     SandboxExtension::Handle applicationCacheDirectoryExtensionHandle;
     String webSQLDatabaseDirectory;
     SandboxExtension::Handle webSQLDatabaseDirectoryExtensionHandle;
+    String mediaCacheDirectory;
+    SandboxExtension::Handle mediaCacheDirectoryExtensionHandle;
 #if ENABLE(SECCOMP_FILTERS)
     String cookieStorageDirectory;
 #endif

Modified: trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -46,6 +46,7 @@
 
     configuration->m_applicationCacheDirectory = WebKit::WebProcessPool::legacyPlatformDefaultApplicationCacheDirectory();
     configuration->m_diskCacheDirectory = WebKit::WebProcessPool::legacyPlatformDefaultNetworkCacheDirectory();
+    configuration->m_mediaCacheDirectory = WebKit::WebProcessPool::legacyPlatformDefaultMediaCacheDirectory();
     configuration->m_indexedDBDatabaseDirectory = WebKit::WebProcessPool::legacyPlatformDefaultIndexedDBDatabaseDirectory();
     configuration->m_localStorageDirectory = WebKit::WebProcessPool::legacyPlatformDefaultLocalStorageDirectory();
     configuration->m_mediaKeysStorageDirectory = WebKit::WebProcessPool::legacyPlatformDefaultMediaKeysStorageDirectory();
@@ -57,6 +58,7 @@
 ProcessPoolConfiguration::ProcessPoolConfiguration()
     : m_applicationCacheDirectory(WebsiteDataStore::defaultApplicationCacheDirectory())
     , m_diskCacheDirectory(WebsiteDataStore::defaultNetworkCacheDirectory())
+    , m_mediaCacheDirectory(WebsiteDataStore::defaultMediaCacheDirectory())
     , m_indexedDBDatabaseDirectory(WebsiteDataStore::defaultIndexedDBDatabaseDirectory())
     , m_localStorageDirectory(WebsiteDataStore::defaultLocalStorageDirectory())
     , m_webSQLDatabaseDirectory(WebsiteDataStore::defaultWebSQLDatabaseDirectory())
@@ -79,6 +81,7 @@
     copy->m_diskCacheSizeOverride = this->m_diskCacheSizeOverride;
     copy->m_applicationCacheDirectory = this->m_applicationCacheDirectory;
     copy->m_diskCacheDirectory = this->m_diskCacheDirectory;
+    copy->m_mediaCacheDirectory = this->m_mediaCacheDirectory;
     copy->m_indexedDBDatabaseDirectory = this->m_indexedDBDatabaseDirectory;
     copy->m_injectedBundlePath = this->m_injectedBundlePath;
     copy->m_localStorageDirectory = this->m_localStorageDirectory;

Modified: trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -65,6 +65,9 @@
     const WTF::String& diskCacheDirectory() const { return m_diskCacheDirectory; }
     void setDiskCacheDirectory(const WTF::String& diskCacheDirectory) { m_diskCacheDirectory = diskCacheDirectory; }
 
+    const WTF::String& mediaCacheDirectory() const { return m_mediaCacheDirectory; }
+    void setMediaCacheDirectory(const WTF::String& mediaCacheDirectory) { m_mediaCacheDirectory = mediaCacheDirectory; }
+    
     const WTF::String& indexedDBDatabaseDirectory() const { return m_indexedDBDatabaseDirectory; }
     void setIndexedDBDatabaseDirectory(const WTF::String& indexedDBDatabaseDirectory) { m_indexedDBDatabaseDirectory = indexedDBDatabaseDirectory; }
 
@@ -102,6 +105,7 @@
 
     WTF::String m_applicationCacheDirectory;
     WTF::String m_diskCacheDirectory;
+    WTF::String m_mediaCacheDirectory;
     WTF::String m_indexedDBDatabaseDirectory;
     WTF::String m_injectedBundlePath;
     WTF::String m_localStorageDirectory;

Modified: trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -137,5 +137,13 @@
 }
 
 #endif
+    
+#if !PLATFORM(COCOA)
+String WebsiteDataStore::defaultMediaCacheDirectory()
+{
+    // FIXME: Implement. https://bugs.webkit.org/show_bug.cgi?id=156369 and https://bugs.webkit.org/show_bug.cgi?id=156370
+    return String();
+}
+#endif
 
 }

Modified: trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.h (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/API/APIWebsiteDataStore.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -49,6 +49,7 @@
 
     static String defaultApplicationCacheDirectory();
     static String defaultNetworkCacheDirectory();
+    static String defaultMediaCacheDirectory();
 
     static String defaultIndexedDBDatabaseDirectory();
     static String defaultLocalStorageDirectory();
@@ -60,6 +61,7 @@
     WebsiteDataStore(WebKit::WebsiteDataStore::Configuration);
     WebsiteDataStore();
 
+    static String tempDirectoryFileSystemRepresentation(const String& directoryName);
     static String cacheDirectoryFileSystemRepresentation(const String& directoryName);
     static String websiteDataDirectoryFileSystemRepresentation(const String& directoryName);
 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm	2016-04-11 22:43:42 UTC (rev 199315)
@@ -57,6 +57,11 @@
     return cacheDirectoryFileSystemRepresentation("NetworkCache");
 }
 
+String WebsiteDataStore::defaultMediaCacheDirectory()
+{
+    return tempDirectoryFileSystemRepresentation("MediaCache");
+}
+
 String WebsiteDataStore::defaultIndexedDBDatabaseDirectory()
 {
     return websiteDataDirectoryFileSystemRepresentation("IndexedDB");
@@ -82,6 +87,33 @@
     return websiteDataDirectoryFileSystemRepresentation("ResourceLoadStatistics");
 }
 
+String WebsiteDataStore::tempDirectoryFileSystemRepresentation(const String& directoryName)
+{
+    static dispatch_once_t onceToken;
+    static NSURL *tempURL;
+    
+    dispatch_once(&onceToken, ^{
+        NSURL *url = "" fileURLWithPath:NSTemporaryDirectory()];
+        if (!url)
+            RELEASE_ASSERT_NOT_REACHED();
+        
+        if (!WebKit::processHasContainer()) {
+            NSString *bundleIdentifier = [NSBundle mainBundle].bundleIdentifier;
+            if (!bundleIdentifier)
+                bundleIdentifier = [NSProcessInfo processInfo].processName;
+            url = "" URLByAppendingPathComponent:bundleIdentifier isDirectory:YES];
+        }
+        
+        tempURL = [[url URLByAppendingPathComponent:@"WebKit" isDirectory:YES] retain];
+    });
+    
+    NSURL *url = "" URLByAppendingPathComponent:directoryName isDirectory:YES];
+    if (![[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nullptr])
+        LOG_ERROR("Failed to create directory %@", url);
+    
+    return url.absoluteURL.path.fileSystemRepresentation;
+}
+
 String WebsiteDataStore::cacheDirectoryFileSystemRepresentation(const String& directoryName)
 {
     static dispatch_once_t onceToken;
@@ -144,6 +176,7 @@
 
     configuration.applicationCacheDirectory = defaultApplicationCacheDirectory();
     configuration.networkCacheDirectory = defaultNetworkCacheDirectory();
+    configuration.mediaCacheDirectory = defaultMediaCacheDirectory();
 
     configuration.webSQLDatabaseDirectory = defaultWebSQLDatabaseDirectory();
     configuration.localStorageDirectory = defaultLocalStorageDirectory();

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2016-04-11 22:43:42 UTC (rev 199315)
@@ -64,6 +64,7 @@
 NSString *WebKitJSCJITEnabledDefaultsKey = @"WebKitJSCJITEnabledDefaultsKey";
 NSString *WebKitJSCFTLJITEnabledDefaultsKey = @"WebKitJSCFTLJITEnabledDefaultsKey";
 NSString *WebKitMediaKeysStorageDirectoryDefaultsKey = @"WebKitMediaKeysStorageDirectory";
+NSString *WebKitMediaCacheDirectoryDefaultsKey = @"WebKitMediaCacheDirectory";
 
 #if !PLATFORM(IOS)
 static NSString *WebKitApplicationDidChangeAccessibilityEnhancedUserInterfaceNotification = @"NSApplicationDidChangeAccessibilityEnhancedUserInterfaceNotification";
@@ -336,6 +337,25 @@
     return stringByResolvingSymlinksInPath([localStorageDirectory stringByStandardizingPath]);
 }
 
+String WebProcessPool::legacyPlatformDefaultMediaCacheDirectory()
+{
+    registerUserDefaultsIfNeeded();
+    
+    NSString *mediaKeysCacheDirectory = [[NSUserDefaults standardUserDefaults] objectForKey:WebKitMediaCacheDirectoryDefaultsKey];
+    if (!mediaKeysCacheDirectory || ![mediaKeysCacheDirectory isKindOfClass:[NSString class]]) {
+        mediaKeysCacheDirectory = NSTemporaryDirectory();
+        
+        if (!WebKit::processHasContainer()) {
+            NSString *bundleIdentifier = [NSBundle mainBundle].bundleIdentifier;
+            if (!bundleIdentifier)
+                bundleIdentifier = [NSProcessInfo processInfo].processName;
+            mediaKeysCacheDirectory = [mediaKeysCacheDirectory stringByAppendingPathComponent:bundleIdentifier];
+        }
+        mediaKeysCacheDirectory = [mediaKeysCacheDirectory stringByAppendingPathComponent:@"WebKit/MediaCache"];
+    }
+    return stringByResolvingSymlinksInPath([mediaKeysCacheDirectory stringByStandardizingPath]);
+}
+
 String WebProcessPool::legacyPlatformDefaultMediaKeysStorageDirectory()
 {
     registerUserDefaultsIfNeeded();

Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -128,6 +128,7 @@
     configuration.localStorageDirectory = processPoolConfiguration.localStorageDirectory();
     configuration.webSQLDatabaseDirectory = processPoolConfiguration.webSQLDatabaseDirectory();
     configuration.applicationCacheDirectory = processPoolConfiguration.applicationCacheDirectory();
+    configuration.mediaCacheDirectory = processPoolConfiguration.mediaCacheDirectory();
     configuration.mediaKeysStorageDirectory = processPoolConfiguration.mediaKeysStorageDirectory();
     configuration.networkCacheDirectory = processPoolConfiguration.diskCacheDirectory();
 
@@ -544,6 +545,10 @@
     if (!parameters.webSQLDatabaseDirectory.isEmpty())
         SandboxExtension::createHandleForReadWriteDirectory(parameters.webSQLDatabaseDirectory, parameters.webSQLDatabaseDirectoryExtensionHandle);
 
+    parameters.mediaCacheDirectory = m_configuration->mediaCacheDirectory();
+    if (!parameters.mediaCacheDirectory.isEmpty())
+        SandboxExtension::createHandleForReadWriteDirectory(parameters.mediaCacheDirectory, parameters.mediaCacheDirectoryExtensionHandle);
+    
 #if ENABLE(SECCOMP_FILTERS)
     parameters.cookieStorageDirectory = this->cookieStorageDirectory();
 #endif

Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -361,6 +361,7 @@
     static String legacyPlatformDefaultIndexedDBDatabaseDirectory();
     static String legacyPlatformDefaultWebSQLDatabaseDirectory();
     static String legacyPlatformDefaultMediaKeysStorageDirectory();
+    static String legacyPlatformDefaultMediaCacheDirectory();
     static String legacyPlatformDefaultApplicationCacheDirectory();
     static String legacyPlatformDefaultNetworkCacheDirectory();
     static bool isNetworkCacheEnabled();

Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -37,6 +37,7 @@
 #include "WebsiteData.h"
 #include <WebCore/ApplicationCacheStorage.h>
 #include <WebCore/DatabaseTracker.h>
+#include <WebCore/HTMLMediaElement.h>
 #include <WebCore/OriginLock.h>
 #include <WebCore/SecurityOrigin.h>
 #include <wtf/RunLoop.h>
@@ -77,6 +78,7 @@
     , m_sessionID(WebCore::SessionID::defaultSessionID())
     , m_networkCacheDirectory(WTFMove(configuration.networkCacheDirectory))
     , m_applicationCacheDirectory(WTFMove(configuration.applicationCacheDirectory))
+    , m_mediaCacheDirectory(WTFMove(configuration.mediaCacheDirectory))
     , m_webSQLDatabaseDirectory(WTFMove(configuration.webSQLDatabaseDirectory))
     , m_mediaKeysStorageDirectory(WTFMove(configuration.mediaKeysStorageDirectory))
     , m_storageManager(StorageManager::create(WTFMove(configuration.localStorageDirectory)))
@@ -255,6 +257,27 @@
 
     RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator(fetchOptions, WTFMove(completionHandler)));
 
+    if (dataTypes.contains(WebsiteDataType::DiskCache)) {
+        StringCapture mediaCacheDirectory { m_mediaCacheDirectory };
+        
+        callbackAggregator->addPendingCallback();
+        m_queue->dispatch([fetchOptions, mediaCacheDirectory, callbackAggregator] {
+            HashSet<RefPtr<WebCore::SecurityOrigin>> origins = WebCore::HTMLMediaElement::originsInMediaCache(mediaCacheDirectory.string());
+            WebsiteData* websiteData = new WebsiteData;
+            
+            for (auto& origin : origins) {
+                WebsiteData::Entry entry { origin, WebsiteDataType::DiskCache, 0 };
+                websiteData->entries.append(WTFMove(entry));
+            }
+            
+            WTF::RunLoop::main().dispatch([callbackAggregator, origins, websiteData] {
+                callbackAggregator->removePendingCallback(WTFMove(*websiteData));
+                
+                delete websiteData;
+            });
+        });
+    }
+
     auto networkProcessAccessType = computeNetworkProcessAccessTypeForDataFetch(dataTypes, !isPersistent());
     if (networkProcessAccessType != ProcessAccessType::None) {
         for (auto& processPool : processPools()) {
@@ -529,6 +552,19 @@
 
     RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator(WTFMove(completionHandler)));
 
+    if (dataTypes.contains(WebsiteDataType::DiskCache)) {
+        StringCapture mediaCacheDirectory { m_mediaCacheDirectory };
+
+        callbackAggregator->addPendingCallback();
+        m_queue->dispatch([modifiedSince, mediaCacheDirectory, callbackAggregator] {
+            WebCore::HTMLMediaElement::clearMediaCache(mediaCacheDirectory.string(), modifiedSince);
+            
+            WTF::RunLoop::main().dispatch([callbackAggregator] {
+                callbackAggregator->removePendingCallback();
+            });
+        });
+    }
+
     auto networkProcessAccessType = computeNetworkProcessAccessTypeForDataRemoval(dataTypes, !isPersistent());
     if (networkProcessAccessType != ProcessAccessType::None) {
         for (auto& processPool : processPools()) {
@@ -755,7 +791,25 @@
     };
 
     RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator(WTFMove(completionHandler)));
-
+    
+    if (dataTypes.contains(WebsiteDataType::DiskCache)) {
+        StringCapture mediaCacheDirectory { m_mediaCacheDirectory };
+        HashSet<RefPtr<WebCore::SecurityOrigin>> origins;
+        for (const auto& dataRecord : dataRecords) {
+            for (const auto& origin : dataRecord.origins)
+                origins.add(origin);
+        }
+        
+        callbackAggregator->addPendingCallback();
+        m_queue->dispatch([origins, mediaCacheDirectory, callbackAggregator] {
+            WebCore::HTMLMediaElement::clearMediaCacheForOrigins(mediaCacheDirectory.string(), origins);
+            
+            WTF::RunLoop::main().dispatch([callbackAggregator] {
+                callbackAggregator->removePendingCallback();
+            });
+        });
+    }
+    
     auto networkProcessAccessType = computeNetworkProcessAccessTypeForDataRemoval(dataTypes, !isPersistent());
     if (networkProcessAccessType != ProcessAccessType::None) {
         for (auto& processPool : processPools()) {

Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h	2016-04-11 22:43:42 UTC (rev 199315)
@@ -61,6 +61,7 @@
         String networkCacheDirectory;
         String applicationCacheDirectory;
 
+        String mediaCacheDirectory;
         String webSQLDatabaseDirectory;
         String localStorageDirectory;
         String mediaKeysStorageDirectory;
@@ -117,6 +118,7 @@
 
     const String m_networkCacheDirectory;
     const String m_applicationCacheDirectory;
+    const String m_mediaCacheDirectory;
 
     const String m_webSQLDatabaseDirectory;
     const String m_mediaKeysStorageDirectory;

Modified: trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -87,6 +87,11 @@
     return API::WebsiteDataStore::defaultApplicationCacheDirectory();
 }
 
+String WebProcessPool::legacyPlatformDefaultMediaCacheDirectory()
+{
+    return API::WebsiteDataStore::defaultMediaCacheDirectory();
+}
+
 void WebProcessPool::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
 {
     initializeInspectorServer();

Modified: trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp (199314 => 199315)


--- trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -86,6 +86,11 @@
     return API::WebsiteDataStore::defaultApplicationCacheDirectory();
 }
 
+WTF::String WebProcessPool::legacyPlatformDefaultMediaCacheDirectory()
+{
+    return API::WebsiteDataStore::defaultMediaCacheDirectory();
+}
+
 void WebProcessPool::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
 {
     initInspectorServer();

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (199314 => 199315)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2016-04-11 22:43:42 UTC (rev 199315)
@@ -77,6 +77,7 @@
 #include <WebCore/FrameLoader.h>
 #include <WebCore/GCController.h>
 #include <WebCore/GlyphPage.h>
+#include <WebCore/HTMLMediaElement.h>
 #include <WebCore/IconDatabase.h>
 #include <WebCore/JSDOMWindow.h>
 #include <WebCore/Language.h>
@@ -293,6 +294,9 @@
     if (!parameters.applicationCacheDirectory.isEmpty())
         ApplicationCacheStorage::singleton().setCacheDirectory(parameters.applicationCacheDirectory);
 
+    if (!parameters.mediaCacheDirectory.isEmpty())
+        WebCore::HTMLMediaElement::setMediaCacheDirectory(parameters.mediaCacheDirectory);
+
     setCacheModel(static_cast<uint32_t>(parameters.cacheModel));
 
     if (!parameters.languages.isEmpty())

Modified: trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm (199314 => 199315)


--- trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm	2016-04-11 21:42:15 UTC (rev 199314)
+++ trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm	2016-04-11 22:43:42 UTC (rev 199315)
@@ -135,6 +135,7 @@
     SandboxExtension::consumePermanently(parameters.uiProcessBundleResourcePathExtensionHandle);
     SandboxExtension::consumePermanently(parameters.webSQLDatabaseDirectoryExtensionHandle);
     SandboxExtension::consumePermanently(parameters.applicationCacheDirectoryExtensionHandle);
+    SandboxExtension::consumePermanently(parameters.mediaCacheDirectoryExtensionHandle);
     SandboxExtension::consumePermanently(parameters.mediaKeyStorageDirectoryExtensionHandle);
 #if PLATFORM(IOS)
     SandboxExtension::consumePermanently(parameters.cookieStorageDirectoryExtensionHandle);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to