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);