Add ApplicationDataManager to maintain the cache for ApplicationData
authorWonYoung Choi <wy80.choi@samsung.com>
Thu, 19 May 2016 06:58:32 +0000 (15:58 +0900)
committerWonYoung Choi <wy80.choi@samsung.com>
Thu, 19 May 2016 06:58:32 +0000 (15:58 +0900)
In single process model, the runtime and the injected bundle can
share one ApplicationData instance. The injected bundle uses the
cached ApplicationData instance to reduce launching time.

common/application_data.cc
common/application_data.h
runtime/browser/runtime.cc
runtime/browser/web_application.cc
runtime/browser/web_application.h
runtime/renderer/injected_bundle.cc

index a75fe58..c5058af 100644 (file)
@@ -242,4 +242,25 @@ bool ApplicationData::LoadManifestData() {
   return true;
 }
 
+// static
+ApplicationDataManager* ApplicationDataManager::GetInstance() {
+  static ApplicationDataManager self;
+  return &self;
+}
+
+ApplicationDataManager::ApplicationDataManager() {
+}
+
+ApplicationDataManager::~ApplicationDataManager() {
+}
+
+ApplicationData* ApplicationDataManager::GetApplicationData(
+    const std::string& appid) {
+  auto it = cache_.find(appid);
+  if (it == cache_.end()) {
+    cache_[appid].reset(new ApplicationData(appid));
+  }
+  return cache_[appid].get();
+}
+
 }  // namespace common
index 7902ccd..ebe9e4a 100644 (file)
@@ -110,6 +110,21 @@ class ApplicationData {
   std::string app_id_;
 };
 
+
+class ApplicationDataManager {
+ public:
+  static ApplicationDataManager* GetInstance();
+
+  ApplicationData* GetApplicationData(const std::string& appid);
+
+ private:
+  ApplicationDataManager();
+  virtual ~ApplicationDataManager();
+
+  std::map<std::string, std::unique_ptr<ApplicationData>> cache_;
+};
+
+
 }  // namespace common
 
 #endif  // XWALK_COMMON_APPLICATION_DATA_H_
index 2a77a81..d99bf47 100755 (executable)
@@ -68,8 +68,8 @@ bool Runtime::OnCreate() {
   std::string appid = cmd->GetAppIdFromCommandLine(kRuntimeExecName);
 
   // Load Manifest
-  std::unique_ptr<common::ApplicationData>
-      appdata(new common::ApplicationData(appid));
+  auto appdata_manager = common::ApplicationDataManager::GetInstance();
+  common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid);
   if (!appdata->LoadManifestData()) {
     return false;
   }
@@ -83,7 +83,7 @@ bool Runtime::OnCreate() {
   // Init WebApplication
   native_window_ = CreateNativeWindow();
   STEP_PROFILE_START("WebApplication Create");
-  application_ = new WebApplication(native_window_, std::move(appdata));
+  application_ = new WebApplication(native_window_, appdata);
   STEP_PROFILE_END("WebApplication Create");
   application_->set_terminator([](){ ui_app_exit(); });
 
index 1996e92..9f836ea 100644 (file)
@@ -206,7 +206,7 @@ static bool ProcessWellKnownScheme(const std::string& url) {
 }  // namespace
 
 WebApplication::WebApplication(
-    NativeWindow* window, std::unique_ptr<common::ApplicationData> app_data)
+    NativeWindow* window, common::ApplicationData* app_data)
     : launched_(false),
       debug_mode_(false),
       verbose_mode_(false),
@@ -214,8 +214,8 @@ WebApplication::WebApplication(
           ewk_context_new_with_injected_bundle_path(INJECTED_BUNDLE_PATH)),
       window_(window),
       appid_(app_data->app_id()),
+      app_data_(app_data),
       locale_manager_(new common::LocaleManager()),
-      app_data_(std::move(app_data)),
       terminator_(NULL) {
   std::unique_ptr<char, decltype(std::free)*> path{app_get_data_path(),
                                                    std::free};
@@ -224,7 +224,7 @@ WebApplication::WebApplication(
   splash_screen_.reset(new SplashScreen(
       window_, app_data_->splash_screen_info(), app_data_->application_path()));
   resource_manager_.reset(
-      new common::ResourceManager(app_data_.get(), locale_manager_.get()));
+      new common::ResourceManager(app_data_, locale_manager_.get()));
   resource_manager_->set_base_resource_path(app_data_->application_path());
   Initialize();
 }
@@ -277,7 +277,7 @@ bool WebApplication::Initialize() {
                                               this);
   InitializeNotificationCallback(ewk_context_, this);
 
