| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "content/browser/child_process_security_policy_impl.h" | 15 #include "content/browser/child_process_security_policy_impl.h" |
| 16 #include "content/browser/fileapi/fileapi_message_filter.h" | 16 #include "content/browser/fileapi/fileapi_message_filter.h" |
| 17 #include "content/browser/indexed_db/cursor_impl.h" |
| 17 #include "content/browser/indexed_db/database_impl.h" | 18 #include "content/browser/indexed_db/database_impl.h" |
| 18 #include "content/browser/indexed_db/indexed_db_blob_info.h" | 19 #include "content/browser/indexed_db/indexed_db_blob_info.h" |
| 19 #include "content/browser/indexed_db/indexed_db_connection.h" | 20 #include "content/browser/indexed_db/indexed_db_connection.h" |
| 20 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 21 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
| 21 #include "content/browser/indexed_db/indexed_db_cursor.h" | 22 #include "content/browser/indexed_db/indexed_db_cursor.h" |
| 22 #include "content/browser/indexed_db/indexed_db_database_error.h" | 23 #include "content/browser/indexed_db/indexed_db_database_error.h" |
| 23 #include "content/browser/indexed_db/indexed_db_return_value.h" | 24 #include "content/browser/indexed_db/indexed_db_return_value.h" |
| 24 #include "content/browser/indexed_db/indexed_db_tracing.h" | 25 #include "content/browser/indexed_db/indexed_db_tracing.h" |
| 25 #include "content/browser/indexed_db/indexed_db_value.h" | 26 #include "content/browser/indexed_db/indexed_db_value.h" |
| 26 #include "content/common/indexed_db/indexed_db_constants.h" | 27 #include "content/common/indexed_db/indexed_db_constants.h" |
| 27 #include "content/common/indexed_db/indexed_db_messages.h" | 28 #include "content/common/indexed_db/indexed_db_messages.h" |
| 28 #include "content/common/indexed_db/indexed_db_metadata.h" | 29 #include "content/common/indexed_db/indexed_db_metadata.h" |
| 29 #include "mojo/public/cpp/bindings/strong_associated_binding.h" | 30 #include "mojo/public/cpp/bindings/strong_associated_binding.h" |
| 30 #include "storage/browser/blob/blob_storage_context.h" | 31 #include "storage/browser/blob/blob_storage_context.h" |
| 31 #include "storage/browser/blob/shareable_file_reference.h" | 32 #include "storage/browser/blob/shareable_file_reference.h" |
| 32 #include "storage/browser/quota/quota_manager.h" | 33 #include "storage/browser/quota/quota_manager.h" |
| 33 | 34 |
| 34 using indexed_db::mojom::CallbacksAssociatedPtrInfo; | 35 using indexed_db::mojom::CallbacksAssociatedPtrInfo; |
| 35 using std::swap; | 36 using std::swap; |
| 36 using storage::ShareableFileReference; | 37 using storage::ShareableFileReference; |
| 37 | 38 |
| 38 namespace content { | 39 namespace content { |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| 41 const int32_t kNoCursor = -1; | |
| 42 const int64_t kNoTransaction = -1; | 42 const int64_t kNoTransaction = -1; |
| 43 | 43 |
| 44 void ConvertBlobInfo( | 44 void ConvertBlobInfo( |
| 45 const std::vector<IndexedDBBlobInfo>& blob_info, | 45 const std::vector<IndexedDBBlobInfo>& blob_info, |
| 46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { | 46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { |
| 47 blob_or_file_info->reserve(blob_info.size()); | 47 blob_or_file_info->reserve(blob_info.size()); |
| 48 for (const auto& iter : blob_info) { | 48 for (const auto& iter : blob_info) { |
| 49 if (!iter.mark_used_callback().is_null()) | 49 if (!iter.mark_used_callback().is_null()) |
| 50 iter.mark_used_callback().Run(); | 50 iter.mark_used_callback().Run(); |
| 51 | 51 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 70 if (value->primary_key.IsValid()) { | 70 if (value->primary_key.IsValid()) { |
| 71 mojo_value->primary_key = value->primary_key; | 71 mojo_value->primary_key = value->primary_key; |
| 72 mojo_value->key_path = value->key_path; | 72 mojo_value->key_path = value->key_path; |
| 73 } | 73 } |
| 74 if (!value->empty()) | 74 if (!value->empty()) |
| 75 swap(mojo_value->value->bits, value->bits); | 75 swap(mojo_value->value->bits, value->bits); |
| 76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); | 76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); |
| 77 return mojo_value; | 77 return mojo_value; |
| 78 } | 78 } |
| 79 | 79 |
| 80 // Destructively converts an IndexedDBValue to a Mojo Value. |
| 81 ::indexed_db::mojom::ValuePtr ConvertValue(IndexedDBValue* value) { |
| 82 auto mojo_value = ::indexed_db::mojom::Value::New(); |
| 83 if (!value->empty()) |
| 84 swap(mojo_value->bits, value->bits); |
| 85 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); |
| 86 return mojo_value; |
| 87 } |
| 88 |
| 80 } // namespace | 89 } // namespace |
| 81 | 90 |
| 82 class IndexedDBCallbacks::IOThreadHelper { | 91 class IndexedDBCallbacks::IOThreadHelper { |
| 83 public: | 92 public: |
| 84 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, | 93 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, |
| 85 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); | 94 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); |
| 86 ~IOThreadHelper(); | 95 ~IOThreadHelper(); |
| 87 | 96 |
| 88 void SendError(const IndexedDBDatabaseError& error); | 97 void SendError(const IndexedDBDatabaseError& error); |
| 89 void SendSuccessStringList(const std::vector<base::string16>& value); | 98 void SendSuccessStringList(const std::vector<base::string16>& value); |
| 90 void SendBlocked(int64_t existing_version); | 99 void SendBlocked(int64_t existing_version); |
| 91 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, | 100 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, |
| 92 int64_t old_version, | 101 int64_t old_version, |
| 93 blink::WebIDBDataLoss data_loss, | 102 blink::WebIDBDataLoss data_loss, |
| 94 const std::string& data_loss_message, | 103 const std::string& data_loss_message, |
| 95 const content::IndexedDBDatabaseMetadata& metadata); | 104 const content::IndexedDBDatabaseMetadata& metadata); |
| 96 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, | 105 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, |
| 97 const content::IndexedDBDatabaseMetadata& metadata); | 106 const content::IndexedDBDatabaseMetadata& metadata); |
| 98 void SendSuccessCursor(int32_t cursor_id, | 107 void SendSuccessCursor(std::unique_ptr<CursorImpl> cursor, |
| 99 const IndexedDBKey& key, | 108 const IndexedDBKey& key, |
| 100 const IndexedDBKey& primary_key, | 109 const IndexedDBKey& primary_key, |
| 101 ::indexed_db::mojom::ValuePtr value, | 110 ::indexed_db::mojom::ValuePtr value, |
| 102 const std::vector<IndexedDBBlobInfo>& blob_info); | 111 const std::vector<IndexedDBBlobInfo>& blob_info); |
| 103 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, | 112 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, |
| 104 const std::vector<IndexedDBBlobInfo>& blob_info); | 113 const std::vector<IndexedDBBlobInfo>& blob_info); |
| 114 void SendSuccessCursorContinue( |
| 115 const IndexedDBKey& key, |
| 116 const IndexedDBKey& primary_key, |
| 117 ::indexed_db::mojom::ValuePtr value, |
| 118 const std::vector<IndexedDBBlobInfo>& blob_info); |
| 119 void SendSuccessCursorPrefetch( |
| 120 const std::vector<IndexedDBKey>& keys, |
| 121 const std::vector<IndexedDBKey>& primary_keys, |
| 122 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, |
| 123 const std::vector<IndexedDBValue>& values); |
| 105 void SendSuccessArray( | 124 void SendSuccessArray( |
| 106 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, | 125 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, |
| 107 const std::vector<IndexedDBReturnValue>& values); | 126 const std::vector<IndexedDBReturnValue>& values); |
| 108 void SendSuccessKey(const IndexedDBKey& value); | 127 void SendSuccessKey(const IndexedDBKey& value); |
| 109 void SendSuccessInteger(int64_t value); | 128 void SendSuccessInteger(int64_t value); |
| 110 void SendSuccess(); | 129 void SendSuccess(); |
| 111 | 130 |
| 112 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); | 131 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); |
| 113 bool CreateAllBlobs( | 132 bool CreateAllBlobs( |
| 114 const std::vector<IndexedDBBlobInfo>& blob_info, | 133 const std::vector<IndexedDBBlobInfo>& blob_info, |
| 115 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); | 134 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); |
| 116 | 135 |
| 117 private: | 136 private: |
| 118 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; | 137 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; |
| 119 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; | 138 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; |
| 120 | 139 |
| 121 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); | 140 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); |
| 122 }; | 141 }; |
| 123 | 142 |
| 124 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, | |
| 125 int32_t ipc_thread_id, | |
| 126 int32_t ipc_callbacks_id) | |
| 127 : dispatcher_host_(dispatcher_host), | |
| 128 ipc_callbacks_id_(ipc_callbacks_id), | |
| 129 ipc_thread_id_(ipc_thread_id), | |
| 130 ipc_cursor_id_(kNoCursor), | |
| 131 host_transaction_id_(kNoTransaction), | |
| 132 data_loss_(blink::WebIDBDataLossNone), | |
| 133 sent_blocked_(false), | |
| 134 io_helper_(nullptr) {} | |
| 135 | |
| 136 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, | |
| 137 int32_t ipc_thread_id, | |
| 138 int32_t ipc_callbacks_id, | |
| 139 int32_t ipc_cursor_id) | |
| 140 : dispatcher_host_(dispatcher_host), | |
| 141 ipc_callbacks_id_(ipc_callbacks_id), | |
| 142 ipc_thread_id_(ipc_thread_id), | |
| 143 ipc_cursor_id_(ipc_cursor_id), | |
| 144 host_transaction_id_(kNoTransaction), | |
| 145 data_loss_(blink::WebIDBDataLossNone), | |
| 146 sent_blocked_(false), | |
| 147 io_helper_(nullptr) {} | |
| 148 | |
| 149 IndexedDBCallbacks::IndexedDBCallbacks( | 143 IndexedDBCallbacks::IndexedDBCallbacks( |
| 150 IndexedDBDispatcherHost* dispatcher_host, | 144 IndexedDBDispatcherHost* dispatcher_host, |
| 151 const url::Origin& origin, | 145 const url::Origin& origin, |
| 152 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) | 146 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) |
| 153 : dispatcher_host_(dispatcher_host), | 147 : dispatcher_host_(dispatcher_host), |
| 154 ipc_cursor_id_(kNoCursor), | |
| 155 host_transaction_id_(kNoTransaction), | 148 host_transaction_id_(kNoTransaction), |
| 156 origin_(origin), | 149 origin_(origin), |
| 157 data_loss_(blink::WebIDBDataLossNone), | 150 data_loss_(blink::WebIDBDataLossNone), |
| 158 sent_blocked_(false), | 151 sent_blocked_(false), |
| 159 io_helper_( | 152 io_helper_( |
| 160 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { | 153 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { |
| 161 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 154 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 162 thread_checker_.DetachFromThread(); | 155 thread_checker_.DetachFromThread(); |
| 163 } | 156 } |
| 164 | 157 |
| 165 IndexedDBCallbacks::~IndexedDBCallbacks() { | 158 IndexedDBCallbacks::~IndexedDBCallbacks() { |
| 166 DCHECK(thread_checker_.CalledOnValidThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
| 167 } | 160 } |
| 168 | 161 |
| 169 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { | 162 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { |
| 170 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
| 171 DCHECK(dispatcher_host_); | 164 DCHECK(dispatcher_host_); |
| 172 | 165 |
| 173 if (io_helper_) { | 166 BrowserThread::PostTask( |
| 174 BrowserThread::PostTask( | 167 BrowserThread::IO, FROM_HERE, |
| 175 BrowserThread::IO, FROM_HERE, | 168 base::Bind(&IOThreadHelper::SendError, base::Unretained(io_helper_.get()), |
| 176 base::Bind(&IOThreadHelper::SendError, | 169 error)); |
| 177 base::Unretained(io_helper_.get()), error)); | |
| 178 } else { | |
| 179 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( | |
| 180 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); | |
| 181 } | |
| 182 dispatcher_host_ = nullptr; | 170 dispatcher_host_ = nullptr; |
| 183 | 171 |
| 184 if (!connection_open_start_time_.is_null()) { | 172 if (!connection_open_start_time_.is_null()) { |
| 185 UMA_HISTOGRAM_MEDIUM_TIMES( | 173 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 186 "WebCore.IndexedDB.OpenTime.Error", | 174 "WebCore.IndexedDB.OpenTime.Error", |
| 187 base::TimeTicks::Now() - connection_open_start_time_); | 175 base::TimeTicks::Now() - connection_open_start_time_); |
| 188 connection_open_start_time_ = base::TimeTicks(); | 176 connection_open_start_time_ = base::TimeTicks(); |
| 189 } | 177 } |
| 190 } | 178 } |
| 191 | 179 |
| 192 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { | 180 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { |
| 193 DCHECK(thread_checker_.CalledOnValidThread()); | 181 DCHECK(thread_checker_.CalledOnValidThread()); |
| 194 DCHECK(dispatcher_host_); | 182 DCHECK(dispatcher_host_); |
| 195 DCHECK(io_helper_); | 183 DCHECK(io_helper_); |
| 196 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 197 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 184 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 198 | 185 |
| 199 BrowserThread::PostTask( | 186 BrowserThread::PostTask( |
| 200 BrowserThread::IO, FROM_HERE, | 187 BrowserThread::IO, FROM_HERE, |
| 201 base::Bind(&IOThreadHelper::SendSuccessStringList, | 188 base::Bind(&IOThreadHelper::SendSuccessStringList, |
| 202 base::Unretained(io_helper_.get()), value)); | 189 base::Unretained(io_helper_.get()), value)); |
| 203 dispatcher_host_ = nullptr; | 190 dispatcher_host_ = nullptr; |
| 204 } | 191 } |
| 205 | 192 |
| 206 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { | 193 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { |
| 207 DCHECK(thread_checker_.CalledOnValidThread()); | 194 DCHECK(thread_checker_.CalledOnValidThread()); |
| 208 DCHECK(dispatcher_host_); | 195 DCHECK(dispatcher_host_); |
| 209 DCHECK(io_helper_); | 196 DCHECK(io_helper_); |
| 210 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 211 | 197 |
| 212 if (sent_blocked_) | 198 if (sent_blocked_) |
| 213 return; | 199 return; |
| 214 | 200 |
| 215 sent_blocked_ = true; | 201 sent_blocked_ = true; |
| 216 | 202 |
| 217 BrowserThread::PostTask( | 203 BrowserThread::PostTask( |
| 218 BrowserThread::IO, FROM_HERE, | 204 BrowserThread::IO, FROM_HERE, |
| 219 base::Bind(&IOThreadHelper::SendBlocked, | 205 base::Bind(&IOThreadHelper::SendBlocked, |
| 220 base::Unretained(io_helper_.get()), existing_version)); | 206 base::Unretained(io_helper_.get()), existing_version)); |
| 221 | 207 |
| 222 if (!connection_open_start_time_.is_null()) { | 208 if (!connection_open_start_time_.is_null()) { |
| 223 UMA_HISTOGRAM_MEDIUM_TIMES( | 209 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 224 "WebCore.IndexedDB.OpenTime.Blocked", | 210 "WebCore.IndexedDB.OpenTime.Blocked", |
| 225 base::TimeTicks::Now() - connection_open_start_time_); | 211 base::TimeTicks::Now() - connection_open_start_time_); |
| 226 connection_open_start_time_ = base::TimeTicks(); | 212 connection_open_start_time_ = base::TimeTicks(); |
| 227 } | 213 } |
| 228 } | 214 } |
| 229 | 215 |
| 230 void IndexedDBCallbacks::OnUpgradeNeeded( | 216 void IndexedDBCallbacks::OnUpgradeNeeded( |
| 231 int64_t old_version, | 217 int64_t old_version, |
| 232 std::unique_ptr<IndexedDBConnection> connection, | 218 std::unique_ptr<IndexedDBConnection> connection, |
| 233 const IndexedDBDatabaseMetadata& metadata, | 219 const IndexedDBDatabaseMetadata& metadata, |
| 234 const IndexedDBDataLossInfo& data_loss_info) { | 220 const IndexedDBDataLossInfo& data_loss_info) { |
| 235 DCHECK(thread_checker_.CalledOnValidThread()); | 221 DCHECK(thread_checker_.CalledOnValidThread()); |
| 236 DCHECK(dispatcher_host_); | 222 DCHECK(dispatcher_host_); |
| 237 DCHECK(io_helper_); | 223 DCHECK(io_helper_); |
| 238 | 224 |
| 239 DCHECK_NE(kNoTransaction, host_transaction_id_); | 225 DCHECK_NE(kNoTransaction, host_transaction_id_); |
| 240 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 241 DCHECK(!database_sent_); | 226 DCHECK(!database_sent_); |
| 242 | 227 |
| 243 data_loss_ = data_loss_info.status; | 228 data_loss_ = data_loss_info.status; |
| 244 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); | 229 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); |
| 245 database_sent_ = true; | 230 database_sent_ = true; |
| 246 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, | 231 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, |
| 247 dispatcher_host_); | 232 dispatcher_host_); |
| 248 | 233 |
| 249 BrowserThread::PostTask( | 234 BrowserThread::PostTask( |
| 250 BrowserThread::IO, FROM_HERE, | 235 BrowserThread::IO, FROM_HERE, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 261 } | 246 } |
| 262 } | 247 } |
| 263 | 248 |
| 264 void IndexedDBCallbacks::OnSuccess( | 249 void IndexedDBCallbacks::OnSuccess( |
| 265 std::unique_ptr<IndexedDBConnection> connection, | 250 std::unique_ptr<IndexedDBConnection> connection, |
| 266 const IndexedDBDatabaseMetadata& metadata) { | 251 const IndexedDBDatabaseMetadata& metadata) { |
| 267 DCHECK(thread_checker_.CalledOnValidThread()); | 252 DCHECK(thread_checker_.CalledOnValidThread()); |
| 268 DCHECK(dispatcher_host_); | 253 DCHECK(dispatcher_host_); |
| 269 DCHECK(io_helper_); | 254 DCHECK(io_helper_); |
| 270 | 255 |
| 271 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 272 DCHECK_NE(kNoTransaction, host_transaction_id_); | 256 DCHECK_NE(kNoTransaction, host_transaction_id_); |
| 273 DCHECK_EQ(database_sent_, !connection); | 257 DCHECK_EQ(database_sent_, !connection); |
| 274 | 258 |
| 275 scoped_refptr<IndexedDBCallbacks> self(this); | 259 scoped_refptr<IndexedDBCallbacks> self(this); |
| 276 | 260 |
| 277 // Only send a new Database if the connection was not previously sent in | 261 // Only send a new Database if the connection was not previously sent in |
| 278 // OnUpgradeNeeded. | 262 // OnUpgradeNeeded. |
| 279 std::unique_ptr<DatabaseImpl> database; | 263 std::unique_ptr<DatabaseImpl> database; |
| 280 if (!database_sent_) | 264 if (!database_sent_) |
| 281 database.reset( | 265 database.reset( |
| 282 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); | 266 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); |
| 283 | 267 |
| 284 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 268 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 285 base::Bind(&IOThreadHelper::SendSuccessDatabase, | 269 base::Bind(&IOThreadHelper::SendSuccessDatabase, |
| 286 base::Unretained(io_helper_.get()), | 270 base::Unretained(io_helper_.get()), |
| 287 base::Passed(&database), metadata)); | 271 base::Passed(&database), metadata)); |
| 288 dispatcher_host_ = nullptr; | 272 dispatcher_host_ = nullptr; |
| 289 | 273 |
| 290 if (!connection_open_start_time_.is_null()) { | 274 if (!connection_open_start_time_.is_null()) { |
| 291 UMA_HISTOGRAM_MEDIUM_TIMES( | 275 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 292 "WebCore.IndexedDB.OpenTime.Success", | 276 "WebCore.IndexedDB.OpenTime.Success", |
| 293 base::TimeTicks::Now() - connection_open_start_time_); | 277 base::TimeTicks::Now() - connection_open_start_time_); |
| 294 connection_open_start_time_ = base::TimeTicks(); | 278 connection_open_start_time_ = base::TimeTicks(); |
| 295 } | 279 } |
| 296 } | 280 } |
| 297 | 281 |
| 298 static std::string CreateBlobData( | |
| 299 const IndexedDBBlobInfo& blob_info, | |
| 300 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
| 301 base::TaskRunner* task_runner) { | |
| 302 if (!blob_info.uuid().empty()) { | |
| 303 // We're sending back a live blob, not a reference into our backing store. | |
| 304 return dispatcher_host->HoldBlobData(blob_info); | |
| 305 } | |
| 306 scoped_refptr<ShareableFileReference> shareable_file = | |
| 307 ShareableFileReference::Get(blob_info.file_path()); | |
| 308 if (!shareable_file.get()) { | |
| 309 shareable_file = ShareableFileReference::GetOrCreate( | |
| 310 blob_info.file_path(), | |
| 311 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, | |
| 312 task_runner); | |
| 313 if (!blob_info.release_callback().is_null()) | |
| 314 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); | |
| 315 } | |
| 316 return dispatcher_host->HoldBlobData(blob_info); | |
| 317 } | |
| 318 | |
| 319 static bool CreateAllBlobs( | |
| 320 const std::vector<IndexedDBBlobInfo>& blob_info, | |
| 321 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, | |
| 322 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { | |
| 323 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); | |
| 324 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | |
| 325 size_t i; | |
| 326 if (!dispatcher_host->blob_storage_context()) | |
| 327 return false; | |
| 328 for (i = 0; i < blob_info.size(); ++i) { | |
| 329 (*blob_or_file_info)[i].uuid = | |
| 330 CreateBlobData(blob_info[i], dispatcher_host, | |
| 331 dispatcher_host->context()->TaskRunner()); | |
| 332 } | |
| 333 return true; | |
| 334 } | |
| 335 | |
| 336 template <class ParamType, class MsgType> | |
| 337 static void CreateBlobsAndSend( | |
| 338 ParamType* params, | |
| 339 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
| 340 const std::vector<IndexedDBBlobInfo>& blob_info, | |
| 341 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { | |
| 342 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 343 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host)) | |
| 344 dispatcher_host->Send(new MsgType(*params)); | |
| 345 } | |
| 346 | |
| 347 static void BlobLookupForCursorPrefetch( | |
| 348 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params* params, | |
| 349 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
| 350 const std::vector<IndexedDBValue>& values) { | |
| 351 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 352 DCHECK_EQ(values.size(), params->values.size()); | |
| 353 | |
| 354 for (size_t i = 0; i < values.size(); ++i) { | |
| 355 if (!CreateAllBlobs(values[i].blob_info, | |
| 356 ¶ms->values[i].blob_or_file_info, dispatcher_host)) | |
| 357 return; | |
| 358 } | |
| 359 | |
| 360 dispatcher_host->Send( | |
| 361 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params)); | |
| 362 } | |
| 363 | |
| 364 static void FillInBlobData( | |
| 365 const std::vector<IndexedDBBlobInfo>& blob_info, | |
| 366 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { | |
| 367 for (const auto& iter : blob_info) { | |
| 368 if (iter.is_file()) { | |
| 369 IndexedDBMsg_BlobOrFileInfo info; | |
| 370 info.is_file = true; | |
| 371 info.mime_type = iter.type(); | |
| 372 info.file_name = iter.file_name(); | |
| 373 info.file_path = iter.file_path().AsUTF16Unsafe(); | |
| 374 info.size = iter.size(); | |
| 375 info.last_modified = iter.last_modified().ToDoubleT(); | |
| 376 blob_or_file_info->push_back(info); | |
| 377 } else { | |
| 378 IndexedDBMsg_BlobOrFileInfo info; | |
| 379 info.mime_type = iter.type(); | |
| 380 info.size = iter.size(); | |
| 381 blob_or_file_info->push_back(info); | |
| 382 } | |
| 383 } | |
| 384 } | |
| 385 | |
| 386 void IndexedDBCallbacks::RegisterBlobsAndSend( | |
| 387 const std::vector<IndexedDBBlobInfo>& blob_info, | |
| 388 const base::Closure& callback) { | |
| 389 for (const auto& iter : blob_info) { | |
| 390 if (!iter.mark_used_callback().is_null()) | |
| 391 iter.mark_used_callback().Run(); | |
| 392 } | |
| 393 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 394 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); | |
| 395 } | |
| 396 | |
| 397 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, | 282 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, |
| 398 const IndexedDBKey& key, | 283 const IndexedDBKey& key, |
| 399 const IndexedDBKey& primary_key, | 284 const IndexedDBKey& primary_key, |
| 400 IndexedDBValue* value) { | 285 IndexedDBValue* value) { |
| 401 DCHECK(thread_checker_.CalledOnValidThread()); | 286 DCHECK(thread_checker_.CalledOnValidThread()); |
| 402 DCHECK(dispatcher_host_); | 287 DCHECK(dispatcher_host_); |
| 403 DCHECK(io_helper_); | 288 DCHECK(io_helper_); |
| 404 | 289 |
| 405 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 406 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 290 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 407 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 291 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 408 | 292 |
| 293 std::unique_ptr<CursorImpl> cursor_impl( |
| 294 new CursorImpl(cursor, origin_, dispatcher_host_)); |
| 295 |
| 409 ::indexed_db::mojom::ValuePtr mojo_value; | 296 ::indexed_db::mojom::ValuePtr mojo_value; |
| 410 std::vector<IndexedDBBlobInfo> blob_info; | 297 std::vector<IndexedDBBlobInfo> blob_info; |
| 411 if (value) { | 298 if (value) { |
| 412 mojo_value = ::indexed_db::mojom::Value::New(); | 299 mojo_value = ::indexed_db::mojom::Value::New(); |
| 413 if (!value->empty()) | 300 if (!value->empty()) |
| 414 swap(mojo_value->bits, value->bits); | 301 swap(mojo_value->bits, value->bits); |
| 415 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); | 302 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); |
| 416 blob_info = value->blob_info; | 303 blob_info = value->blob_info; |
| 417 } | 304 } |
| 418 | 305 |
| 419 BrowserThread::PostTask( | 306 BrowserThread::PostTask( |
| 420 BrowserThread::IO, FROM_HERE, | 307 BrowserThread::IO, FROM_HERE, |
| 421 base::Bind(&IOThreadHelper::SendSuccessCursor, | 308 base::Bind(&IOThreadHelper::SendSuccessCursor, |
| 422 base::Unretained(io_helper_.get()), | 309 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), |
| 423 dispatcher_host_->Add(cursor.get()), key, primary_key, | 310 key, primary_key, base::Passed(&mojo_value), |
| 424 base::Passed(&mojo_value), base::Passed(&blob_info))); | 311 base::Passed(&blob_info))); |
| 425 dispatcher_host_ = nullptr; | 312 dispatcher_host_ = nullptr; |
| 426 } | 313 } |
| 427 | 314 |
| 428 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, | 315 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
| 429 const IndexedDBKey& primary_key, | 316 const IndexedDBKey& primary_key, |
| 430 IndexedDBValue* value) { | 317 IndexedDBValue* value) { |
| 431 DCHECK(thread_checker_.CalledOnValidThread()); | 318 DCHECK(thread_checker_.CalledOnValidThread()); |
| 432 DCHECK(dispatcher_host_); | 319 DCHECK(dispatcher_host_); |
| 433 DCHECK(!io_helper_); | 320 DCHECK(io_helper_); |
| 434 | 321 |
| 435 DCHECK_NE(kNoCursor, ipc_cursor_id_); | |
| 436 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 322 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 437 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 323 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 438 | 324 |
| 439 IndexedDBCursor* idb_cursor = | 325 ::indexed_db::mojom::ValuePtr mojo_value; |
| 440 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); | 326 std::vector<IndexedDBBlobInfo> blob_info; |
| 327 if (value) { |
| 328 mojo_value = ::indexed_db::mojom::Value::New(); |
| 329 if (!value->empty()) |
| 330 std::swap(mojo_value->bits, value->bits); |
| 331 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); |
| 332 blob_info = value->blob_info; |
| 333 } |
| 441 | 334 |
| 442 DCHECK(idb_cursor); | 335 BrowserThread::PostTask( |
| 443 if (!idb_cursor) | 336 BrowserThread::IO, FROM_HERE, |
| 444 return; | 337 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, |
| 445 | 338 base::Unretained(io_helper_.get()), key, primary_key, |
| 446 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( | 339 base::Passed(&mojo_value), base::Passed(&blob_info))); |
| 447 new IndexedDBMsg_CallbacksSuccessCursorContinue_Params()); | |
| 448 params->ipc_thread_id = ipc_thread_id_; | |
| 449 params->ipc_callbacks_id = ipc_callbacks_id_; | |
| 450 params->ipc_cursor_id = ipc_cursor_id_; | |
| 451 params->key = key; | |
| 452 params->primary_key = primary_key; | |
| 453 if (value && !value->empty()) | |
| 454 swap(params->value.bits, value->bits); | |
| 455 // TODO(alecflett): Avoid a copy here: the whole params object is | |
| 456 // being copied into the message. | |
| 457 if (!value || value->blob_info.empty()) { | |
| 458 dispatcher_host_->Send( | |
| 459 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params)); | |
| 460 } else { | |
| 461 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get(); | |
| 462 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); | |
| 463 RegisterBlobsAndSend( | |
| 464 value->blob_info, | |
| 465 base::Bind(CreateBlobsAndSend< | |
| 466 IndexedDBMsg_CallbacksSuccessCursorContinue_Params, | |
| 467 IndexedDBMsg_CallbacksSuccessCursorContinue>, | |
| 468 base::Owned(params.release()), dispatcher_host_, | |
| 469 value->blob_info, | |
| 470 base::Unretained(&p->value.blob_or_file_info))); | |
| 471 } | |
| 472 dispatcher_host_ = nullptr; | 340 dispatcher_host_ = nullptr; |
| 473 } | 341 } |
| 474 | 342 |
| 475 void IndexedDBCallbacks::OnSuccessWithPrefetch( | 343 void IndexedDBCallbacks::OnSuccessWithPrefetch( |
| 476 const std::vector<IndexedDBKey>& keys, | 344 const std::vector<IndexedDBKey>& keys, |
| 477 const std::vector<IndexedDBKey>& primary_keys, | 345 const std::vector<IndexedDBKey>& primary_keys, |
| 478 std::vector<IndexedDBValue>* values) { | 346 std::vector<IndexedDBValue>* values) { |
| 479 DCHECK(thread_checker_.CalledOnValidThread()); | 347 DCHECK(thread_checker_.CalledOnValidThread()); |
| 480 DCHECK(dispatcher_host_); | 348 DCHECK(dispatcher_host_); |
| 481 DCHECK(!io_helper_); | 349 DCHECK(io_helper_); |
| 482 DCHECK_EQ(keys.size(), primary_keys.size()); | 350 DCHECK_EQ(keys.size(), primary_keys.size()); |
| 483 DCHECK_EQ(keys.size(), values->size()); | 351 DCHECK_EQ(keys.size(), values->size()); |
| 484 | 352 |
| 485 DCHECK_NE(kNoCursor, ipc_cursor_id_); | |
| 486 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 353 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 487 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 354 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 488 | 355 |
| 489 std::vector<IndexedDBKey> msg_keys; | 356 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; |
| 490 std::vector<IndexedDBKey> msg_primary_keys; | 357 mojo_values.reserve(values->size()); |
| 358 for (size_t i = 0; i < values->size(); ++i) |
| 359 mojo_values.push_back(ConvertValue(&(*values)[i])); |
| 491 | 360 |
| 492 for (size_t i = 0; i < keys.size(); ++i) { | 361 BrowserThread::PostTask( |
| 493 msg_keys.push_back(keys[i]); | 362 BrowserThread::IO, FROM_HERE, |
| 494 msg_primary_keys.push_back(primary_keys[i]); | 363 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, |
| 495 } | 364 base::Unretained(io_helper_.get()), keys, primary_keys, |
| 496 | 365 base::Passed(&mojo_values), *values)); |
| 497 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params( | |
| 498 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params()); | |
| 499 params->ipc_thread_id = ipc_thread_id_; | |
| 500 params->ipc_callbacks_id = ipc_callbacks_id_; | |
| 501 params->ipc_cursor_id = ipc_cursor_id_; | |
| 502 params->keys = msg_keys; | |
| 503 params->primary_keys = msg_primary_keys; | |
| 504 params->values.resize(values->size()); | |
| 505 | |
| 506 bool found_blob_info = false; | |
| 507 for (size_t i = 0; i < values->size(); ++i) { | |
| 508 params->values[i].bits.swap(values->at(i).bits); | |
| 509 if (!values->at(i).blob_info.empty()) { | |
| 510 found_blob_info = true; | |
| 511 FillInBlobData(values->at(i).blob_info, | |
| 512 ¶ms->values[i].blob_or_file_info); | |
| 513 for (const auto& blob_iter : values->at(i).blob_info) { | |
| 514 if (!blob_iter.mark_used_callback().is_null()) | |
| 515 blob_iter.mark_used_callback().Run(); | |
| 516 } | |
| 517 } | |
| 518 } | |
| 519 | |
| 520 if (found_blob_info) { | |
| 521 BrowserThread::PostTask(BrowserThread::IO, | |
| 522 FROM_HERE, | |
| 523 base::Bind(BlobLookupForCursorPrefetch, | |
| 524 base::Owned(params.release()), | |
| 525 dispatcher_host_, | |
| 526 *values)); | |
| 527 } else { | |
| 528 dispatcher_host_->Send( | |
| 529 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); | |
| 530 } | |
| 531 dispatcher_host_ = nullptr; | 366 dispatcher_host_ = nullptr; |
| 532 } | 367 } |
| 533 | 368 |
| 534 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { | 369 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
| 535 DCHECK(thread_checker_.CalledOnValidThread()); | 370 DCHECK(thread_checker_.CalledOnValidThread()); |
| 536 DCHECK(dispatcher_host_); | 371 DCHECK(dispatcher_host_); |
| 537 | 372 |
| 538 if (value && value->primary_key.IsValid()) { | |
| 539 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 540 } else { | |
| 541 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); | |
| 542 } | |
| 543 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 373 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 544 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 374 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 545 | 375 |
| 546 if (io_helper_) { | 376 ::indexed_db::mojom::ReturnValuePtr mojo_value; |
| 547 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | 377 std::vector<IndexedDBBlobInfo> blob_info; |
| 378 if (value) { |
| 379 mojo_value = ConvertReturnValue(value); |
| 380 blob_info = value->blob_info; |
| 381 } |
| 548 | 382 |
| 549 ::indexed_db::mojom::ReturnValuePtr mojo_value; | 383 BrowserThread::PostTask( |
| 550 std::vector<IndexedDBBlobInfo> blob_info; | 384 BrowserThread::IO, FROM_HERE, |
| 551 if (value) { | 385 base::Bind(&IOThreadHelper::SendSuccessValue, |
| 552 mojo_value = ConvertReturnValue(value); | 386 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), |
| 553 blob_info = value->blob_info; | 387 base::Passed(&blob_info))); |
| 554 } | |
| 555 BrowserThread::PostTask( | |
| 556 BrowserThread::IO, FROM_HERE, | |
| 557 base::Bind(&IOThreadHelper::SendSuccessValue, | |
| 558 base::Unretained(io_helper_.get()), | |
| 559 base::Passed(&mojo_value), base::Passed(&blob_info))); | |
| 560 } else { | |
| 561 auto params = base::MakeUnique<IndexedDBMsg_CallbacksSuccessValue_Params>(); | |
| 562 params->ipc_thread_id = ipc_thread_id_; | |
| 563 params->ipc_callbacks_id = ipc_callbacks_id_; | |
| 564 if (value && value->primary_key.IsValid()) { | |
| 565 params->value.primary_key = value->primary_key; | |
| 566 params->value.key_path = value->key_path; | |
| 567 } | |
| 568 if (value && !value->empty()) | |
| 569 swap(params->value.bits, value->bits); | |
| 570 if (!value || value->blob_info.empty()) { | |
| 571 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params)); | |
| 572 } else { | |
| 573 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get(); | |
| 574 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); | |
| 575 RegisterBlobsAndSend( | |
| 576 value->blob_info, | |
| 577 base::Bind( | |
| 578 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params, | |
| 579 IndexedDBMsg_CallbacksSuccessValue>, | |
| 580 base::Owned(params.release()), dispatcher_host_, value->blob_info, | |
| 581 base::Unretained(&p->value.blob_or_file_info))); | |
| 582 } | |
| 583 } | |
| 584 dispatcher_host_ = nullptr; | 388 dispatcher_host_ = nullptr; |
| 585 } | 389 } |
| 586 | 390 |
| 587 void IndexedDBCallbacks::OnSuccessArray( | 391 void IndexedDBCallbacks::OnSuccessArray( |
| 588 std::vector<IndexedDBReturnValue>* values) { | 392 std::vector<IndexedDBReturnValue>* values) { |
| 589 DCHECK(thread_checker_.CalledOnValidThread()); | 393 DCHECK(thread_checker_.CalledOnValidThread()); |
| 590 DCHECK(dispatcher_host_); | 394 DCHECK(dispatcher_host_); |
| 591 DCHECK(io_helper_); | 395 DCHECK(io_helper_); |
| 592 | 396 |
| 593 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 397 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 594 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 398 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 595 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 596 | 399 |
| 597 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; | 400 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; |
| 598 mojo_values.reserve(values->size()); | 401 mojo_values.reserve(values->size()); |
| 599 for (size_t i = 0; i < values->size(); ++i) | 402 for (size_t i = 0; i < values->size(); ++i) |
| 600 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); | 403 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); |
| 601 | 404 |
| 602 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 405 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 603 base::Bind(&IOThreadHelper::SendSuccessArray, | 406 base::Bind(&IOThreadHelper::SendSuccessArray, |
| 604 base::Unretained(io_helper_.get()), | 407 base::Unretained(io_helper_.get()), |
| 605 base::Passed(&mojo_values), *values)); | 408 base::Passed(&mojo_values), *values)); |
| 606 dispatcher_host_ = nullptr; | 409 dispatcher_host_ = nullptr; |
| 607 } | 410 } |
| 608 | 411 |
| 609 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { | 412 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { |
| 610 DCHECK(thread_checker_.CalledOnValidThread()); | 413 DCHECK(thread_checker_.CalledOnValidThread()); |
| 611 DCHECK(dispatcher_host_); | 414 DCHECK(dispatcher_host_); |
| 612 DCHECK(io_helper_); | 415 DCHECK(io_helper_); |
| 613 | 416 |
| 614 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 615 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 417 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 616 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 418 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 617 | 419 |
| 618 BrowserThread::PostTask( | 420 BrowserThread::PostTask( |
| 619 BrowserThread::IO, FROM_HERE, | 421 BrowserThread::IO, FROM_HERE, |
| 620 base::Bind(&IOThreadHelper::SendSuccessKey, | 422 base::Bind(&IOThreadHelper::SendSuccessKey, |
| 621 base::Unretained(io_helper_.get()), value)); | 423 base::Unretained(io_helper_.get()), value)); |
| 622 dispatcher_host_ = nullptr; | 424 dispatcher_host_ = nullptr; |
| 623 } | 425 } |
| 624 | 426 |
| 625 void IndexedDBCallbacks::OnSuccess(int64_t value) { | 427 void IndexedDBCallbacks::OnSuccess(int64_t value) { |
| 626 DCHECK(thread_checker_.CalledOnValidThread()); | 428 DCHECK(thread_checker_.CalledOnValidThread()); |
| 627 DCHECK(dispatcher_host_); | 429 DCHECK(dispatcher_host_); |
| 628 if (io_helper_) { | |
| 629 BrowserThread::PostTask( | |
| 630 BrowserThread::IO, FROM_HERE, | |
| 631 base::Bind(&IOThreadHelper::SendSuccessInteger, | |
| 632 base::Unretained(io_helper_.get()), value)); | |
| 633 } else { | |
| 634 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 635 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 636 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | |
| 637 | 430 |
| 638 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( | 431 BrowserThread::PostTask( |
| 639 ipc_thread_id_, ipc_callbacks_id_, value)); | 432 BrowserThread::IO, FROM_HERE, |
| 640 } | 433 base::Bind(&IOThreadHelper::SendSuccessInteger, |
| 434 base::Unretained(io_helper_.get()), value)); |
| 641 dispatcher_host_ = nullptr; | 435 dispatcher_host_ = nullptr; |
| 642 } | 436 } |
| 643 | 437 |
| 644 void IndexedDBCallbacks::OnSuccess() { | 438 void IndexedDBCallbacks::OnSuccess() { |
| 645 DCHECK(thread_checker_.CalledOnValidThread()); | 439 DCHECK(thread_checker_.CalledOnValidThread()); |
| 646 DCHECK(dispatcher_host_); | 440 DCHECK(dispatcher_host_); |
| 647 DCHECK(io_helper_); | 441 DCHECK(io_helper_); |
| 648 | 442 |
| 649 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
| 650 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 443 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 651 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 444 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 652 | 445 |
| 653 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 446 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 654 base::Bind(&IOThreadHelper::SendSuccess, | 447 base::Bind(&IOThreadHelper::SendSuccess, |
| 655 base::Unretained(io_helper_.get()))); | 448 base::Unretained(io_helper_.get()))); |
| 656 dispatcher_host_ = nullptr; | 449 dispatcher_host_ = nullptr; |
| 657 } | 450 } |
| 658 | 451 |
| 659 bool IndexedDBCallbacks::IsValid() const { | 452 bool IndexedDBCallbacks::IsValid() const { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 if (database) { | 506 if (database) { |
| 714 ::indexed_db::mojom::DatabaseAssociatedRequest request; | 507 ::indexed_db::mojom::DatabaseAssociatedRequest request; |
| 715 callbacks_.associated_group()->CreateAssociatedInterface( | 508 callbacks_.associated_group()->CreateAssociatedInterface( |
| 716 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); | 509 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
| 717 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); | 510 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); |
| 718 } | 511 } |
| 719 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); | 512 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); |
| 720 } | 513 } |
| 721 | 514 |
| 722 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( | 515 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( |
| 723 int32_t cursor_id, | 516 std::unique_ptr<CursorImpl> cursor, |
| 724 const IndexedDBKey& key, | 517 const IndexedDBKey& key, |
| 725 const IndexedDBKey& primary_key, | 518 const IndexedDBKey& primary_key, |
| 726 ::indexed_db::mojom::ValuePtr value, | 519 ::indexed_db::mojom::ValuePtr value, |
| 727 const std::vector<IndexedDBBlobInfo>& blob_info) { | 520 const std::vector<IndexedDBBlobInfo>& blob_info) { |
| 728 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) | 521 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info)) |
| 729 callbacks_->SuccessCursor(cursor_id, key, primary_key, std::move(value)); | 522 return; |
| 523 |
| 524 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info; |
| 525 ::indexed_db::mojom::CursorAssociatedRequest request; |
| 526 callbacks_.associated_group()->CreateAssociatedInterface( |
| 527 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
| 528 mojo::MakeStrongAssociatedBinding(std::move(cursor), std::move(request)); |
| 529 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key, |
| 530 std::move(value)); |
| 730 } | 531 } |
| 731 | 532 |
| 732 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( | 533 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( |
| 733 ::indexed_db::mojom::ReturnValuePtr value, | 534 ::indexed_db::mojom::ReturnValuePtr value, |
| 734 const std::vector<IndexedDBBlobInfo>& blob_info) { | 535 const std::vector<IndexedDBBlobInfo>& blob_info) { |
| 735 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) | 536 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) |
| 736 callbacks_->SuccessValue(std::move(value)); | 537 callbacks_->SuccessValue(std::move(value)); |
| 737 } | 538 } |
| 738 | 539 |
| 739 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( | 540 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( |
| 740 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, | 541 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, |
| 741 const std::vector<IndexedDBReturnValue>& values) { | 542 const std::vector<IndexedDBReturnValue>& values) { |
| 742 DCHECK_EQ(mojo_values.size(), values.size()); | 543 DCHECK_EQ(mojo_values.size(), values.size()); |
| 743 | 544 |
| 744 for (size_t i = 0; i < mojo_values.size(); ++i) { | 545 for (size_t i = 0; i < mojo_values.size(); ++i) { |
| 745 if (!CreateAllBlobs(values[i].blob_info, | 546 if (!CreateAllBlobs(values[i].blob_info, |
| 746 &mojo_values[i]->value->blob_or_file_info)) | 547 &mojo_values[i]->value->blob_or_file_info)) |
| 747 return; | 548 return; |
| 748 } | 549 } |
| 749 callbacks_->SuccessArray(std::move(mojo_values)); | 550 callbacks_->SuccessArray(std::move(mojo_values)); |
| 750 } | 551 } |
| 751 | 552 |
| 553 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue( |
| 554 const IndexedDBKey& key, |
| 555 const IndexedDBKey& primary_key, |
| 556 ::indexed_db::mojom::ValuePtr value, |
| 557 const std::vector<IndexedDBBlobInfo>& blob_info) { |
| 558 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) |
| 559 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value)); |
| 560 } |
| 561 |
| 562 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch( |
| 563 const std::vector<IndexedDBKey>& keys, |
| 564 const std::vector<IndexedDBKey>& primary_keys, |
| 565 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, |
| 566 const std::vector<IndexedDBValue>& values) { |
| 567 DCHECK_EQ(mojo_values.size(), values.size()); |
| 568 |
| 569 for (size_t i = 0; i < mojo_values.size(); ++i) { |
| 570 if (!CreateAllBlobs(values[i].blob_info, |
| 571 &mojo_values[i]->blob_or_file_info)) { |
| 572 return; |
| 573 } |
| 574 } |
| 575 |
| 576 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values)); |
| 577 } |
| 578 |
| 752 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( | 579 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( |
| 753 const IndexedDBKey& value) { | 580 const IndexedDBKey& value) { |
| 754 callbacks_->SuccessKey(value); | 581 callbacks_->SuccessKey(value); |
| 755 } | 582 } |
| 756 | 583 |
| 757 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { | 584 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { |
| 758 callbacks_->SuccessInteger(value); | 585 callbacks_->SuccessInteger(value); |
| 759 } | 586 } |
| 760 | 587 |
| 761 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { | 588 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 787 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); | 614 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); |
| 788 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | 615 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); |
| 789 if (!dispatcher_host_->blob_storage_context()) | 616 if (!dispatcher_host_->blob_storage_context()) |
| 790 return false; | 617 return false; |
| 791 for (size_t i = 0; i < blob_info.size(); ++i) | 618 for (size_t i = 0; i < blob_info.size(); ++i) |
| 792 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); | 619 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); |
| 793 return true; | 620 return true; |
| 794 } | 621 } |
| 795 | 622 |
| 796 } // namespace content | 623 } // namespace content |
| OLD | NEW |