| Index: content/child/indexed_db/indexed_db_dispatcher.cc
|
| diff --git a/content/child/indexed_db/indexed_db_dispatcher.cc b/content/child/indexed_db/indexed_db_dispatcher.cc
|
| index 9e92b711c65261e1f2688d228ed361dd1af2dfbc..66d1666a0c89fe4cd5d1b03ef36ece29083b1fd7 100644
|
| --- a/content/child/indexed_db/indexed_db_dispatcher.cc
|
| +++ b/content/child/indexed_db/indexed_db_dispatcher.cc
|
| @@ -18,6 +18,7 @@
|
| #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h"
|
| #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h"
|
|
|
| +using WebKit::WebBlobInfo;
|
| using WebKit::WebData;
|
| using WebKit::WebIDBCallbacks;
|
| using WebKit::WebIDBDatabase;
|
| @@ -323,6 +324,7 @@ void IndexedDBDispatcher::RequestIDBDatabasePut(
|
| int64 transaction_id,
|
| int64 object_store_id,
|
| const WebData& value,
|
| + const WebKit::WebVector<WebBlobInfo>& webBlobInfo,
|
| const IndexedDBKey& key,
|
| WebIDBDatabase::PutMode put_mode,
|
| WebIDBCallbacks* callbacks,
|
| @@ -364,6 +366,21 @@ void IndexedDBDispatcher::RequestIDBDatabasePut(
|
| IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j]));
|
| }
|
| }
|
| +
|
| + params.blob_or_file_info.resize(webBlobInfo.size());
|
| + for (size_t i = 0; i < webBlobInfo.size(); ++i) {
|
| + const WebBlobInfo& info = webBlobInfo[i];
|
| + params.blob_or_file_info[i].is_file = info.isFile();
|
| + if (info.isFile()) {
|
| + params.blob_or_file_info[i].file_path = info.filePath();
|
| + params.blob_or_file_info[i].file_name = info.fileName();
|
| + } else {
|
| + params.blob_or_file_info[i].url = GURL(info.url());
|
| + params.blob_or_file_info[i].size = info.size();
|
| + }
|
| + params.blob_or_file_info[i].mime_type = info.type();
|
| + }
|
| +
|
| Send(new IndexedDBHostMsg_DatabasePut(params));
|
| }
|
|
|
| @@ -491,37 +508,62 @@ void IndexedDBDispatcher::OnSuccessStringList(
|
| pending_callbacks_.Remove(ipc_callbacks_id);
|
| }
|
|
|
| -void IndexedDBDispatcher::OnSuccessValue(int32 ipc_thread_id,
|
| - int32 ipc_callbacks_id,
|
| - const std::string& value) {
|
| - DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
|
| - WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
|
| +static void LoadBlobInfo(
|
| + WebData* web_value,
|
| + const std::string& value,
|
| + const std::vector<IndexedDBMsg_BlobOrFileInfo>& blob_info,
|
| + WebKit::WebVector<WebBlobInfo>* web_blob_info) {
|
| +
|
| + if (value.size()) {
|
| + web_value->assign(&*value.begin(), value.size());
|
| + WebKit::WebVector<WebBlobInfo> local_blob_info(blob_info.size());
|
| + for (size_t i = 0; i < blob_info.size(); ++i) {
|
| + const IndexedDBMsg_BlobOrFileInfo& info = blob_info[i];
|
| + if (info.is_file) {
|
| + local_blob_info[i] =
|
| + WebBlobInfo(WebString::fromUTF8(info.url.spec()),
|
| + info.file_path, info.file_name, info.mime_type,
|
| + info.last_modified, info.size);
|
| + } else {
|
| + local_blob_info[i] =
|
| + WebBlobInfo(WebString::fromUTF8(info.url.spec()), info.mime_type,
|
| + info.size);
|
| + }
|
| + }
|
| + web_blob_info->swap(local_blob_info);
|
| + }
|
| +}
|
| +
|
| +void IndexedDBDispatcher::OnSuccessValue(
|
| + const IndexedDBMsg_CallbacksSuccessValue_Params& params) {
|
| + DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId());
|
| + WebIDBCallbacks* callbacks =
|
| + pending_callbacks_.Lookup(params.ipc_callbacks_id);
|
| if (!callbacks)
|
| return;
|
| WebData web_value;
|
| - if (value.size())
|
| - web_value.assign(&*value.begin(), value.size());
|
| - callbacks->onSuccess(web_value);
|
| - pending_callbacks_.Remove(ipc_callbacks_id);
|
| + WebVector<WebBlobInfo> web_blob_info;
|
| + LoadBlobInfo(&web_value, params.value, params.blob_or_file_info,
|
| + &web_blob_info);
|
| + callbacks->onSuccess(web_value, web_blob_info);
|
| + pending_callbacks_.Remove(params.ipc_callbacks_id);
|
| }
|
|
|
| void IndexedDBDispatcher::OnSuccessValueWithKey(
|
| - int32 ipc_thread_id,
|
| - int32 ipc_callbacks_id,
|
| - const std::string& value,
|
| - const IndexedDBKey& primary_key,
|
| - const IndexedDBKeyPath& key_path) {
|
| - DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
|
| - WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
|
| + const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& params) {
|
| + DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId());
|
| + WebIDBCallbacks* callbacks =
|
| + pending_callbacks_.Lookup(params.ipc_callbacks_id);
|
| if (!callbacks)
|
| return;
|
| WebData web_value;
|
| - if (value.size())
|
| - web_value.assign(&*value.begin(), value.size());
|
| - callbacks->onSuccess(web_value,
|
| - WebIDBKeyBuilder::Build(primary_key),
|
| - WebIDBKeyPathBuilder::Build(key_path));
|
| - pending_callbacks_.Remove(ipc_callbacks_id);
|
| + WebVector<WebBlobInfo> web_blob_info;
|
| + LoadBlobInfo(&web_value, params.value, params.blob_or_file_info,
|
| + &web_blob_info);
|
| + callbacks->onSuccess(web_value, web_blob_info,
|
| + WebIDBKeyBuilder::Build(params.primary_key),
|
| + WebIDBKeyPathBuilder::Build(params.key_path));
|
| + pending_callbacks_.Remove(params.ipc_callbacks_id);
|
| }
|
|
|
| void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id,
|
| @@ -553,8 +595,9 @@ void IndexedDBDispatcher::OnSuccessOpenCursor(
|
| const IndexedDBKey& key = p.key;
|
| const IndexedDBKey& primary_key = p.primary_key;
|
| WebData web_value;
|
| - if (p.value.size())
|
| - web_value.assign(&*p.value.begin(), p.value.size());
|
| + WebVector<WebBlobInfo> web_blob_info;
|
| + LoadBlobInfo(&web_value, p.value, p.blob_or_file_info,
|
| + &web_blob_info);
|
|
|
| WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
|
| if (!callbacks)
|
| @@ -564,7 +607,8 @@ void IndexedDBDispatcher::OnSuccessOpenCursor(
|
| new RendererWebIDBCursorImpl(ipc_object_id, thread_safe_sender_.get());
|
| cursors_[ipc_object_id] = cursor;
|
| callbacks->onSuccess(cursor, WebIDBKeyBuilder::Build(key),
|
| - WebIDBKeyBuilder::Build(primary_key), web_value);
|
| + WebIDBKeyBuilder::Build(primary_key), web_value,
|
| + web_blob_info);
|
|
|
| pending_callbacks_.Remove(ipc_callbacks_id);
|
| }
|
| @@ -586,10 +630,11 @@ void IndexedDBDispatcher::OnSuccessCursorContinue(
|
| return;
|
|
|
| WebData web_value;
|
| - if (value.size())
|
| - web_value.assign(&*value.begin(), value.size());
|
| + WebVector<WebBlobInfo> web_blob_info;
|
| + LoadBlobInfo(&web_value, value, p.blob_or_file_info, &web_blob_info);
|
| callbacks->onSuccess(WebIDBKeyBuilder::Build(key),
|
| - WebIDBKeyBuilder::Build(primary_key), web_value);
|
| + WebIDBKeyBuilder::Build(primary_key), web_value,
|
| + web_blob_info);
|
|
|
| pending_callbacks_.Remove(ipc_callbacks_id);
|
| }
|
| @@ -602,13 +647,15 @@ void IndexedDBDispatcher::OnSuccessCursorPrefetch(
|
| const std::vector<IndexedDBKey>& keys = p.keys;
|
| const std::vector<IndexedDBKey>& primary_keys = p.primary_keys;
|
| std::vector<WebData> values(p.values.size());
|
| + DCHECK_EQ(p.values.size(), p.blob_or_file_infos.size());
|
| + std::vector<WebVector<WebBlobInfo> > blob_infos(p.blob_or_file_infos.size());
|
| for (size_t i = 0; i < p.values.size(); ++i) {
|
| - if (p.values[i].size())
|
| - values[i].assign(&*p.values[i].begin(), p.values[i].size());
|
| + LoadBlobInfo(&values[i], p.values[i], p.blob_or_file_infos[i],
|
| + &blob_infos[i]);
|
| }
|
| RendererWebIDBCursorImpl* cursor = cursors_[ipc_cursor_id];
|
| DCHECK(cursor);
|
| - cursor->SetPrefetchData(keys, primary_keys, values);
|
| + cursor->SetPrefetchData(keys, primary_keys, values, blob_infos);
|
|
|
| WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
|
| DCHECK(callbacks);
|
|
|