-  if (FindPrivilege(app_data_.get(), kFullscreenPrivilege)) {
+  if (FindPrivilege(app_data_, kFullscreenPrivilege)) {
     ewk_context_tizen_extensible_api_string_set(ewk_context_,
                                                 kFullscreenFeature, true);
   }
@@ -819,7 +819,7 @@ void WebApplication::OnNotificationPermissionRequest(
   // Local Domain: Grant permission if defined, otherwise Popup user prompt.
   // Remote Domain: Popup user prompt.
   if (common::utils::StartsWith(url, "file://") &&
-      FindPrivilege(app_data_.get(), kNotificationPrivilege)) {
+      FindPrivilege(app_data_, kNotificationPrivilege)) {
     result_handler(true);
     return;
   }
@@ -859,7 +859,7 @@ void WebApplication::OnGeolocationPermissionRequest(
 
   // Local Domain: Grant permission if defined, otherwise block execution.
   // Remote Domain: Popup user prompt if defined, otherwise block execution.
-  if (!FindPrivilege(app_data_.get(), kLocationPrivilege)) {
+  if (!FindPrivilege(app_data_, kLocationPrivilege)) {
     result_handler(false);
     return;
   }
@@ -904,7 +904,7 @@ void WebApplication::OnQuotaExceed(WebView*, const std::string& url,
   // Local Domain: Grant permission if defined, otherwise Popup user prompt.
   // Remote Domain: Popup user prompt.
   if (common::utils::StartsWith(url, "file://") &&
-      FindPrivilege(app_data_.get(), kStoragePrivilege)) {
+      FindPrivilege(app_data_, kStoragePrivilege)) {
     result_handler(true);
     return;
   }
@@ -999,7 +999,7 @@ void WebApplication::OnUsermediaPermissionRequest(
 
   // Local Domain: Grant permission if defined, otherwise block execution.
   // Remote Domain: Popup user prompt if defined, otherwise block execution.
-  if (!FindPrivilege(app_data_.get(), kUsermediaPrivilege)) {
+  if (!FindPrivilege(app_data_, kUsermediaPrivilege)) {
     result_handler(false);
     return;
   }
index 480f1dc..87519e3 100755 (executable)
@@ -40,7 +40,7 @@ class SplashScreen;
 class WebApplication : public WebView::EventListener {
  public:
   WebApplication(NativeWindow* window,
-                 std::unique_ptr<common::ApplicationData> app_data);
+                 common::ApplicationData* app_data);
   virtual ~WebApplication();
 
   void AppControl(std::unique_ptr<common::AppControl> appcontrol);
@@ -112,10 +112,10 @@ class WebApplication : public WebView::EventListener {
   NativeWindow* window_;
   std::string appid_;
   std::string app_data_path_;
+  common::ApplicationData* app_data_;
   std::list<WebView*> view_stack_;
   std::unique_ptr<SplashScreen> splash_screen_;
   std::unique_ptr<common::LocaleManager> locale_manager_;
-  std::unique_ptr<common::ApplicationData> app_data_;
   std::unique_ptr<common::ResourceManager> resource_manager_;
   std::function<void(void)> terminator_;
   int security_model_version_;
index 467f9c0..f766150 100755 (executable)
@@ -50,22 +50,26 @@ class BundleGlobalData {
   }
   void Initialize(const std::string& app_id) {
     PreInitialize();
-    app_data_.reset(new common::ApplicationData(app_id));
-    app_data_->LoadManifestData();
+
+    auto appdata_manager = common::ApplicationDataManager::GetInstance();
+    common::ApplicationData* app_data =
+        appdata_manager->GetApplicationData(app_id);
+
+    app_data->LoadManifestData();
     // PreInitialized locale_manager_.reset(new common::LocaleManager);
     locale_manager_->EnableAutoUpdate(true);
-    if (app_data_->widget_info() != NULL &&
-        !app_data_->widget_info()->default_locale().empty()) {
+    if (app_data->widget_info() != NULL &&
+        !app_data->widget_info()->default_locale().empty()) {
       locale_manager_->SetDefaultLocale(
-          app_data_->widget_info()->default_locale());
+          app_data->widget_info()->default_locale());
     }
-    resource_manager_.reset(new common::ResourceManager(app_data_.get(),
+    resource_manager_.reset(new common::ResourceManager(app_data,
                             locale_manager_.get()));
     resource_manager_->set_base_resource_path(
-        app_data_->application_path());
+        app_data->application_path());
 
     auto widgetdb = extensions::WidgetPreferenceDB::GetInstance();
-    widgetdb->Initialize(app_data_.get(),
+    widgetdb->Initialize(app_data,
                          locale_manager_.get());
   }
 
@@ -78,7 +82,7 @@ class BundleGlobalData {
   ~BundleGlobalData() {}
   std::unique_ptr<common::ResourceManager> resource_manager_;
   std::unique_ptr<common::LocaleManager> locale_manager_;
-  std::unique_ptr<common::ApplicationData> app_data_;
+
   bool preInitialized;
 };