File: web_app_database.h

package info (click to toggle)
chromium 138.0.7204.157-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,864 kB
  • sloc: cpp: 34,936,859; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,967; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (154 lines) | stat: -rw-r--r-- 6,150 bytes parent folder | download | duplicates (3)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_DATABASE_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_DATABASE_H_

#include <memory>
#include <optional>

#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "chrome/browser/web_applications/proto/web_app.pb.h"
#include "chrome/browser/web_applications/proto/web_app_database_metadata.pb.h"
#include "chrome/browser/web_applications/web_app_constants.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "components/sync/model/data_type_store.h"
#include "components/sync/protocol/web_app_specifics.pb.h"
#include "components/webapps/common/web_app_id.h"

namespace syncer {
class ModelError;
class MetadataBatch;
class MetadataChangeList;
}  // namespace syncer

namespace web_app {

class AbstractWebAppDatabaseFactory;
class WebApp;
namespace proto {
class WebApp;
}  // namespace proto
struct RegistryUpdateData;

// Exclusively used from the UI thread.
class WebAppDatabase {
 public:
  using ReportErrorCallback =
      base::RepeatingCallback<void(const syncer::ModelError&)>;

  static constexpr std::string_view kDatabaseMetadataKey = "DATABASE_METADATA";

  WebAppDatabase(AbstractWebAppDatabaseFactory* database_factory,
                 ReportErrorCallback error_callback);
  WebAppDatabase(const WebAppDatabase&) = delete;
  WebAppDatabase& operator=(const WebAppDatabase&) = delete;
  ~WebAppDatabase();

  using RegistryOpenedCallback = base::OnceCallback<void(
      Registry registry,
      std::unique_ptr<syncer::MetadataBatch> metadata_batch)>;
  // Open existing or create new DB. Read all data and return it via callback.
  void OpenDatabase(RegistryOpenedCallback callback);

  using CompletionCallback = base::OnceCallback<void(bool success)>;
  void Write(const RegistryUpdateData& update_data,
             std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
             CompletionCallback callback);

  bool is_opened() const { return opened_; }

  // Returns the version that the database will be migrated to when opened.
  // - No version/version 0 is the original version.
  // - Version 1 introduces the UserInstalled install source, migration between
  //   0 and 1 add or remove this source.
  // - Version 2 migrates shortcut apps to DIY apps, ensures platform user
  //   display mode is set, and fixes partial install state inconsistencies.
  // - Version 3 migrates deprecated launch handler fields to client_mode,
  //   removes query/ref from scope, and ensures relative_manifest_id exists
  //   without fragments.
  static int GetCurrentDatabaseVersion();

 private:
  struct ProtobufState {
    ProtobufState();
    ~ProtobufState();
    ProtobufState(ProtobufState&&);
    ProtobufState& operator=(ProtobufState&&);

    proto::DatabaseMetadata metadata;
    base::flat_map<webapps::AppId, proto::WebApp> apps;
  };

  ProtobufState ParseProtobufs(
      const syncer::DataTypeStore::RecordList& data_records) const;

  void MigrateDatabase(ProtobufState& state);
  void MigrateInstallSourceAddUserInstalled(
      ProtobufState& state,
      std::set<webapps::AppId>& changed_apps);
  // Migrates apps that were created as shortcuts (empty scope or installed via
  // "Create shortcut") to be DIY apps with a valid scope derived from the start
  // URL.
  void MigrateShortcutAppsToDiyApps(ProtobufState& state,
                                    std::set<webapps::AppId>& changed_apps);
  // Ensures that the user display mode is set for the current platform in the
  // sync proto. If it's missing, it derives it from the other platform's
  // setting or defaults to STANDALONE.
  void MigrateDefaultDisplayModeToPlatformDisplayMode(
      ProtobufState& state,
      std::set<webapps::AppId>& changed_apps);
  // Corrects the install_state for apps that claim OS integration but lack the
  // necessary OS integration state data.
  void MigratePartiallyInstalledAppsToCorrectState(
      ProtobufState& state,
      std::set<webapps::AppId>& changed_apps);
  // Migrates deprecated launch handler fields (`route_to`,
  // `navigate_existing_client`) to the `client_mode` field. Also handles the
  // `client_mode_valid_and_specified` field correctly.
  void MigrateDeprecatedLaunchHandlerToClientMode(
      ProtobufState& state,
      std::set<webapps::AppId>& changed_apps);
  // Migrates the `scope` field by removing any query or ref components.
  void MigrateScopeToRemoveRefAndQuery(ProtobufState& state,
                                       std::set<webapps::AppId>& changed_apps);
  // Ensures the `relative_manifest_id` field exists and does not contain URL
  // fragments. Populates it from the start_url if missing. Records a histogram
  // if an existing fragment needed removal.
  void MigrateToRelativeManifestIdNoFragment(
      ProtobufState& state,
      std::set<webapps::AppId>& changed_apps);

  void OnDatabaseOpened(RegistryOpenedCallback callback,
                        const std::optional<syncer::ModelError>& error,
                        std::unique_ptr<syncer::DataTypeStore> store);

  void OnAllDataAndMetadataRead(
      RegistryOpenedCallback callback,
      const std::optional<syncer::ModelError>& error,
      std::unique_ptr<syncer::DataTypeStore::RecordList> data_records,
      std::unique_ptr<syncer::MetadataBatch> metadata_batch);

  void OnDataWritten(CompletionCallback callback,
                     const std::optional<syncer::ModelError>& error);

  std::unique_ptr<syncer::DataTypeStore> store_;
  const raw_ptr<AbstractWebAppDatabaseFactory, DanglingUntriaged>
      database_factory_;
  ReportErrorCallback error_callback_;

  // Database is opened if store is created and all data read.
  bool opened_ = false;

  SEQUENCE_CHECKER(sequence_checker_);

  base::WeakPtrFactory<WebAppDatabase> weak_ptr_factory_{this};
};

}  // namespace web_app

#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_DATABASE_H_