[M108 Migration] Avoid creation of PersonalDataManager from pre-launched wrt-loader 42/287942/2
authorayush.k123 <ayush.k123@samsung.com>
Wed, 8 Feb 2023 05:20:29 +0000 (10:50 +0530)
committerBot Blink <blinkbot@samsung.com>
Fri, 10 Feb 2023 22:46:17 +0000 (22:46 +0000)
The db path is determined after the webapp is launched. So it should
hold to create instance to access DB until the actual webapp is
launched from prelaunched wrt-loader.
The PersonalDataManager instance will be created when it is actually
used, not the BrowserContextEfl constructor. This patch fixes the
db lock issue with ubrowser by pre-launched wrt-loader process.

Reference: https://review.tizen.org/gerrit/280947/

Change-Id: I42ae897a6fa06230010170103f933cc8b10877ec
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
tizen_src/ewk/efl_integration/browser/autofill/personal_data_manager_factory.cc
tizen_src/ewk/efl_integration/browser/autofill/personal_data_manager_factory.h
tizen_src/ewk/efl_integration/browser_context_efl.cc

index 0bf0c5b..934d66e 100644 (file)
@@ -22,43 +22,46 @@ PersonalDataManagerFactoryEfl* PersonalDataManagerFactoryEfl::GetInstance() {
   return base::Singleton<PersonalDataManagerFactoryEfl>::get();
 }
 
-void PersonalDataManagerFactoryEfl::PersonalDataManagerAdd(
-    content::BrowserContext* ctx) {
-  DCHECK(ctx);
-
-  if (ctx) {
-    uint64_t uniqueId = reinterpret_cast<uint64_t>(ctx);
-    PersonalDataManager* mgr = personal_data_manager_id_map_.Lookup(uniqueId);
-    if (!mgr) {
-      // TODO: LOCALE!
-      PrefService* srv = user_prefs::UserPrefs::Get(ctx);
-      CHECK(srv);
-      auto* client = content::GetContentClientExport()->browser();
-      mgr = new PersonalDataManager(client->GetApplicationLocale());
-      mgr->Init(WebDataServiceFactoryEfl::GetAutofillWebDataForProfile(),
-                nullptr, srv, nullptr,
-                nullptr,  // TODO(djmix.kim) : pass nullptr for bringup
-                nullptr,  // TODO(djmix.kim) : pass nullptr for bringup
-                nullptr,  // TODO(djmix.kim) : pass nullptr for bringup
-                nullptr,  // TODO(djmix.kim) : pass nullptr for bringup
-                ctx->IsOffTheRecord());
-      mgr->AddObserver(this);
-      personal_data_manager_id_map_.AddWithID(mgr, uniqueId);
-    }
-  }
-}
-
 void PersonalDataManagerFactoryEfl::PersonalDataManagerRemove(
-    content::BrowserContext* ctx) {
-  uint64_t uniqueId = reinterpret_cast<uint64_t>(ctx);
-  personal_data_manager_id_map_.Remove(uniqueId);
+    content::BrowserContext* context) {
+  uint64_t unique_id = reinterpret_cast<uint64_t>(context);
+  PersonalDataManager* manager =
+      personal_data_manager_id_map_.Lookup(unique_id);
+  if (manager)
+    manager->RemoveObserver(this);
+
+  personal_data_manager_id_map_.Remove(unique_id);
 }
 
 PersonalDataManager*
 PersonalDataManagerFactoryEfl::PersonalDataManagerForContext(
-    content::BrowserContext* ctx) {
-  uint64_t uniqueId = reinterpret_cast<uint64_t>(ctx);
-  return personal_data_manager_id_map_.Lookup(uniqueId);
+    content::BrowserContext* context) {
+  if (!context)
+    return nullptr;
+
+  uint64_t unique_id = reinterpret_cast<uint64_t>(context);
+  PersonalDataManager* manager =
+      personal_data_manager_id_map_.Lookup(unique_id);
+  if (manager)
+    return manager;
+
+  PrefService* service = user_prefs::UserPrefs::Get(context);
+  if (!service) {
+    LOG(ERROR) << "Preference service is not set.";
+    return nullptr;
+  }
+
+  std::unique_ptr<PersonalDataManager> pdm(new PersonalDataManager(
+      content::GetContentClientExport()->browser()->GetApplicationLocale()));
+  manager = pdm.get();
+
+  manager->Init(WebDataServiceFactoryEfl::GetAutofillWebDataForProfile(), nullptr,
+                service, nullptr, nullptr, nullptr, nullptr, nullptr,
+                context->IsOffTheRecord());
+  manager->AddObserver(this);
+  personal_data_manager_id_map_.AddWithID(std::move(pdm), unique_id);
+
+  return manager;
 }
 
 PersonalDataManagerFactoryEfl::PersonalDataManagerFactoryEfl()
index 205581d..6deed3d 100644 (file)
@@ -32,7 +32,6 @@ class PersonalDataManagerFactoryEfl : public PersonalDataManagerObserver {
  public:
   static PersonalDataManagerFactoryEfl* GetInstance();
 
-  void PersonalDataManagerAdd(content::BrowserContext* ctx);
   void PersonalDataManagerRemove(content::BrowserContext* ctx);
   PersonalDataManager* PersonalDataManagerForContext(
       content::BrowserContext* ctx);
@@ -53,7 +52,8 @@ class PersonalDataManagerFactoryEfl : public PersonalDataManagerObserver {
   PersonalDataManagerFactoryEfl& operator=(
       const PersonalDataManagerFactoryEfl&) = delete;
 
-  base::IDMap<PersonalDataManager*> personal_data_manager_id_map_;
+  base::IDMap<std::unique_ptr<PersonalDataManager>>
+      personal_data_manager_id_map_;
 
   Ewk_Context_Form_Autofill_Profile_Changed_Callback callback_;
   void* callback_user_data_;
index 4a31804..9c52220 100644 (file)
@@ -177,8 +177,6 @@ BrowserContextEfl::BrowserContextEfl(EWebContext* web_context, bool incognito)
   user_prefs::UserPrefs::Set(this, user_pref_service_.get());
 
 #if defined(TIZEN_AUTOFILL_SUPPORT)
-  autofill::PersonalDataManagerFactoryEfl::GetInstance()
-      ->PersonalDataManagerAdd(this);
   autofill::AutocompleteHistoryManagerFactoryEfl::GetInstance()
       ->AutocompleteHistoryManagerAdd(this);
 #endif