namespace WrtPlugins {
namespace W3C {
+
const std::string storageEventName = "storage";
const std::string appServiceEventName = "appservice";
const std::string softKeyboardChangeEventName = "softkeyboardchange";
AddEventListenerSupport::m_listeners =
AddEventListenerSupport::IFramesListeners();
-JSContextRef AddEventListenerSupport::m_context = NULL;
-
-void AddEventListenerSupport::initialize(JSContextRef context)
-{
- if (!m_context) {
- m_context = context;
- }
-}
-
-void AddEventListenerSupport::deinitialize()
-{
- if (!m_context) {
- LogDebug("Not yet initialized");
- }
-
- m_listeners.clear();
- m_context = NULL;
-}
-
-bool AddEventListenerSupport::isInitialized()
-{
- return m_context != NULL;
-}
-
-JSValueRef AddEventListenerSupport::
- AddEventListener(JSContextRef context,
- JSObjectRef object,
- JSObjectRef thisObject,
- size_t argumentCount,
- const JSValueRef arguments[],
- JSValueRef* /*exception*/)
+JSValueRef AddEventListenerSupport::AddEventListener(
+ JSContextRef context,
+ JSObjectRef object,
+ JSObjectRef thisObject,
+ size_t argumentCount,
+ const JSValueRef arguments[],
+ JSValueRef* /*exception*/)
{
LogDebug("Add event listener invoked");
LogDebug("This(iframe?):" << thisObject);
LogDebug("object:" << object);
+ JSContextRef global_context = JSContextGetGlobalContext(context);
+ LogDebug("context:" << context << "(global:" << global_context << ")");
+
if (argumentCount < 2 || !JSValueIsString(context, arguments[0])) {
LogError("Wrong arguments");
return JSValueMakeUndefined(context);
return JSValueMakeUndefined(context);
}
- JSValueProtect(m_context, arguments[1]);
- JSObjectRef objectCb =
- JSValueToObject(m_context,
- arguments[1],
- NULL);
- if (!JSObjectIsFunction(m_context, objectCb)) {
+ JSObjectRef objectCb = JSValueToObject(context, arguments[1], NULL);
+ if (!JSObjectIsFunction(context, objectCb)) {
LogError("JS object is not a function");
return JSValueMakeUndefined(context);
}
+ JSValueProtect(global_context, arguments[1]);
//add object to Listeners
//set event information according to each event type
CallbackData data;
data.object = objectCb;
data.thisObject = thisObject;
+ data.context = global_context;
if (eventName == storageEventName) {
data.eventType = StorageCustomEvent;
return JSValueMakeUndefined(context);
}
-void AddEventListenerSupport::
- CallStorageListenersFromDifferentIFrames(
- JSObjectRef iframe,
- const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event)
+void AddEventListenerSupport::RemoveIFrame(JSObjectPtr iframe)
+{
+ auto it = m_listeners.find(iframe->getObject());
+ if (it == m_listeners.end()) {
+ LogWarning("Iframe not registered");
+ return;
+ }
+
+ FOREACH(listener, *it->second)
+ {
+ JSValueUnprotect(listener->context, listener->object);
+ }
+ m_listeners.erase(it);
+ LogDebug("Iframe removed from add event listener object");
+}
+
+void AddEventListenerSupport::CallStorageListenersFromDifferentIFrames(
+ JSObjectRef iframe,
+ const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event)
{
LogDebug("Invoked callbacks");
- LogInfo("Context: " << m_context);
FOREACH(it, m_listeners)
{
continue;
}
- auto eventPriv = new JSStorageEventPrivateObject(m_context,
- event);
-
- JSObjectRef eventObject =
- JSObjectMake(m_context, JSStorageEvent::getClassRef(), eventPriv);
- const size_t argc = 1;
- JSValueRef argv[argc] = { eventObject };
-
- JSValueProtect(m_context, eventObject);
-
FOREACH(listener, *it->second)
{
LogDebug("Call");
- if (listener->eventType ==
- StorageCustomEvent)
+ auto eventPriv =
+ new JSStorageEventPrivateObject(listener->context, event);
+
+ JSObjectRef eventObject =
+ JSObjectMake(listener->context, JSStorageEvent::getClassRef(), eventPriv);
+ const size_t argc = 1;
+ JSValueRef argv[argc] = { eventObject };
+
+ JSValueProtect(listener->context, eventObject);
+
+ if (listener->eventType == StorageCustomEvent)
{
JSObjectCallAsFunction(
- m_context,
+ listener->context,
listener->object,
NULL,
argc,
argv,
NULL);
}
- }
- JSValueUnprotect(m_context, eventObject);
+ JSValueUnprotect(listener->context, eventObject);
+ }
}
LogDebug("Done");
}
-void AddEventListenerSupport::
- CallCustomEventListenersFromIFrame(
- JSObjectRef iframe,
- CustomEventType eventType,
- JSObjectRef eventObject)
+void AddEventListenerSupport::CallCustomEventListenersFromIFrame(
+ JSObjectRef iframe,
+ CustomEventType eventType,
+ JSObjectRef eventObject)
{
LogDebug("Invoked callbacks");
const size_t argc = 1;
JSValueRef argv[argc] = { eventObject };
- JSValueProtect(m_context, eventObject);
FOREACH(listener, *it->second)
{
if (listener->eventType == eventType) {
LogDebug("Call");
JSObjectCallAsFunction(
- m_context,
+ listener->context,
listener->object,
iframe,
argc,
NULL);
}
}
- JSValueUnprotect(m_context, eventObject);
LogDebug("Done");
}
#include <list>
#include <memory>
#include <JavaScriptCore/JavaScript.h>
+#include <JavaScriptCore/JSContextRef.h>
#include <StorageEvent/IStorageEvent.h>
#include <TizenServiceEvent/ITizenServiceEvent.h>
#include <js_overlay_types.h>
+#include <JSObject.h>
+
+// import temporarily from JSContextRefPrivate.h
+extern "C" JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx);
namespace WrtPlugins {
namespace W3C {
class AddEventListenerSupport
{
public:
- static void initialize(JSContextRef context);
- static void deinitialize();
-
- static bool isInitialized();
-
static JSValueRef AddEventListener(JSContextRef context,
JSObjectRef object,
JSObjectRef thisObject,
const JSValueRef arguments[],
JSValueRef* exception);
+ static void RemoveIFrame(JSObjectPtr iframe);
+
static void CallStorageListenersFromDifferentIFrames(
JSObjectRef iframe,
const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event);
CustomEventType eventType;
JSObjectRef object;
JSObjectRef thisObject;
+ JSContextRef context;
};
typedef std::list<CallbackData> Listeners;
//first-iframe, 2nd - listeners list
typedef std::map<JSObjectRef, ListenersPtr> IFramesListeners;
- static JSContextRef m_context;
static IFramesListeners m_listeners;
private: