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_
|