Remove Blob.webkitSlice
[WebKit-https.git] / Source / WebCore / fileapi / File.h
index e852c6a..d466adc 100644 (file)
@@ -27,9 +27,9 @@
 #define File_h
 
 #include "Blob.h"
-#include "PlatformString.h"
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
@@ -38,9 +38,16 @@ class KURL;
 
 class File : public Blob {
 public:
-    static PassRefPtr<File> create(const String& path)
+    // AllContentTypes should only be used when the full path/name are trusted; otherwise, it could
+    // allow arbitrary pages to determine what applications an user has installed.
+    enum ContentTypeLookupPolicy {
+        WellKnownContentTypes,
+        AllContentTypes,
+    };
+
+    static PassRefPtr<File> create(const String& path, ContentTypeLookupPolicy policy = WellKnownContentTypes)
     {
-        return adoptRef(new File(path));
+        return adoptRef(new File(path, policy));
     }
 
     // For deserialization.
@@ -54,21 +61,28 @@ public:
 #endif
 
 #if ENABLE(FILE_SYSTEM)
-    // If filesystem files live in the remote filesystem, the port might pass the valid metadata (non-zero modificationTime and non-negative file size) and cache in the File object.
+    // If filesystem files live in the remote filesystem, the port might pass the valid metadata (whose length field is non-negative) and cache in the File object.
     //
-    // Otherwise calling size(), lastModifiedTime() and webkitSlice() will synchronously query the file metadata.
+    // Otherwise calling size(), lastModifiedTime() and slice() will synchronously query the file metadata.
     static PassRefPtr<File> createForFileSystemFile(const String& name, const FileMetadata& metadata)
     {
         return adoptRef(new File(name, metadata));
     }
+
+    static PassRefPtr<File> createForFileSystemFile(const KURL& url, const FileMetadata& metadata)
+    {
+        return adoptRef(new File(url, metadata));
+    }
+
+    KURL fileSystemURL() const { return m_fileSystemURL; }
 #endif
 
     // Create a file with a name exposed to the author (via File.name and associated DOM properties) that differs from the one provided in the path.
-    static PassRefPtr<File> createWithName(const String& path, const String& name)
+    static PassRefPtr<File> createWithName(const String& path, const String& name, ContentTypeLookupPolicy policy = WellKnownContentTypes)
     {
         if (name.isEmpty())
-            return adoptRef(new File(path));
-        return adoptRef(new File(path, name));
+            return adoptRef(new File(path, policy));
+        return adoptRef(new File(path, name, policy));
     }
 
     virtual unsigned long long size() const;
@@ -76,7 +90,10 @@ public:
 
     const String& path() const { return m_path; }
     const String& name() const { return m_name; }
+
+    // This may return NaN (which is converted to null Date in javascript layer) if getFileModificationTime() platform call has failed or the information is not available.
     double lastModifiedDate() const;
+
 #if ENABLE(DIRECTORY_UPLOAD)
     // Returns the relative path of this file in the context of a directory selection.
     const String& webkitRelativePath() const { return m_relativePath; }
@@ -86,22 +103,28 @@ public:
     void captureSnapshot(long long& snapshotSize, double& snapshotModificationTime) const;
 
 private:
-    File(const String& path);
+    File(const String& path, ContentTypeLookupPolicy);
 
     // For deserialization.
     File(const String& path, const KURL& srcURL, const String& type);
-    File(const String& path, const String& name);
+    File(const String& path, const String& name, ContentTypeLookupPolicy);
 
 # if ENABLE(FILE_SYSTEM)
     File(const String& name, const FileMetadata&);
+    File(const KURL& fileSystemURL, const FileMetadata&);
+
+    // Returns true if this has a valid snapshot metadata (i.e. m_snapshotSize >= 0).
+    bool hasValidSnapshotMetadata() const { return m_snapshotSize >= 0; }
 #endif
 
     String m_path;
     String m_name;
 
 #if ENABLE(FILE_SYSTEM)
-    // If non-zero modificationTime and non-negative file size are given at construction time we use them in size(), lastModifiedTime() and webkitSlice().
-    // By default we initialize m_snapshotSize to -1 and m_snapshotModificationTime to 0 (so that we don't use them unless they are given).
+    KURL m_fileSystemURL;
+
+    // If m_snapshotSize is negative (initialized to -1 by default), the snapshot metadata is invalid and we retrieve the latest metadata synchronously in size(), lastModifiedTime() and slice().
+    // Otherwise, the snapshot metadata are used directly in those methods.
     const long long m_snapshotSize;
     const double m_snapshotModificationTime;
 #endif