| Index: third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
|
| diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
|
| index e799703de7fdd455cf1246e44287fb97eba5a2ee..02a187d672923a8cff43b851bedaad1b09fcc2a7 100644
|
| --- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
|
| +++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp
|
| @@ -40,9 +40,11 @@
|
| #include "modules/indexeddb/IDBDatabase.h"
|
| #include "modules/indexeddb/IDBKeyPath.h"
|
| #include "modules/indexeddb/IDBTracing.h"
|
| +#include "modules/indexeddb/IDBValueWrapping.h"
|
| #include "platform/Histogram.h"
|
| #include "platform/SharedBuffer.h"
|
| #include "platform/bindings/ScriptState.h"
|
| +#include "platform/wtf/RefPtr.h"
|
| #include "public/platform/WebBlobInfo.h"
|
| #include "public/platform/WebData.h"
|
| #include "public/platform/WebVector.h"
|
| @@ -376,19 +378,13 @@ IDBRequest* IDBObjectStore::put(ScriptState* script_state,
|
|
|
| v8::Isolate* isolate = script_state->GetIsolate();
|
| DCHECK(isolate->InContext());
|
| - Vector<WebBlobInfo> blob_info;
|
| - SerializedScriptValue::SerializeOptions options;
|
| - options.blob_info = &blob_info;
|
| -
|
| // TODO(crbug.com/719053): This wasm behavior differs from other browsers.
|
| - options.wasm_policy =
|
| + SerializedScriptValue::SerializeOptions::WasmSerializationPolicy wasm_policy =
|
| ExecutionContext::From(script_state)->IsSecureContext()
|
| ? SerializedScriptValue::SerializeOptions::kSerialize
|
| : SerializedScriptValue::SerializeOptions::kBlockedInNonSecureContext;
|
| - options.for_storage = SerializedScriptValue::kForStorage;
|
| - RefPtr<SerializedScriptValue> serialized_value =
|
| - SerializedScriptValue::Serialize(isolate, value.V8Value(), options,
|
| - exception_state);
|
| + IDBValueWrapper value_wrapper(isolate, value.V8Value(), wasm_policy,
|
| + exception_state);
|
| if (exception_state.HadException())
|
| return nullptr;
|
|
|
| @@ -412,9 +408,8 @@ IDBRequest* IDBObjectStore::put(ScriptState* script_state,
|
| // value.
|
| if (put_mode == kWebIDBPutModeCursorUpdate && uses_in_line_keys) {
|
| DCHECK(key);
|
| - if (clone.IsEmpty())
|
| - clone = DeserializeScriptValue(script_state, serialized_value.Get(),
|
| - &blob_info);
|
| + DCHECK(clone.IsEmpty());
|
| + value_wrapper.Clone(script_state, &clone);
|
| IDBKey* key_path_key = ScriptValue::To<IDBKey*>(
|
| script_state->GetIsolate(), clone, exception_state, key_path);
|
| if (exception_state.HadException())
|
| @@ -437,10 +432,8 @@ IDBRequest* IDBObjectStore::put(ScriptState* script_state,
|
| return nullptr;
|
| }
|
| if (uses_in_line_keys) {
|
| - if (clone.IsEmpty()) {
|
| - clone = DeserializeScriptValue(script_state, serialized_value.Get(),
|
| - &blob_info);
|
| - }
|
| + if (clone.IsEmpty())
|
| + value_wrapper.Clone(script_state, &clone);
|
| IDBKey* key_path_key = ScriptValue::To<IDBKey*>(
|
| script_state->GetIsolate(), clone, exception_state, key_path);
|
| if (exception_state.HadException())
|
| @@ -494,10 +487,8 @@ IDBRequest* IDBObjectStore::put(ScriptState* script_state,
|
| Vector<int64_t> index_ids;
|
| HeapVector<IndexKeys> index_keys;
|
| for (const auto& it : Metadata().indexes) {
|
| - if (clone.IsEmpty()) {
|
| - clone = DeserializeScriptValue(script_state, serialized_value.Get(),
|
| - &blob_info);
|
| - }
|
| + if (clone.IsEmpty())
|
| + value_wrapper.Clone(script_state, &clone);
|
| IndexKeys keys;
|
| GenerateIndexKeysForValue(script_state->GetIsolate(), *it.value, clone,
|
| &keys);
|
| @@ -507,16 +498,16 @@ IDBRequest* IDBObjectStore::put(ScriptState* script_state,
|
|
|
| IDBRequest* request =
|
| IDBRequest::Create(script_state, source, transaction_.Get());
|
| - Vector<char> wire_bytes;
|
| - serialized_value->ToWireBytes(wire_bytes);
|
| - RefPtr<SharedBuffer> value_buffer = SharedBuffer::AdoptVector(wire_bytes);
|
|
|
| - request->StorePutOperationBlobs(serialized_value->BlobDataHandles());
|
| + value_wrapper.ExtractBlobDataHandles(request->transit_blob_handles());
|
| + value_wrapper.WrapIfBiggerThan(IDBValueWrapper::kWrapThreshold);
|
| +
|
| + BackendDB()->Put(
|
| + transaction_->Id(), Id(), WebData(value_wrapper.ExtractWireBytes()),
|
| + value_wrapper.WrappedBlobInfo(), key,
|
| + static_cast<WebIDBPutMode>(put_mode),
|
| + request->CreateWebCallbacks().release(), index_ids, index_keys);
|
|
|
| - BackendDB()->Put(transaction_->Id(), Id(), WebData(value_buffer), blob_info,
|
| - key, static_cast<WebIDBPutMode>(put_mode),
|
| - request->CreateWebCallbacks().release(), index_ids,
|
| - index_keys);
|
| return request;
|
| }
|
|
|
|
|