Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1612)

Unified Diff: WebCore/bindings/v8/SerializedScriptValue.cpp

Issue 11192017: ********** WebCore blob hacking (Closed) Base URL: http://svn.webkit.org/repository/webkit/trunk/Source/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « WebCore/bindings/v8/SerializedScriptValue.h ('k') | WebCore/fileapi/Blob.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: WebCore/bindings/v8/SerializedScriptValue.cpp
===================================================================
--- WebCore/bindings/v8/SerializedScriptValue.cpp (revision 140218)
+++ WebCore/bindings/v8/SerializedScriptValue.cpp (working copy)
@@ -431,7 +431,7 @@
doWriteUint32(length);
for (unsigned i = 0; i < length; ++i) {
doWriteWebCoreString(fileList.item(i)->path());
- doWriteWebCoreString(fileList.item(i)->url().string());
+ doWriteWebCoreString(fileList.item(i)->uuid()); // TODO: bump version numbers somewhere?
doWriteWebCoreString(fileList.item(i)->type());
}
}
@@ -704,14 +704,14 @@
JSFailure
};
- Serializer(Writer& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, Vector<String>& blobURLs, v8::TryCatch& tryCatch)
+ Serializer(Writer& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, BlobDataHandleMap& blobDataHandles, v8::TryCatch& tryCatch)
: m_writer(writer)
, m_tryCatch(tryCatch)
, m_depth(0)
, m_execDepth(0)
, m_status(Success)
, m_nextObjectReference(0)
- , m_blobURLs(blobURLs)
+ , m_blobDataHandles(blobDataHandles)
{
ASSERT(!tryCatch.HasCaught());
if (messagePorts) {
@@ -1078,8 +1078,8 @@
Blob* blob = V8Blob::toNative(value.As<v8::Object>());
if (!blob)
return;
- m_writer.writeBlob(blob->url().string(), blob->type(), blob->size());
- m_blobURLs.append(blob->url().string());
+ m_writer.writeBlob(blob->uuid(), blob->type(), blob->size());
+ m_blobDataHandles.add(blob->uuid(), blob->blobDataHandle());
}
#if ENABLE(FILE_SYSTEM)
@@ -1100,8 +1100,8 @@
File* file = V8File::toNative(value.As<v8::Object>());
if (!file)
return;
- m_writer.writeFile(file->path(), file->url().string(), file->type());
- m_blobURLs.append(file->url().string());
+ m_writer.writeFile(file->path(), file->uuid(), file->type());
+ m_blobDataHandles.add(file->uuid(), file->blobDataHandle());
}
void writeFileList(v8::Handle<v8::Value> value)
@@ -1112,7 +1112,7 @@
m_writer.writeFileList(*fileList);
unsigned length = fileList->length();
for (unsigned i = 0; i < length; ++i)
- m_blobURLs.append(fileList->item(i)->url().string());
+ m_blobDataHandles.add(fileList->item(i)->uuid(), fileList->item(i)->blobDataHandle());
}
void writeImageData(v8::Handle<v8::Value> value)
@@ -1231,7 +1231,7 @@
ObjectPool m_transferredMessagePorts;
ObjectPool m_transferredArrayBuffers;
uint32_t m_nextObjectReference;
- Vector<String>& m_blobURLs;
+ BlobDataHandleMap& m_blobDataHandles;
};
Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, StateBase* next)
@@ -1341,12 +1341,13 @@
// restoring information about saved objects of composite types.
class Reader {
public:
- Reader(const uint8_t* buffer, int length, v8::Isolate* isolate)
+ Reader(const uint8_t* buffer, int length, v8::Isolate* isolate, const BlobDataHandleMap& blobDataHandles)
: m_buffer(buffer)
, m_length(length)
, m_position(0)
, m_version(0)
, m_isolate(isolate)
+ , m_blobDataHandles(blobDataHandles)
{
ASSERT(!(reinterpret_cast<size_t>(buffer) & 1));
ASSERT(length >= 0);
@@ -1859,16 +1860,16 @@
bool readBlob(v8::Handle<v8::Value>* value)
{
- String url;
+ String uuid;
String type;
uint64_t size;
- if (!readWebCoreString(&url))
+ if (!readWebCoreString(&uuid))
return false;
if (!readWebCoreString(&type))
return false;
if (!doReadUint64(&size))
return false;
- PassRefPtr<Blob> blob = Blob::create(KURL(ParsedURLString, url), type, size);
+ PassRefPtr<Blob> blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size));
*value = toV8(blob, v8::Handle<v8::Object>(), m_isolate);
return true;
}
@@ -1894,15 +1895,15 @@
bool readFile(v8::Handle<v8::Value>* value)
{
String path;
- String url;
+ String uuid;
String type;
if (!readWebCoreString(&path))
return false;
- if (!readWebCoreString(&url))
+ if (!readWebCoreString(&uuid))
return false;
if (!readWebCoreString(&type))
return false;
- PassRefPtr<File> file = File::create(path, KURL(ParsedURLString, url), type);
+ PassRefPtr<File> file = File::create(path, getOrCreateBlobDataHandle(uuid, type));
*value = toV8(file, v8::Handle<v8::Object>(), m_isolate);
return true;
}
@@ -1915,15 +1916,15 @@
PassRefPtr<FileList> fileList = FileList::create();
for (unsigned i = 0; i < length; ++i) {
String path;
- String urlString;
+ String uuid;
String type;
if (!readWebCoreString(&path))
return false;
- if (!readWebCoreString(&urlString))
+ if (!readWebCoreString(&uuid))
return false;
if (!readWebCoreString(&type))
return false;
- fileList->append(File::create(path, KURL(ParsedURLString, urlString), type));
+ fileList->append(File::create(path, getOrCreateBlobDataHandle(uuid, type)));
}
*value = toV8(fileList, v8::Handle<v8::Object>(), m_isolate);
return true;
@@ -1965,11 +1966,30 @@
return true;
}
+ PassRefPtr<BlobDataHandle> getOrCreateBlobDataHandle(const String& uuid, const String& type, long long size = -1)
+ {
+ // The containing ssv may have a BDH for this uuid if this ssv is just being
+ // passed from main to worker thread (for example). We use those values when creating the
+ // new blob instead of cons'ing up a new BDH.
+ //
+ // FIXME: Maybe we should require that it work that way where the ssv must have a BDH for any
+ // blobs it comes across during deserialization. Would require callers to explicitly populate
+ // the collection of BDH's for blobs to work, which would encourage lifetimes to be considered
+ // when passing ssv's around cross process. At present, we get 'lucky' in some cases because
+ // the blob in the src process happens to still exists at the time the dest process is deserializing.
+ // For example in sharedWorker.postMesssage(...).
+ BlobDataHandleMap::const_iterator it = m_blobDataHandles.find(uuid);
+ if (it != m_blobDataHandles.end())
+ return it->value;
+ return BlobDataHandle::create(uuid, type, size);
+ }
+
const uint8_t* m_buffer;
const unsigned m_length;
unsigned m_position;
uint32_t m_version;
v8::Isolate* m_isolate;
+ const BlobDataHandleMap& m_blobDataHandles;
};
@@ -2423,7 +2443,7 @@
Serializer::Status status;
{
v8::TryCatch tryCatch;
- Serializer serializer(writer, messagePorts, arrayBuffers, m_blobURLs, tryCatch);
+ Serializer serializer(writer, messagePorts, arrayBuffers, m_blobDataHandles, tryCatch);
status = serializer.serialize(value);
if (status == Serializer::JSException) {
// If there was a JS exception thrown, re-throw it.
@@ -2478,7 +2498,7 @@
if (!m_data.impl())
return v8NullWithCheck(isolate);
COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes);
- Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length(), isolate);
+ Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length(), isolate, m_blobDataHandles);
Deserializer deserializer(reader, messagePorts, m_arrayBufferContentsArray.get());
return deserializer.deserialize();
}
« no previous file with comments | « WebCore/bindings/v8/SerializedScriptValue.h ('k') | WebCore/fileapi/Blob.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698