Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / bindings / v8 / V8AbstractEventListener.cpp
index 61720ea..12f78db 100644 (file)
@@ -31,8 +31,8 @@
 #include "config.h"
 #include "bindings/v8/V8AbstractEventListener.h"
 
-#include "V8Event.h"
-#include "V8EventTarget.h"
+#include "bindings/core/v8/V8Event.h"
+#include "bindings/core/v8/V8EventTarget.h"
 #include "bindings/v8/V8Binding.h"
 #include "bindings/v8/V8EventListenerList.h"
 #include "bindings/v8/V8HiddenValue.h"
 
 namespace WebCore {
 
-V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, DOMWrapperWorld* world, v8::Isolate* isolate)
+V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, ScriptState* scriptState)
     : EventListener(JSEventListenerType)
     , m_isAttribute(isAttribute)
-    , m_world(world)
+    , m_scriptState(scriptState)
+    , m_isolate(scriptState->isolate())
+{
+    if (isMainThread())
+        InspectorCounters::incrementCounter(InspectorCounters::JSEventListenerCounter);
+}
+
+V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, v8::Isolate* isolate)
+    : EventListener(JSEventListenerType)
+    , m_isAttribute(isAttribute)
+    , m_scriptState(nullptr)
     , m_isolate(isolate)
 {
     if (isMainThread())
@@ -57,16 +67,16 @@ V8AbstractEventListener::~V8AbstractEventListener()
 {
     if (!m_listener.isEmpty()) {
         v8::HandleScope scope(m_isolate);
-        V8EventListenerList::clearWrapper(m_listener.newLocal(m_isolate), m_isAttribute, m_isolate);
+        V8EventListenerList::clearWrapper(m_listener.newLocal(isolate()), m_isAttribute, isolate());
     }
     if (isMainThread())
         InspectorCounters::decrementCounter(InspectorCounters::JSEventListenerCounter);
 }
 
-void V8AbstractEventListener::handleEvent(ExecutionContext* context, Event* event)
+void V8AbstractEventListener::handleEvent(ExecutionContext*, Event* event)
 {
     // Don't reenter V8 if execution was terminated in this instance of V8.
-    if (context->isJSExecutionForbidden())
+    if (scriptState()->executionContext()->isJSExecutionForbidden())
         return;
 
     ASSERT(event);
@@ -75,40 +85,30 @@ void V8AbstractEventListener::handleEvent(ExecutionContext* context, Event* even
     // See issue 889829.
     RefPtr<V8AbstractEventListener> protect(this);
 
-    v8::HandleScope handleScope(m_isolate);
-
-    v8::Local<v8::Context> v8Context = toV8Context(context, world());
-    if (v8Context.IsEmpty())
+    if (scriptState()->contextIsEmpty())
         return;
-
-    // Enter the V8 context in which to perform the event handling.
-    v8::Context::Scope scope(v8Context);
+    ScriptState::Scope scope(scriptState());
 
     // Get the V8 wrapper for the event object.
-    v8::Isolate* isolate = v8Context->GetIsolate();
-    v8::Handle<v8::Value> jsEvent = toV8(event, v8::Handle<v8::Object>(), isolate);
+    v8::Handle<v8::Value> jsEvent = toV8(event, scriptState()->context()->Global(), isolate());
     if (jsEvent.IsEmpty())
         return;
-    invokeEventHandler(context, event, v8::Local<v8::Value>::New(isolate, jsEvent));
+    invokeEventHandler(event, v8::Local<v8::Value>::New(isolate(), jsEvent));
 }
 
 void V8AbstractEventListener::setListenerObject(v8::Handle<v8::Object> listener)
 {
-    m_listener.set(m_isolate, listener);
+    m_listener.set(isolate(), listener);
     m_listener.setWeak(this, &setWeakCallback);
 }
 
-void V8AbstractEventListener::invokeEventHandler(ExecutionContext* context, Event* event, v8::Local<v8::Value> jsEvent)
+void V8AbstractEventListener::invokeEventHandler(Event* event, v8::Local<v8::Value> jsEvent)
 {
     // If jsEvent is empty, attempt to set it as a hidden value would crash v8.
     if (jsEvent.IsEmpty())
         return;
 
-    v8::Local<v8::Context> v8Context = toV8Context(context, world());
-    if (v8Context.IsEmpty())
-        return;
-    v8::Isolate* isolate = v8Context->GetIsolate();
-
+    ASSERT(!scriptState()->contextIsEmpty());
     v8::Local<v8::Value> returnValue;
     {
         // Catch exceptions thrown in the event handler so they do not propagate to javascript code that caused the event to fire.
@@ -116,29 +116,29 @@ void V8AbstractEventListener::invokeEventHandler(ExecutionContext* context, Even
         tryCatch.SetVerbose(true);
 
         // Save the old 'event' property so we can restore it later.
-        v8::Local<v8::Value> savedEvent = V8HiddenValue::getHiddenValue(v8Context->GetIsolate(), v8Context->Global(), V8HiddenValue::event(isolate));
+        v8::Local<v8::Value> savedEvent = V8HiddenValue::getHiddenValue(isolate(), scriptState()->context()->Global(), V8HiddenValue::event(isolate()));
         tryCatch.Reset();
 
-        // Make the event available in the global object, so DOMWindow can expose it.
-        V8HiddenValue::setHiddenValue(v8Context->GetIsolate(), v8Context->Global(), V8HiddenValue::event(isolate), jsEvent);
+        // Make the event available in the global object, so LocalDOMWindow can expose it.
+        V8HiddenValue::setHiddenValue(isolate(), scriptState()->context()->Global(), V8HiddenValue::event(isolate()), jsEvent);
         tryCatch.Reset();
 
-        returnValue = callListenerFunction(context, jsEvent, event);
+        returnValue = callListenerFunction(jsEvent, event);
         if (tryCatch.HasCaught())
             event->target()->uncaughtExceptionInEventHandler();
 
         if (!tryCatch.CanContinue()) { // Result of TerminateExecution().
-            if (context->isWorkerGlobalScope())
-                toWorkerGlobalScope(context)->script()->forbidExecution();
+            if (scriptState()->executionContext()->isWorkerGlobalScope())
+                toWorkerGlobalScope(scriptState()->executionContext())->script()->forbidExecution();
             return;
         }
         tryCatch.Reset();
 
         // Restore the old event. This must be done for all exit paths through this method.
         if (savedEvent.IsEmpty())
-            V8HiddenValue::setHiddenValue(v8Context->GetIsolate(), v8Context->Global(), V8HiddenValue::event(isolate), v8::Undefined(v8Context->GetIsolate()));
+            V8HiddenValue::setHiddenValue(isolate(), scriptState()->context()->Global(), V8HiddenValue::event(isolate()), v8::Undefined(isolate()));
         else
-            V8HiddenValue::setHiddenValue(v8Context->GetIsolate(), v8Context->Global(), V8HiddenValue::event(isolate), savedEvent);
+            V8HiddenValue::setHiddenValue(isolate(), scriptState()->context()->Global(), V8HiddenValue::event(isolate()), savedEvent);
         tryCatch.Reset();
     }
 
@@ -146,7 +146,7 @@ void V8AbstractEventListener::invokeEventHandler(ExecutionContext* context, Even
         return;
 
     if (m_isAttribute && !returnValue->IsNull() && !returnValue->IsUndefined() && event->isBeforeUnloadEvent()) {
-        V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, stringReturnValue, returnValue);
+        TOSTRING_VOID(V8StringResource<>, stringReturnValue, returnValue);
         toBeforeUnloadEvent(event)->setReturnValue(stringReturnValue);
     }
 
@@ -161,23 +161,22 @@ bool V8AbstractEventListener::shouldPreventDefault(v8::Local<v8::Value> returnVa
     return returnValue->IsBoolean() && !returnValue->BooleanValue();
 }
 
-v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(ExecutionContext* context, Event* event)
+v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(Event* event)
 {
-    v8::Isolate* isolate = toV8Context(context, world())->GetIsolate();
-    v8::Local<v8::Object> listener = m_listener.newLocal(isolate);
+    v8::Local<v8::Object> listener = m_listener.newLocal(isolate());
     if (!m_listener.isEmpty() && !listener->IsFunction())
         return listener;
 
     EventTarget* target = event->currentTarget();
-    v8::Handle<v8::Value> value = toV8(target, v8::Handle<v8::Object>(), isolate);
+    v8::Handle<v8::Value> value = toV8(target, scriptState()->context()->Global(), isolate());
     if (value.IsEmpty())
         return v8::Local<v8::Object>();
-    return v8::Local<v8::Object>::New(isolate, v8::Handle<v8::Object>::Cast(value));
+    return v8::Local<v8::Object>::New(isolate(), v8::Handle<v8::Object>::Cast(value));
 }
 
 bool V8AbstractEventListener::belongsToTheCurrentWorld() const
 {
-    return m_isolate->InContext() && m_world == DOMWrapperWorld::current(m_isolate);
+    return isolate()->InContext() && &world() == &DOMWrapperWorld::current(isolate());
 }
 
 void V8AbstractEventListener::setWeakCallback(const v8::WeakCallbackData<v8::Object, V8AbstractEventListener> &data)