[Issue#] PLM-131009-03049
[Problem] Make a DynamicBox is located in homescreen and if try to update its package by
re-installation, a WebProcess crash occurs.
[Cause] When a DynamicBox is updated, web-provider re-uses WebProcess which was used by
previous one. So then the widget handle is updated, but plugin-logic couldn't know that.
Because wrt plugin-logic was not been considered about such reuse case.
So, there was a problem on accessing widget handle which is internal variable of singleton.
[Solution] Fixed the wrt plugin-logic to update internal variable of singleton properly even in that case.
Change-Id: I0ecde7906b941778ee9027914d7a695aad59c036
+ m_widgetId = widgetId;
+
if (!m_pluginOwners++) {
DPL::Log::LogSystemSingleton::Instance().SetTag("SECURITY_DAEMON");
ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup);
DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS");
Assert(ACE_OK == ret);
if (!m_pluginOwners++) {
DPL::Log::LogSystemSingleton::Instance().SetTag("SECURITY_DAEMON");
ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup);
DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS");
Assert(ACE_OK == ret);
#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
#include <dpl/wrt-dao-ro/widget_dao_read_only.h>
-PluginContainerSupport::PluginContainerSupport() : m_initialized(false)
+PluginContainerSupport::PluginContainerSupport() :
+ m_initialized(false),
+ m_widgetHandle(0)
{
// Reading root plugins list from so files
readRootPluginsList();
{
// Reading root plugins list from so files
readRootPluginsList();
void PluginContainerSupport::Initialize(int widgetHandle)
{
void PluginContainerSupport::Initialize(int widgetHandle)
{
+ if (isInitialized() == true && m_widgetHandle != widgetHandle) {
+ // re-initialize required
+ m_initialized = false;
+
+ m_pluginModels.clear();
+ m_featureModels.clear();
+ }
+
if (isInitialized() == false) {
if (isInitialized() == false) {
+ m_initialized = true;
+ m_widgetHandle = widgetHandle;
+
readAllowedPlugins(widgetHandle);
readRootPlugins(widgetHandle);
}
readAllowedPlugins(widgetHandle);
readRootPlugins(widgetHandle);
}
registerPluginModel(dt->pluginHandle);
registerFeatureModel(data->first, dt, deviceCapabilities);
}
registerPluginModel(dt->pluginHandle);
registerFeatureModel(data->first, dt, deviceCapabilities);
}
-
- m_initialized = true;
}
void PluginContainerSupport::readRootPlugins(int widgetHandle)
}
void PluginContainerSupport::readRootPlugins(int widgetHandle)
} else {
_D("Not defined app type");
}
} else {
_D("Not defined app type");
}
}
void PluginContainerSupport::registerFeatureModel(
}
void PluginContainerSupport::registerFeatureModel(
private:
// Reading
void readRootPluginsList();
private:
// Reading
void readRootPluginsList();
{
return m_initialized;
}
{
return m_initialized;
}
+ bool isInitialized(int widgetHandle)
+ {
+ return (m_initialized && m_widgetHandle == widgetHandle);
+ }
void Initialize(int widgetHandle);
void registerPluginModel(WrtDB::DbPluginHandle handle);
std::list<std::string> getAllowedFeatures(int widgetHandle) const;
void Initialize(int widgetHandle);
void registerPluginModel(WrtDB::DbPluginHandle handle);
std::list<std::string> getAllowedFeatures(int widgetHandle) const;
{
_D("========== start session START ==========");
{
_D("========== start session START ==========");
- if (!m_pluginsSupport->isInitialized()) {
+ if (!m_pluginsSupport->isInitialized(widgetHandle)) {
m_pluginsSupport->Initialize(widgetHandle);
}
auto sessionIt = m_sessions.find(context);
m_pluginsSupport->Initialize(widgetHandle);
}
auto sessionIt = m_sessions.find(context);