summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/js/SerializedScriptValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/js/SerializedScriptValue.cpp')
-rw-r--r--WebCore/bindings/js/SerializedScriptValue.cpp108
1 files changed, 100 insertions, 8 deletions
diff --git a/WebCore/bindings/js/SerializedScriptValue.cpp b/WebCore/bindings/js/SerializedScriptValue.cpp
index 6d6fa21..00ec25f 100644
--- a/WebCore/bindings/js/SerializedScriptValue.cpp
+++ b/WebCore/bindings/js/SerializedScriptValue.cpp
@@ -27,9 +27,11 @@
#include "config.h"
#include "SerializedScriptValue.h"
+#include "Blob.h"
#include "File.h"
#include "FileList.h"
#include "ImageData.h"
+#include "JSBlob.h"
#include "JSDOMGlobalObject.h"
#include "JSFile.h"
#include "JSFileList.h"
@@ -147,26 +149,86 @@ private:
unsigned m_length;
};
+class SerializedBlob : public SharedSerializedData {
+public:
+ static PassRefPtr<SerializedBlob> create(const Blob* blob)
+ {
+ return adoptRef(new SerializedBlob(blob));
+ }
+
+ const KURL& url() const { return m_url; }
+ const String& type() const { return m_type; }
+ unsigned long long size() const { return m_size; }
+
+private:
+ SerializedBlob(const Blob* blob)
+ : m_url(blob->url().copy())
+ , m_type(blob->type().crossThreadString())
+ , m_size(blob->size())
+ {
+ }
+
+ KURL m_url;
+ String m_type;
+ unsigned long long m_size;
+};
+
+class SerializedFile : public SharedSerializedData {
+public:
+ static PassRefPtr<SerializedFile> create(const File* file)
+ {
+ return adoptRef(new SerializedFile(file));
+ }
+
+ const String& path() const { return m_path; }
+ const KURL& url() const { return m_url; }
+ const String& type() const { return m_type; }
+
+private:
+ SerializedFile(const File* file)
+ : m_path(file->path().crossThreadString())
+ , m_url(file->url().copy())
+ , m_type(file->type().crossThreadString())
+ {
+ }
+
+ String m_path;
+ KURL m_url;
+ String m_type;
+};
+
class SerializedFileList : public SharedSerializedData {
public:
+ struct FileData {
+ String path;
+ KURL url;
+ String type;
+ };
+
static PassRefPtr<SerializedFileList> create(const FileList* list)
{
return adoptRef(new SerializedFileList(list));
}
unsigned length() const { return m_files.size(); }
- const String& item(unsigned idx) { return m_files[idx]; }
+ const FileData& item(unsigned idx) { return m_files[idx]; }
private:
SerializedFileList(const FileList* list)
{
unsigned length = list->length();
m_files.reserveCapacity(length);
- for (unsigned i = 0; i < length; i++)
- m_files.append(list->item(i)->path().crossThreadString());
+ for (unsigned i = 0; i < length; i++) {
+ File* file = list->item(i);
+ FileData fileData;
+ fileData.path = file->path().crossThreadString();
+ fileData.url = file->url().copy();
+ fileData.type = file->type().crossThreadString();
+ m_files.append(fileData);
+ }
}
- Vector<String> m_files;
+ Vector<FileData> m_files;
};
class SerializedImageData : public SharedSerializedData {
@@ -217,9 +279,15 @@ SerializedScriptValueData::SerializedScriptValueData(const ImageData* imageData)
{
}
+SerializedScriptValueData::SerializedScriptValueData(const Blob* blob)
+ : m_type(BlobType)
+ , m_sharedData(SerializedBlob::create(blob))
+{
+}
+
SerializedScriptValueData::SerializedScriptValueData(const File* file)
: m_type(FileType)
- , m_string(file->path().crossThreadString())
+ , m_sharedData(SerializedFile::create(file))
{
}
@@ -233,6 +301,16 @@ SerializedObject* SharedSerializedData::asObject()
return static_cast<SerializedObject*>(this);
}
+SerializedBlob* SharedSerializedData::asBlob()
+{
+ return static_cast<SerializedBlob*>(this);
+}
+
+SerializedFile* SharedSerializedData::asFile()
+{
+ return static_cast<SerializedFile*>(this);
+}
+
SerializedFileList* SharedSerializedData::asFileList()
{
return static_cast<SerializedFileList*>(this);
@@ -570,6 +648,8 @@ struct SerializingTreeWalker : public BaseWalker {
JSObject* obj = asObject(value);
if (obj->inherits(&JSFile::s_info))
return SerializedScriptValueData(toFile(obj));
+ if (obj->inherits(&JSBlob::s_info))
+ return SerializedScriptValueData(toBlob(obj));
if (obj->inherits(&JSFileList::s_info))
return SerializedScriptValueData(toFileList(obj));
if (obj->inherits(&JSImageData::s_info))
@@ -736,12 +816,21 @@ struct DeserializingTreeWalker : public BaseWalker {
return jsNumber(m_exec, value.asDouble());
case SerializedScriptValueData::DateType:
return new (m_exec) DateInstance(m_exec, m_globalObject->dateStructure(), value.asDouble());
+ case SerializedScriptValueData::BlobType: {
+ if (!m_isDOMGlobalObject)
+ return jsNull();
+ SerializedBlob* serializedBlob = value.asBlob();
+ ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(m_exec->lexicalGlobalObject())->scriptExecutionContext();
+ ASSERT(scriptExecutionContext);
+ return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), Blob::create(scriptExecutionContext, serializedBlob->url(), serializedBlob->type(), serializedBlob->size()));
+ }
case SerializedScriptValueData::FileType: {
if (!m_isDOMGlobalObject)
return jsNull();
+ SerializedFile* serializedFile = value.asFile();
ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(m_exec->lexicalGlobalObject())->scriptExecutionContext();
ASSERT(scriptExecutionContext);
- return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), File::create(scriptExecutionContext, value.asString().crossThreadString()));
+ return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), File::create(scriptExecutionContext, serializedFile->path(), serializedFile->url(), serializedFile->type()));
}
case SerializedScriptValueData::FileListType: {
if (!m_isDOMGlobalObject)
@@ -751,8 +840,10 @@ struct DeserializingTreeWalker : public BaseWalker {
unsigned length = serializedFileList->length();
ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(m_exec->lexicalGlobalObject())->scriptExecutionContext();
ASSERT(scriptExecutionContext);
- for (unsigned i = 0; i < length; i++)
- result->append(File::create(scriptExecutionContext, serializedFileList->item(i)));
+ for (unsigned i = 0; i < length; i++) {
+ const SerializedFileList::FileData& fileData = serializedFileList->item(i);
+ result->append(File::create(scriptExecutionContext, fileData.path, fileData.url, fileData.type));
+ }
return toJS(m_exec, static_cast<JSDOMGlobalObject*>(m_globalObject), result.get());
}
case SerializedScriptValueData::ImageDataType: {
@@ -920,6 +1011,7 @@ struct TeardownTreeWalker {
case SerializedScriptValueData::NumberType:
case SerializedScriptValueData::DateType:
case SerializedScriptValueData::EmptyType:
+ case SerializedScriptValueData::BlobType:
case SerializedScriptValueData::FileType:
case SerializedScriptValueData::FileListType:
case SerializedScriptValueData::ImageDataType: