1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_CALLBACKS_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_CALLBACKS_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string16.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_database_error.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_dispatcher_host.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/indexed_db/indexed_db_key.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/indexed_db/indexed_db_key_path.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass IndexedDBBlobInfo;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBConnection;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBCursor;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBDatabase;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBDatabaseCallbacks;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct IndexedDBDatabaseMetadata;
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct IndexedDBValue;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CONTENT_EXPORT IndexedDBCallbacks
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public base::RefCounted<IndexedDBCallbacks> {
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Simple payload responses
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_thread_id,
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_callbacks_id);
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBCursor responses
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_thread_id,
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_callbacks_id,
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_cursor_id);
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase responses
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_thread_id,
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_callbacks_id,
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int32 ipc_database_callbacks_id,
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     int64 host_transaction_id,
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     const GURL& origin_url);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnError(const IndexedDBDatabaseError& error);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBFactory::GetDatabaseNames
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnSuccess(const std::vector<base::string16>& string);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBFactory::Open / DeleteDatabase
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnBlocked(int64 existing_version);
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBFactory::Open
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnDataLoss(blink::WebIDBDataLoss data_loss,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          std::string data_loss_message);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnUpgradeNeeded(
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int64 old_version,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      scoped_ptr<IndexedDBConnection> connection,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const content::IndexedDBDatabaseMetadata& metadata);
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccess(scoped_ptr<IndexedDBConnection> connection,
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const content::IndexedDBDatabaseMetadata& metadata);
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::OpenCursor
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const IndexedDBKey& key,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const IndexedDBKey& primary_key,
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         IndexedDBValue* value);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBCursor::Continue / Advance
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccess(const IndexedDBKey& key,
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const IndexedDBKey& primary_key,
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         IndexedDBValue* value);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBCursor::PrefetchContinue
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccessWithPrefetch(
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::vector<IndexedDBKey>& keys,
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::vector<IndexedDBKey>& primary_keys,
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::vector<IndexedDBValue>* values);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::Get (with key injection)
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void OnSuccess(IndexedDBValue* value,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const IndexedDBKey& key,
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         const IndexedDBKeyPath& key_path);
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::Get
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void OnSuccess(IndexedDBValue* value);
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::Put / IndexedDBCursor::Update
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void OnSuccess(const IndexedDBKey& key);
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::Count
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // IndexedDBFactory::DeleteDatabase
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccess(int64 value);
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase::Delete
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBCursor::Continue / Advance (when complete)
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnSuccess();
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blink::WebIDBDataLoss data_loss() const { return data_loss_; }
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void SetConnectionOpenStartTime(const base::TimeTicks& start_time);
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~IndexedDBCallbacks();
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void RegisterBlobsAndSend(const std::vector<IndexedDBBlobInfo>& blob_info,
1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                            const base::Closure& callback);
1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  friend class base::RefCounted<IndexedDBCallbacks>;
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Originally from IndexedDBCallbacks:
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int32 ipc_callbacks_id_;
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int32 ipc_thread_id_;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBCursor callbacks ------------------------
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int32 ipc_cursor_id_;
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // IndexedDBDatabase callbacks ------------------------
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int64 host_transaction_id_;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL origin_url_;
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int32 ipc_database_id_;
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int32 ipc_database_callbacks_id_;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Stored in OnDataLoss, merged with OnUpgradeNeeded response.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  blink::WebIDBDataLoss data_loss_;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string data_loss_message_;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The "blocked" event should be sent at most once per request.
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool sent_blocked_;
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::TimeTicks connection_open_start_time_;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBCallbacks);
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_CALLBACKS_H_
147