Remove Blob.webkitSlice
[WebKit-https.git] / Source / WebCore / fileapi / File.h
index 13a91fe..d466adc 100644 (file)
 #define File_h
 
 #include "Blob.h"
-#include "PlatformString.h"
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
+struct FileMetadata;
 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.
@@ -53,19 +61,39 @@ public:
 #endif
 
 #if ENABLE(FILE_SYSTEM)
-    // 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)
+    // 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 slice() will synchronously query the file metadata.
+    static PassRefPtr<File> createForFileSystemFile(const String& name, const FileMetadata& metadata)
     {
-        return adoptRef(new File(path, name));
+        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, ContentTypeLookupPolicy policy = WellKnownContentTypes)
+    {
+        if (name.isEmpty())
+            return adoptRef(new File(path, policy));
+        return adoptRef(new File(path, name, policy));
+    }
+
     virtual unsigned long long size() const;
     virtual bool isFile() const { return true; }
 
     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; }
@@ -74,27 +102,50 @@ public:
     // Note that this involves synchronous file operation. Think twice before calling this function.
     void captureSnapshot(long long& snapshotSize, double& snapshotModificationTime) const;
 
-    // FIXME: obsolete attributes. To be removed.
-    const String& fileName() const { return name(); }
-    unsigned long long fileSize() const { return size(); }
-
 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, ContentTypeLookupPolicy);
 
-#if ENABLE(FILE_SYSTEM)
-    File(const String& path, const String& name);
+# 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)
+    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
+
 #if ENABLE(DIRECTORY_UPLOAD)
     String m_relativePath;
 #endif
 };
 
+inline File* toFile(Blob* blob)
+{
+    ASSERT(!blob || blob->isFile());
+    return static_cast<File*>(blob);
+}
+
+inline const File* toFile(const Blob* blob)
+{
+    ASSERT(!blob || blob->isFile());
+    return static_cast<const File*>(blob);
+}
+
 } // namespace WebCore
 
 #endif // File_h