summaryrefslogtreecommitdiffstats
path: root/chrome/common/common_param_traits.cc
diff options
context:
space:
mode:
authorjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-27 18:29:24 +0000
committerjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-27 18:29:24 +0000
commit22339b123c68805c7c293c67f6f47ea45f0fd1a1 (patch)
treebb05e2e3eb0362338e921a4dce9d5c350437326e /chrome/common/common_param_traits.cc
parente840afdedd33728491639312a268fbf37a48f078 (diff)
downloadchromium_src-22339b123c68805c7c293c67f6f47ea45f0fd1a1.zip
chromium_src-22339b123c68805c7c293c67f6f47ea45f0fd1a1.tar.gz
chromium_src-22339b123c68805c7c293c67f6f47ea45f0fd1a1.tar.bz2
Support sending BlobData to browser process. Also support sending UploadData
with the blob info to browser process. BUG=none TEST=none Review URL: http://codereview.chromium.org/3108042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57707 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/common_param_traits.cc')
-rw-r--r--chrome/common/common_param_traits.cc114
1 files changed, 111 insertions, 3 deletions
diff --git a/chrome/common/common_param_traits.cc b/chrome/common/common_param_traits.cc
index 19ef93b..f3c44c1 100644
--- a/chrome/common/common_param_traits.cc
+++ b/chrome/common/common_param_traits.cc
@@ -17,6 +17,7 @@
#ifndef EXCLUDE_SKIA_DEPENDENCIES
#include "third_party/skia/include/core/SkBitmap.h"
#endif
+#include "webkit/blob/blob_data.h"
#include "webkit/glue/dom_operations.h"
#include "webkit/glue/password_form.h"
@@ -327,11 +328,13 @@ struct ParamTraits<net::UploadData::Element> {
WriteParam(m, static_cast<int>(p.type()));
if (p.type() == net::UploadData::TYPE_BYTES) {
m->WriteData(&p.bytes()[0], static_cast<int>(p.bytes().size()));
- } else {
+ } else if (p.type() == net::UploadData::TYPE_FILE) {
WriteParam(m, p.file_path());
WriteParam(m, p.file_range_offset());
WriteParam(m, p.file_range_length());
WriteParam(m, p.expected_file_modification_time());
+ } else {
+ WriteParam(m, p.blob_url());
}
}
static bool Read(const Message* m, void** iter, param_type* r) {
@@ -344,8 +347,7 @@ struct ParamTraits<net::UploadData::Element> {
if (!m->ReadData(iter, &data, &len))
return false;
r->SetToBytes(data, len);
- } else {
- DCHECK(type == net::UploadData::TYPE_FILE);
+ } else if (type == net::UploadData::TYPE_FILE) {
FilePath file_path;
uint64 offset, length;
base::Time expected_modification_time;
@@ -359,6 +361,12 @@ struct ParamTraits<net::UploadData::Element> {
return false;
r->SetToFilePathRange(file_path, offset, length,
expected_modification_time);
+ } else {
+ DCHECK(type == net::UploadData::TYPE_BLOB);
+ GURL blob_url;
+ if (!ReadParam(m, iter, &blob_url))
+ return false;
+ r->SetToBlobUrl(blob_url);
}
return true;
}
@@ -401,6 +409,106 @@ void ParamTraits<scoped_refptr<net::UploadData> >::Log(const param_type& p,
l->append("<net::UploadData>");
}
+// Only the webkit_blob::BlobData ParamTraits<> definition needs this
+// definition, so keep this in the implementation file so we can forward declare
+// BlobData in the header.
+template <>
+struct ParamTraits<webkit_blob::BlobData::Item> {
+ typedef webkit_blob::BlobData::Item param_type;
+ static void Write(Message* m, const param_type& p) {
+ WriteParam(m, static_cast<int>(p.type()));
+ if (p.type() == webkit_blob::BlobData::TYPE_DATA) {
+ WriteParam(m, p.data());
+ } else if (p.type() == webkit_blob::BlobData::TYPE_FILE) {
+ WriteParam(m, p.file_path());
+ WriteParam(m, p.offset());
+ WriteParam(m, p.length());
+ WriteParam(m, p.expected_modification_time());
+ } else {
+ WriteParam(m, p.blob_url());
+ WriteParam(m, p.offset());
+ WriteParam(m, p.length());
+ }
+ }
+ static bool Read(const Message* m, void** iter, param_type* r) {
+ int type;
+ if (!ReadParam(m, iter, &type))
+ return false;
+ if (type == webkit_blob::BlobData::TYPE_DATA) {
+ std::string data;
+ if (!ReadParam(m, iter, &data))
+ return false;
+ r->SetToData(data);
+ } else if (type == webkit_blob::BlobData::TYPE_FILE) {
+ FilePath file_path;
+ uint64 offset, length;
+ base::Time expected_modification_time;
+ if (!ReadParam(m, iter, &file_path))
+ return false;
+ if (!ReadParam(m, iter, &offset))
+ return false;
+ if (!ReadParam(m, iter, &length))
+ return false;
+ if (!ReadParam(m, iter, &expected_modification_time))
+ return false;
+ r->SetToFile(file_path, offset, length, expected_modification_time);
+ } else {
+ DCHECK(type == webkit_blob::BlobData::TYPE_BLOB);
+ GURL blob_url;
+ uint64 offset, length;
+ if (!ReadParam(m, iter, &blob_url))
+ return false;
+ if (!ReadParam(m, iter, &offset))
+ return false;
+ if (!ReadParam(m, iter, &length))
+ return false;
+ r->SetToBlob(blob_url, offset, length);
+ }
+ return true;
+ }
+ static void Log(const param_type& p, std::string* l) {
+ l->append("<BlobData::Item>");
+ }
+};
+
+void ParamTraits<scoped_refptr<webkit_blob::BlobData> >::Write(
+ Message* m, const param_type& p) {
+ WriteParam(m, p.get() != NULL);
+ if (p) {
+ WriteParam(m, p->items());
+ WriteParam(m, p->content_type());
+ WriteParam(m, p->content_disposition());
+ }
+}
+
+bool ParamTraits<scoped_refptr<webkit_blob::BlobData> >::Read(
+ const Message* m, void** iter, param_type* r) {
+ bool has_object;
+ if (!ReadParam(m, iter, &has_object))
+ return false;
+ if (!has_object)
+ return true;
+ std::vector<webkit_blob::BlobData::Item> items;
+ if (!ReadParam(m, iter, &items))
+ return false;
+ std::string content_type;
+ if (!ReadParam(m, iter, &content_type))
+ return false;
+ std::string content_disposition;
+ if (!ReadParam(m, iter, &content_disposition))
+ return false;
+ *r = new webkit_blob::BlobData;
+ (*r)->swap_items(&items);
+ (*r)->set_content_type(content_type);
+ (*r)->set_content_disposition(content_disposition);
+ return true;
+}
+
+void ParamTraits<scoped_refptr<webkit_blob::BlobData> >::Log(
+ const param_type& p, std::string* l) {
+ l->append("<webkit_blob::BlobData>");
+}
+
void ParamTraits<ThumbnailScore>::Write(Message* m, const param_type& p) {
IPC::ParamTraits<double>::Write(m, p.boring_score);
IPC::ParamTraits<bool>::Write(m, p.good_clipping);