| // 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. |
| 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); |
| |
| 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_ |