| Index: Source/bindings/core/v8/V8LazyEventListener.cpp
|
| diff --git a/Source/bindings/core/v8/V8LazyEventListener.cpp b/Source/bindings/core/v8/V8LazyEventListener.cpp
|
| index f56372cf1c771a2ed38a5a453b852aeb1490941d..fd8ee45989db8cca124171dffbd93e03d318cb06 100644
|
| --- a/Source/bindings/core/v8/V8LazyEventListener.cpp
|
| +++ b/Source/bindings/core/v8/V8LazyEventListener.cpp
|
| @@ -53,7 +53,7 @@
|
| namespace blink {
|
|
|
| V8LazyEventListener::V8LazyEventListener(const AtomicString& functionName, const AtomicString& eventParameterName, const String& code, const String sourceURL, const TextPosition& position, Node* node, v8::Isolate* isolate)
|
| - : V8AbstractEventListener(true, isolate)
|
| + : V8AbstractEventListener(true, DOMWrapperWorld::mainWorld(), isolate)
|
| , m_functionName(functionName)
|
| , m_eventParameterName(eventParameterName)
|
| , m_code(code)
|
| @@ -74,21 +74,21 @@ v8::Handle<v8::Object> toObjectWrapper(T* domObject, ScriptState* scriptState)
|
| return v8::Local<v8::Object>::New(scriptState->isolate(), value.As<v8::Object>());
|
| }
|
|
|
| -v8::Local<v8::Value> V8LazyEventListener::callListenerFunction(v8::Handle<v8::Value> jsEvent, Event* event)
|
| +v8::Local<v8::Value> V8LazyEventListener::callListenerFunction(ScriptState* scriptState, v8::Handle<v8::Value> jsEvent, Event* event)
|
| {
|
| - v8::Local<v8::Object> listenerObject = getListenerObject(scriptState()->executionContext());
|
| + v8::Local<v8::Object> listenerObject = getListenerObject(scriptState->executionContext());
|
| if (listenerObject.IsEmpty())
|
| return v8::Local<v8::Value>();
|
|
|
| v8::Local<v8::Function> handlerFunction = listenerObject.As<v8::Function>();
|
| - v8::Local<v8::Object> receiver = getReceiverObject(event);
|
| + v8::Local<v8::Object> receiver = getReceiverObject(scriptState, event);
|
| if (handlerFunction.IsEmpty() || receiver.IsEmpty())
|
| return v8::Local<v8::Value>();
|
|
|
| - if (!scriptState()->executionContext()->isDocument())
|
| + if (!scriptState->executionContext()->isDocument())
|
| return v8::Local<v8::Value>();
|
|
|
| - LocalFrame* frame = toDocument(scriptState()->executionContext())->frame();
|
| + LocalFrame* frame = toDocument(scriptState->executionContext())->frame();
|
| if (!frame)
|
| return v8::Local<v8::Value>();
|
|
|
| @@ -104,33 +104,23 @@ static void V8LazyEventListenerToString(const v8::FunctionCallbackInfo<v8::Value
|
| v8SetReturnValue(info, V8HiddenValue::getHiddenValue(info.GetIsolate(), info.Holder(), V8HiddenValue::toStringString(info.GetIsolate())));
|
| }
|
|
|
| -void V8LazyEventListener::handleEvent(ExecutionContext* context, Event* event)
|
| +void V8LazyEventListener::prepareListenerObject(ExecutionContext* executionContext)
|
| {
|
| - v8::HandleScope handleScope(toIsolate(context));
|
| - // V8LazyEventListener doesn't know the associated context when created.
|
| - // Thus we lazily get the associated context and set a ScriptState on V8AbstractEventListener.
|
| - v8::Local<v8::Context> v8Context = toV8Context(context, world());
|
| - if (v8Context.IsEmpty())
|
| + if (!executionContext)
|
| return;
|
| - setScriptState(ScriptState::from(v8Context));
|
| -
|
| - V8AbstractEventListener::handleEvent(context, event);
|
| -}
|
|
|
| -void V8LazyEventListener::prepareListenerObject(ExecutionContext* context)
|
| -{
|
| - if (!context)
|
| - return;
|
| -
|
| - v8::HandleScope handleScope(toIsolate(context));
|
| - // V8LazyEventListener doesn't know the associated context when created.
|
| - // Thus we lazily get the associated context and set a ScriptState on V8AbstractEventListener.
|
| - v8::Local<v8::Context> v8Context = toV8Context(context, world());
|
| + // A ScriptState used by the event listener needs to be calculated based on
|
| + // the ExecutionContext that fired the the event listener and the world
|
| + // that installed the event listener.
|
| + v8::HandleScope handleScope(toIsolate(executionContext));
|
| + v8::Local<v8::Context> v8Context = toV8Context(executionContext, world());
|
| if (v8Context.IsEmpty())
|
| return;
|
| - setScriptState(ScriptState::from(v8Context));
|
| + ScriptState* scriptState = ScriptState::from(v8Context);
|
| + if (!scriptState->contextIsValid())
|
| + return;
|
|
|
| - if (context->isDocument() && !toDocument(context)->allowInlineEventHandlers(m_node, this, m_sourceURL, m_position.m_line)) {
|
| + if (executionContext->isDocument() && !toDocument(executionContext)->allowInlineEventHandlers(m_node, this, m_sourceURL, m_position.m_line)) {
|
| clearListenerObject();
|
| return;
|
| }
|
| @@ -138,10 +128,10 @@ void V8LazyEventListener::prepareListenerObject(ExecutionContext* context)
|
| if (hasExistingListenerObject())
|
| return;
|
|
|
| - ASSERT(context->isDocument());
|
| + ASSERT(executionContext->isDocument());
|
|
|
| - ScriptState::Scope scope(scriptState());
|
| - String listenerSource = InspectorInstrumentation::preprocessEventListener(toDocument(context)->frame(), m_code, m_sourceURL, m_functionName);
|
| + ScriptState::Scope scope(scriptState);
|
| + String listenerSource = InspectorInstrumentation::preprocessEventListener(toDocument(executionContext)->frame(), m_code, m_sourceURL, m_functionName);
|
|
|
| // FIXME: Remove the following 'with' hack.
|
| //
|
| @@ -183,9 +173,9 @@ void V8LazyEventListener::prepareListenerObject(ExecutionContext* context)
|
| if (m_node && m_node->isHTMLElement())
|
| formElement = toHTMLElement(m_node)->formOwner();
|
|
|
| - v8::Handle<v8::Object> nodeWrapper = toObjectWrapper<Node>(m_node, scriptState());
|
| - v8::Handle<v8::Object> formWrapper = toObjectWrapper<HTMLFormElement>(formElement, scriptState());
|
| - v8::Handle<v8::Object> documentWrapper = toObjectWrapper<Document>(m_node ? m_node->ownerDocument() : 0, scriptState());
|
| + v8::Handle<v8::Object> nodeWrapper = toObjectWrapper<Node>(m_node, scriptState);
|
| + v8::Handle<v8::Object> formWrapper = toObjectWrapper<HTMLFormElement>(formElement, scriptState);
|
| + v8::Handle<v8::Object> documentWrapper = toObjectWrapper<Document>(m_node ? m_node->ownerDocument() : 0, scriptState);
|
|
|
| v8::Local<v8::Object> thisObject = v8::Object::New(isolate());
|
| if (thisObject.IsEmpty())
|
|
|