Chromium Code Reviews| 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 |
|
Jens Widell
2015/01/05 10:00:59
"the the"
|
| + // 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()) |