From 3267070c531c9f2790319afdd7d5fa2f3c456e91 Mon Sep 17 00:00:00 2001 From: LongXiang Date: Tue, 29 Jan 2013 14:56:34 +0800 Subject: [PATCH] Fix WrtAccess singleton deinitialize issue [Issue#] N/A [Problem] If an iframe or opened window closed, the main frame or opener window will fail to access device APIs. [Cause] When iframe or child window be closed, the WrtAccess singleton will be deinitialized, later ace check calls will fail the WrtAccess initialized assertion. [Solution] Count initialized plugins in WrtAccess. Change-Id: Icd9c5eb0488912225d8dcf4bd222b0bd26ea29c8 --- src/Commons/WrtAccess/WrtAccess.cpp | 24 ++++++++++++++---------- src/Commons/WrtAccess/WrtAccess.h | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Commons/WrtAccess/WrtAccess.cpp b/src/Commons/WrtAccess/WrtAccess.cpp index b1f5850..cfda0f1 100644 --- a/src/Commons/WrtAccess/WrtAccess.cpp +++ b/src/Commons/WrtAccess/WrtAccess.cpp @@ -112,8 +112,8 @@ namespace WrtDeviceApis { namespace Commons { WrtAccess::WrtAccess() : - m_initialized(false), - m_sessionId(GenerateSessionId()) + m_sessionId(GenerateSessionId()), + m_pluginOwners(0) { } @@ -151,18 +151,22 @@ void WrtAccess::initialize(int widgetId) LogDebug("Invalid widget id"); Throw(Exception); } - ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup); - Assert(ACE_OK == ret); - m_initialized = true; - m_widgetId = widgetId; + + if (!m_pluginOwners++) { + ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup); + Assert(ACE_OK == ret); + m_widgetId = widgetId; + } } void WrtAccess::deinitialize(int /*widgetId*/) { LogDebug("deinitialize"); - m_initialized = false; - ace_return_t ret = ace_client_shutdown(); - Assert(ACE_OK == ret); + + if (!--m_pluginOwners) { + ace_return_t ret = ace_client_shutdown(); + Assert(ACE_OK == ret); + } } int WrtAccess::getWidgetId() const @@ -172,7 +176,7 @@ int WrtAccess::getWidgetId() const bool WrtAccess::checkAccessControl(const AceFunction& aceFunction) const { - Assert(m_initialized && "WrtAccessSingleton needs to be initialized with" + Assert(m_pluginOwners && "WrtAccessSingleton needs to be initialized with" "WidgetId during on_widget_start_callback in each plugin"); size_t deviceCount = aceFunction.deviceCapabilities.size(); diff --git a/src/Commons/WrtAccess/WrtAccess.h b/src/Commons/WrtAccess/WrtAccess.h index 574324f..2011a77 100644 --- a/src/Commons/WrtAccess/WrtAccess.h +++ b/src/Commons/WrtAccess/WrtAccess.h @@ -46,8 +46,8 @@ private: WrtAccess(); virtual ~WrtAccess(); - bool m_initialized; int m_widgetId; + size_t m_pluginOwners; SessionId m_sessionId; friend class DPL::Singleton; -- 2.7.4