summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/webdatabase/web_database_host.cc
blob: d3615747f14f14712ae54413c324ed758ea36edd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/blink/renderer/modules/webdatabase/web_database_host.h"

#include <utility>

#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/webdatabase/web_database.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin.h"
#include "third_party/sqlite/sqlite3.h"

namespace blink {

WebDatabaseHost* WebDatabaseHost::instance_ = nullptr;

// static
WebDatabaseHost& WebDatabaseHost::GetInstance() {
  DEFINE_STATIC_LOCAL(WebDatabaseHost, instance, ());
  return instance;
}

void WebDatabaseHost::Init() {
  Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
      pending_remote_.InitWithNewPipeAndPassReceiver());
}

WebDatabaseHost::WebDatabaseHost()
    : main_thread_task_runner_(Thread::MainThread()->GetTaskRunner()) {}

mojom::blink::WebDatabaseHost& WebDatabaseHost::GetWebDatabaseHost() {
  if (!shared_remote_) {
    DCHECK(pending_remote_);
    shared_remote_ = mojo::SharedRemote<mojom::blink::WebDatabaseHost>(
        std::move(pending_remote_), base::ThreadPool::CreateSequencedTaskRunner(
                                        {base::WithBaseSyncPrimitives()}));
  }

  return *shared_remote_;
}

base::File WebDatabaseHost::OpenFile(const String& vfs_file_name,
                                     int desired_flags) {
  base::File file;
  GetWebDatabaseHost().OpenFile(vfs_file_name, desired_flags, &file);
  return file;
}

int WebDatabaseHost::DeleteFile(const String& vfs_file_name, bool sync_dir) {
  int rv = SQLITE_IOERR_DELETE;
  GetWebDatabaseHost().DeleteFile(vfs_file_name, sync_dir, &rv);
  return rv;
}

int32_t WebDatabaseHost::GetFileAttributes(const String& vfs_file_name) {
  int32_t rv = -1;
  GetWebDatabaseHost().GetFileAttributes(vfs_file_name, &rv);
  return rv;
}

int64_t WebDatabaseHost::GetFileSize(const String& vfs_file_name) {
  int64_t rv = 0LL;
  GetWebDatabaseHost().GetFileSize(vfs_file_name, &rv);
  return rv;
}

bool WebDatabaseHost::SetFileSize(const String& vfs_file_name, int64_t size) {
  bool rv = false;
  GetWebDatabaseHost().SetFileSize(vfs_file_name, size, &rv);
  return rv;
}

int64_t WebDatabaseHost::GetSpaceAvailableForOrigin(
    const SecurityOrigin& origin) {
  int64_t rv = 0LL;
  GetWebDatabaseHost().GetSpaceAvailable(&origin, &rv);
  return rv;
}

void WebDatabaseHost::DatabaseOpened(const SecurityOrigin& origin,
                                     const String& database_name,
                                     const String& database_display_name,
                                     uint32_t estimated_size) {
  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
  GetWebDatabaseHost().Opened(&origin, database_name, database_display_name,
                              estimated_size);
}

void WebDatabaseHost::DatabaseModified(const SecurityOrigin& origin,
                                       const String& database_name) {
  DCHECK(!main_thread_task_runner_->RunsTasksInCurrentSequence());
  GetWebDatabaseHost().Modified(&origin, database_name);
}

void WebDatabaseHost::DatabaseClosed(const SecurityOrigin& origin,
                                     const String& database_name) {
  DCHECK(!main_thread_task_runner_->RunsTasksInCurrentSequence());
  GetWebDatabaseHost().Closed(&origin, database_name);
}

void WebDatabaseHost::ReportSqliteError(const SecurityOrigin& origin,
                                        const String& database_name,
                                        int error) {
  DCHECK(!main_thread_task_runner_->RunsTasksInCurrentSequence());

  // We filter out errors which the backend doesn't act on to avoid a
  // unnecessary ipc traffic, this method can get called at a fairly high
  // frequency (per-sqlstatement).
  if (error != SQLITE_CORRUPT && error != SQLITE_NOTADB)
    return;

  GetWebDatabaseHost().HandleSqliteError(&origin, database_name, error);
}
}  // namespace blink